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

 
Forester #:
Да, я тоже заметил то, что время расчетов не росло линейно. Неделя 10 сек, 5 недель около 4 минут. Тоже подумал про ресайз массива,

Самое стремное - когда Жорж, Ренату написал что он купил проц новый а он  начинает считать вначале быстро, а потом очень медленно, он сказал - что-то типа нормально там все)

 
Forester #:

По скорости, какие расчеты насколько замедляют самую быструю версию без свопов, комиссий и контроля тиков: (уже с новым ресайзом массива истории)

5 недель на вашем последнем примере, чтобы не миллисекунды сравнивать.

своп, комис в %, контроль тиков
OnTester result -5038568.32
2927398 ticks, 7477 bars generated. Test passed in 0:00:18.092 (including ticks preprocessing 0:00:00.359).
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.375.
2927398 ticks, 7477 bars generated. Test passed in 0:00:17.367.
в среднем 17,5 сек  медленне на 84%

В общем самый лучший/точный вариант комиссии в % замедляет расчеты на 85% примерно. Это конечно много, но для демонстрации тем, кто хочет своими глазами увидеть абсолютное совпадение с тестером MQ, это может быть нужно.

Сделал ускоренную версию расчета комиссии в %.

новый тест без контроля без свопов без комиссий
EURUSD,M5: 2927398 ticks, 7477 bars generated. Environment synchronized in 0:00:00.025. Test passed in 0:00:10.578 (including ticks preprocessing 0:00:00.312).
EURUSD,M5: 2927398 ticks, 7477 bars generated. Test passed in 0:00:10.077.
EURUSD,M5: 2927398 ticks, 7477 bars generated. Test passed in 0:00:10.071.
в среднем 10 сек

своп, комис% ускоренный, контроль тиков
OnTester result -5038568.32
EURUSD,M5: 2927398 ticks, 7477 bars generated. Test passed in 0:00:13.173 (including ticks preprocessing 0:00:00.312).
EURUSD,M5: 2927398 ticks, 7477 bars generated. Test passed in 0:00:12.784.
EURUSD,M5: 2927398 ticks, 7477 bars generated. Test passed in 0:00:12.722.
EURUSD,M5: 2927398 ticks, 7477 bars generated. Test passed in 0:00:12.994.

в среднем 12,8 сек  медленнее на 28%

 
Forester #:

Внутренний контроль нужен для версий советника с #define VIRTUAL_TESTER

Повторюсь, что Тестер запускаю в режиме по пипсам и на кастомных символах. Поэтому свопы и комиссия - не из области практики для меня.

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

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

fxsaber, 2023.11.24 16:23

Попробуйте выставить одним OrderSend BuyLimit = Ask, TP = Bid. И увидите различия с тестером. Не эталон он, к сожалению.

 
lynxntech #:

по тому и просится, вернуть обычный режим профилирования

кто знает где-то что забагалось и будет крутиться вертеться месяцами в пустую, да и вообще с тем вариантом проще было в понимании, можно было просто рассчитать сколько на что считается,

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

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

struct COUNTER_UNIT
{
  int Count;
  string Name;  
    
  COUNTER_UNIT() : Count(0), Name(NULL)
  {
  }
  
  bool Set( const string &Str )
  {
    bool Res = (this.Name == Str);
    
    if (!Res && (Res = (this.Name == NULL)))
      this.Name = Str;
    
    return(Res && (bool)++this.Count);
  }  
};

class COUNTER
{
  COUNTER_UNIT Units[];
  int Amount;
  
public:
  COUNTER( void ) : Amount(::ArrayResize(Units, 1000) * 0)
  {
  }
  
  void Set( const string Str )
  {
    for (int i = 0; (i <= this.Amount); i++)
      if (this.Units[i].Set(Str))
      {
        if (i == this.Amount)
          this.Amount++;
          
        break;
      }      
  }
  
  ~COUNTER()
  {
    ::ArrayResize(this.Units, this.Amount);
    ::ArrayPrint(this.Units);
  }
};

COUNTER Counter; // Counter.Set(__FUNCTION__); прописать в функциях.

#define _VC Counter.Set(__FUNCTION__);

В функциях для подсчета прописал эти выделенные три символа. Реализация лобовая. Для ускорения нужно подключать Generic.mqh или подобное.

 
Forester #:

Сделал ускоренную версию расчета комиссии в %.

Можно точно ускорить VIRTUAL::NewTick. Для этого надо будет ядро переписать почти полностью. Пока не готов браться. Думаю, будет быстрее всех существующих решений.

 
Forester #:

5 недель на вашем последнем примере, чтобы не миллисекунды сравнивать.

Замерять лучше так.


  1. Оставить включенным только один Агент.
  2. Выбрать полную оптимизацию.
  3. inRange диапазон от 1 до 10.
  4. После оптимизации посмотреть shortest-время.
 
fxsaber #:
Замерять лучше так.


  1. Оставить включенным только один Агент.
  2. Выбрать полную оптимизацию.
  3. inRange диапазон от 1 до 10.
  4. После оптимизации посмотреть shortest-время.
Спасибо.
fxsaber #:

Можно точно ускорить VIRTUAL::NewTick. Для этого надо будет ядро переписать почти полностью. Пока не готов браться. Думаю, будет быстрее всех существующих решений.

При текущей скорости значительного (например 50%) ускорения наверное уже не добиться. А за более мелкое наверное инет смысла время тратить. Да и бОльшая скорость наверное нужна только вам.

У вас же кажется можно объединить несколько тестеров в один и потом посмотреть итог?..
Вот простой вариант придумал с мультивалютным тестером: каждую валюту в отдельном тестере считать, а потом объединить результат. Только надо будет вызывать VIRTUAL::Create( "GPDUSD"); VIRTUAL::Create( "EURUSD"); . А внутри использовать не _Symbol _Point и т.д., а сохраненные в массиве структур параметры для каждой валюты, которые рассчитаются 1 раз и потом будут читаться из него ( _Symbol _Point _Digits все для свопов, все для торг. сессии, предрасчеты для комиссий, и т.п.). К нему можно обращаться по индексу валюты. Индекс - номер вирт. тестера. Это точно быстрее, чем запрос у терминала по строке символа.
Но когда хотим торговать "GPDUSD" или  "EURUSD" надо в советнике выбирать нужный тестер по индексу этой валюты VIRTUAL::SelectByIndex(1); VIRTUAL::SelectByIndex(2);. Можно и внутри делать поиск в массиве по имени символа и выбирать нужный тестер, если не задан индекс (только в моменты торговых операций - их меньше, чем потиковых проверок).
Это один вариант.
Но думаю можно и сразу в одном тестере мультивалютность использовать,  возможно это сложнее, чем объединение.

Ну мультивалютность тоже мало кому нужна, чтобы тратить на это время.

 

Forester #:
Спасибо. При текущей скорости значительного (например 50%) ускорения наверное уже не добиться. А за более мелкое наверное инет смысла время тратить. Да и бОльшая скорость наверное нужна только вам.

У вас же кажется можно объединить несколько тестеров в один и потом посмотреть итог?..

Вы можете объединять любое количество виртуалов.

Это один вариант.

Сохраните виртуалки тестера в файл. Затем в скрипте создайте виртуалку и добавьте в нее все файлы.

Но думаю можно и сразу в одном тестере мультивалютность использовать,  возможно это сложнее, чем объединение.

Ну мультивалютность тоже мало кому нужна, чтобы тратить на это время.

Над мультивалютностью думал. Не осилил, т.к. самому пока не требуется. Там надо варганить Marketwatch. Основная нужда мультивалютных виртуалов - торговля на крипто-биржах.

 
Forester #:
При текущей скорости значительного (например 50%) ускорения наверное уже не добиться. А за более мелкое наверное инет смысла время тратить. Да и бОльшая скорость наверное нужна только вам.
Экономия еще на потреблении памяти.

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

Компьютер для тестировки и оптимизации робота ( советника ).

fxsaber, 2023.11.30 14:06

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

18 Агентов, каждый потребяет меньше 0.5Гб. И еще один терминал параллельно гоняет из посчитанных opt-файлов одиночные прогоны - потребляет до 1 гига.

 
fxsaber #:

Во время просмотра увидел, что можно ускорить тестирование. Оставляю на будущее советник для замера производительности.

Этот советник убьет штатный тестер, на виртуалке прогоняет быстро. Еще ускорить - пока не до этого.

Попробовал этот советник на EURUSD при валюте депозита CHF.

MQ тестер на нем сделал 1341 сделку, причем все они без прибыли и в отчете по сделкам и в итоговом. Остальные лимитники так и не были активированы.


Ошибки примерно такие (других не заметил):

2022.05.30 23:44:31   failed modify #105 buy 10 EURUSD sl: 0.00000, tp: 1.07799 -> sl: 0.00000, tp: 1.07799 [Invalid stops]
2022.05.30 23:44:31   failed modify #103 buy 10 EURUSD sl: 0.00000, tp: 1.07798 -> sl: 0.00000, tp: 1.07798 [Invalid stops]
2022.05.30 23:44:32  no prices for symbol USDCHF (1970.01.01 00:00:00 0.00000, 0.00000)
2022.05.30 23:44:32  no prices for symbol USDCHF (1970.01.01 00:00:00 0.00000, 0.00000)
2022.05.30 23:44:32   position modified [#2663 sell 10 EURUSD 1.07860 tp: 1.07798]
2022.05.30 23:44:32   position modified [#2661 sell 10 EURUSD 1.07860 tp: 1.07799]

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

И что самое интересное, если переключиться на ваш виртуальный тестер, то совершается 43738 сделок, как при тесте с USD в качестве валюты Аккаунта.
Т.е. при валюте аккаунта USD или EUR - и MQ и виртуальный тестеры делают по  43738 сделок и результаты абсолютно совпадают.
При переключении аккаунта на CHF, виртуальный делает входы в тех же местах, а MQ перестает правильно работать.
Тики вручную из папки удалял и снова загружал, т.е. проблема не в них. То же самое поведение и при переключении на реальный сервер Аль..и.

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

П.С.  Аналогичная проблема с MQ тестером при тесте по USDCHF и валюте аккаунта EUR.
Причина обращения: