Библиотеки: TradeTransactions

 

TradeTransactions:

Доступ к данным OnTradeTransaction в любом месте программы

Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction.

Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется асинхронности. А это далеко не всегда бывает просто сделать (советники), а иногда - даже невозможно (скрипты).

Данная библиотека решает эту проблему. Она в любой момент открывает доступ ко всем транзакциям в торговом терминале (полные данные соответствующих OnTradeTransaction) с момента запуска программы.

Это позволяет очень легко наделить свои программы асинхронностью.

Автор: fxsaber

 
Библиотека - реализация этой идеи

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

Максисальная длина названия символа на FOREX

fxsaber, 2018.08.25 21:08

Конечно, событийная модель неудобная в данном случае. Например, если нужно не выходя из On-функции сделать Async-операции и получить по ним результат.

Сейчас такое поведение возможно релизовать через костыль.

  1. Пишется индикатор (без буферов и входных переменных) с OnTradeTransaction, который пишет все транзакции в общедоступное место (например, в ресурс).
  2. Советник этот индикатор создает через iCustom.
  3. В любом месте выполнения советник может посмотреть все пришедшии транзакции, что записал индикатор.

Таким образом получается огромная гибкость.

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


Речь, конечно, идет про реквесты. И мэджик-тема тут не при чем.


ЗЫ Хотя было бы разумно, чтобы штатно выполнялись записи транзакций в общедоступный массив со стороны разработчиков. Без индикатора.

Разумеется, общедоступный массив транзакций с момента работы Терминала со стороны разработчиков - был бы логичный ход продвижения торговой  асинхронности в MT5. Но востребованность такого решения, скорее всего, близка к нулю. Пока же библиотека закрывает эту брешь, если кому-то это нужно, конечно.

 

Ценность не в библиотеке, а в подобном функционале, когда есть архив всех транзакций Терминала.

Появляется возможность написать торговую библиотеку, когда не требуется вообще задумываться об асинхронности, ожидании результата и т.д. Сама торговая библиотека делает все незаметно.


Например, имеется $1K на счету. Отправляется 100 асинхронных приказов Buy USDCHF 1 lot. Понятно, что 99 из них будут отклонены торговым сервером (не Терминалом), исполнится только первый. Но до отмены и какого-либо ответа от торгового сервера умная торговая библа может считать, что присутствует 100 BUY-позиций.

 
  • В исходниках библиотеки присутствует (ResourceData.mqh) универсальный класс, позволяющий удобно сохранять/читать данные в/из Ресурсах.
В MT4 не работает из-за бага.
 

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

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

 
Интересная идея, спасибо.  Там и производительность должна улучшится за счёт распараллеливания кода, как понимаю.  А в тестере корректно работает?
 
Alexey Navoykov:
Интересная идея, спасибо.  Там и производительность должна улучшится за счёт распараллеливания кода, как понимаю.  А в тестере корректно работает?

Не пробовал в Тестере. Но раз мультивалютный 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 - Ошибочный параметр при вызове системной функции.
}
 
fxsaber:
Пример хранения/обмена данными через Ресурсы внутри Терминала

Можно ли при чтении нарваться на данные, которые пребывают в процессе записи? Т.е. считать не полную информацию?

 

Пока что не могу придумать пользы от этой библиотеки.

На форексе она точно не нужна, а на бирже нет необходимости.

Тестировали данную библиотеку на бирже?

В каком случае по вашему она может пригодиться?

 
Andrey Khatimlianskii:

Можно ли при чтении нарваться на данные, которые пребывают в процессе записи? Т.е. считать не полную информацию?

Нужно экспериментировать. Думаю, что одновременная запись/чтение ресурса действует также, как и с глобальными переменными, т.к. запись в обоих случаях - это создание: ResourceCreate и GlobalVariableSet. Единственное отличие ресурса от глобальной - невозможно даже теоретически что-либо писать в ресурс одновременно. С глобальными - возможно.


Фактически, чтение ресурса - это получение куска данных из памяти. И если чтение началось, то запись ресурса не должна повлиять, т.к. запись - это выделение другого куска памяти. Пересекаться они вряд ли могут, т.к. это, скорее всего, не даст сделать сама ОС. Поэтому, с моей точки зрения, конфликтов load/save с ресурсами быть не должно. Но лучше, конечно, задать этот вопрос разработчикам.

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