Советник проходит тест, но не работает на реальном счете.

 

Господа!

У меня имеется советник, который проводит тест стратегии на Metatrader5. Но, если его запустить на демо-счете, он работает некорректно. Отличаются ли условия для советника: на тестере, на раельном счете и на демо-счете?

 

вопрос задаете с подвохом.

варианты ответов такие же

1. не отличется

2. отличается.

потому как все зависит от ваших алгоритмов.

 

Подвоха нет. Я ищу причину того, почему тесты на MT5 проходят, как ожидается, а на реальном времени не всё отрабатывается. Просто не знаю с какой стороны подойти, и как по-другому задать вопрос.

 
alanat:

Подвоха нет. Я ищу причину того, почему тесты на MT5 проходят, как ожидается, а на реальном времени не всё отрабатывается. Просто не знаю с какой стороны подойти, и как по-другому задать вопрос.

Обычно еще код необходимо приложить, что бы повторить вашу ошибку. Если боитесь выкладывать код в публичный доступ, то вам в сервисдеск
 

Программа отрабатывается до строчки  Print("Вход в рынок");

А строка Print("Ожидание входа в рынок перенесено на следующие сутки"); не отрабатывается, и ниже тоже не отрабатывается.

 

 

 

 

#define TIME_DIFFERENCE 0
//////////////////////////////////////////////////////////////////////
//для московского времени 0
///////////////////////////////////////////////////////////////////////

#define STOPLOSS 7000
///////////////////////////////////////////////////////////////////////
//STOPLOSS - переменная для stop loss в пунктах
//////////////////////////////////////////////////////////////////////
#define CHECK_TIME 22
///////////////////////////////////////////////////////////////////////
//время, когда надо проверять свечи в 10 и 11 часов
//////////////////////////////////////////////////////////////////////


int OnInit()
  {
   return(0);
  }

void OnDeinit(const int reason)
  {
  
  }

void OnTick()
  {
      MqlDateTime time_cur;
      MqlRates rates[];
      MqlTradeRequest request;
      MqlTradeResult result;
      MqlTick prices;
     
      TimeCurrent(time_cur);
      SymbolInfoTick(Symbol(), prices);
     
      ArraySetAsSeries(rates,true);
      CopyRates (Symbol(), 0, 0, 22, rates);
      //rates[CHECK_TIME-11] - в 11
      //rates[CHECK_TIME-10] - в 10
      
     
      
      if (!GlobalVariableCheck("price_save")) GlobalVariableSet("price_save", 0.0);
      if (!GlobalVariableCheck("signal1")) GlobalVariableSet("signal1", 0);
      if (!GlobalVariableCheck("signal2")) GlobalVariableSet("signal2", 0);
     
      request.action = TRADE_ACTION_DEAL;
      request.symbol = Symbol();
      request.deviation = 5;
      request.type_filling = ORDER_FILLING_AON;
      request.type_time = ORDER_TIME_GTC;
     


      if ((time_cur.hour == CHECK_TIME-TIME_DIFFERENCE) && (time_cur.min == 0) && (time_cur.sec == 0) && (GlobalVariableGet("signal1") == 0))
         {
            printf("%d.00", time_cur.hour);
            if (PositionsTotal() == 0)
               {
                  if ((rates[CHECK_TIME-10].open < rates[CHECK_TIME-10].close) && (rates[CHECK_TIME-11].open > rates[CHECK_TIME-11].close))
                     {
                     
                        request.type = ORDER_TYPE_SELL;
                        request.price = prices.bid;
                        request.sl = prices.bid + STOPLOSS*SymbolInfoDouble(Symbol(), SYMBOL_POINT);
                        request.tp = 0.0;
                        request.volume = 0.1*MathFloor(10*AccountInfoDouble(ACCOUNT_BALANCE)*13/100000);
///////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////
                        GlobalVariableSet("balance_save", AccountInfoDouble(ACCOUNT_BALANCE));
                        GlobalVariableSet("price_save", request.price);
                        OrderSend(request, result);
                        while ((result.retcode == TRADE_RETCODE_PRICE_CHANGED) || (result.retcode == TRADE_RETCODE_REQUOTE) || (result.retcode == TRADE_RETCODE_REJECT) || (result.retcode == TRADE_RETCODE_CANCEL) || (result.retcode == TRADE_RETCODE_CONNECTION))
                           {
                          
                              SymbolInfoTick(Symbol(), prices);
                              request.price = prices.bid;
                              request.sl = prices.bid + STOPLOSS*SymbolInfoDouble(Symbol(), SYMBOL_POINT);
                              GlobalVariableSet("price_save", request.price);
                              OrderSend(request, result);
                           }
                        Print("Вход в рынок");
                     }
                     else Print("Ожидание входа в рынок перенесено на следующие сутки");
                      
               }
            else Print("Есть незакрытая позиция");
            GlobalVariableSet("signal1", 1);
         }
      if ((time_cur.hour == CHECK_TIME-TIME_DIFFERENCE) && (time_cur.min == 1) && (time_cur.sec == 0)) GlobalVariableSet("signal1", 0);
    
      if ((time_cur.hour == CHECK_TIME+1-TIME_DIFFERENCE) && (time_cur.min == 0) && (time_cur.sec == 0) && (GlobalVariableGet("signal2") == 0) && (PositionsTotal() > 0))
         {
               if (rates[1].open > rates[1].close)
                  {
                     PositionSelect(Symbol());
                     request.type = ORDER_TYPE_BUY;
                     request.price = prices.ask;
                     request.volume = PositionGetDouble(POSITION_VOLUME);
                     request.sl = 0.0;
                     request.tp = 0.0;
                     OrderSend(request, result);
                     while ((result.retcode == TRADE_RETCODE_PRICE_CHANGED) || (result.retcode == TRADE_RETCODE_REQUOTE) || (result.retcode == TRADE_RETCODE_REJECT) || (result.retcode == TRADE_RETCODE_CANCEL) || (result.retcode == TRADE_RETCODE_CONNECTION))
                           {
                              SymbolInfoTick(Symbol(), prices);
                              request.price = prices.ask;
                              request.sl = 0.0;
                              request.tp = 0.0;
                              OrderSend(request, result);
                           }
                     Print("Позиция закрыта. TP");
                     Print("Текущий баланс = ", AccountInfoDouble(ACCOUNT_BALANCE));
                  }
               else GlobalVariableSet("signal2", 1);
         }
      if ((GlobalVariableGet("signal2") == 1) && (prices.ask <= (GlobalVariableGet("price_save") - 0.00020)) && (PositionsTotal() > 0))
 
         {
            PositionSelect(Symbol());
            request.type = ORDER_TYPE_BUY;
            request.price = prices.ask;
            request.volume = PositionGetDouble(POSITION_VOLUME);
            request.sl = 0.0;
            request.tp = 0.0;
            OrderSend(request, result);
            while ((result.retcode == TRADE_RETCODE_PRICE_CHANGED) || (result.retcode == TRADE_RETCODE_REQUOTE) || (result.retcode == TRADE_RETCODE_REJECT) || (result.retcode == TRADE_RETCODE_CANCEL) || (result.retcode == TRADE_RETCODE_CONNECTION))
                           {
                              SymbolInfoTick(Symbol(), prices);
                              request.price = prices.ask;
                              request.sl = 0.0;
                              request.tp = 0.0;
                              OrderSend(request, result);
                           }


            Print("Позиция закрыта. SL");
            Print("Текущий баланс = ", AccountInfoDouble(ACCOUNT_BALANCE));
            GlobalVariableSet("signal2", 0);
         }
  } 

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

Отклонение в 5 пунктов при спреде 20-30 пунктов это постоянные реквоты.

Такая девиация практически убивает торговлю.

ЗЫ кстати код вставляется через кнопочку SRC

 

Советник писался не мной, но по моей стратегии. Поэтому в тонкостях программирования ничего не понимаю. Что за кнопочка SRC? И что делать с отклонением в 5 пунктов?

 
alanat:

И что делать с отклонением в 5 пунктов?

Найдите в коде строчку со словом deviation и поставьте вместо 5 значение 50. Видимо, код создавался без учёта 5-значных котировок.

SRC - это в верхней панели диалогового окошка. Помогает разместить на форуме код в формате, удобном для чтения. 

 
alanat:

Советник писался не мной, но по моей стратегии. Поэтому в тонкостях программирования ничего не понимаю. Что за кнопочка SRC? И что делать с отклонением в 5 пунктов?

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

А мой совет - отказаться от советника, максимальная и абсолютная просадка по средствам которого достигает уровня первоначального депозита (см. картинку).

 

 
Yedelkin:

Найдите в коде строчку со словом deviation и поставьте вместо 5 значение 50. Видимо, код создавался без учёта 5-значных котировок.

 

Т.е. "5" - это изменение цены пока идет запрос с терминала на сервер в пунктах?

 

 
ForexMoneyMaker:

А мой совет - отказаться от советника, максимальная и абсолютная просадка по средствам которого достигает уровня первоначального депозита (см. картинку).

 

 

Советник тестился на периоде 01.01.10 - 03.09.11

В итоге выходит в безубыток 

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