CustomSymbolXXX проблемы - страница 2

 

да, действительно - если первым ставить SYMBOL_CALC_TRADE_FUTURES, а объёмы задавать последними в порядке VOLUME_STEP,VOLUME_MAX,VOLUME_MIN

то можно задавать CURRENCY_BASE, CURRENCY_PROFIT и VOLUME_MIN 

прочие опции не смотрел - по ходу дела, потом уже..

про то что CustomSymbolSetString() может быть true и при этом ничего не сделать, нехороший осадочек :-) 

 
Maxim Kuznetsov #:

да, действительно - если первым ставить SYMBOL_CALC_TRADE_FUTURES, а объёмы задавать последними в порядке VOLUME_STEP,VOLUME_MAX,VOLUME_MIN

то можно задавать CURRENCY_BASE, CURRENCY_PROFIT и VOLUME_MIN 

прочие опции не смотрел - по ходу дела, потом уже..

про то что CustomSymbolSetString() может быть true и при этом ничего не сделать, нехороший осадочек :-) 

даже тики, свечи оптом работает :-)

правда боюсь, что если стаканы добавить то бобик сдохнет и не потянет;

310 стаканов по 50 уровней, с обновлениями раз в 10ms это некоторый перебор будет

 

SYMBOL_BANK не сохраняется . Оно конечно опциональное, но непорядок что его нельзя задать.

SYMBOL_BANK

Feeder of the current quote

 

оригинально как-то всё работает..

1. Отдельная DLL обеспечивает всю связь и кладёт в очередь пред-подготовленные данные.

2. Сервис MT5 в цикле:

   2.1 забирает все сообщения из очереди (чтобы за каждым сообщением не блокировать)

   2.2 Обрабатывает каждое сообщение (в результате вызывает CustomTicksAdd и CustomRatesUpdate)

   2.3 Sleep(N) милисек. (разгрузка)

И тут начинаются чудеса:

   если N=30 милисек, то сообщений на цикл обрабатывается мало, но втормаживают TicksAdd, RatesUpdate 

   если N=50 сообщений в цикле больше, но и TicksAdd RatesUpdate работают лучше..

   при N=100 и тем паче 300 , тормозов TicksAdd RatesUpdate практически нет.  Вот только с таким таймером, смысл тиков теряется - слишком большая задержка

 

Возможно что-то с кешами процессора и планировщиком. 

Если Sleep() совсем убрать или заменить на SwitchToThread() - то снова всё хорошо, TicksAdd и RatesUpdate без тормозов.

но и нагрузка на ЦП получается 8%, бесконечный цикл 

а если Sleep() то видимо или успевают кеши протухнуть или по ядрам неудачно мигрирует, поэтому следующий за ним TicksAdd RatesUpdate могут втормозить на ровном месте

 
Maxim Kuznetsov #:

Возможно что-то с кешами процессора и планировщиком. 

Если Sleep() совсем убрать или заменить на SwitchToThread() - то снова всё хорошо, TicksAdd и RatesUpdate без тормозов.

но и нагрузка на ЦП получается 8%, бесконечный цикл 

а если Sleep() то видимо или успевают кеши протухнуть или по ядрам неудачно мигрирует, поэтому следующий за ним TicksAdd RatesUpdate могут втормозить на ровном месте

глядишь, кому пригодится: организация цикла внутри сервиса MT5:

#include <winapi/processthreadsapi.mqh>

class Service {
public:
        void OnStart(); // однократный проход, в стиле скрипта
        void Run();     // повторение OnStart пока не вызван ExpertRemove()
};

void Service::Run() {
   while(!IsStopped()) {
      mscStamp=GetMicrosecondCount()/1000;
      OnStart();  // обработка очереди
      if (IsStopped()) {
         break;
      }
      if (GetMicrosecondCount()/1000-mscStamp<100) {
         // практически ничего не делали - можно спать
         Sleep(30);
      } else {
         // что-то большое делали - вероятно что снова накидано сообщений, надо быстрее повторить
         SwitchToThread();      
      }
}

более менее, и ЦП разгружался и упомянутые TicksAdd RatesUpdate меньше втормаживают

 

помимо строгой очерёдности CustomSymbolSetXXX

видимо (причём скорее от билда-к-билду) должна быть правильная очерёдность CustomTickAdd CustomRatesUpdate, при которой они оба работают быстрее. 

например всё по одному символу (тики далее свечи или наоборот, или по очерёдности), потом по следующему символу и так далее. И там ещё где-то CustomBookAdd между ними потом :-)

потому что если всё пихать строго как оно приходит, получается странно, с дикими провалами :

(на скриншоте только то что дольше 250ms)


иногда на единичный TickAdd, RatesUpdate уходит больше времени как на 250.

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