Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Максисальная длина названия символа на FOREX
fxsaber, 2018.08.25 21:08
Конечно, событийная модель неудобная в данном случае. Например, если нужно не выходя из On-функции сделать Async-операции и получить по ним результат.
Сейчас такое поведение возможно релизовать через костыль.
- Пишется индикатор (без буферов и входных переменных) с OnTradeTransaction, который пишет все транзакции в общедоступное место (например, в ресурс).
- Советник этот индикатор создает через iCustom.
- В любом месте выполнения советник может посмотреть все пришедшии транзакции, что записал индикатор.
Таким образом получается огромная гибкость.
Например, можно отправить сотню Async-ордеров и не выходя из глубоких потрохов дождаться их выполнения, продолжив далее выполнять свой код.
Речь, конечно, идет про реквесты. И мэджик-тема тут не при чем.
ЗЫ Хотя было бы разумно, чтобы штатно выполнялись записи транзакций в общедоступный массив со стороны разработчиков. Без индикатора.
Разумеется, общедоступный массив транзакций с момента работы Терминала со стороны разработчиков - был бы логичный ход продвижения торговой асинхронности в MT5. Но востребованность такого решения, скорее всего, близка к нулю. Пока же библиотека закрывает эту брешь, если кому-то это нужно, конечно.
Ценность не в библиотеке, а в подобном функционале, когда есть архив всех транзакций Терминала.
Появляется возможность написать торговую библиотеку, когда не требуется вообще задумываться об асинхронности, ожидании результата и т.д. Сама торговая библиотека делает все незаметно.
Например, имеется $1K на счету. Отправляется 100 асинхронных приказов Buy USDCHF 1 lot. Понятно, что 99 из них будут отклонены торговым сервером (не Терминалом), исполнится только первый. Но до отмены и какого-либо ответа от торгового сервера умная торговая библа может считать, что присутствует 100 BUY-позиций.
Например, из-за частичного исполнения может быть открыто множество позиций, вместо одной. Когда нужно кучу позиций/ордеров модифицировать, становится очень удобно использовать предложенный подход.
Ничего по выходу из OnTick запоминать не нужно, писать OnTradeTransaction и разбираться там с RequestID - аналогично. Пишешь, как обычно, только в OnTick. А в нем в любом месте всегда имеешь полный контроль асинхронных транзакций. Получаются молниеносные множественные модификации и без бубнов - про асинхронность и ее особенности даже думать не надо.
Интересная идея, спасибо. Там и производительность должна улучшится за счёт распараллеливания кода, как понимаю. А в тестере корректно работает?
Не пробовал в Тестере. Но раз мультивалютный OnTick на такой же идее работает в Тестере, то и здесь, вроде, должно все получиться.
ЗЫ Только идея не в распараллеливании. Это в MT4 по торговым потокам занимались распределением.
// Пример хранения/обмена данными через Ресурсы внутри Терминала #include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/ru/code/22166 void OnStart() { const RESOURCEDATA<int> ResourceINT("::int"); // Ресурс для обмена int-ами. const - как доказательство, что ничего не пишется в объект класса int ArrayINT[] = {1, 2, 3}; int Num = 5; ResourceINT = ArrayINT; // Ресурс хранит массив. ResourceINT += Num; // Добавили в ресурс еще значение. ResourceINT += ArrayINT; // Добавили массив. int ArrayINT2[]; ResourceINT.Get(ArrayINT2); // Считали данные из ресурса. ArrayPrint(ArrayINT2); // Вывели: 1 2 3 5 1 2 3 ResourceINT.Free(); // Удалили данные из ресурса Print(ResourceINT.Get(ArrayINT2)); // Убедились, что данных нет: 0 const RESOURCEDATA<MqlTick> ResourceTicks("::Ticks"); // Ресурс для обмена тиками. const - как доказательство, что ничего не пишется в объект класса MqlTick Tick; if (SymbolInfoTick(_Symbol, Tick)) for (int i = 0; i < 3; i++) ResourceTicks += Tick; // Добавили в ресурс тики MqlTick Ticks[]; ResourceTicks.Get(Ticks); // Считали данные из ресурса. ArrayPrint(Ticks); // Вывели. // Это полное имя ресурса для обращения из другой программы const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::Ticks"; Print(NameOut); // Вывели полное имя ресурса. const RESOURCEDATA<MqlTick> Resource(NameOut); // Ресурс для доступа к данным (read-only) из другой программы MqlTick TicksOut[]; Resource.Get(TicksOut); // Считали данные из ресурса. ArrayPrint(TicksOut); // Вывели. Resource.Free(); // Не получится повлиять на данные read-only-ресурса. Print(_LastError); // ERR_INVALID_PARAMETER - Ошибочный параметр при вызове системной функции. }
Пример хранения/обмена данными через Ресурсы внутри Терминала
Можно ли при чтении нарваться на данные, которые пребывают в процессе записи? Т.е. считать не полную информацию?
Пока что не могу придумать пользы от этой библиотеки.
На форексе она точно не нужна, а на бирже нет необходимости.
Тестировали данную библиотеку на бирже?
В каком случае по вашему она может пригодиться?
Можно ли при чтении нарваться на данные, которые пребывают в процессе записи? Т.е. считать не полную информацию?
Нужно экспериментировать. Думаю, что одновременная запись/чтение ресурса действует также, как и с глобальными переменными, т.к. запись в обоих случаях - это создание: ResourceCreate и GlobalVariableSet. Единственное отличие ресурса от глобальной - невозможно даже теоретически что-либо писать в ресурс одновременно. С глобальными - возможно.
Фактически, чтение ресурса - это получение куска данных из памяти. И если чтение началось, то запись ресурса не должна повлиять, т.к. запись - это выделение другого куска памяти. Пересекаться они вряд ли могут, т.к. это, скорее всего, не даст сделать сама ОС. Поэтому, с моей точки зрения, конфликтов load/save с ресурсами быть не должно. Но лучше, конечно, задать этот вопрос разработчикам.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
TradeTransactions:
Доступ к данным OnTradeTransaction в любом месте программы
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction.
Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется асинхронности. А это далеко не всегда бывает просто сделать (советники), а иногда - даже невозможно (скрипты).
Данная библиотека решает эту проблему. Она в любой момент открывает доступ ко всем транзакциям в торговом терминале (полные данные соответствующих OnTradeTransaction) с момента запуска программы.
Это позволяет очень легко наделить свои программы асинхронностью.
Автор: fxsaber