Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 815
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я просто не могу понять, нормально ли то, что ..
Здесь многое трудно понять. В частности, разбираясь с последовательностью транзакций, я обнаружил, что в ряде случаев присутствуют несуразности.
На мой взгляд, лучше всего организовать свой контроль торговли: помнить свои торговые приказы и контролировать состав ордеров и позиций просто по факту их наличия в соотв. списках.Например, при открытии позиции сначала формально открывается рыночный ордер, который потом превращается в позицию. Однако, в процессе этой пулемётной серии транзакций есть такая ситуация, когда позиция уже открыта, а ордер ещё не закрыт. Ясно, что это одно и то же событие, но транзакции организованы поштучно, выдаются последовательно, и при таком подходе в принципе невозможно правильно отразить преобразование рыночного ордера в позицию.
Кстати о птичках.
Знаете ли вы, что рыночные ордера выдаются в этих транзакциях с нулевой ценой?
Вот, хочет человек, к примеру, открыть позицию Buy по цене 1.2000, Sl= 1.1000, Тр=1.3000.
При исполнении этой операции первым делом появляется транзакция, в которой отражён рыночный ордер, с такими данными:
Sl= 1.1000, Тр=1.3000, т.е. с заданными циферками, а Price = 0 (равно нулю). Такой-себе рыночный ордер с нулевой ценой :) И думайте что хотите.
Для удобства. Из MqlTradeTransaction вызывается небольшая функция. В которой уже путем перебора элементов класса находиться нужный элемент. И уже для этого элемента вызывается одна из функций класса, которая делает, что-то полезное.
Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете?
Сначала просто словами, потом поправим в нужное русло.
Исполняется пользовательская функция Abc(), в которой реализован длинный (по времени) алгоритм.
В течение времени исполнения этой функции имеют место события, например, - Trade, Timer и пр.
Можно ли не завершая исполнение функции Abc() узнать о том факте, что эти события произошли?
Нет. Пока одна функция считает, все остальное будет пропущено.
Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.
...
Абсолютно всё прозрачно в OnTradeTransaction.
Первое: Структура MqlTradeTransaction заполняется по-разному в зависимости от типа торговой транзакции (ENUM_TRADE_TRANSACTION_TYPE).
читать здесь: Структура торговой транзакции (MqlTradeTransaction))
Второе: для визуализации результатов можно выдрать из примера OrderSendAsync этот блок кода
и вставить его в советник, который навесить на график. Затем вручную можно открывать/закрывать позиции и смотреть на распечатки результатов во вкладке "Эксперты".
Нет. Пока одна функция считает, все остальное будет пропущено.
Это аналогично Функция Sleep() - то есть пока Ваша функция очень долго считает, её поведение анfлогично Sleep - все остальные события будут пропущены.
Спасибо. Это прискорбно.
И как же тогда эффективно использовать ресурс ПК? Опять зацикленный код и периодический опрос параметров?
Абсолютно всё прозрачно в OnTradeTransaction.
Спасибо за ответ, я в общем-то так и сделал. Пока больше вопросов чем понимания..
Опишите, пожалуйста, более подробно, что именно Вы хотите получить? Зачем из OnTradeTransaction Вы что-то вызываете?
Сначала просто словами, потом поправим в нужное русло.
Я понял, что проблема не в OnTradeTransaction. Смотрите какой ужас у меня твориться:
Вот код.
А вот результат его выполнения
2017.09.22 10:30:12 Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12 Объем 0.0 Объем 0.0
Меняю строки 2 и 3 местами. т.е код теперь такой
Получаю вот такой, результат.
2017.09.22 10:30:12 Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Объем 1.0 SBRF-3.18 Объем 1.0
В обоих случаях никаких предупреждений компилятор не выдает. Прикрепил код эксперта на 80 строк и настройки тестирования. Брокер БКС. Версия 1730.
Я понял, что проблема не в OnTradeTransaction. Смотрите какой ужас у меня твориться:
Вот код.
А вот результат его выполнения
2017.09.22 10:30:12 Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12 Объем 0.0 Объем 0.0
Меняю строки 2 и 3 местами. т.е код теперь такой
Получаю вот такой, результат.
2017.09.22 10:30:12 Не удалось выбрать позицию по символ SBRF-12.17
2017.09.22 10:30:12 SBRF-3.18 Объем 1.0 SBRF-3.18 Объем 1.0
В обоих случаях никаких предупреждений компилятор не выдает. Прикрепил код эксперта на 80 строк и настройки тестирования. Брокер БКС. Версия 1730.
Кажется ошибка в том, что пытаетесь получить информацию о более чем 1 позиция, в 1 строка (Print).
В любой момент доступна только информация об 1 (выбранной) позиции :
- во втором случае все правильно, потому что последний Select возвращает true , что вы не проверили.
- а во первом случае : последний Select возвращает false , что вы тоже не проверили, и результат непредсказуем.
..... очевидно Select==false сбрасывает информацию предыдущего Select==true