Ошибки, баги, вопросы - страница 1929

 

раньше можно было в ме перетянуть библиотеку DLL и увидеть список доступных функций, сейчас такого нет или как то изменилось все ?

 

В очередной раз ошибка HistorySelect  в тестере. В 1626, вроде, не было. В 1629 - есть.

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}
 
fxsaber:

В очередной раз ошибка HistorySelect  в тестере. В 1626, вроде, не было. В 1629 - есть.

Эксперт работает на вашем компьютере с заранее загруженной информации.

Чтоб отобразиться действие сделанное сейчас , нужно некоторое время (менше 10 секунд) :

1. Ваш терминал отправляет запрос на сервер

2. Сервер обрабатывает

3. Обновляется информация в вашем терминале

4. Уже после то у вас сработает правильно HistorySelect и HistoryDealsTotal

То есть : чтоб видеть последние действие в историю , нужно выполнить Sleep после Trade и перед HistorySelect

... либо каким то способом проверить что история не устарела.

( то же как и с котировок - они у вас есть, но такие какие били в момент загрузки )

 
Ivan Ivanov:
fxsaber:

В очередной раз ошибка HistorySelect  в тестере. В 1626, вроде, не было. В 1629 - есть.

 

Вот пример :

//--- отправка запроса
    if ( !OrderSend(request,result) )
      PrintFormat("OrderSend error %d",GetLastError());
    else
    { Sleep(9999); // Time to get result
      ..... // Здесь мне нужен result
    }

Без Sleep у меня не работает, а когда там 10 секунд - нормально.

https://www.mql5.com/ru/docs/trading/ordersend
Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Ivanov:

Вот пример : 

Речь про тестер.
 
Почти детский вопрос: почему так?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

По какой-то причине был уверен, что после нормализации DoubleToString лишен смысла. Ан нет, как показывает скрипт. Почему так?

Похоже, что неправильно работает приведение double -> string.

 
В тестере очень медленно работают PositionGet-функции. Для демонстрации был написан такой советник
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


Результат одиночного прогона, когда желтые строки закомментированы

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


Результат одиночного прогона, когда желтые строки НЕ закомментированы

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


TesterBench-библиотека показывает такое же падение времени выполнения.


ЗЫ Тормозят не только PositionGet, но и OrderGet, HistoryDealGet, HistoryOrderGet.

 

В тестере (1629) сделки открываются по нулевым ценам

Запускаем советник в тестере по реальным тикам торгового сервера FIBOGroup-MT5 Server


 

Вопрос к разработчикам и заинтересованным коллегам.

В Тестере в режиме визуализации задействован объект класса CiMA - мувинг.

Режим = "Каждый тик на основе реальных тиков". Скорость в Визуализаторе близка к максимальной.

Проблема такая. При появлении нового бара приходится ждать хренову тучу новых тиков, чтобы обновились значения мувингов типа CiMA, а точнее значения в буфере мувинга.

При этом на каждом тике форсируется обновление посредством метода CiMA::Refresh(-1).

Почему так хреново работает Тестер?

На реале таких проблем нет.