当初考えていたトレードルールに忠実に実装を直して、トレンドラインを考慮するようにしたりしてみたが、運用実績は単調減少のまま。
スプレッドを0にしても、同じなので、何かおかしい気がする(PyAlgoで実装していた時はうまくいっていたのに)。
まあ、改良して、多少減少スピードは鈍化したようではあるのだが。
うーん。。。
【運用実績のグラフ】
https://gyazo.com/3fa7daf1639307bec6fdba6e8acb60de
【EAのコード】
#define MAGICMA 20150810 #define TRADE_TYPE_BUY 1 #define TRADE_TYPE_SELL 2 #define TRADE_TYPE_NOT_HAVE 3 #define MA_PERIOD 20 #define FALSE 0 #define TRUE 1 int touch_top(double ma_cur, double ma_prev1, double ma_prev2) { if (Open[2] < ma_prev2 && Close[2] > ma_prev2 && Open[1] > ma_prev1 && Close[1] < ma_prev1){ return TRUE; } else { return FALSE; } } int touch_bottom(double ma_cur, double ma_prev1, double ma_prev2) { if (Open[2] > ma_prev2 && Close[2] < ma_prev2 && Open[1] < ma_prev1 && Close[1] > ma_prev1){ return TRUE; } else { return FALSE; } } int cross_above(double ma_cur, double ma_prev1) { if (Open[1] < ma_prev1 && Close[1] > ma_prev1){ return TRUE; } else { return FALSE; } } int cross_below(double ma_cur, double ma_prev1) { if (Open[0] > ma_cur && Close[0] < ma_cur){ return TRUE; } else { return FALSE; } } int double_under_ma(double ma_cur, double ma_prev1) { if (Close[1] < ma_prev1 && Close[0] < ma_cur){ return TRUE; } else { return FALSE; } } int double_over_ma(double ma_cur, double ma_prev1) { if (Close[1] > ma_prev1 && Close[0] > ma_cur){ return TRUE; } else { return FALSE; } } int check_active_order() { for(int i = 0;i < OrdersTotal();i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false){ break; } if(OrderMagicNumber() != MAGICMA || OrderSymbol() != Symbol()){ continue; } return TRUE; } return FALSE; } double get_trend(int bars) { return (Close[0] - Close[bars])/(double)bars; } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma_cur; double ma_prev1; double ma_prev2; //---- go trading only for first tiks of new bar if(Volume[0] > 1){ return; } //---- get Moving Average ma_cur = iMA(NULL, 0, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 0); ma_prev1 = iMA(NULL, 0, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 1); ma_prev2 = iMA(NULL, 0, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 2); //---- buy conditions if(touch_bottom(ma_cur, ma_prev1, ma_prev2) && get_trend(12) > 0.01) { OrderSend(Symbol(), OP_SELL, NormalizeDouble(AccountFreeMargin()*0.1/1000.0,1), Bid, 3, 0, 0, "", MAGICMA, 0, Blue); return; } //---- sell conditions if(touch_top(ma_cur, ma_prev1, ma_prev2) && get_trend(12) < 0.01) { OrderSend(Symbol(), OP_BUY, NormalizeDouble(AccountFreeMargin()*0.1/1000.0,1), Ask, 3, 0, 0, "", MAGICMA, 0, Red); return; } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma_cur; double ma_prev1; double ma_prev2; double ma5_cur; //---- go trading only for first tiks of new bar if(Volume[0] > 1) { return; } //---- get Moving Average ma_cur = iMA(NULL, 0, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 0); ma_prev1 = iMA(NULL, 0, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 1); ma_prev2 = iMA(NULL, 0, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 2); ma5_cur = iMA(NULL, 0, 5, 0, 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(double_under_ma(ma_cur, ma_prev1) || Close[0] < ma5_cur || Low[0] < ma5_cur || OrderProfit() > AccountFreeMargin()*(-0.07)){ OrderClose(OrderTicket(), OrderLots(), Bid, 3, White); } break; } if(OrderType() == OP_SELL) { if(double_over_ma(ma_cur, ma_prev1) || High[0] > ma5_cur || High[0] > ma5_cur || OrderProfit() > AccountFreeMargin()*(-0.07)){ OrderClose(OrderTicket(), OrderLots(), Ask, 3, White); } break; } } //---- } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if (Bars < 100 || IsTradeAllowed() == false){ return; } //---- calculate open orders by current symbol if (check_active_order() == FALSE){ CheckForOpen(); } else { CheckForClose(); } //---- } //+------------------------------------------------------------------+