Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 714

 
dimnik:

С использованием OnTradeTransaction странно изменилось время оптимизации. Система на 15М, очень простая, история годовая, один прогон происходит за 0,3 - 0,4 секунды.

После запуска оптимизации первые 200-300 прогонов идут со скоростью меньше секунды, следующие замедляются вплоть до 15-20 секунд (в 50 раз!);

Перегрева процессора и троттлинга нет, памяти свободно больше половины (из 16 ГБ).

До использования обработчика OnTradeTransaction ничего подобного не было - даже более сложные советники на мелких таймфреймах оптимизировались с примерно одинаковой скоростью.

Это HistoryDealSelect так сильно влияет на скорость? Как можно ликвидировать тормоза?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long     deal_type         =0;
   double   deal_volume       =0;
   long     deal_magic        =0;
   if(HistoryDealSelect(trans.deal))
     {
      deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
      deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
      deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
     }
   else
      return;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


 

Покажите весь код. 
 

Привет!

Кто знает - как в индикаторе отобразить бары, которые будут находиться справа от нулевого бара и сколько их максимум? (прогноз цены чтобы сделать)

 
dimnik:

Это HistoryDealSelect так сильно влияет на скорость? Как можно ликвидировать тормоза?

Разработчики рекомендуют сводить к минимуму вызов History-функций (дорогие) - через кэширование истории.

Рабочее такое решение выкладывал в кодобазу (MT4Orders), но Вам оно, наверное, не подойдет.

После использования кэширования тормозов не наблюдал.

 

ЗЫ Хотя, в Вашем OnTradeTransaction тормозить не должно, хоть и написан не оптимально.

 
Renat Akhtyamov:

Привет!

Кто знает - как в индикаторе отобразить бары, которые будут находиться справа от нулевого бара и сколько их максимум? (прогноз цены чтобы сделать)

К времени открытия последнего бара приплюсуй PeriodSeconds() и туда рисуй графическими объектами свечу. Максимум сколько будет видно справа. Но не проверял как будет отображаться если попадёт выходной. Наверное надо самостоятельно учитывать.
 
Alexey Viktorov:
К времени открытия последнего бара приплюсуй PeriodSeconds() и туда рисуй графическими объектами свечу. Максимум сколько будет видно справа. Но не проверял как будет отображаться если попадёт выходной. Наверное надо самостоятельно учитывать.
Сенкс, получилось!
 
Alexey Viktorov:
К времени открытия последнего бара приплюсуй PeriodSeconds() и туда рисуй графическими объектами свечу. Максимум сколько будет видно справа. Но не проверял как будет отображаться если попадёт выходной. Наверное надо самостоятельно учитывать.

На чарте рисует продолжение, а в окне индикатора - к сожалению нет.

Может быть я конечно ошибаюсь...

Что скажете - можно ли продолжить линию индикатора за нулевой бар вправо?

 
Кто в курсе - можно ли продолжить линию индикатора за нулевой бар вправо?
 
Renat Akhtyamov:
Кто в курсе - можно ли продолжить линию индикатора за нулевой бар вправо?
Можно. Можно поставить сдвиг, но сделать расчёт по не существующим значениям наверное не получится, да и в отображении индикатора не используется время. Потому я и говорил об отображении баров графическими элементами. В ObjectCreate() присутствует и номер окна(подокна) и время. Так-что проблем с созданием графических элементов быть не должно.
 
Alexey Viktorov:
Можно. Можно поставить сдвиг, но сделать расчёт по не существующим значениям наверное не получится, да и в отображении индикатора не используется время. Потому я и говорил об отображении баров графическими элементами. В ObjectCreate() присутствует и номер окна(подокна) и время. Так-что проблем с созданием графических элементов быть не должно.

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

Однако сделать то же самое в окне индикатора не удается. То есть записать значения в буфер индикатора с индексом -1, -2 и прочее не получается.

Вопрос в этом.

В принципе понятно. Выход - построение индикатора графическими объектами.

 
Renat Akhtyamov:

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

Однако сделать то же самое в окне индикатора не удается. То есть записать значения в буфер индикатора с индексом -1, -2 и прочее не получается.

Вопрос в этом.

В принципе понятно. Выход - построение индикатора графическими объектами.

Рассчитать второй буфер на нормальных его значениях, например (если нужно 10 баров рассчитать для отображения "будущего"), то посчитать этот буфер на значениях Buff[9] -- Buff[8] -- Buff[n] -- Buff[0], а потом вывести этот буфер с не нулевым смещением. Задать смещение буфера на нужное количество баров в будущее - на 10 в данном случае
Причина обращения: