Помогите пожалуйста новичку разобраться с кодом советника Moving Average

 

Здравствуйте! Просьба помочь разобраться в коде, что делаю не так. Сразу скажу я в программирование новичок. Прочитал учебник mql4 и просмотрел множество кодов экспертов, но так и не смог найти ответы на свои вопросы. Терминал у меня с 5 знаками, торговый счёт ECN, изменяющийся спред + комиссия. Советник самый простой, открывает сделки на продажу при пересечении быстрой МА медленную МА сверху вниз и наоборот на покупку - пересечение быстрой МА медленную МА снизу вверх. На самом деле ТС намного сложнее, просто пока не работают нормально все основные функции и не могу ему нормально тестировать, а уж тем более оптимизировать, решил не усложнять код лишними расчётами. Вот сам код советника.

#define MAGICMA  20050610
extern string text1              ="===========================MoneyManagment===========================";
extern double Lots               = 0.1;
extern string text2              ="======================Simple_Close_settings=========================";
extern double TakeProfit         = 100;
extern double StopLoss           = 100;
extern double Bezubitok          = 30; //Расстояние, через которое пройдёт цена от открытия сделки в "+", чтобы перенести СтопЛос в безубыток
extern string text3              = "===================TrailingStopLoss_settings=======================";
extern double Trailing           = 100; //Расстояние, через которое будет подтягиватся СтопЛос к текущей цене
extern double Slippage           = 3; // Допуск проскальзования цены при открытии и закрытии сделок
extern string text4              = "===================Indicator_Trade_System_settings=================";
extern int    Fast_EMA_Period    = 8;
extern int    Slow_EMA_Period    = 21;




//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen()
  {
   double X1,X2,X3,X4;
   int ticket;

   
   X1=iMA(NULL,0,Fast_EMA_Period,0,MODE_EMA,PRICE_CLOSE,1);
   X2=iMA(NULL,0,Slow_EMA_Period,0,MODE_EMA,PRICE_CLOSE,1);
   X3=iMA(NULL,0,Fast_EMA_Period,0,MODE_EMA,PRICE_CLOSE,2);
   X4=iMA(NULL,0,Slow_EMA_Period,0,MODE_EMA,PRICE_CLOSE,2);
//----
if(Volume[0]>1) return;
  {   
      //ENTRY Ask(buy, long) 
      if (X3<=X4 && X1>X2)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,",",MAGICMA,0,White);
        }
      //ENTRY Bid (sell, short)
      if (X3>=X4 && X1<X2)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,",",MAGICMA,0,Red);
        }
  }
//----
  }
//+------------------------------------------------------------------+
//| Check for TrailingStop                                           |
//+------------------------------------------------------------------+
void CheckForTrailing()
 {

     if (Trailing>0) for(int i=0; i<=OrdersTotal();i++) 
     {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
           if (OrderMagicNumber()==MAGICMA && OrderSymbol()==Symbol()) 
           {
            if (OrderType()==OP_BUY && Bid-OrderOpenPrice()>Trailing*Point && Bid-OrderStopLoss()>Trailing*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trailing*Point,OrderTakeProfit(),0,CLR_NONE);
            if (OrderType()==OP_SELL && OrderOpenPrice()-Ask>Trailing*Point && OrderStopLoss()-Ask>Trailing*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Trailing*Point,OrderTakeProfit(),0,CLR_NONE);
           }
        }
}
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double X1,X2,X3,X4;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average 
   X1=iMA(NULL,0,Fast_EMA_Period,0,MODE_EMA,PRICE_CLOSE,1);
   X2=iMA(NULL,0,Slow_EMA_Period,0,MODE_EMA,PRICE_CLOSE,1);
   X3=iMA(NULL,0,Fast_EMA_Period,0,MODE_EMA,PRICE_CLOSE,2);
   X4=iMA(NULL,0,Slow_EMA_Period,0,MODE_EMA,PRICE_CLOSE,2);
//----
   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(Bid>=(OrderOpenPrice()+TakeProfit*Point)||Bid<=(OrderOpenPrice()-StopLoss*Point))OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
        
      if(OrderType()==OP_SELL)
        {
         if(Ask<=(OrderOpenPrice()-TakeProfit*Point)||Ask>=(OrderOpenPrice()+StopLoss*Point)) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         break;
        }
     }
//----
  }



//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
   if(Bars<25 || IsTradeAllowed()==false) 
     return (0);
   if (AccountFreeMargin()<(100*Point*Lots))
     {
      Print("Стоп! Недостаточно средств для продолжения торговли. Свободная маржа = ", AccountFreeMargin());
      return(0);  
     }
      
   if(Trailing>0) CheckForTrailing();  
     
      
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
   
 
   

   return(0);
  }
//+------------------------------------------------------------------+

Может кто сможет ответить на мои вопросы:

1. При открытии ордеров, в OrderSend где у должны стоять параметры Стоплос и Тейкпрофит у меня стоят нули, при попытки поставить туда другие цифры, эксперт не открывает сделки, я проверил, при ручном открытии сделки есть возможность сразу выставлять СЛ и ТП, в чём может быть дело?

2. Не могу понять, ТП, СЛ и ТС у меня стоят - 100 пунктов, хотя сделки почему-то закрываются не кратно этим пунктам даже с учётом спреда, почему так происходит? Может у меня не работает функция закрытии ордеров? Как в таком случае ограничить убыток изначально установленным СЛ и чтобы он следовал за ценой только в + направление?

3. У моего ДЦ Стоплевел=100 пп., как сделать виртуальные ТП и СЛ, чтобы можно было выставлять уровни меньше Стоплевела, как при ручном закрытии позиций? (Пипсовка на Ecn счетах не возбраняется).

4. Возможно ли сделать следующее и как если можно: сделать реверсивное закрытие и одновременно закрытие по СЛ и ТП с переводом в безубыток (в зависимости от того, какое событие произойдет первым)? Пробовал сделать, но в тестере он открывает одну позицию и не закрывает её до конца теста, а только собирает свопы.) Либо работает что-то одно.

Заранее благодарен всем кто откликнется!

Файлы:
 
ierehon:

Здравствуйте! Просьба помочь разобраться в коде, что делаю не так. Сразу скажу я в программирование новичок. Прочитал учебник mql4 и просмотрел множество кодов экспертов, но так и не смог найти ответы на свои вопросы. Терминал у меня с 5 знаками, торговый счёт ECN, изменяющийся спред + комиссия. Советник самый простой, открывает сделки на продажу при пересечении быстрой МА медленную МА сверху вниз и наоборот на покупку - пересечение быстрой МА медленную МА снизу вверх. На самом деле ТС намного сложнее, просто пока не работают нормально все основные функции и не могу ему нормально тестировать, а уж тем более оптимизировать, решил не усложнять код лишними расчётами. Вот сам код советника.

Может кто сможет ответить на мои вопросы:

1. При открытии ордеров, в OrderSend где у должны стоять параметры Стоплос и Тейкпрофит у меня стоят нули, при попытки поставить туда другие цифры, эксперт не открывает сделки, я проверил, при ручном открытии сделки есть возможность сразу выставлять СЛ и ТП, в чём может быть дело?

2. Не могу понять, ТП, СЛ и ТС у меня стоят - 100 пунктов, хотя сделки почему-то закрываются не кратно этим пунктам даже с учётом спреда, почему так происходит? Может у меня не работает функция закрытии ордеров? Как в таком случае ограничить убыток изначально установленным СЛ и чтобы он следовал за ценой только в + направление?

3. У моего ДЦ Стоплевел=100 пп., как сделать виртуальные ТП и СЛ, чтобы можно было выставлять уровни меньше Стоплевела, как при ручном закрытии позиций? (Пипсовка на Ecn счетах не возбраняется).

4. Возможно ли сделать следующее и как если можно: сделать реверсивное закрытие и одновременно закрытие по СЛ и ТП с переводом в безубыток (в зависимости от того, какое событие произойдет первым)? Пробовал сделать, но в тестере он открывает одну позицию и не закрывает её до конца теста, а только собирает свопы.) Либо работает что-то одно.

Заранее благодарен всем кто откликнется!


Слушайте, ну хотя бы это мне может кто-нибудь объяснить, почему если у меня условие закрытие сделки на buy такое, убыток закрытой сделки может быть в разы больше? У меня в тестере стоплос=80 пунктам, а сделки закрываются и -120 и -200 пунктов. Тоже самое с тейкпрофитом.
 Bid<=(OrderOpenPrice()-StopLoss*Point)