前回、
Moving Average.ex4について
http://trading-fx.blog.jp/archives/8854259.html
でMT4付属のEA、Moving Average.mq4の中身を見ました。
内容は移動平均線と値段の交差でエントリー・決済してるEAでした。
今回これを改造して期間が異なる移動平均線を二つ用意して
短期移動平均線が長期移動平均線を上に抜けるゴールデンクロスで買い、逆のデッドクロスで売り
決済はその逆の条件というEAに変えたいと思います。
まずマジックナンバーがかぶらないように
次に期間のパラメータを追加します。
決済の時の条件も同様に変えます。
と買いポジションはデッドクロスで、売りポジションはゴールデンクロスで決済にします。
これで長期を短期が上抜けで買い、長期を短期がした抜けで売り、ポジション取った後は逆の条件で決済
というEAがおそらくできたはず…
それではJPYUSD5分足でいざバックテスト!

見事な右下がりになりました…
Moving Average.ex4について
http://trading-fx.blog.jp/archives/8854259.html
でMT4付属のEA、Moving Average.mq4の中身を見ました。
内容は移動平均線と値段の交差でエントリー・決済してるEAでした。
今回これを改造して期間が異なる移動平均線を二つ用意して
短期移動平均線が長期移動平均線を上に抜けるゴールデンクロスで買い、逆のデッドクロスで売り
決済はその逆の条件というEAに変えたいと思います。
まずマジックナンバーがかぶらないように
#define MAGICMA 20131111これを
#define MAGICMA 20180511
と適当に今日の日付にでも変えます。
次に期間のパラメータを追加します。
//--- Inputs input double Lots =0.1; input double MaximumRisk =0.02; input double DecreaseFactor=3; input int MovingPeriod =12; input int MovingShift =6;これにもう一つの期間を追加します。
//--- Inputs
input double Lots =0.1;
input double MaximumRisk =0.02;
input double DecreaseFactor=3;
input int MovingPeriodS =7;
input int MovingPeriodL =21;input int MovingShift =6;
短期(Short)と長期(Long)という事でそれぞれMovingPeriodS,MovingPeriodLとし、デフォルトで適当に7,21を設定しました。
次にポジションをとるときの条件を変えます。
これを次にポジションをとるときの条件を変えます。
//+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //--- sell conditions if(Open[1]>ma && Close[1]<ma) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //--- buy conditions if(Open[1]<ma && Close[1]>ma) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } //--- }
//+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double maS0; double maS1; double maL0; double maL1; int res; //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average maS0=iMA(NULL,0,MovingPeriodS,MovingShift,MODE_SMA,PRICE_CLOSE,0); maS1=iMA(NULL,0,MovingPeriodS,MovingShift,MODE_SMA,PRICE_CLOSE,1); maL0=iMA(NULL,0,MovingPeriodL,MovingShift,MODE_SMA,PRICE_CLOSE,0); maL1=iMA(NULL,0,MovingPeriodL,MovingShift,MODE_SMA,PRICE_CLOSE,1);//--- sell conditions if(maS1>maL1 && maS0<maL0) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //--- buy conditions if(maS1<maL1 && maS0>maL0) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } //--- }
maS0,maS1,maL0,maL1を作ってそれぞれに
短期移動平均線現在の足、一本前の足、長期移動平均線現在の足、一本前の足
を当てはめます。
デッドクロスを、一本前の長期移動平均線より短期移動平均線が大きく、現在の足の長期移動平均線より短期移動平均線が小さいと表します。
ゴールデンクロスはその逆です。
短期移動平均線現在の足、一本前の足、長期移動平均線現在の足、一本前の足
を当てはめます。
デッドクロスを、一本前の長期移動平均線より短期移動平均線が大きく、現在の足の長期移動平均線より短期移動平均線が小さいと表します。
ゴールデンクロスはその逆です。
決済の時の条件も同様に変えます。
//+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma; //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //--- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //--- check order type if(OrderType()==OP_BUY) { if(Open[1]>ma && Close[1]<ma) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White)) Print("OrderClose error ",GetLastError()); } break; } if(OrderType()==OP_SELL) { if(Open[1]<ma && Close[1]>ma) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White)) Print("OrderClose error ",GetLastError()); } break; } } //--- }
ここも同様に
//+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double maS0; double maS1; double maL0; double maL1; //--- go trading only for first tiks of new bar if(Volume[0]>1) return; //--- get Moving Average maS0=iMA(NULL,0,MovingPeriodS,MovingShift,MODE_SMA,PRICE_CLOSE,0); maS1=iMA(NULL,0,MovingPeriodS,MovingShift,MODE_SMA,PRICE_CLOSE,1); maL0=iMA(NULL,0,MovingPeriodL,MovingShift,MODE_SMA,PRICE_CLOSE,0); maL1=iMA(NULL,0,MovingPeriodL,MovingShift,MODE_SMA,PRICE_CLOSE,1); //--- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //--- check order type if(OrderType()==OP_BUY) { if(maS1>maL1 && maS0<maL0) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White)) Print("OrderClose error ",GetLastError()); } break; } if(OrderType()==OP_SELL) { if(maS1<maL1 && maS0>maL0) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White)) Print("OrderClose error ",GetLastError()); } break; } } //--- }
これで長期を短期が上抜けで買い、長期を短期がした抜けで売り、ポジション取った後は逆の条件で決済
というEAがおそらくできたはず…
それではJPYUSD5分足でいざバックテスト!

見事な右下がりになりました…