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

 
hini #:
For one symbol, I have multiple virtual environments. Should the MagicNumber in each be the same as in the real environment, and then use snapshots?

Нет правильной или неправильной логики при решении вашей задачи. Делайте так, как получается.

 
fxsaber # :

Нет правильной или неправильной логики при решении вашей задачи. Делайте так, как получается.

На самом деле, я хотел бы увидеть, как работает структура выполнения кода вашего советника (а не логика стратегии)

Вы эксперт в реальной торговле, и мне очень интересно узнать, как вы проводите сделки и как работает ваш советник (EA).
 
hini #:

Actually, I'd like to see how your EA code execution structure works (not the strategy logic)

You are an expert in actual trading, and I'm very interested in learning how you conduct trades and how your EA (Expert Advisor) operates

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

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

fxsaber, 2023.11.14 17:49

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

  // Синхронизирует VirtualPointerTo-окружение на основе текущего (выбранного) и VirtualPointerOut (для закрытия позиций).
  static bool SyncChannel( const string &Symb, const MAGIC_TYPE Magic, const double Lots,
                           const VIRTUAL_POINTER &VirtualPointerTo, const VIRTUAL_POINTER &VirtualPointerOut, const int FlagChange = false )
  {      
    // Нужно для механизма IsNull.
    if (!VirtualPointerTo.GetHandle() || !VIRTUAL::GetHandle())
      _B2(VIRTUAL::Snapshot());    
    
    const bool IsNull = !OrdersTotal() && !_VP(VirtualPointerTo, OrdersTotal());
    bool Res = IsNull || !FlagChange || _B(SYNCCHANNEL::IsNotChange(true), 500);
  
    if (!IsNull)
    {
      Res &= SYNCCHANNEL::IsCloseBy(/*Symb*/) && MACRO_ISCHANGE(SYNCCHANNEL::SyncCloseBy(Symb, Magic, VirtualPointerTo/*, (inMinLotCorrection <= 0)*/));
      
      Res &= MACRO_ISCHANGE(SYNCCHANNEL::SyncExistOrders(Symb, Magic, VirtualPointerTo, VirtualPointerOut));

      if (Lots && (inMinLotCorrection > Lots))
        ::Alert("inMinLotCorrection(" + (string)inMinLotCorrection + ") > Lots(" + (string)Lots + ")");
      
      Res &= MACRO_ISCHANGE(SYNCCHANNEL::SetNewLimit(Symb, Magic, Lots, OP_BUYLIMIT, VirtualPointerTo, inMinLotCorrection));
      Res &= MACRO_ISCHANGE(SYNCCHANNEL::SetNewLimit(Symb, Magic, Lots, OP_SELLLIMIT, VirtualPointerTo, inMinLotCorrection));
    }    

    return(Res);    
  }
 
fxsaber # :

все в порядке

 
fxsaber # :

This week.

Тихо спрашиваю, есть ли какие-нибудь обновления?
 
hini #:
Quietly asking, are there any updates?

Пока не сделал. Вы можете использовать CLASSIC-вариант. Там все работает правильно.

 
fxsaber #:

Пока не сделал. Вы можете использовать CLASSIC-вариант. Там все работает правильно.

ok

 
Возможно включить такие два режима работы библиотеки.
#define VIRTUAL_SELECTORDERS_OBJECT // Работа с выбранныым окружением без указателей, отключает мультивалютку.
#define VIRTUAL_ORDERSELECT_WITHOUT_COPY // OrderSelect без копирования ORDER-структуры, отключает мультивалютку.


Их использование меняет внутреннюю скрытую архитектуру библиотеки, обходя соответствующие замедляющие особенности MQL5/RAM. Имеет смысл использовать, если требуется скорость расчетов - Тестер.

К сожалению, работают только в моновалютном режиме.


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

#define VIRTUAL_ALTERNATIVE // Альтернативная скорость расчетов
#define VIRTUAL_SELECTORDERS_OBJECT // Работа с выбранныым окружением без указателей, отключает мультивалютку.
#define VIRTUAL_ORDERSELECT_WITHOUT_COPY // OrderSelect без копирования ORDER-структуры, отключает мультивалютку.

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

void OnStart()
{
  Print(VIRTUAL::GetMode());
}
MAX_ORDERS 200
VIRTUAL_ALTERNATIVE
VIRTUAL_SELECTORDERS_OBJECT
VIRTUAL_ORDERSELECT_WITHOUT_COPY


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


ЗЫ. Просьба попробовать эти режимы и сообщить об их результатах.

 
fxsaber #:
Возможно включить такие два режима работы библиотеки.

К сожалению, работают только в моновалютном режиме.

Работают в мультивалютном Apart-режиме.

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

Прогнал следующий советник в MT5-Тестере.

#define VIRTUAL_SELECTORDERS_OBJECT // Работа с выбранныым окружением без указателей, отключает мультивалютку.
#define VIRTUAL_ORDERSELECT_WITHOUT_COPY // OrderSelect без копирования ORDER-структуры, отключает мультивалютку.
#include "EA_Tester.mq5" // https://www.mql5.com/ru/blogs/post/756829


Реальное окружение (стандартный бэктест).

shortest pass 0:00:05.057, longest pass 0:00:06.296, average pass 0:00:05.335


Виртуальное окружение.

shortest pass 0:00:01.546, longest pass 0:00:02.675, average pass 0:00:01.778


И через скрипт альтернативный тиковый тестер.

#define VIRTUAL_SELECTORDERS_OBJECT // Работа с выбранныым окружением без указателей, отключает мультивалютку.
#define VIRTUAL_ORDERSELECT_WITHOUT_COPY // OrderSelect без копирования ORDER-структуры, отключает мультивалютку.
#include "EA_VirtualTester.mq5" // https://www.mql5.com/ru/blogs/post/756831
Benchmark mode.
Getting Ticks (2024.01.01 00:00:00 - 2025.01.01 00:00:00)...
"EURGBP"
1. EURGBP: 10749054 ticks (2024.01.02 00:00:19 - 2024.12.31 23:59:58)
Calculating (APART) 10749054 ticks...
1/5: Performance = 37 364 100.8 [00:00:00.287](100.00%), Best = 37 364 100.8 ticks/sec [00:00:00.287]
Calculating (APART) 10749054 ticks...
2/5: Performance = 37 300 438.9 [00:00:00.288](99.83%), Best = 37 364 100.8 ticks/sec [00:00:00.287]
Calculating (APART) 10749054 ticks...
3/5: Performance = 36 459 470.4 [00:00:00.294](97.58%), Best = 37 364 100.8 ticks/sec [00:00:00.287]
Calculating (APART) 10749054 ticks...
4/5: Performance = 37 144 603.7 [00:00:00.289](99.41%), Best = 37 364 100.8 ticks/sec [00:00:00.287]
Calculating (APART) 10749054 ticks...
5/5: Performance = 37 167 593.9 [00:00:00.289](99.47%), Best = 37 364 100.8 ticks/sec [00:00:00.287]
-----------------
BestPerformance = 37 364 100.8 ticks/sec [00:00:00.287]

Compiler Version: 4789 X64 Regular
MAX_ORDERS 200
VIRTUAL_LIMITS_TP_SLIPPAGE
VIRTUAL_NOCHECK_NULL
VIRTUAL_ALTERNATIVE
VIRTUAL_SELECTORDERS_OBJECT
VIRTUAL_ORDERSELECT_WITHOUT_COPY


С новыми режимами Virtual-тестер на данном примере в три раза быстрее, показывая производительность 37 миллионов тиков в секунду на старой машине. Т.е. 100 милллионов тиков в секунду на Modern-CPU - реально.


Итоговый результат.


MT5-Tester MT5-Tester + Virtual Virtual-Tester
Длительность 0:00:05.057 0:00:01.546 0:00:00.287
использование меняет внутреннюю скрытую архитектуру библиотеки, обходя соответствующие замедляющие особенности MQL5/RAM

Если добавить в MT5-Tester в моновалютке Virtual, получаем трехкратное ускорение расчетов. Если же без MT5-Tester - в 20 раз.

Если же использовать многоордерные ТС (мартины, гридеры, МО), то производительность может вырасти на порядки.