【無料】メールマガジン配布します!

真実!しか流さないメールマガジン《不定期》

メルマガのお申し込みはコチラ

int CheckForClose() を見ていきます。 EAを作ろう

この記事は、シリーズなのでここから見ても分けが分からないと思います。

 

サンプルEAもあり 興味のある人は、この記事からどうぞ

 

今日は、CheckForClose()を見ていきます。

ちなみにこのCheckForClose()は、オリジナルの関数なのでこれを一生懸命ぐぐって調べてもたぶん何も出てこないはずです。

 

//—————————————————————————        
int CheckForClose()
{
  if(getProfit()>=Amount){CloseAll();}
  if(LockDown>0)
  {
    for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber–)
    {
      if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)&&(LockDown>0))
      { int Pos=OrderType();
        if((Pos==OP_BUY)&&(Bid-OrderOpenPrice()>Point*LockDown)&&(OrderStopLoss() == 0))
        {OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point,OrderTakeProfit(),0,CLR_NONE);}
        if((Pos==OP_SELL)&&(OrderOpenPrice()-Ask>Point*LockDown)&&(OrderStopLoss() == 0))
        {OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-Point,OrderTakeProfit(),0,CLR_NONE);}
      }
    }
  }

 

これもぱっとみると初めての方は、ノイローゼになりそうなわけが分からない呪文が書いてありようにみえるかもしれません。

慣れていくと、基本的にやっていることは、どのEAも同じなのでそれほど難しいことはありません。

if(getProfit()>=Amount){CloseAll();}

IF文ですね。 if(もし) getProfit() >=(以上)だったら Amount ) これを実行{CloseAll();}と書いてあります。

 

getProfit()と書いてあるオリジナルの呼出関数なので、恐らく現在のポジションの損益を調べるところでしょう。

Amoutは、設定額という意味かな?設定した金額以上に利益が出たら、→CloseAll 乃ち全部のポジションを決済しましょう。という命令文になってます。もちろん。プラスの損益だけでの決済なのかは、個々で判断できませんが、もしかすると損切りもここで行うのかもしれません。

extern int Amount = 2;

初期設定では、’2’となっていますので、2以上のプラス損益になったら決済という流れですね。

 

getProfit()これは、このままでは意味がわかりませんのでプログラムコードの中で同じように書いてあるところを捜します。

//—————————————————————————        
double getProfit()
{
   double Profit = 0;
   for (int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber–)
   {
     if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES))
     Profit = Profit + OrderProfit() + OrderSwap();
   }
   return (Profit);
}

こんな一文がありました。ここを呼び出しているということになります。

tomoも最初理解が出来なかった記憶があるのですが、

~~~()としてあるのは、何かを呼び出すと覚えても差し支えありません。

MQLに元々備え付けてあるコードでいくと、OrdersTotal()とか、AccountBalance()ですね。

~~~()は、そのコードを呼び出して数字を返してくれます。もしくは、コード先のプログラムを呼び出すだけの場合もあります。

 

今回の呼出先をみると、

double getProfit()
{

と書いてあります。このように double getProfit() 、int getProfit()と書いてある場合は数字を返す時のお約束ですね。

Void getProfit() となっていた場合は、数値を返さずに呼出先のプログラムを実行するときに使います。その使い分けはと聞かれても^^;あなた次第ですとしかいえませんが

return (Profit);

最後の最後に、Profitの数字を戻しているということになります。

分かるかな??伝わってますかね^^:

 

  double Profit = 0;

Profit を 0に初期化;

   for (int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber—)
MT4の保有ポジション分を繰り返す

   {
     if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES))
ポジションを選択する、エラーじゃなければ if文を実行   

  Profit = Profit + OrderProfit() + OrderSwap();
ポジションの損益 と スワップを Profitに足しなさいという文章ですね。

}

となっており、先ほどの return (Profit);と続きます。

ここでは、ぱっとい理解しにくいかもですが

getProfit() = return (Profit)のProfitの数字が戻ってくるイメージです。

Profitが4だったらMT4では

if( 4 >= Amount ){CloseAll();}と見ているということです。

 

ここでも気になったのは、損益を計算するコードです。MT4内の全てのポジションの損益を計算していますね。これでは、他のEAのポジションも合算してしまいます。

これは、修正しておきましょう。

 

//—————————————————————————        
double getProfit()
{
   double Profit = 0;
   for (int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber–)
   {
     if (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES))
    {if(OrderMagicNumber() ==MAGICMA)Profit = Profit + OrderProfit() + OrderSwap();}
   }
   return (Profit);
}

上の用にコードを書き換えるだけで、自分のマジックナンバーだけをカウントするように変更出来ます。

もちろん、ここではマジックナンバーでしか調べてないので他通貨対応のEAであれば、OrderSymbol() == Symbol()このように通貨毎の条件式をプラスしてもいいでしょう。

てか、本来は1セットにして覚えて書いたがいいです。

 

//—————————————————————————        
void CloseAll()
{
   bool   Result;
   int    i,Pos,Error;
   int    Total=OrdersTotal();
   if(Total>0)
   {
     for(i=Total-1; i>=0; i–)
     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE)
       {
         Pos=OrderType();
         if(Pos==OP_BUY)
         {Result=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);}
         if(Pos==OP_SELL)
         {Result=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, CLR_NONE);}
         if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT))
         {Result=OrderDelete(OrderTicket(), CLR_NONE);}
//———————–
         if(Result!=true)
          {
             Error=GetLastError();
             Print("LastError = ",Error);
          }
         else Error=0;
//———————–
       }  
     }
   }
   return(0);
}

ここのコードも長いですね^^:説明するのがメンドイと思うほどにです。読み解くほうもうメンドイでしょう。しかし、あることは、パターンです。

 

決済コードの基本は、

MT4のポジションを認識する

決済する

エラー処理を入れる?(ここは。好みだったりもします)

基本のパターンです。これを覚えればあとは応用になっていきます。

 

ここでは、CloseAllと関数名をつけている通りすべてのポジションを決済させるつもりなのでしょう。
分解しながら、コードに日本語説明を入れていきます。

//—————————————————————————        
void CloseAll()
{
   bool   Result;
   int    i,Pos,Error;
   int    Total=OrdersTotal();

ここまでが、初期設定です。このあたりの変数は後で使います。

   if(Total>0)

ここは、保有中ポジションが0より大きければ実行。0より小さければ処理をしないということです。無駄な処理は省く事も大事です。

   {
     for(i=Total-1; i>=0; i—)

保有中のポジション数の回数分forで繰り替えすという命令です。

ここでのポイントは、Total-1 と i—) となっているところです。

ポジションが5個保有している場合、4、3,2,1,0とiの変数が変化していきます。

これは、決済のポジション処理するときに覚えておくお作法です。

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)との関係性で必要になってきます。

OrderSelectで順番にポジションを認識しましょう。1~5ですね。

20140511102159

このようなイメージで順番に呼び出してくれます。

しかし、最初のポジション1を決済したら どうなるかというと・・・・・

20140511102356 

ポジション1を決済してしまったため順番が変更になってしまうのです。そこで変数iは順番を守るので次の番号のポジションを選択します。ポジション3を決済してしまうというズレが生じるため5番後ろから決済していく方法が取られています。

う~ん。うまく説明できなかった(苦笑

 

     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE)
       {
         Pos=OrderType(); // ポジションの種類を調べる
         if(Pos==OP_BUY)
         {Result=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);}
         if(Pos==OP_SELL)
         {Result=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, CLR_NONE);}

オーダーの種類ごとに決済命令をだしてます。

         if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT))
         {Result=OrderDelete(OrderTicket(), CLR_NONE);}

指値などの注文をキャンセルさせている命令ですね。
//———————–
         if(Result!=true)
          {
             Error=GetLastError();
             Print("LastError = ",Error);
          }
         else Error=0;

ここは、オーダー命令にエラーが発生した場合、エラーをPrintさせてます。
これで動作確認して万が一の時に動作チェックやコード改善に活用する感じです。

考え方によっては、エラーだ出たら再注文をさせるようにコードを組むのもありですね。
//———————–
       }  
     }
   }
   return(0);
}

 

初心者のかたが理解しずらいポイントは、決済のやり方かもしれません。

OrderSelect(0, SELECT_BY_POS, MODE_TRADES)

こうするとポジションの色んな情報がMT4に一時保管されます。(イメージですね)

Pos=OrderType(); // オーダーのタイプを調べたり、買いポジションなのか?売りポジションなのか?

OrderTicket() // オーダーのチケット番号を調べる

OrderLots() // オーダーのロットを調べる

OrderOpenTime() // ポジションを持った時間を調べる

などが使えます。

 

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);}

 

これが。買いポジションの決済コードですが、OrderTicket(),番号が必要になってくるため。

OrderSelect ー OrderClose の順番が1セットになって使われるのです。

 

OrderTicket()番号は、ポジションによってバラバラなのでその度に調べる必要があるのでこうなっているのでしょう。

 

さてこれで、設定値より損益がプラスになったらポジションを全決済するところまで簡単に説明してしまいました。

最後に、参考にマジックナンバー処理を加えたコードを載せておきます。動作の保証はしてませんのでご自身で確認して使ってくださいね。(たぶん大丈夫ですが)

//—————————————————————————        
void CloseAll()
{
   bool   Result;
   int    i,Pos,Error;
   int    Total=OrdersTotal();
   if(Total>0)
   {
     for(i=Total-1; i>=0; i–)
     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE)
       {

if(OrderSymbol() != Symbol() || OrderMagicNumber() !=MAGICMA)continue;

         Pos=OrderType();
         if(Pos==OP_BUY)
         {Result=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);}
         if(Pos==OP_SELL)
         {Result=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, CLR_NONE);}
         if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT))
         {Result=OrderDelete(OrderTicket(), CLR_NONE);}
//———————–
         if(Result!=true)
          {
             Error=GetLastError();
             Print("LastError = ",Error);
          }
         else Error=0;
//———————–
       }  
     }
   }
   return(0);
}

if(OrderSymbol() != Symbol() || OrderMagicNumber() !=MAGICMA)continue;
違う通貨のポジション もしくは、マジックナンバーが違ったら処理を飛ばす。

という感じでコードを書いております。

 

これで無料EAの簡単な解説記事がおわっちゃいました。

誰かの役に立つといですが

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

tomoよりのお願い

参考になったちょっと役に立ったお疲れさんって
少しでもおもったかた(*゜▽゜ノノ゛☆

 

ポッチっとお願いします。その1ポチ!ありがとう

にほんブログ村 為替ブログ FX初心者本人(1年目)へ
にほんブログ村

 

このエントリーをはてなブックマークに追加 はてなで広めてください。この記事が役に立つ人がいると思います。
←左のボタンをクリックして共有してください。

 

 

関連記事

タグ

2014年5月11日 | コメント/トラックバック(0) |

カテゴリー:MQL講座

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ