Помогите с роботом.

 

Здравствуйте! Помогите найти ошибку в роботе.

Он создан на основе двух скользящих средних периодами 7 и 17. Должен ставится отложенный ордер (BuyStop, приказ sellstop) при перекрещении двух мА. Закрытие происходит по трейлинг стопу и по времени.

А в результате открываются сделки помимо отложенных и текущие (Покупка, Продажа). И сделки ставятся на каждом баре, а не на перекрещении.

Файл робота внизу.

//+------------------------------------------------------------------+
//|                                                     Mr. gold.mq4 |
//|                                                         Mr. gold |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mr. gold"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lots             = 0.1;
extern int ChannelDistance     = 100;
extern int Magic               = 8888;   
extern int StopLoss            = 0,
           TakeProfit          = 0,
           TrailingStop        = 0;
extern int ExpirationOrder     = 0;
extern double Rastvor          = 0;    // Расстояние между МА 
           
int Bar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
   
int start()
{
   double minstoplevel;
   double price;
   double stoploss;
   double takeprofit;
   int ticket, Slippage;
   int cnt = OrdersTotal();
   double MA_1, MA_2;
   
   int Order_Total_Amount_BUYSTOP, Order_Total_Amount_SELLSTOP;
       
   if (Bars > Bar &&
      cnt < 2)
      
   {
      MA_1=iMA(NULL,0,7,0,MODE_SMA,PRICE_TYPICAL,0);
      MA_2=iMA(NULL,0,17,0,MODE_SMA,PRICE_CLOSE,0);
         
      minstoplevel=NormalizeDouble((MarketInfo(Symbol(),MODE_SPREAD)*2+1)*Point,Digits);
      
      for (int I = OrdersTotal () - 1; I >= 0; I --)
      {
        OrderSelect (I, SELECT_BY_POS);
      
        if (OrderType () == OP_BUYSTOP)
      {        
         Order_Total_Amount_BUYSTOP ++;
      }
        if (OrderType () == OP_SELLSTOP)
      {
         Order_Total_Amount_SELLSTOP ++;
      }      
      }
      
      // Print("Minimum stop Level=",minstoplevel," points");
      
      // Buy
      if (MA_1!=EMPTY_VALUE &&
      MA_1!=0 &&
      MA_2!=EMPTY_VALUE &&
      MA_2!=0)
      if (MA_1>MA_2+Rastvor*Point)
      if (Order_Total_Amount_BUYSTOP==0)
      {
         price=NormalizeDouble(Bid+minstoplevel+ChannelDistance*Point,Digits);
         //--- вычисленные значения цен SL и TP должны быть нормализованы
         
         if (StopLoss>0)
         stoploss=NormalizeDouble(price-StopLoss*Point,Digits);
         
         if (TakeProfit>0)
         takeprofit=NormalizeDouble(price+TakeProfit*Point,Digits);
         //--- размещаем рыночный ордер на покупку лота
         ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,price,30,stoploss,takeprofit,"",Magic,TimeCurrent()+ExpirationOrder,clrGreen);      
      }
            
      // Sell
      if (MA_1!=EMPTY_VALUE &&
      MA_1!=0 &&
      MA_2!=EMPTY_VALUE &&
      MA_2!=0)
      if (MA_1<MA_2-Rastvor*Point)
      if (Order_Total_Amount_SELLSTOP==0)
      {
         price=NormalizeDouble(Bid-minstoplevel-ChannelDistance*Point,Digits);
         //--- вычисленные значения цен SL и TP должны быть нормализованы
            
         if (StopLoss>0)
         stoploss=NormalizeDouble(price+StopLoss*Point,Digits);
            
         if (TakeProfit>0)
         takeprofit=NormalizeDouble(price-TakeProfit*Point,Digits);
         //--- размещаем рыночный ордер на покупку лота
         ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,price,30,stoploss,takeprofit,"",Magic,TimeCurrent()+ExpirationOrder,clrRed);
      }
      // Прочие
      
      Bar = Bars;
   }
   
   // Трейлинг-стоп
   
   Order_Modify_Trailing_Stop ();  
   
   return(0);
}
 
// МОДИФИКАЦИЯ ОРДЕРА

void Order_Modify_Trailing_Stop ()
{
   // СТОП-УРОВНИ
   
   for (int I = OrdersTotal () - 1; I >= 0; I --)
   {
      OrderSelect (I, SELECT_BY_POS);
      
      if (OrderMagicNumber () == Magic)
      {
         // СТОП-УРОВНИ
         
         if (TrailingStop > 0)
         {
            if (OrderType () == OP_BUY ||
               OrderType () == OP_BUYSTOP ||
               OrderType () == OP_BUYLIMIT)
            {
               // Установка
               
               if (NormalizeDouble (MarketInfo (OrderSymbol (), MODE_BID) - OrderOpenPrice (), MarketInfo (OrderSymbol (), MODE_DIGITS)) > NormalizeDouble (TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) &&
                  (NormalizeDouble (MarketInfo (OrderSymbol (), MODE_BID) - TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) > OrderStopLoss () || OrderStopLoss () == 0))
               {
                  OrderModify (OrderTicket (), OrderOpenPrice (), NormalizeDouble (MarketInfo (OrderSymbol (), MODE_BID) - TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)), OrderTakeProfit (), OrderExpiration ());
                  
                  OrderSelect (OrderTicket (), SELECT_BY_TICKET);
               }
            }
            
            if (OrderType () == OP_SELL ||
               OrderType () == OP_SELLSTOP ||
               OrderType () == OP_SELLLIMIT)
            {
               // Установка
               
               if (NormalizeDouble (OrderOpenPrice () - MarketInfo (OrderSymbol (), MODE_ASK), MarketInfo (OrderSymbol (), MODE_DIGITS)) > NormalizeDouble (TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) &&
                  (NormalizeDouble (MarketInfo (OrderSymbol (), MODE_ASK) + TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)) < OrderStopLoss () || OrderStopLoss () == 0))
               {
                  OrderModify (OrderTicket (), OrderOpenPrice (), NormalizeDouble (MarketInfo (OrderSymbol (), MODE_ASK) + TrailingStop * MarketInfo (OrderSymbol (), MODE_POINT), MarketInfo (OrderSymbol (), MODE_DIGITS)), OrderTakeProfit (), OrderExpiration ());
                  
                  OrderSelect (OrderTicket (), SELECT_BY_TICKET);
               }
            }
         }
      }
   }
}

  //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }

 



Файлы:
 
Anna_89:
...
Э нормал лангуич уил би эйбл ту урэйт?
 
А зачем надо было исходный код переводить на русский. Или это у меня что то с форумом не то. 
 
Vitalii Ananev:
А зачем надо было исходный код переводить на русский. Или это у меня что то с форумом не то. 
Ну что ж вы так ... Всю интригу сломали ... Надо было продолжить курс, означенный в моём первом сообщении ... Нам же топикстартер задала вектор общения
 
Artyom Trishkin:
Ну что ж вы так ... Всю интригу сломали ... Надо было продолжить курс, означенный в моём первом сообщении ... Нам же топикстартер задала вектор общения
Я не специально. :) Первым делом подумал, что это у меня с форумом что то не то. Поэтому и уточнил.  Сегодня экспериментировал с таймером личных сообщений. После чего все свежие сообщения стали загадочным образом пропадать стоит только обновить страницу. Вот сначала и подумал, что перевод исходника это следствие моих экспериментов. 
 
Anna_89:

Здравствуйте! Помогите найти ошибку в роботе.

Он создан на основе двух скользящих средних периодами 7 и 17. Должен ставится отложенный ордер (BuyStop, приказ sellstop) при перекрещении двух мА. Закрытие происходит по трейлинг стопу и по времени.

А в результате открываются сделки помимо отложенных и текущие (Покупка, Продажа). И сделки ставятся на каждом баре, а не на перекрещении.


Правильно вставляем код на форуме. И переводить код с английского на русский не нужно :).
 
if (MA_1!=EMPTY_VALUE &&
      MA_1!=0 &&
      MA_2!=EMPTY_VALUE &&
      MA_2!=0)

А что, бывает и так?

 
      MA_1=iMA(NULL,0,7,0,MODE_SMA,PRICE_TYPICAL,0);
      MA_2=iMA(NULL,0,17,0,MODE_SMA,PRICE_CLOSE,0);

Первое что сразу в глаза бросается:  Значения мувингов берутся на текущем, еще не сформированном баре. Эти значения меняются каждый тик.

if (MA_1<MA_2-Rastvor*Point)

 Второе: условие пересечение задано не верно. Данное логическое выражения вычисляет только лишь является ли значение MA_1 меньше (МА_2 - Rastvor*Point). Поэтому если это значение истинно и выражение

if (Order_Total_Amount_BUYSTOP==0)

тоже истинно то у вас каждый тик будут открываться новые ордера.

 
int start()
{

   if (Bars > Bar &&
      cnt < 2)
      
   {

      ...действия, которые надо производить только при появлении нового бара
      
      Bar = Bars;
   }
   

   return(0);
}

Логика с работой по открытию нового бара так не работает, это легко увидеть, сравнив результаты тестирования по ценам открытия и по всем тикам.

Причина обращения: