Объем позиции при первом обращении к OnTradeTransaction() при одновременном исполнении нескольких лимитных ордеров. - страница 2

 
bigluck:

Цель заключена в вопросе - понять в какой момент обновляется размер позиции, что бы именно после этого получить корректное значение через PositionGetDouble(POSITION_VOLUME);

То что вы описали соответствует моему описанию. Этими извращениями приходится заниматься из-за того что нет события типа "ДАННЫЕ ПО ПОЗИЦИИ БЫЛИ ОБНОВЛЕНЫ".

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

Жаль, что Вы читаете через строчку.

Удачи!

 
bigluck:

Вы забыли добавить (добавлено жирным): В MQL5 именно сделку и надо контролировать для понимания что происходит с позицией, так как в MQL5 нет событий типа "ДАННЫЕ ПО ПОЗИЦИИ БЫЛИ ОБНОВЛЕНЫ" / "ПОЗИЦИЯ ОТКРЫТА" / "ПОЗИЦИЯ ИЗМЕНЕНА" / "ПОЗИЦИЯ ЗАКРЫТА".

"Именно сделка может нам сказать, что объём позиции увеличен, часть позиции закрыта, или вся позиция закрыта" - мне не нужно можествование при принятии решений по алгоритму. Мне нужен факт наступления событий вида: "ДАННЫЕ ПО ПОЗИЦИИ БЫЛИ ОБНОВЛЕНЫ" / "ПОЗИЦИЯ ОТКРЫТА" / "ПОЗИЦИЯ ИЗМЕНЕНА" / "ПОЗИЦИЯ ЗАКРЫТА". Этого нет.

"А вот при обработке третьего события из имитируемых трёх, позиция будет уже точно полным объёмом" - не факт. На практике обычно бывает 1 или 2 ну или 0 - как сервера успели (есть же ещё биржа), но практически всегда не 3.

Понятно. А зачем-же вы вырезали первое предложение из моего текста которое цитируете? Я повторю вам «Наверное вы забываете о том, что любое изменение позиции рождено совершением сделки.»

Вам двое объясняют что нет никаких проблем, он вы не слышите и упорно пытаетесь обратить внимание на свою хотелку. Я очень сомневаюсь что это будет воплощено, или даже будет услышано разработчиками. Пока никому кроме вас это не надо. Все без проблем обходятся тем что есть. Если я не торгую на ФОРТС и много чего не знаю, то Михаил prostotrader сам пишет советники и ими торгует на ФОРТС. К его мнению вам не мешало-бы прислушаться.

 

Сначала был MT4, где ордера кухОнно исполнялись брокером всегда в полном объеме на одной цене по его желанию. Там – да, понятен статус каждого ордера и легко посчитать среднюю цену и объем. Потом сделали расчет средней цены и объёма по ордерам в терминале и назвали MT5. Раз терминал уже рассчитывает среднюю и объем, то осталось только получать от него событие типа “ДАННЫЕ ПО ПОЗИЦИИ РАССЧИТАНЫ” чтобы после этого и ознакомится с ними. Определение актуального объема и цены текущей позиции при биржевом исполнении не тривиальная задача: цена может стоять у лимитника и поцеловывая его разъедать маленькими порциями набирая позу, вдруг отскочит в нужную сторону, но вкатит обратно и уже выставленные стоп ордера на каждый юнит позиции размажутся по стакану, а дойдя до лимитника на следующем уровне уже опять начнёт его отстукивать по частям. Всё это может произойти в течение минуты и на каждом событии надо располагать актуальными данными о позиции для принятия решений - я всегда предпочту получить данные о позиции с сервера ибо это то, что у меня на бирже и это то, чем мне надо управлять стопами и тейками, а самостоятельно созданный расчет по ордерам и сделкам при выходе очередного билда может незаметно начать давать другие результаты. Но самое главное, что даже при самостоятельном расчёте по ордерам и сделкам по событиям OnTradeTransaction() нет однозначного момента чтобы наступила уверенность, что данные по позиции рассчитаны актуально, так как даже сразу после события TRADE_TRANSACTION_DEAL_ADD объем позиции может быть еще не обновлен из-за перегрузки сервера (too many requests).  Это вы называете хотелкой? Это необходимость.

Поэтому цитата из документации про OnTradeTransaction(): “Например, при отсылке рыночного ордера на покупку, он обрабатывается, для счета создается соответствующий ордер на покупку, происходит исполнение ордера, его удаление из списка открытых, добавление в историю ордеров, далее добавляется соответствующая сделка в историю и создается новая позиция.” 

на самом деле звучит так: “Например, при отсылке рыночного ордера на покупку, он обрабатывается, для счета создается соответствующий ордер на покупку, происходит исполнение ордера, его удаление из списка открытых, добавление в историю ордеров, далее добавляется соответствующая сделка в историю и КОГДА-НИБУДЬ создастся новая позиция -  ВЫ ТАМ ВРЕМЯ ОТ ВРЕМЕНИ ОБРАЩАЙТЕСЬ ЧЕРЕЗ PositionGetDouble(POSITION_VOLUME) - КОГДА-НИТЬ ОНА ПОЯВИТСЯ, МЫ НЕ СООБЩИМ ВАМ КОГДА.” 

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Еще один вопрос, не смог найти в документации: Если в в советнике присутствует и OnTick() и OnTrade(), а очередной тик вызвал срабатывание ордера, то всегда ли гарантированно сначала будет вызвана функция OnTick() и только потом OnTrade() ?
 
bigluck:

Сначала был MT4, где ордера кухОнно исполнялись брокером всегда в полном объеме на одной цене по его желанию. Там – да, понятен статус каждого ордера и легко посчитать среднюю цену и объем. Потом сделали расчет средней цены и объёма по ордерам в терминале и назвали MT5. Раз терминал уже рассчитывает среднюю и объем, то осталось только получать от него событие типа “ДАННЫЕ ПО ПОЗИЦИИ РАССЧИТАНЫ” чтобы после этого и ознакомится с ними. Определение актуального объема и цены текущей позиции при биржевом исполнении не тривиальная задача: цена может стоять у лимитника и поцеловывая его разъедать маленькими порциями набирая позу, вдруг отскочит в нужную сторону, но вкатит обратно и уже выставленные стоп ордера на каждый юнит позиции размажутся по стакану, а дойдя до лимитника на следующем уровне уже опять начнёт его отстукивать по частям. Всё это может произойти в течение минуты и я всегда предпочту получить данные о позиции с сервера ибо это то, что у меня на бирже и это то, чем мне надо управлять стопами и тейками. Но самое главное, что даже при самостоятельном расчёте по ордерам и сделкам по событиям OnTradeTransaction() нет однозначного момента чтобы наступила уверенность, что данные по позиции рассчитаны актуально, так как даже сразу после события TRADE_TRANSACTION_DEAL_ADD объем позиции может быть еще не обновлен из-за перегрузки сервера (too many requests).  Это вы называете хотелкой? Это необходимость.

Поэтому цитата из документации про OnTradeTransaction(): “Например, при отсылке рыночного ордера на покупку, он обрабатывается, для счета создается соответствующий ордер на покупку, происходит исполнение ордера, его удаление из списка открытых, добавление в историю ордеров, далее добавляется соответствующая сделка в историю и создается новая позиция.” 

на самом деле звучит так: “Например, при отсылке рыночного ордера на покупку, он обрабатывается, для счета создается соответствующий ордер на покупку, происходит исполнение ордера, его удаление из списка открытых, добавление в историю ордеров, далее добавляется соответствующая сделка в историю и КОГДА-НИБУДЬ создастся новая позиция -  ВЫ ТАМ ВРЕМЯ ОТ ВРЕМЕНИ ОБРАЩАЙТЕСЬ ЧЕРЕЗ PositionGetDouble(POSITION_VOLUME) - КОГДА-НИТЬ ОНА ПОЯВИТСЯ, МЫ НЕ СООБЩИМ ВАМ КОГДА.” 

Научитесь пользоваться отладчиком кода. Так называемый debug режим. Там поставьте точки останова и просмотрите что получается в вашем примере. Когда, что происходит и когда что можно получить.

На сим откланиваюсь и вы, похоже остаётесь в одиночестве.