Библиотеки: Virtual - страница 38

 

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

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

fxsaber, 2021.05.14 22:10

Важно для тех, кто использует снепшоты и другие очень специфические техники торговли.

Советники обычно работают с каким-то своим мэджиком. Механизм определения свой-чужой постоянно задействован. В логике идет подсчет своих ордеров и т.д.

Ниже на примере покажу одно из преимуществ работы через снепшоты.

// Демонстрация РЕШЕНИЯ открытия дубля позиции в MT5.
// https://www.mql5.com/ru/forum/368178/page13#comment_22171524

#property script_show_inputs

input int inMagic = 6723; // С каким мэджиком работаем

#define MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define VIRTUAL_SNAPSHOT_REFRESHTIME 1000 // Время жизни снепшота для обновления. В MT5 требует подключенной MT4Orders.mqh
#define VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Отказ от снепшота истории для повышения производительности
#include <fxsaber\Virtual\Virtual.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define MinLot SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN)

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Отказываемся от встроенной коррекции результата MT5-OrderSend.

  VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, inMagic); // В снепшот попадут только данные с inMagic-мэджиком.
  
  while (!IsStopped() && OrdersTotal() <= 1)
  {
    if (!OrdersTotal())
      OrderSend(_Symbol, OP_BUY, MinLot, Ask, 0, 0, 0, NULL, inMagic);    
    else if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      
    VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, inMagic); // В снепшот попадут только данные с inMagic-мэджиком.
  }
    
  Print(MT4ORDERS::ByPass.ToString()); // Распечатываем статистику синхронизаций.
}

Вся торговая логика - это пять строк while-цикла. Как видите, в нем нет никаких проверок на свой-чужой. Однако, все будет работать правильно даже при наличии ордеров с другими мэджиками.

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


Например, навесил вышеприведенный скрипт на два EURAUD-чарта с разными мэджиками.

Никто никому не мешал, отработка идеальная.

 

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

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

fxsaber, 2021.09.30 15:03

Автоматически не сохраняются, конечно. Но и для ручных манипуляций пока не написаны VIRTUAL::Save/Load.

Пример использования.

Сохранение.

#include <fxsaber\Virtual\Virtual.mqh>

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void System()
{
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
  OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0);

  if (OrderSelect(0, SELECT_BY_POS))    
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
}

void OnStart()
{   
  if (VIRTUAL::SelectByHandle(VIRTUAL::Create()))
  {
    VIRTUAL::NewTick();
    
    System(); // Поторговали в виртуальном окружении

    Print(VIRTUAL::ToString(5)); // Вывели его состояние.
          
    VIRTUAL::Save("Virtual.bin"); // Сохранили окружение в файл.
  }
}


Загрузка.

#include <fxsaber\Virtual\Virtual.mqh>

void OnStart()
{   
  if (VIRTUAL::SelectByHandle(VIRTUAL::Create("Virtual.bin"))) // Загрузили виртуальное окружение из файла.
    Print(VIRTUAL::ToString(5)); // Вывели его состояние.
}


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


ЗЫ SELECT_BY_TICKET подправил.

 

думаю, что нужен еще вариант сохранения по хэндлу открытого файла, тогда появится возможность в один файл сохранить и настройки и время и ... и  Virtual, думаю это полезно

спасибо!

 
Igor Makanu #:

думаю, что нужен еще вариант сохранения по хэндлу открытого файла, тогда появится возможность в один файл сохранить и настройки и время и ... и  Virtual, думаю это полезно

спасибо!

Выше написал, что можно в массив сохранить или загрузиться из него. А его уже любым способом использовать.

Там есть некоторая проблема в виде того, что MqlTick имеет разный sizeof для MT4/5. Поэтому при сохранении в файл тик приходится писать в самый его конец.

Для массива - аналогично.

 
fxsaber #:

Там есть некоторая проблема в виде того, что MqlTick имеет разный sizeof для MT4/5. Поэтому при сохранении в файл тик приходится писать в самый его конец.

но ведь у открытого файла по его хендлу доступно положение файлового указателя? - пиши что хочешь в любой последовательности

хотя не суть, меня устраивает, сохранения состояния виртуального окружения мне не хватало, теперь очень круто!

 
Igor Makanu #:

сохранения состояния виртуального окружения мне не хватало

До сих пор ни разу не столкнулся с такой необходимостью. Видимо, сценарии использования иные.


А вот со свопами была необходимость исследований, поэтому есть такое.

VIRTUAL::CalcSwaps(); // Расчет свопов.
 
fxsaber #:

VIRTUAL::Create("Virtual.bin")

Когда стартуем первый раз этого файла нету, Load возвращает false. Create возвращает -1 и в памяти остается объект ORDERS

Может лучше не проверять Load , а просто есть файл - загрузили, нету - работаем с нуля?

 
Igor Makanu #:

но ведь у открытого файла по его хендлу доступно положение файлового указателя? - пиши что хочешь в любой последовательности

Добавлена работа с файловыми хендлами. MqlTick-несоответствие обошел.

Oleksii Chepurnyi #:

Когда стартуем первый раз этого файла нету, Load возвращает false. Create возвращает -1 и в памяти остается объект ORDERS

Спасибо, исправил.

Может лучше не проверять Load , а просто есть файл - загрузили, нету - работаем с нуля?

VIRTUAL::Load, вроде, так и работает.

 
VIRTUAL::ReduceHistory может сократить длину истории торгов до нужного значения.