Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 43

 
fxsaber:

Не понял. Если в БД что-то изменилось, то единственный способ узнать это - сравнить с предыдущим состоянием БД.

Можно сравнивать каждый соответствующий элемент БД. Либо вычислить из них хэш и сравнить хэши.

Терминал об этом изменении уже знает (OnTrade). Вот и хочется узнать о нем в своей функции.

 
fxsaber:

Особенно актуально для MT4, где шаг изменение time_msc равен 1000 мс.

Плохо, это делает невозможным использование самого простого из известных мне на данный момент вариантов.

 
Andrey Khatimlianskii:

Терминал об этом изменении уже знает (OnTrade). Вот и хочется узнать о нем в своей функции.

Trade-события нет в MT4.

 
fxsaber:

Trade-события нет в MT4.

Его просто не пробросили в МКЛ. Терминал же обновляет список сделок не по таймеру.

 
Andrey Khatimlianskii:

Его просто не пробросили в МКЛ. Терминал же обновляет список сделок не по таймеру.

Поэтому только через проверку.

 
Andrey Khatimlianskii:

1. Какой самый дешевый способ узнать, что вызов функции происходит на том же тике, что и предыдущий вызов?

Время (TimeCurrent) может остаться тем же, время в мс из SymbolInfoTick, теоретически, тоже.

Сравнивать бид, аск и время в мс — дороговато.

Вариант с организацией контроля в самом советнике не предлагать, хочется именно универсальную независимую функцию получить.


2. Аналогичный вопрос для торговых операций. Как узнать, что с момента последнего запуска что-то изменилось в списке ордеров/позиций (включая уровни открытия, СЛ и ТП)?

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

Но, опять же, хотелось бы универсального решения.


У кого какие идеи?

Так:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   int count = 0;
   if ( A ) some_func( count );
   if ( B ) some_func( count );
   if ( C ) some_func( count );
}
//+------------------------------------------------------------------+
void some_func( int& count )
{
   if( count++ > 0 )
      return;
      
   // recalculate only once on each tick
}
//+------------------------------------------------------------------+
 
Koldun Zloy:

Так:

Спасибо.

Andrey Khatimlianskii:

Вариант с организацией контроля в самом советнике не предлагать, хочется именно универсальную независимую функцию получить.

 
Andrey Khatimlianskii:

Спасибо.

Раз пока не предложили, подкину идею, куда бы я копал, проверять время последнего PostMessage или типа того, возможно бред, не разбираюсь настолько в Апи.

 
Aleksey Mavrin:

проверять время последнего PostMessage или типа того, возможно бред, не разбираюсь настолько в Апи.

Да, похоже на бред)

Спасибо за попытку.

 
Andrey Khatimlianskii:

Нереально без контроля в самом советнике.

Мало того, не нужно. Запрашиваемая функция будет вызываться в советнике, т.е. по сути является тем же контролем в советнике, только менее инвазивным