前回
Moving Average.mq4を移動平均線のゴールドクロス・デッドクロスに改造
http://trading-fx.blog.jp/archives/9191662.html
で移動平均線同士のクロスでエントリー・イグジットするEAを作りました。
しかしバックテストの結果は見事な右下がり…

この条件でトレードするとダメという事ですね。
ん?じゃあこのエントリー・イグジットを逆にしたらどうなる?
という事で4か所書き換えて条件を逆に変えてみます。
ポジションを持つ条件を逆に変えます。
//+------------------------------------------------------------------+
//| 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;
}
//---
}
これの二か所を変えます。
//+------------------------------------------------------------------+
//| 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;
}
//---
}
お次は決済の条件。
//+------------------------------------------------------------------+
//| 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;
}
}
//---
}
これも二か所変えます。
//+------------------------------------------------------------------+
//| 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;
}
}
//---
}
これでエントリー・イグジットの条件が逆になりました。
さあ、それでバックテストをしてみた結果…

ダメみたいですね…
そう単純にいかないものですね。