OnTick

 

Событие OnTick кто посылает в терминал?

Как заявляют разработчики терминала, событие OnTick накопительное.

Соответственно вопрос: когда оно накопится и кто решает что уже пора, накопилось? ))

Нет все понятно, но кто конкретно? ))

Посылает брокер на свое усмотрение,

или идет напрямую от поставщика котировок независимо от брокера? - Сервер решает: ну всЁ, пора!

 
Никто никуда ничего не посылает, терминал сам это событие генерирует, в момент прихода нового тика.
 
Насколько я понимаю, приходит сигнал от ДЦ с новыми котировками, и по этому событию терминал вызывает у советников функцию OnTick()
 

Матчасть нужно читать, коллега ;-)

NewTick

Событие NewTick генерируется при поступлении новых котировок и обрабатывается функцией OnTick() у присоединенных советников. Если при поступлении новой котировки выполнялась функция OnTick, запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником, так как соответствующее событие не будет поставлено в очередь событий эксперта.

Терминал получает котировки. Приход новой котировки (изменение цены по сути) ведёт к генерации терминалом события нового тика. Это реакция терминала на изменение цены. И уже тогда советник получает сообщение о том, что сгенерировано событие нового тика. Реакция советника - обработка тика и вызов функции-обработчика OnTick().

В итоге код советника - это набор модулей, обслуживающих событийно-ориентированное программирование...

 
evillive:
Laryx:
denkir:

Я думаю, Serj_Che имел ввиду не совсем это. Поясняю:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

функция OnCalculate и OnTick

Renat, 2013.10.28 13:33

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

В какой-то момент прилетает пачка тиков (2-3-N), что приводит к последовательным N вызовам индикатора и только 1 вызову эксперта.

У большинства брокеров спокойные котировки и пакет можно получить разве что на сильных движениях рынка.

И вопрос соответственно в том - кто определяет сколько тиков будет в пачке (N) которая прилетит в терминал.

Интересный вопрос... 

 
MigVRN:

Я думаю, Serj_Che имел ввиду не совсем это. Поясняю:

И вопрос соответственно в том - кто определяет сколько тиков будет в пачке (N) которая прилетит в терминал.

Интересный вопрос... 

Если так, то датафидеры - поставщики котировок... серверная часть МетаТрейдера подключается к поставщикам... обычно к нескольким...
 

Из справки:

Функция OnTick() не является обработчиком каждого тика, она уведомляет эксперта об изменениях на рынке. Изменения могут быть пакетными: в терминал может одновременно прийти несколько тиков, но функция OnTick() будет вызвана лишь один раз для уведомления эксперта о последнем состоянии рынка. 

Ранее в советнике использовал OnTick(), ошибок не возникало. 

Решил переделать  через OnBookEvent(), полезли ошибки, какая то чехарда получилась. Как будто терминал сам с собой не дружит.

GD 0 11:32:33.345 Trades 'xxxxx': modify order #12970611 buy limit 1.00 SBRF-9.15 at 7732 (7723) sl: 0 tp: 0 -> 7734, sl: 0 tp: 0

FE 0 11:32:33.376 Trades 'xxxxx': modify order #12970611 buy limit 1.00 SBRF-9.15 at 7732 (7723) sl: 0 tp: 0 -> 7734, sl: 0 tp: 0 placed for execution in 35 ms

RD 0 11:32:33.392 Trades 'xxxxx': modify order #12970610 sell limit 1.00 SBRF-9.15 at 7762 sl: 0 tp: 0 -> 7764, sl: 0 tp: 0

EE 0 11:32:33.423 Trades 'xxxxx': modify order #12970610 sell limit 1.00 SBRF-9.15 at 7762 sl: 0 tp: 0 -> 7764, sl: 0 tp: 0 placed for execution in 36 ms

FR 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

DH 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

RF 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

PL 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

NJ 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

LP 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

JO 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

HE 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

FS 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

DI 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

RG 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

PM 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

NK 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

LQ 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

JH 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

HF 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

FL 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

DJ 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

RP 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

PN 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

ND 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

LR 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

JI 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

HG 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

FM 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

DK 2 11:32:33.423 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7762.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

HR 0 11:32:33.454 Trades 'xxxxx': modify order #12970610 sell limit 1.00 SBRF-9.15 at 7764 sl: 0 tp: 0 -> 7769, sl: 0 tp: 0

LR 0 11:32:33.486 Trades 'xxxxx': modify order #12970610 sell limit 1.00 SBRF-9.15 at 7764 sl: 0 tp: 0 -> 7769, sl: 0 tp: 0 placed for execution in 35 ms

IL 2 11:32:33.486 Trades 'xxxxx': failed modify order #12970610 sell limit 1.00  at 7764.00000 sl: 0.00000 tp: 0.00000 -> 7769.00000, sl: 0.00000 tp: 0.00000 [Invalid request]

 

 Используется стандартный торговый класс. 

Как избавиться от этих ошибок? Сделать свои торговые функции? 

 

ну вы бы ещё распечатку побольше сделали бы, удобнее было бы читать ;-)

причём однотипные строки... накой?

Какая причина ошибки? Код какой?

 
denkir:

ну вы бы ещё распечатку побольше сделали бы, удобнее было бы читать ;-)

причём однотипные строки... накой?

Какая причина ошибки? Код какой?

Меньше не получилось )

Это чтобы понять суть ошибки,

Советник хочет модифицировать ордер, терминал отвечает неправильный запрос, после того как ордер все таки модифицировался - в догонку еще раз пишет что неправильный запрос.

Причина ошибки из журнала же видно:

10013

TRADE_RETCODE_INVALID

Неправильный запрос

 
MigVRN:

Я думаю, Serj_Che имел ввиду не совсем это. Поясняю:

И вопрос соответственно в том - кто определяет сколько тиков будет в пачке (N) которая прилетит в терминал.

Интересный вопрос... 

Да, вы правильно поняли вопрос, именно это интересует.
 

Добрый день!

Поскольку функция OnBookEvent() является широковещательной, то

необходимо фильтровать события для своего символа:

//+------------------------------------------------------------------+
//| Expert Book Event function                                       |
//+------------------------------------------------------------------+
void OnBookEvent( const string &a_symbol )
{
  if ( a_symbol == MySymbol )
  {
    //Наше событие!
  }
}

 И всё заработает правильно.

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