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

 
fxsaber #:

Если вы сбрасываете все значения, то VIRTUAL_POINTER-переменную замените просто новой средой.

Если же нужно уменьшить историю торговли, то для этого есть VIRTUAL::ReduceHistory.

Хорошо, дай подумать.
 
Похоже, нет способа сбросить ORDER::TicketCount до 0.
 
hini #:
Похоже, нет способа сбросить ORDER::TicketCount до 0.

Зачем его сбрасывать? Например, на торговом сервере, сколько бы демо-счетов (аналог Virtual) к нему не было подключено, единая система присвоения номеров тикетов.

 
fxsaber #:

Зачем его сбрасывать? Например, на торговом сервере, сколько бы демо-счетов (аналог Virtual) к нему не было подключено, единая система присвоения номеров тикетов.

Я создал простой тестер с графическим интерфейсом, в котором есть кнопка «Сброс», нажимая на которую, я хочу, чтобы весь советник был таким же, как при первой загрузке на график, все было совершенно новым. Номер виртуального ордера, на который совершается сделка, сбрасывается до 1.

 
hini #:

Я создал простой тестер с графическим интерфейсом, в котором есть кнопка «Сброс», нажимая на которую, я хочу, чтобы весь советник был таким же, как при первой загрузке на график, все было совершенно новым. Номер виртуального ордера, на который совершается сделка, сбрасывается до 1.

Такого прямого функционала нет. Есть VIRTUAL::Save/Load, включая вариант сохранения/загрузки в массив (если подключить TypeToBytes).

Если использовать эту возможность, то будет нужный сброс тикетов. Однако, я сомневаюсь, что Save/Load-методы сейчас работают корректно, т.к. было много архитектурных изменений после их написания.

 
fxsaber #:

Такого прямого функционала нет. Есть VIRTUAL::Save/Load, включая вариант сохранения/загрузки в массив (если подключить TypeToBytes).

Если использовать эту возможность, то будет нужный сброс тикетов. Однако, я сомневаюсь, что Save/Load-методы сейчас работают корректно, т.к. было много архитектурных изменений после их написания.

Хорошо, понятно.
 

Автор, здравствуйте! У меня есть вопрос.

Почему, когда я делаю виртуальный тест на основном символе (например, копирую тики за месяц на графике XAUUSD), всё работает очень быстро? Но если я создаю кастомный символ TESTER_XAUUSD, копирую в него тики из XAUUSD за тот же месяц и запускаю тест — скорость становится в разы медленнее (разница в десятки раз), да и баланс получается другим.

Это из-за использования кастомного символа? Или есть другая причина?

void RunHistoryVirtual(CStrategyBase* ts, bool stop, datetime startTime, datetime endTime) {

  MqlTick Ticks[];
  Print(_Symbol,"  ", startTime, " ", endTime);
  const int Amount = ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, startTime * 1000, endTime * 1000);
  ts.m_virPointer.Select();
  ts.SetLogggerIsRun(false);

  for (int i = 0; i < Amount; ++i) {
    VIRTUAL::NewTick(Ticks[i]);
    ts.Execute();
  }

  if (stop) VIRTUAL::Stop();
  Print(Amount, " ", " ", VIRTUAL::ToString());
  
}
 
hini #:

Это из-за использования кастомного символа? Или есть другая причина?

Скорость Virtual не зависит от природы MqlTick[]. У меня нет гипотезы, что может медленно работать в самом Virtual.

Возможно, проблема в CopyTicks. Вам придется самостоятельно провести расследование.

 
fxsaber #:

Скорость Virtual не зависит от природы MqlTick[]. У меня нет гипотезы, что может медленно работать в самом Virtual.

Возможно, проблема в CopyTicks. Вам придется самостоятельно провести расследование.

Проблема была в моём компьютере — на другой машине всё работает нормально. Ладно, не буду заморачиваться.
 

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

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

Forester, 2025.07.11 10:33

Экспериментирую с кастомным символом BTCUSD. У него цена тика = 0.1
Virtual tester показывает профит в валюте депозита на порядок больше, чем MQ тестер.
Помогла такая модификация в Order.mqh:
  bool Create( const SYMBOL_BASE &SymbolBase, const ENUM_ORDER_TYPE inType, const double &dLots,
               double inPrice, int SlipPage,  double dSL, double dTP, const MAGIC_TYPE &iMagicNumber,
               const string &sComment, const datetime &dExpiration, const MqlTick &Tick, double &STOPS_LEVEL, int &TRADE_EXEMODE )
  {
    this = SymbolBase;
    double TICK_SIZE=SymbolInfoDouble(this.GetSymbol(),SYMBOL_TRADE_TICK_VALUE);
    this.TickValue *= (this.Lots = ::NormalizeDouble(dLots, 8)) * TICK_SIZE;
Ну у вас по умолчанью расчеты в пипсах, а не в валюте, так что наверное не актуально. В пипсах все совпадает.

Расчеты в валюте делаются так в файле Symbol_Base.mqh.

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

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

fxsaber, 2025.06.30 10:26

    if (true) // Режим прибыли в валюте.
    {
      this.TickSize = ::SymbolInfoDouble(sSymb, SYMBOL_TRADE_TICK_SIZE);
      this.TickValue = ::SymbolInfoDouble(sSymb, SYMBOL_TRADE_TICK_VALUE) / this.TickSize;
    }
    else // Режим прибыли в пипсах.
    {
      this.TickSize = this.Point;
      this.TickValue = 1 / this.TickSize;
    }