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ですね。
このようなイメージで順番に呼び出してくれます。
しかし、最初のポジション1を決済したら どうなるかというと・・・・・
ポジション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の簡単な解説記事がおわっちゃいました。
誰かの役に立つといですが
この記事を読んだ方は、こんな記事も読んでます
tomoよりのお願い
参考になった。ちょっと役に立った。お疲れさんって
少しでもおもったかた(*゜▽゜ノノ゛☆
ポッチっとお願いします。その1ポチ!ありがとう
![]() |
はてなで広めてください。この記事が役に立つ人がいると思います。
←左のボタンをクリックして共有してください。 |
関連記事
- ・バックテスターツールを使った検証の例とフィルターのかけ方
- ・バックテスターで週末トレーニング
- ・MT4 バックテスター(プラストレードサポート機能) オリジナルですよ
- ・バックテスト アプリケーションを作ろうって
- ・ネタもないし、、、バックテストツールを作っているのですが
- ・桁を揃える
- ・EAのエラーコードを表示させる為のサンプルプログラム
- ・TerminalClose というコードがあんのね。
- ・なんちゃってテトリス・・・
- ・なんちゃってコピートレードツール・・・
- ・CheckForOpen(); の中身 EAを作ろう!!
- ・EAを作ろうの、、、だらだらと続く
- ・EAを作ろうの続々です、、、
- ・EAを作ろう、、、という続き
- ・EAを作ろう ということで、サンプルEAをあげます。
- ・TimeCurrent()の謎? 時間決済は、どうするのかな
- ・MT4ビルド600のDLL化どうする?
- ・フォレックスレスター2をしゃぶりつくす、、、
- ・やれ、つくろ~、それ作ろう、まずつくってみよう。EAを
- ・EAを作ってみる? 意外に簡単と思うのは、たぶん作れるひとだけだと思うけど・・・
- ・システムトレードをつくってみよう?簡単にw
- ・知っていると便利なMT4 エラーコード(error code)
- ・データタイプについて
- ・関連記事テスト用
- ・テスト
- ・MQLとは?
タグ
2014年5月11日 | コメント/トラックバック(0) |
カテゴリー:MQL講座