При её использовании в тестере наблюдаю следующую проблему. Открывается позиция следовательно идет вызов OnTradeTransaction. В этот момент внутри OnTradeTransaction получая размер позиции с помощью класса CPositionInfo. Все хорошо. Далее на этом же вызове прямо из OnTradeTransaction вызываю другую функцию и там уже CPositionInfo возвращает ноль т.е не то, что нужно. Еще через несколько минут в OnTimer пытаюсь получить размер позиции, там уже все ок т.е 1. Естественно позиция не закрывалась и не открывалась снова на протяжении всей истории.
Вопрос. Почему CPositionInfo возвращает в OnTradeTransaction, то что надо, а в другой функции, вызванной из OnTradeTransaction, возвращает 0 вместо объема позиции.
Вот логи. (Позиция открыта в 10:30:12 закрыта 10:48:53)
Срабатывает ордер.
2017.09.22 10:30:12 order [#3 buy limit 1.00 SBRF-3.18 at 19352] triggered
Три раза вызывается OnTradeTransaction. CPositionInfo на каждом вызове объем позиции равный 1. На последнем вызове TRADE_TRANSACTION_HISTORY_ADD вызываю функцию.
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_DEAL_ADD order=3 order_type=ORDER_TYPE_BUY state=ORDER_STATE_STARTED Price=19352.0 deal=2 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0 2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_ORDER_DELETE order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0 2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_HISTORY_ADD order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
В функции вызванной из OnTradeTransaction.
2017.09.22 10:32:50 На котируемом символе SBRF-3.18 есть позиция 0.0 в направлении POSITION_TYPE_BUY
Спустя время опять пытаюсь получить объем в OnTimer
2017.09.22 10:40:00 В OnTimer Символ=SBRF-3.18 Объем=1.0
Закрывается позиция
2017.09.22 10:48:53 order [#5 sell limit 1.00 SBRF-3.18 at 19435] triggered
При её использовании в тестере наблюдаю следующую проблему. Открывается позиция следовательно идет вызов OnTradeTransaction. В этот момент внутри OnTradeTransaction получая размер позиции с помощью класса CPositionInfo. Все хорошо. Далее на этом же вызове прямо из OnTradeTransaction вызываю другую функцию и там уже CPositionInfo возвращает ноль т.е не то, что нужно. Еще через несколько минут в OnTimer пытаюсь получить размер позиции, там уже все ок т.е 1. Естественно позиция не закрывалась и не открывалась снова на протяжении всей истории.
Вопрос. Почему CPositionInfo возвращает в OnTradeTransaction, то что надо, а в другой функции, вызванной из OnTradeTransaction, возвращает 0 вместо объема позиции.
Вот логи. (Позиция открыта в 10:30:12 закрыта 10:48:53)
Срабатывает ордер.
2017.09.22 10:30:12 order [#3 buy limit 1.00 SBRF-3.18 at 19352] triggered
Три раза вызывается OnTradeTransaction. CPositionInfo на каждом вызове объем позиции равный 1. На последнем вызове TRADE_TRANSACTION_HISTORY_ADD вызываю функцию.
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_DEAL_ADD order=3 order_type=ORDER_TYPE_BUY state=ORDER_STATE_STARTED Price=19352.0 deal=2 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0 2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_ORDER_DELETE order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0 2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_HISTORY_ADD order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
В функции вызванной из OnTradeTransaction.
2017.09.22 10:32:50 На котируемом символе SBRF-3.18 есть позиция 0.0 в направлении POSITION_TYPE_BUY
Спустя время опять пытаюсь получить объем в OnTimer
2017.09.22 10:40:00 В OnTimer Символ=SBRF-3.18 Объем=1.0
Закрывается позиция
2017.09.22 10:48:53 order [#5 sell limit 1.00 SBRF-3.18 at 19435] triggered
А зачем пользовать CPositionInfo, если есть структура MqlTradeTransaction в которой вся информация по ордеру, сделке и позиции?
Например, при отсылке рыночного ордера на покупку он обрабатывается, для счета создается соответствующий ордер на покупку, происходит исполнение ордера, его удаление из списка открытых, добавление в историю ордеров, далее добавляется соответствующая сделка в историю и создается новая позиция. Все эти действия являются торговыми транзакциями...
Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Видимо для этого надо менять весь алгоритм. Проблема описана крайне скудно. Если без использования OnTradeTransaction нужны были какие-то классы, то используя OnTradeTransaction необходимость в некоторых классах отпадает. Именно по этому и сказано
Алгоритм поменять не проблема. Я просто не могу понять, нормально ли то, что CPositionInfo после открытия позиции возвращает, то 1, то 0, то опять 1(речь про размер позиции). Хотя по истории позиция не закрывалась и не открывалась снова.
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Исполняется пользовательская функция Abc(), в которой реализован длинный (по времени) алгоритм. В течение времени исполнения этой функции имеют место события, например, - Trade, Timer и пр. Можно ли не завершая исполнение функции Abc() узнать о том факте, что эти события произошли?
pivomoe: Я просто не могу понять, нормально ли то, что ..
Здесь многое трудно понять. В частности, разбираясь с последовательностью транзакций, я обнаружил, что в ряде случаев присутствуют несуразности. Например, при открытии позиции сначала формально открывается рыночный ордер, который потом превращается в позицию. Однако, в процессе этой пулемётной серии транзакций есть такая ситуация, когда позиция уже открыта, а ордер ещё не закрыт. Ясно, что это одно и то же событие, но транзакции организованы поштучно, выдаются последовательно, и при таком подходе в принципе невозможно правильно отразить преобразование рыночного ордера в позицию.
На мой взгляд, лучше всего организовать свой контроль торговли: помнить свои торговые приказы и контролировать состав ордеров и позиций просто по факту их наличия в соотв. списках.
Знаете ли вы, что рыночные ордера выдаются в этих транзакциях с нулевой ценой? Вот, хочет человек, к примеру, открыть позицию Buy по цене 1.2000, Sl= 1.1000, Тр=1.3000. При исполнении этой операции первым делом появляется транзакция, в которой отражён рыночный ордер, с такими данными: Sl= 1.1000, Тр=1.3000, т.е. с заданными циферками, а Price = 0 (равно нулю). Такой-себе рыночный ордер с нулевой ценой :) И думайте что хотите.
А можно как-нибудь сделать, чтоб эти неистребимые флажки-новости-объекты не наполняли мой список объектов снова и снова?
Вот тут в настройках уберите новости и перезагрузите терминал
Кирилл, спасибо большое. А то мой эксперт перебирает объекты - перебирает, а они снова и снова.
Спасибо.
Пытаюсь научиться пользоваться функцией OnTradeTransaction.
При её использовании в тестере наблюдаю следующую проблему. Открывается позиция следовательно идет вызов OnTradeTransaction. В этот момент внутри OnTradeTransaction получая размер позиции с помощью класса CPositionInfo. Все хорошо. Далее на этом же вызове прямо из OnTradeTransaction вызываю другую функцию и там уже CPositionInfo возвращает ноль т.е не то, что нужно. Еще через несколько минут в OnTimer пытаюсь получить размер позиции, там уже все ок т.е 1. Естественно позиция не закрывалась и не открывалась снова на протяжении всей истории.
Вопрос. Почему CPositionInfo возвращает в OnTradeTransaction, то что надо, а в другой функции, вызванной из OnTradeTransaction, возвращает 0 вместо объема позиции.
Вот логи. (Позиция открыта в 10:30:12 закрыта 10:48:53)
Срабатывает ордер.
2017.09.22 10:30:12 order [#3 buy limit 1.00 SBRF-3.18 at 19352] triggered
Три раза вызывается OnTradeTransaction. CPositionInfo на каждом вызове объем позиции равный 1. На последнем вызове TRADE_TRANSACTION_HISTORY_ADD вызываю функцию.
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_DEAL_ADD order=3 order_type=ORDER_TYPE_BUY state=ORDER_STATE_STARTED Price=19352.0 deal=2 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_ORDER_DELETE order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_HISTORY_ADD order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
В функции вызванной из OnTradeTransaction.
2017.09.22 10:32:50 На котируемом символе SBRF-3.18 есть позиция 0.0 в направлении POSITION_TYPE_BUY
Спустя время опять пытаюсь получить объем в OnTimer
2017.09.22 10:40:00 В OnTimer Символ=SBRF-3.18 Объем=1.0
Закрывается позиция
2017.09.22 10:48:53 order [#5 sell limit 1.00 SBRF-3.18 at 19435] triggered
Пытаюсь научиться пользоваться функцией OnTradeTransaction.
При её использовании в тестере наблюдаю следующую проблему. Открывается позиция следовательно идет вызов OnTradeTransaction. В этот момент внутри OnTradeTransaction получая размер позиции с помощью класса CPositionInfo. Все хорошо. Далее на этом же вызове прямо из OnTradeTransaction вызываю другую функцию и там уже CPositionInfo возвращает ноль т.е не то, что нужно. Еще через несколько минут в OnTimer пытаюсь получить размер позиции, там уже все ок т.е 1. Естественно позиция не закрывалась и не открывалась снова на протяжении всей истории.
Вопрос. Почему CPositionInfo возвращает в OnTradeTransaction, то что надо, а в другой функции, вызванной из OnTradeTransaction, возвращает 0 вместо объема позиции.
Вот логи. (Позиция открыта в 10:30:12 закрыта 10:48:53)
Срабатывает ордер.
2017.09.22 10:30:12 order [#3 buy limit 1.00 SBRF-3.18 at 19352] triggered
Три раза вызывается OnTradeTransaction. CPositionInfo на каждом вызове объем позиции равный 1. На последнем вызове TRADE_TRANSACTION_HISTORY_ADD вызываю функцию.
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_DEAL_ADD order=3 order_type=ORDER_TYPE_BUY state=ORDER_STATE_STARTED Price=19352.0 deal=2 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_ORDER_DELETE order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
2017.09.22 10:30:50 Синмво =SBRF-3.18 TRADE_TRANSACTION_HISTORY_ADD order=3 order_type=ORDER_TYPE_BUY_LIMIT state=ORDER_STATE_FILLED Price=19352.0 deal=0 deal_type=DEAL_TYPE_BUY Направление позиции POSITION_TYPE_BUY Объем 1.0
В функции вызванной из OnTradeTransaction.
2017.09.22 10:32:50 На котируемом символе SBRF-3.18 есть позиция 0.0 в направлении POSITION_TYPE_BUY
Спустя время опять пытаюсь получить объем в OnTimer
2017.09.22 10:40:00 В OnTimer Символ=SBRF-3.18 Объем=1.0
Закрывается позиция
2017.09.22 10:48:53 order [#5 sell limit 1.00 SBRF-3.18 at 19435] triggered
А зачем пользовать CPositionInfo, если есть структура MqlTradeTransaction в которой вся информация по ордеру, сделке и позиции?
Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Видимо для этого надо менять весь алгоритм. Проблема описана крайне скудно. Если без использования OnTradeTransaction нужны были какие-то классы, то используя OnTradeTransaction необходимость в некоторых классах отпадает. Именно по этому и сказано
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Alexey Viktorov, 2017.12.30 09:04
А зачем пользовать CPositionInfo, если есть структура MqlTradeTransaction в которой вся информация по ордеру, сделке и позиции?
В течение времени исполнения этой функции имеют место события, например, - Trade, Timer и пр.
Можно ли не завершая исполнение функции Abc() узнать о том факте, что эти события произошли?
Я просто не могу понять, нормально ли то, что ..
Здесь многое трудно понять. В частности, разбираясь с последовательностью транзакций, я обнаружил, что в ряде случаев присутствуют несуразности.
На мой взгляд, лучше всего организовать свой контроль торговли: помнить свои торговые приказы и контролировать состав ордеров и позиций просто по факту их наличия в соотв. списках.Например, при открытии позиции сначала формально открывается рыночный ордер, который потом превращается в позицию. Однако, в процессе этой пулемётной серии транзакций есть такая ситуация, когда позиция уже открыта, а ордер ещё не закрыт. Ясно, что это одно и то же событие, но транзакции организованы поштучно, выдаются последовательно, и при таком подходе в принципе невозможно правильно отразить преобразование рыночного ордера в позицию.
Кстати о птичках.
Знаете ли вы, что рыночные ордера выдаются в этих транзакциях с нулевой ценой?
Вот, хочет человек, к примеру, открыть позицию Buy по цене 1.2000, Sl= 1.1000, Тр=1.3000.
При исполнении этой операции первым делом появляется транзакция, в которой отражён рыночный ордер, с такими данными:
Sl= 1.1000, Тр=1.3000, т.е. с заданными циферками, а Price = 0 (равно нулю). Такой-себе рыночный ордер с нулевой ценой :) И думайте что хотите.