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

 
fxsaber #:

В случае успешного выполнения возращается хэндл окружения (виртуальное или реальное), которое было ДО вызова Тестера.

ok

 
hini #:

CopyTicksRange always returns 0 in MQ test mode. Do you know why?

Убедитесь, что используете тестирование по реальным тикам. Также смотрите и анализируйте код ошибки в _LastError.

 
Stanislav Korotky # :

Убедитесь, что используете тестирование по реальным тикам. Также смотрите и анализируйте код ошибки в _LastError.

Проблема решена.

 
Есть ли какие-нибудь обновления?
 
hini #:
Are there any updates?

This week.

 

Заметил зависимость производительности библиотеки от длины статического массива.

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

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

double GetProfit()
{
  double Res = 0;
  
  for (uint i = OrdersTotal(); (bool)i--;)
    if (OrderSelect(i, SELECT_BY_POS))
      Res += OrderProfit();
      
  return(Res);
}

// Эмуляция тестера.
double GetProfit( const MqlTick &Tick )
{
  double Res = 0;
  
  for (uint i = 3e6; (bool)i--;)
  {
    VIRTUAL::NewTick(Tick);

    Res += GetProfit();
  }
      
  return(Res);
}

void OnStart()
{ 
  Print("Compiler Version: " + (string)__MQLBUILD__ + " " + __CPU_ARCHITECTURE__ +
        ", MAX_ORDERS = " + (string)(MAX_ORDERS));
  
  if (VIRTUAL::SelectByHandle(VIRTUAL::Create(1000.0)))
  {
    MqlTick Tick;

    Tick.bid = 0.57630;
    Tick.ask = 0.57635;

    VIRTUAL::NewTick(Tick);

    for (int i = 0; i < 10; i++)
    {
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask, 0, 0, 0);
      OrderSend(_Symbol, OP_SELLLIMIT, 1, Tick.bid, 0, 0, 0);
      
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0);
      OrderSend(_Symbol, OP_SELL, 1, Tick.bid, 0, 0, 0);
    }
        
    _B(GetProfit(Tick), 1000);    
  }
}


Повторяющиеся результаты при изменении MAX_ORDERS.

Compiler Version: 4678 AVX, MAX_ORDERS = 150
Alert: Bench_Stack = 0, 1000 <= Time[Test9.mq5 270 in OnStart: GetProfit(Tick)] = 2773994 mcs.
Compiler Version: 4678 AVX, MAX_ORDERS = 400
Alert: Bench_Stack = 0, 1000 <= Time[Test9.mq5 270 in OnStart: GetProfit(Tick)] = 2484084 mcs.

Объяснить такую разницу (> 10%) не получается, кроме как странностями связки компилятора и конфигурации машины.


Кратко, увеличили массив и получили бесплатное ускорение.

 
fxsaber #:

Заметил зависимость производительности библиотеки от длины статического массива.


Повторяющиеся результаты при изменении MAX_ORDERS.

Объяснить такую разницу (> 10%) не получается, кроме как странностями связки компилятора и конфигурации машины.


Кратко, увеличили массив и получили бесплатное ускорение.

Пропишите по дефолту больше 2000. Я свою версию большим числом сделок тестировал и даже 2000 не хватило. Памяти вроде немного массив кушает. Зато не будет у людей сбоить с последующим поиском решения. Думаю 3000-5000 хватит на любые эксперименты. Я себе вообще 20000 поставил.

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

 

Могу ли я спросить, как написать надежный торговый репликатор, который копирует из виртуальной среды в реальную?

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

 
hini #:

May I ask, how does one write a reliable trade replicator that copies from a virtual to a real environment?

If I close specific orders in the virtual environment, it seems that I can only close the real orders based on the order comments.

Не использую комментарии. Удобно использовать, например, MagicNumber для одного и того же виртуального окружения.

 
fxsaber # :

Не использую комментарии. Удобно использовать, например, MagicNumber для одного и того же виртуального окружения.

Для одного символа у меня есть несколько виртуальных сред. Должен ли MagicNumber в каждой из них быть таким же, как в реальной среде, а затем использовать снимки?