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

 
hini #:

I think this method can also solve the problem of power outages on the computer. What do you think?

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

 
fxsaber # :

Понимаю, что CurrentTick может отсутствовать. Мне нужно видеть ваш код, чтобы понять сценарий использования.

Извините, проблема была не в вашем коде - у меня были проблемы с объединением кодовой базы Forester. Теперь это решено.
 
fxsaber #:

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

Should I use

VIRTUAL::Tester()

or

 VIRTUAL_TESTER VirtualTester(inSymbols, inBalance);

?

 

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

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

fxsaber, 2023.11.14 17:49

Печали не будет, если делать так.

AddToArray(OrderTickets, (OrderType() <= OP_SELL) ? OrderTicket() : -OrderTicket());

Это фича MT4Orders. Однако, SELECT_BY_TICKET - это небыстрый механизм в MT4/5 и виртуалке. Одна из причин - если не найдет среди живых, полезет в историю (MODE_TRADES-флаг - только указание приоритета, где сначала искать).


Здесь уже речь о дополнении от Virtual.mqh. Безусловно, снепшоты очень круто ускорят работу, если торгуется много символов/мэджиков.

Снепшот сводит работу с внешним для советника окружением (торговый API) к минимуму. Т.е. самые тормозные функции вызываются единожды для изначального считывания, а далее вся работа с торговым окружением идет внутри советника незаметно для программиста, т.к. все тот же MT4-style.


Имеет смысл использовать один из этих вариантов снепшота.

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

VIRTUAL::Snapshot(); // 1: один (_Symbol) символ, все мэджики.
VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, MyMagic); // 2: один (_Symbol), один мэджик.
VIRTUAL::Snapshot(VIRTUAL_SNAPSHOT_REFRESHTIME, -1, false, ""); // 3: все символы и мэджики.


  1. Использую его. У меня в моновалютном советнике может быть несколько подТС (каждая со своим мэджиком). И даже если несколько советников на одном символе, все равно вижу для себя целесообразным использовать именно этот вариант. Т.е. один раз заснепшотил, а дальше все подТС работают с результатом.
  2. Если моновалютный советник работает только с одним мэджиком, то самый быстрый вариант.
  3. Мультивалютный советник, где можно задать мэджик или все мэджики.


Можно тысячу раз подряд вызвать VIRTUAL::Snapshot(), но он не будет взаимодействать с внешним торговым API чаще, чем задано в VIRTUAL_SNAPSHOT_REFRESHTIME (в примере это одна миллисекунда - мне хватает). Поэтому ничего не требуется запоминать, код, грубо говоря, становится таким.

VIRTUAL::Snapshot();

for (uint i = OrdersTotal(); (bool)i--;)
{
  VIRTUAL::Snapshot();
  
  do_something();
}


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

  // Синхронизирует 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);    
  }

Из выделенного видно создание снепшота. Его следует вызывать после тормозных функций. Например, OrderSend. Если лишний раз вызвать - ничего страшного, как показал в коде выше.

Однако, исходник привел по другой причине. Все потенциально тормозные функции при синхронизации облачаю в макрос, который полностью останавливает синхронизацию, если во время нее пришел новый тик (SymbolInfoTick или CopyTicks), т.к. требуется сначала новые тики пробросить через все виртуалки, а только потом синхронизировать с реалом. Все точно также, как должно работать у торговых копиров и на внешних крипто-биржах.

При мультивалютной торговле следует ли делать снимок всех символов одновременно или записывать снимки для каждого символа отдельно? Кажется, что сделать снимок всех символов сразу было бы лучше?
 
hini #:
For multi-currency trading, should I take a snapshot of all symbols simultaneously, or should I record snapshots for each symbol separately? It seems taking a snapshot of all symbols at once would be better?

Если советник торгует одновременно несколько символов, то, конечно, снепшот мультивалютный.

 
hini #:

Should I use

or

?

В советнике использую первый вариант.

 
fxsaber # :

В советнике использую первый вариант.

хорошо, спасибо!
 

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

Но когда я отключаю визуализацию, баланс счета виртуальной стратегии сильно отличается.

Почему это происходит и как это решить?

 
hini #:

Good afternoon, author. I encountered a problem. When I backtest with visualization enabled, the account balance of the virtual and MQ Tester is quite similar.

But when I turn off the visualization, the account balance of the virtual strategy is very different.

Why is this happening and how to solve it ?

.

 
FXSABER # :

.

Что это значит? Можете объяснить яснее? Я искал в папке Virtual MQL_VISUAL_MODE, но не нашел никаких ссылок на него.