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

 
Igor Makanu:

свойства кастомного символа после перезагрузки терминала тестер портит, где то Ваш код-сервис был чтоб исправлять это

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

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

fxsaber, 2019.09.15 22:30

Решение проблемы автоматического изменения валют кастомного символа после перезагрузки Терминала.

// Сервис корректирует валюты всех кастомных символов.
#property service

bool CorrectCurrency( const string Symb, const string Currency )
{  
  return(SymbolInfoInteger(Symb, SYMBOL_CUSTOM) && 
         CustomSymbolSetString(Symb, SYMBOL_CURRENCY_BASE, Currency) &&
         CustomSymbolSetString(Symb, SYMBOL_CURRENCY_MARGIN, Currency) &&
         CustomSymbolSetString(Symb, SYMBOL_CURRENCY_PROFIT, Currency));
}

void CorrectSymbols( void )
{
  const string Currency = AccountInfoString(ACCOUNT_CURRENCY);
  
  for (int i = SymbolsTotal(false) - 1; i >= 0; i--)
    CorrectCurrency(SymbolName(i, false), Currency);
    
  return;
}

void OnStart()
{
  CorrectSymbols();
}

уже и забыл про эту особенность. Наверное, еще по той причине, что в режиме по пипсам гоняю.

 

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

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

Igor Makanu, 2021.01.04 11:11

логично! еще раз спасибо! Вы кладезь знаний и идей!


... есть еще идея, но не до конца сформированная - запустить  Virtual в тестере и по окончании прохода тестера выполнить виртуальную торговлю не проблема, а вот время которое тратит агент на сам "пустой" проход (без сделок) все таки присутствует

насколько помню, в тестере переменные/структуры/классы, описанные с модификаторами const static в глобальной видимости программы - инициализируются один раз при запуске агента тестирования, туда бы подложить тики для  Virtual 

и хотелось бы  "обмануть" тестер, чтобы тестировать на периоде 1 год в  Virtual , а сам проход тестера ограничить, ну например 2-3 дня - это должно сократить время при оптимизации


проверил разные варианты - чтение из файла, чтение из БД Redis (БД в памяти) - все работает не быстрее штатного тестера хоть и тест в виртуальном окружении

НО очень хорошо работает если подключить тики в качестве ресурса, меня интересовало тестирование в режиме OHLC M1 - создал советник для тестера, прогнал его в режиме OHLC M1, собрал тестерные тики в массив и записал массив в файл с помощью FileWriteArray(), размер за 1 год по Евро получился 84 Мб

затем в тестовый советник подключил этот файл в виде ресурса:

#resource "\\Files\\EURUSD_ticks.bin" as MqlTick ExtData[] 

выставил в тестере дату тестирования 2 дня и в виртуальном окружении прогнал 1000 проходов - скорость против обычной оптимизации на слабом ноуте ровно в 3 раза 1мин 38 сек против 5 мин хх сек

тестовый советник такой:

#resource "\\Files\\EURUSD_ticks.bin" as MqlTick ExtData[]
input int param = 0;
double Lots = 0.1;
int Interval = 1000;  // Время жизни позиции

#include <MT4Orders.mqh>
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
void MyStrategy()
{
   MqlTick  Tick;
   SymbolInfoTick(_Symbol, Tick);
   if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
      OrderSend(_Symbol, OP_BUY, Lots, Tick.ask, 100, 0, 0); // Если нет позиции - открываем
   else if (TimeCurrent() - OrderOpenTime() > Interval) // Если позиция прожила больше заданного времени
   {
      // Перевернули позицию
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
      OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
   }
}
//+------------------------------------------------------------------+
double OnTester()
{
   for(int n = ArraySize(ExtData), i = 0; i < n; i++)
   {
      VIRTUAL::NewTick(ExtData[i], MyStrategy);
   }
   return(AccountBalance());
}

//+------------------------------------------------------------------+
int OnInit()
{
   if(!VIRTUAL::SelectByHandle(VIRTUAL::Create())) return(INIT_FAILED);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
void OnTick()
{

}

 

и это для торговли одним ордером, если будет сетка ордеров, то разница скорости тестирования должна быть более существенной!


ЗЫ: есть еще подозрение, что можно увеличить немного скорость если записать не всю структуру MqlTick , лишь Bid / Ask и Time - меньше объем данных, меньше ресурсы процессора будет потреблять, потом попробую проверить

 
Igor Makanu:
в тестовый советник подключил файл в виде ресурса:

выставил в тестере дату тестирования 2 дня

Мат. режим логичней, как и использование VIRTUAL:Tester. MT4Orders лучше выкинуть при таком раскладе.
 
fxsaber:
Мат. режим логичней.

никогда не пользовался, проверил, да все работает

в общем крутая штука этот Virtual!


fxsaber:
Мат. режим логичней, как и использование VIRTUAL:Tester. MT4Orders лучше выкинуть при таком раскладе.

а что выкинуть то? т.е. переписать ЕА под МТ5 и будет быстрее? - Virtual будет работать с МТ5-style?

 
Весь Тестер для мат. режима.
#resource "\\Files\\EURUSD_ticks.bin" as MqlTick ExtData[]

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

double OnTester()
{
   VIRTUAL::Tester(ExtData, OnTick);
   
   return(AccountBalance());
}

void OnTick ()
{
  // Здесь ТС.
}


Igor Makanu:

а что выкинуть то? т.е. переписать ЕА под МТ5 и будет быстрее? - Virtual будет работать с МТ5-style?

Virtual работает в MT4-style. Ему для этого не нужен MT4Orders.

Если Virtual использовать только, как Тестер выше, то он еще может быть ускорен. Сеточные ТС, конечно, гораздо быстрее в виртуале, чем в штатном Тестере. Но библа под них не затачивалась, т.к. не практикую. Ускоритель сеток теоретически возможен.

 
fxsaber:
Весь Тестер для мат. режима.

оставил такой код:

#resource "\\Files\\EURUSD_ticks.bin" as MqlTick ExtData[]

#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
input int param = 0;
double Lots = 0.1;
int Interval = 1000;  // Время жизни позиции
double OnTester()
{
   VIRTUAL::Tester(ExtData, OnTick);
   return(AccountBalance());
}
//+------------------------------------------------------------------+
void OnTick()
{
   MqlTick  Tick;
   SymbolInfoTick(_Symbol, Tick);
   if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
      OrderSend(_Symbol, OP_BUY, Lots, Tick.ask, 100, 0, 0); // Если нет позиции - открываем
   else if (TimeCurrent() - OrderOpenTime() > Interval) // Если позиция прожила больше заданного времени
   {
      // Перевернули позицию
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
      OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
   }
}

не работает - результаты не правильные, было 993571.2$  стало -642.48$ 


UPD: в облако залил EURUSD_ticks.bin  (84 Мб)

https://mega.nz/file/yBlxwI7S#dNwIL1uSCi51lQyrBfTdb01-6zPlnsLQfclqClvFs4c

 
Igor Makanu:

не работает - результаты не правильные, было 993571.2$  стало -642.48$

Подготовил данные.

#property script_show_inputs

input datetime inFrom = D'2021.01.01';

void OnStart()
{
  MqlTick Ticks[];
  
  CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, inFrom * 1000);
  
  FileSave(_Symbol + "_ticks.bin", Ticks);
}


Запустил в мат. режиме Ваш советник, добавив для наглядности в конец исходника эти строки.

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


На выходе получил HTML-проход. Вроде, все нормально в нем.

В исходном варианте Вы не закрывали открытые позиции в конце бэктеста. Т.е. делали аналогию этому:

VIRTUAL::Tester(ExtData, OnTick, 0, false);
 
ОК, спасибо, завтра еще проверю, спать пора - но однозначно, для исследований без Virtual очень тяжко
 
Igor Makanu:

UPD: в облако залил EURUSD_ticks.bin  (84 Мб)

https://mega.nz/file/yBlxwI7S#dNwIL1uSCi51lQyrBfTdb01-6zPlnsLQfclqClvFs4c

В прицепе HTML-отчет.

Файлы:
Report.zip  725 kb
 

что-то не так работает в режиме OHLC M1

ТС - открыли ордер, по закрытию смотрим профит ордера и удваиваем убыток с переворотом позиции:

//+------------------------------------------------------------------+
#resource "\\Files\\EURUSD_ticks.bin" as const MqlTick HistoryData[]
#include <MT4Orders.mqh>
// раскоментировать для Virtual
/* 
#define REPORT_TESTER             // В тестере будут автоматически записываться отчеты
#define REPORT_INTERACTIVE_CHARTS // Добавляет в отчет интерактивные графики.
#define REPORT_BROWSER    
#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
#include <fxsaber\Report.mqh>

//+------------------------------------------------------------------+
double OnTester()
{
   VIRTUAL::Tester(HistoryData, OnTick, 1000000, true);
   return(AccountBalance());
}
*/
//+------------------------------------------------------------------+
void OnTick()
{
   static TICKET_TYPE ticket = -1;
   MqlTick  Tick;
   SymbolInfoTick(_Symbol, Tick);
   if(ticket == -1)
   {
      ticket = OrderSend(_Symbol, OP_BUY, 0.01, Tick.ask, 100, NormalizeDouble(Tick.ask - 200 * _Point, _Digits), NormalizeDouble(Tick.ask + 200 * _Point, _Digits));
      return;
   }
   if(OrderSelect(ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0) return;
   int cmd = OrderType();
   double lot = 0.01;
   if(OrderProfit() < 0.0)
   {
      cmd = OrderType() == OP_BUY ? OP_SELL : OP_BUY;
      lot = 2.0 * OrderLots();
   }
   double pr, sl, tp;
   if(cmd == OP_BUY)
   {
      pr = Tick.ask;
      sl = pr - 200 * _Point;
      tp = pr + 200 * _Point;
   }
   else
   {
      pr = Tick.bid;
      sl = pr + 200 * _Point;
      tp = pr - 200 * _Point;
   }
   ticket = OrderSend(_Symbol, cmd, lot, pr, 100, NormalizeDouble(sl, _Digits), NormalizeDouble(tp, _Digits));
}
//+------------------------------------------------------------------+
//2021.01.05 22:07:45.260       Core 1  final balance 999661.75 USD
//2021.01.05 22:08:52.897       Core 1  OnTester result 1000025.79


Virtual много сделок пропустил, приатачил отчеты, тест 01.01.2020 - 31.12.2020

EURUSD_ticks.bin :   https://mega.nz/file/KR0X2IQS#dNwIL1uSCi51lQyrBfTdb01-6zPlnsLQfclqClvFs4c

Файлы:
Причина обращения: