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

 

Забыл про бесплатный способ ускорения некоторых советников.

В качестве примера такой советник.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
/*
#define VIRTUAL_LIMITS_TP_SLIPPAGE // Лимитники и TP исполняются по первой цене акцепта - положительные проскальзывания
#define VIRTUAL_TESTER_FAST // Возможно, это ускорит советник в Тестере.
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
*/
input int inRange = 0;
input int inOffset = 10;

void OnTick( void )
{
  static double Offset = inOffset * _Point;
  
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick) && Tick.bid && Tick.ask)
  {
    const double PriceHigh = NormalizeDouble(MathMax(Tick.bid + Offset, Tick.ask + _Point), _Digits);
    const double PriceLow = NormalizeDouble(MathMin(Tick.ask - Offset, Tick.bid - _Point), _Digits);
    
    bool BuyLimit = false;
    bool SellLimit = false;
    
    for (int i = OrdersTotal() - 1; i >= 0; i--)
      if (OrderSelect(i, SELECT_BY_POS))
        switch (OrderType())
        {
          case OP_BUY:
            BuyLimit = true;
            
            if (OrderTakeProfit() != PriceHigh)
              OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), PriceHigh, 0);
            break;
          case OP_SELL:
            SellLimit = true;
            
            if (OrderTakeProfit() != PriceLow)
              OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), PriceLow, 0);
            break;
          case OP_BUYLIMIT:
            BuyLimit = true;
            
            if ((OrderTakeProfit() != PriceHigh) || (OrderOpenPrice() != PriceLow))
              OrderModify(OrderTicket(), PriceLow, OrderStopLoss(), PriceHigh, 0);
            break;
          case OP_SELLLIMIT:
            SellLimit = true;
          
            if ((OrderTakeProfit() != PriceLow) || (OrderOpenPrice() != PriceHigh))
              OrderModify(OrderTicket(), PriceHigh, OrderStopLoss(), PriceLow, 0);
        }

    if (!BuyLimit)
      OrderSend(_Symbol, OP_BUYLIMIT, 1, PriceLow, 0, 0, PriceHigh);
  
    if (!SellLimit)
      OrderSend(_Symbol, OP_SELLLIMIT, 1, PriceHigh, 0, 0, PriceLow);
  }
}


Оптимизация.

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

optimization finished, total passes 6
optimization done in 9 minutes 12 seconds
shortest pass 0:01:30.359, longest pass 0:01:33.652, average pass 0:01:32.059
local 6 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)


После расскомментирования исходника.

optimization finished, total passes 6
optimization done in 1 minutes 54 seconds
shortest pass 0:00:18.341, longest pass 0:00:21.834, average pass 0:00:19.104
local 6 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)


Получили бесплатное ускорение оптимизации в пять раз.


Одиночный проход.

Без Virtual.

23366361 ticks, 213919 bars generated. Environment synchronized in 0:00:00.073. Test passed in 0:04:31.191 (including ticks preprocessing 0:00:02.984).


Вместе с Virtual.

23366361 ticks, 213919 bars generated. Environment synchronized in 0:00:00.070. Test passed in 0:00:22.723 (including ticks preprocessing 0:00:03.047).


Бесплатное ускорение в 12 раз. Бесплатное - сделки совершаются в Тестере, графики строятся, таблицы заполняются и т.д.


ЗЫ На практике использование такого метода чаще всего дает ускорение на 10-20%. Это до пяти часов в сутки.

 
Stanislav Korotky:

По наводке автора, разбираемся с проблемой: баг или ошибка публикации! Обнаружился двойник - https://www.mql5.com/ru/forum/356959

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

 
Хочу на всякий случай заметить, что 
VIRTUAL_TESTER_FAST

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

 
traveller00:

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

Нет данных.

 
// Демонстрация влияния Неттинга и Хеджа на конечный результат.

sinput bool inTogether = false; // Разрешить на одном тике отправить противоположные ордера

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

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

#define VIRTUAL_LIMITS_TP_SLIPPAGE // Лимитники и TP исполняются по первой цене акцепта - положительные проскальзывания
#define VIRTUAL_TESTER_FAST // Возможно, это ускорит советник в Тестере.
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

#define REPORT_TESTER_INPUTS      // В отчете одиночного прохода будут видны входные параметры советника - требует разрешения DLL.
#define REPORT_INTERACTIVE_CHARTS // Добавляет в отчет интерактивные графики.
#define REPORT_BROWSER            // Создание отчета с запуском браузера - требует разрешения DLL.
#include <Report.mqh> // https://www.mql5.com/ru/code/18801

// true - если найдена Type-позиция.
bool OrderScan( const int Type )
{
  bool Res = false;  
  
  for (int i = OrdersTotal() - 1; !Res && (i >= 0); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Type);
    
  return(Res);
}

void ChangePosition( const int Type )
{
  if (OrderScan(Type)) // Если есть позиция
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0); // Закрываем
  else
    OrderSend(_Symbol, Type, 1, Type ? Bid : Ask, 0, 0, 0); // Иначе - открываем.
}

void OnInit()
{
  MathSrand((int)TimeCurrent()); // Повторные запуски - повторяющася случайность.
}

// Торговая система на случайности.
void OnTick()
{  
  static int Count = 0;
  
  if (!(Count++ % 100)) // Выполняем через каждые 100 тиков.
    switch (MathRand() % 3)
    {
    case 0: // Меняем только BUY-позицию.
      ChangePosition(OP_BUY);
      
      break;
    case 1: // Меняем оба типа позиций, если разрешено.
      if (!inTogether)
        break;
      
      ChangePosition(OP_BUY);
    case 2: // Меняем только SELL-позицию.
      ChangePosition(OP_SELL);
    }
}

// Выводим отчеты.
void OnDeinit( const int )
{
  if (VIRTUAL::GetHandle())
  {
    VIRTUAL::Stop(); // Закрыли висящие виртуальные ордера.
    REPORT::ToFile("Report_Virtual_" + (string)inTogether + ".htm"); // Отчет для виртуала.

    VIRTUAL::SelectByHandle(); // Выбрали реальное окружение.
  }
  
  REPORT::ToFile("Report_Real_" + (string)inTogether + ".htm"); // Отчет для реала
}


В этом советнике запускается ТС (см. лаконичный OnTick) в виртуале и на реале. При этом на реал выводится только нетто-позиция, а на виртуал - хедж.


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

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


Рекомендую этот режим библиотеки в некоторых ситуациях.


ЗЫ За сутки ТС делает несколько сотен сделок, поэтому лучше запускать на коротком интервале бэктест.

 
fxsaber:

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

Как следствие, если торгуете портфелем ТС на лимитниках, то Неттинг-прибыль и Хедж-прибыль будет совпадать. Т.к. такая ТС не должна на одном тике вызывать одновременное срабатывание BuyLimit и SellLimit.

В частности, это обозначает, что ReverseMean системы (торговля канала на отбой) могут быть в любом сочетании использоваться одновременно на Хедже без потери прибыли (совпадать с Неттинг-вариантом).

 
fxsaber:

Нет данных.

Только сейчас дошли руки поглядеть. Отчёт самого MT5 выглядит так же. Но если залезть в АПИ, начинаются различия. Например TesterStatistics выдаёт несовпадающие с отчётом данные. Она перехватывается Virtual-ом и данные не совпадают с данными из MT5. А именно, судя по разным отчётам MT5 и Report, он не видит закрытия в конце теста последней сделки и не включает её в отчёт. Он вроде бы и сам может закрывать при наличии VIRTUAL_CLOSEALL_BYEND, но в примере её нет. К тому же она не включается при использовании BESTINTERVAL_ONTESTER. А ещё для неё должен быть VIRTUAL_TESTER. Так что на первый взгляд там не совсем всё просто.

 
traveller00:

Только сейчас дошли руки поглядеть. Отчёт самого MT5 выглядит так же. Но если залезть в АПИ, начинаются различия. Например TesterStatistics выдаёт несовпадающие с отчётом данные. Она перехватывается Virtual-ом и данные не совпадают с данными из MT5. А именно, судя по разным отчётам MT5 и Report, он не видит закрытия в конце теста последней сделки и не включает её в отчёт. Он вроде бы и сам может закрывать при наличии VIRTUAL_CLOSEALL_BYEND, но в примере её нет. К тому же она не включается при использовании BESTINTERVAL_ONTESTER. А ещё для неё должен быть VIRTUAL_TESTER. Так что на первый взгляд там не совсем всё просто.

У меня нет уверенности, что API всегда нужно передавать на реальное тестерное окружение. В случае такой необходимости это всегда можно сделать в OnDeinit.

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

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

fxsaber, 2020.12.06 03:28

void OnDeinit( const int )
{
  if (VIRTUAL::GetHandle())
  {
    VIRTUAL::Stop(); // Закрыли висящие виртуальные ордера.

    VIRTUAL::SelectByHandle(); // Выбрали реальное окружение.
  }
}

Что касается BestInterval, он давно не обновлялся.

 

День добрый!

При создании простейшего советника визардом MQL5  и добавлении в него строк

#define VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
#include <fxsaber\Virtual\Virtual.mqh> // Виртуальное торговое окружение

Получается ошибка при компиляции 'OldOnTick2' - undeclared identifier    test.mq5 А знаний не хватает :)

 
newnek:

При создании простейшего советника визардом MQL5  и добавлении в него строк

Получается ошибка при компиляции 'OldOnTick2' - undeclared identifier    test.mq5 А знаний не хватает :)

Визардом никогда не пользовался. Вся информация в описании и в постах ветки.

Возможно, это решение поможет запустить советник из Визарда.