EAを改良してみたがダメ

当初考えていたトレードルールに忠実に実装を直して、トレンドラインを考慮するようにしたりしてみたが、運用実績は単調減少のまま。
スプレッドを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();
    }
//----
}
//+------------------------------------------------------------------+