前回のおさらいです。
メタトレーダで、自作EAを作る際に、もっとも注意しなくてはいけない点として、
「重複注文をしないでね」と命令文を入れないと、ひたすらに発注してしまう。(口座が破壊されるまで)
不親切極まりないですが、ユーザが気を付けるしかないです。
前回は、もっとも簡単(と思える)な方法で重複注文を避けるコードを紹介しました。
------------------------------------------------------------------------------------------
int BUY_Order = 0;
int start()
{
if (BUY_Order == 0 )
{
OrderSend(Symbol(),OP_BUY,0.1,Bid,5.0,0,0,NULL,123,0,Red);
}
BUY_Order = 1;
return(0);
}
------------------------------------------------------------------------------------------
赤文字で書いてあるところに注目してください。
int BUY_Order = 0;
BUY_Order という変数に初めに”0”を代入しておきます。
注文した後に、
BUY_Order = 1 で”1”を代入します。
注文する条件が、if (BUY_Order == 0 ) ですから
日本語に直すと
「もし、BUY_Order が”0”ならば発注しなさい」
なので、変数BUY_Order に”1”が代入された後は、注文が発注される事はありません。
ただし、一度メタトレーダを閉じてしまうと変数がリセットされてしまうため
再起動時に、また発注されてしまいます。
面倒くさいですね(苦笑)
さて、これらを踏まえて、少し実践的なEAを作ってみました。
プログラム内容としては、
「
62EMAを10SMAが「ゴールデンクロス」したら買い、デッドクロスしたら売りで発注する。
発注の際にポジションを持っていたら決済をする。(重複注文防止)
」
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
//マジックナンバーの定義
#define MAGIC 1213
//パラメーターの設定//
extern double Lots = 0.01; //取引ロット数
extern int Slip = 10; //許容スリッページ数
extern string Comments = ""; //コメント
extern int ShortMA_Period = 10; //単純移動平均線の期間
extern int LongMA_Period = 62; //EMAの期間
//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0; //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0; //売りポジションの決済注文の結果をキャッチする変数
int start()
{
double Short1,Short2,Long1,Long2; //移動平均線の値を入れる変数の宣言
Short1 = iMA(NULL,0,ShortMA_Period,0,MODE_SMA,PRICE_CLOSE,1); //一つ前の単純移動平均線
Short2 = iMA(NULL,0,ShortMA_Period,0,MODE_SMA,PRICE_CLOSE,2); //二つ前の単純移動平均線
Long1 = iMA(NULL,0,LongMA_Period,0,MODE_EMA,PRICE_CLOSE,1); //一つ前のEMA
Long2 = iMA(NULL,0,LongMA_Period,0,MODE_EMA,PRICE_CLOSE,2); //二つ前のEMA
//買いポジションのエグジット
OrderSelect(Ticket_L,SELECT_BY_TICKET);
if( Short1<Long1&&Short2 >Long2
&& ( Ticket_L != 0 && Ticket_L != -1 ))
{
Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
if( Exit_L ==1 ) {Ticket_L = 0;}
}
//売りポジションのエグジット
OrderSelect(Ticket_S,SELECT_BY_TICKET);
if( Short1 > Long1&&Short2 < Long2
&& ( Ticket_S != 0 && Ticket_S != -1 ))
{
Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
if( Exit_S ==1 ) {Ticket_S = 0;}
}
//買いエントリー
if( Short1 >Long1 && Short2 < Long2
&& ( Ticket_L == 0 || Ticket_L == -1 )
&& ( Ticket_S == 0 || Ticket_S == -1 ))
{
Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
}
//売りエントリー
if( Short1<Long1 && Short2 > Long2
&& ( Ticket_S == 0 || Ticket_S == -1 )
&& ( Ticket_L == 0 || Ticket_L == -1 ))
{
Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);
}
return(0);
}
このコードも、一度メタトレーダを閉じてしまうと、変数がリセットされる為重複注文してしまうので注意です
是非、バックテストをしてデモトレードで試してみてください。
おすすめ通貨は「AUD/JPY」です。
約1年間のバックテストグラフです(4XP)

