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

 
  1. Упрощение торговой логики на боевом счету. Рынок создает ситуации, которых нет в Тестере. Это и реджекты и частичное исполнение. Что порождает массу сложностей, чтобы торговля на реальном счету велась близко к той идеальной картине, которая была, когда создавась ТС в Тестере. Как правило, авторы ТС тратят очень большие усилия для борьбы с рыночными нюансами, которые крайне сложно предусмотреть. Фактически, учатся на своих ошибках за реальные деньги. Т.к. демо-счета не в состоянии эмулировать многие вещи реального мира. Виртуальное же окружение позволяет видеть в любой момент идеалистическую картину исполнения. Соответственно, для обхода подводных камней настоящего рынка нужен только доступ в реальном времени к этой идеальной картине и качественный синхронизатор (копир-сервис) из виртуального окружения в реальный. Поэтому при решении сложных ситуаций на реальном рынке большую помощь оказывают виртуальные торговые окружения.
// Пример кроссплатформенного боевого советника

#include <fxsaber/Virtual/Virtual.mqh> // https://www.mql5.com/ru/code/22577

#define OnTick SystemOnTick
  // Сюда прописываем любой MT4-style тиковый советник
  #include <..\Experts\fxsaber\TesterEA\TesterEA.mq4> // https://www.mql5.com/ru/code/22770
#undef OnTick

#include <fxsaber\HistoryTicks\HistoryTicks.mqh> // https://www.mql5.com/ru/code/20298

void OnTick()
{  
  static const bool VirtualInit = (VIRTUAL::Tester(HistoryTicks, SystemOnTick, 1000, false) != -1); // Прогнали в виртуалке советник на тиковой истории с начальным балансом = 1000
  
  if (VirtualInit)
  {
    VIRTUAL::NewTick(LastTicks, SystemOnTick); // Продолжаем гнать советник в виртуале на вновь поступающих тиках (без единого пропуска!)
    Comment(VIRTUAL::ToString(5));
    
//    VirtualToReal(); // Синхронизатор виртуального и реального торговых окружений.
  }
}
 

Внесены небольшие удобства и исправления.

Пример

// Пример использования _V-макроса: операция с конкретно заданным окружением.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#define VIRTUAL_ONTESTER_FORMULA ::AccountBalance() // Что возвращать в OnTester в режиме VIRTUAL_TESTER
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

// Возвращает количество открытых позиций
int GetPositionsTotal()
{
  int Res = 0;
  
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
      Res++;
      
  return(Res);
}

int OnInit()
{
  _P(VIRTUAL::Total()); // Количество созданных виртуальных окружений
  _P(TimeCurrent());    // TimeCurrent виртуального окружения - входной параметр VirtualTester = true (см. выше директиву VIRTUAL_TESTER)
  
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0); // Отправили в виртуальное окружение ордер
  
  _V(1, OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0)); // Отправили в виртуальное окружение ордер  
  _V(0, OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0)); // Отправили в реальное окружение ордер
  
  _V(1, OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0)); // Отправили в виртуальное окружение ордер
  _V(0, OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0)); // Отправили в реальное окружение ордер

  _V(1, OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid + 100 * _Point, 0, 0, 0)); // Отправили в виртуальное окружение ордер
  _V(0, OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid + 100 * _Point, 0, 0, 0)); // Отправили в реальное окружение ордер
      
  _P(_V(1, OrdersTotal())); // Количество MT4-ордеров в виртуальном окружении
  _P(_V(0, OrdersTotal())); // Количество MT4-ордеров в реальном окружении
  
  _P(_V(1, GetPositionsTotal())); // Количество текущих позиций в виртуальном окружении
  _P(_V(0, GetPositionsTotal())); // Количество текущих позиций в реальном окружении

  MqlTick Tick;
  
  if (_V(1, SymbolInfoTick(_Symbol, Tick)))
    _P(Tick.time); // Время текущего тика в виртуальном окружении

  if (_V(0, SymbolInfoTick(_Symbol, Tick)))
    _P(Tick.time); // Время текущего тика в реальном окружении

  _P(_V(7, SymbolInfoTick(_Symbol, Tick))); // Будет возвращен false, т.к. с хэндлом 7 не создано торговое окружение

  _P(VIRTUAL::GetHandle()); // Убедились, что по-умолчанию находимся в виртуальном окружении - входной параметр VirtualTester = true (см. выше директиву VIRTUAL_TESTER)
  _P(VIRTUAL::ToString());  // Распечатали состояние виртуального окружения
  
  return(INIT_FAILED);
}

void OnTick() {}
 

бороться с "рыночными нюансами" невозможно, их можно либо принимать либо отвергать :) Что бы их понять, не обязатательно делать все так сложно, достаточно посмотреть кач-во исполнения дц

это к цитате из предпоследнего поста.. написано запутанно и бессмысленно

 
Maxim Dmitrievsky:

бороться с "рыночными нюансами" невозможно, их можно либо принимать либо отвергать :) Что бы их понять, не обязатательно делать все так сложно, достаточно посмотреть кач-во исполнения дц

это к цитате из предпоследнего поста.. написано запутанно и бессмысленно

Напомнило: mmgp. ru/showthread.php?t=614281

Сложность только при написании синхронизатора. А использовать его уже - элементарно.
 
fxsaber:

Напомнило: mmgp. ru/showthread.php?t=614281

Сложность только при написании синхронизатора. А использовать его уже - элементарно.

вай вай, вот там опять очередная каша в головах про ецн стп

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

 
Maxim Dmitrievsky:

вай вай, вот там опять очередная каша в головах про ецн стп

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

  1. Ставим BuyLimit и SellLimit с тэйками - торговля канала вовнутрь переворотом.
  2. BuyLimit исполнился частично, породив 10 позиций. Не зафиленная часть реджекнулась и осталась висеть.
  3. Из этих 10 позиций 7 исполнились частично по тэйку, при этом SellLimit исполнился частично, породив 6 позиций. Часть SellLimit так же реджекнулась и осталась висеть.
  4. И т.д.
Разруливайте. С помощью синхронизатора это делается элементарно. При написании ТС не нужно думать о таких вещах совсем. Все будет отрабатывать корректно, максимально-возможно приближая результат на реале к тому, что показывает Тестер. Точно такие же ситуации возникают на биржах. Так что не нужно про ДЦ.
 
fxsaber:

  1. Ставим BuyLimit и SellLimit с тэйками - торговля канала вовнутрь переворотом.
  2. BuyLimit исполнился частично, породив 10 позиций. Не зафиленная часть реджекнулась и осталась висеть.
  3. Из этих 10 позиций 7 исполнились частично по тэйку, при этом SellLimit исполнился частично, породив 6 позиций. Часть SellLimit так же реджекнулась и осталась висеть.
  4. И т.д.
Разруливайте. С помощью синхронизатора это делается элементарно. При написании ТС не нужно думать о таких вещах совсем. Все будет отрабатывать корректно, максимально-возможно приближая результат на реале к тому, что показывает Тестер. Точно такие же ситуации возникают на биржах. Так что не нужно про ДЦ.

а, понятно, ну если такие ситуации то да. Просто думал обобщено на какие-то другие непонятные случаи

 
fxsaber:
Из этих 10 позиций 7 исполнились частично по тэйку, при этом SellLimit исполнился частично

Такое может быть? Разве нет очереди исполнения?

 
Andrey Khatimlianskii:

Такое может быть? Разве нет очереди исполнения?

Зависит от реализации агрегатора. Если все позиции имеют одинаковый тэйк, то два варианта

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

 

Еще несколько сценариев использования виртуального окружения, когда не требуется менять код ТС:

  1. Сдвиг точек входа/выхода ТС. Когда нужно понять, как меняется результат ТС, если цены входов и выходов делать немного отличными от оригинальных. Это можно сделать без изменения кода ТС, при этом позволяет исследовать ТС на эффективность. И в некоторых случаях добиться ее улучшения.
  2. Изменение правил ММ. Можно взять любую ТС и наделить ее своими правилами ММ.
  3. Дополнительные входы. Например, можете посмотреть, как изменяются результаты ТС, если добавить к ней сеточные входы. В некоторых ситуациях это разумно.
  4. Фильтрация сделок. Возможно создавать любые фильтры сделок. Одна из рабочих реализаций - BestInterval.
BestInterval
BestInterval
  • www.mql5.com
Рыночные закономерности зависят от интервалов внутри суток или недели. По этой причине разумно ограничивать торговлю ТС по времени. Например, есть скальперские ТС, хорошо торгующие кроссы на азиатско-американской торговой сессии. Или же практикуется выключение ТС в период высокой волатильности. Соответственно, встает задача, как найти наилучшее...
Причина обращения: