Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5 - страница 31

 
Sergey Klimov:

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.30 09:48

Памятка

Действие/тип программыСмена ТФ или символаСмена счета
ИндикаторЗапуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).Ничего не происходит, кроме обнуления prev_calculated.
СоветникЗапуск OnDeinit и OnInit, объект глобального класса не меняется.Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).
 
_o0O:

Билд 1940.

В настройках терминала параметр "Макс баров в окне" установлено значение 5000.

Но с каждым новым баром количество баров в окне увеличивается (об этом свидетельствуют rates_total в индикаторе и функция Bars (Symbol (), Period ()) . Так и должно быть? До каких пор будет увеличиваться количество баров в окне с течением времени?

Да, это поведение известно еще со времен появления MetaTrader 4. То ест 12-13 лет уже. Терминал сам не подрезает графики во время работы.

 
fxsaber:

Вопрос то был чуть-чуть про другое (разное значение по сути одних и тех же переменных в зависимости от способа доступа к ним).

А табличка из памятки - это просто засада. ;-)

 
Stanislav Korotky:

Вопрос то был чуть-чуть про другое (разное значение по сути одних и тех же переменных в зависимости от способа доступа к ним).

Удивляет, что _Symbol меняется. Так то это просто const-переменные, инициализируемые в конструкторе глобального класса.

 
fxsaber:

Удивляет, что _Symbol меняется. Так то это просто const-переменные, инициализируемые в конструкторе глобального класса.

const - определение для программы на MQL, чтобы мы не могли её изменить. Что и как там терминал внутри присваивает - не имеет ограничений. Про глобальный класс впервые слышу - есть где почитать?

 
Stanislav Korotky:

const - определение для программы на MQL, чтобы мы не могли её изменить. Что и как там терминал внутри присваивает - не имеет ограничений. Про глобальный класс впервые слышу - есть где почитать?

Это мое определение.

 

Ну на мой взгляд, если разработчик заявляет:

В переменной _Digits хранится количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика.

Можно также использовать функцию Digits().


В переменной _Point хранится размер пункта текущего инструмента в валюте котировки.

Можно также использовать функцию Point().

 то там и должны хранится всегда актуальные данные для текущего инструмента. А то после смены счета получается что там хранятся данные не текущего символа, а предыдущего. И получается что через _Digits, _Point и функции SymbolInfo получаем по одному и тому же инструменту разные данные.

Кстати, функции Digits() и Point() тоже выдают старые значения, что в принципе и не удивительно.

И почему бы вообще при смене счета не производить переинициализацию индикатора?

 

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

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

fxsaber, 2018.11.16 01:33

Пока не в состоянии что-то серьезное написать, решил сделать замеры.

Тестовый советник

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

//#define VIRTUAL_ON // Тестер или Virtual

#ifdef VIRTUAL_ON
  #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
  
  const int Init = VIRTUAL::Select(VIRTUAL::Create());
  
  void OnTick()
  {
    VIRTUAL::NewTick();
  }
/*  
  double OnTester()
  {
    return(AccountEquity());
  } */
#endif // VIRTUAL_ON

input int inRange = 0;          // 1 .. 5
input int inAmount = 1;         // Amount of positions
input int iTakeProfit  = 10000; // TakeProfit in pips

uint iStartTime;

void OnInit()
{  
  iStartTime = GetTickCount(); // Начинается замер специально в OnInit, а не снаружи
  
  const double Price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  
  for (int i = 0; i < inAmount; i++)
    OrderSend(_Symbol, OP_BUY, 0.1, Price, 100, 0, Price + iTakeProfit * _Point);
}

double OnTester()
{
  return(GetTickCount() - iStartTime);
}


22 млн тиков в режиме по всем тикам. Терминалы запускались с RAMDrive. Только одно ядро задействовано. Выбран лучший результат из Оптимизации в 5 прогонов. Кросс-перерасчет выключен. Время указано в секундах. Hedge, Forex, MaxCustom. Исходный баланс 10 млн. В MT5 кастомный символ (свопы и комиссия отсутствуют).

AmountMT5-TesterMT4-TesterMT5-Virtual (x64) MT4-Virtual (x32) (w/o strict)
002.88603.43203.86906.209
108.23711.24704.08706.677
214.36713.08904.19708.159
317.58117.03604.49310.998
420.90522.21504.69610.296
523.11925.61604.94513.558
2061.21568.85807.59735.568


С увеличением одновременно открытых позиций (Amount) заметно растет время выполнения. MT4 проигрывает MT5 по скорости в режиме Тестера и в режиме Virtual.

Virtual значительно быстрее MT5-тестера и слабо зависит от Amount.


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

Virtual не затачивался на большое количество одновременных ордеров, но переваривает их неплохо. Чего не скажешь про MT-тестеры. Там, похоже, отсутствует совсем оптимизация в этом месте.


До теста пришла в голову идея, как ускорить Virtual, чтобы количество ордеров почти не влияло на производительность. Но полученные результаты, честно говоря, удивили. Сложно сказать, стоит ли этим заниматься в Virtual. Но 100% это нужно делать в MT5-Тестере.


ЗЫ После замеров понял, что в MT4 не использовал strict-режим. Перезамерять не стал

 

Несколько лет назад я заметил это в MT4 и сообщил об этом ServiceDesk. Было сказано, что если бы я это заметил, когда MT5 сообщаю об этом.

Теперь я заметил это поведение и в MT5, и вот мое сообщение вместе с рождественским желанием изменить это :)

Я хочу оптимизировать различные MA. Только стандартная функция iMA () «знает» разные методы (sma, ema, smma, lwma), другие (iDEMA, iTEMA, iAMA) этого не делают.

Поэтому любая настройка с MaMethod! = IMA, которая меняет sma, ema, smma, lwma, бессмысленна:

enum €ChooseMA {  // 
   €iMA,     // norm MA: maPer, maPrc
   €iDEMA,   // DEMA dmaPer, dmaPrc
   €iFrAMA,  // FracEMA: fmaPer, famPrc
   €iTEMA,   // tripEMA tmaPer, tmaPrc
   €iAMA,    // Adap. MA: amaPer,amaFast,amaSlow,amaPrc
};

input €ChooseMA            MA          = €iTEMA;         // Type of MA
input uint                 MaPeriod    = 33;             // Periods for Ma
input ENUM_MA_METHOD       Meth        = MODE_SMMA;      // Method of averaging
input ENUM_APPLIED_PRICE   Prc         = PRICE_CLOSE;
 
...
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   if ( (bool)MQLInfoInteger(MQL_TESTER) && MA != €iMA && Meth != MODE_SMMA ){
      return(INIT_PARAMETERS_INCORRECT);
   }
..
}

Теперь, если оптимизатор хочет запустить, например:

  1. MA=€iTEMA, MaPeriod=33,Meth=sma
  2. MA=€iTEMA, MaPeriod=33,Meth=ema
  3. MA=€iTEMA, MaPeriod=33,Meth=smma
  4. MA=€iTEMA, MaPeriod=33,Meth=lwma

Все они будут иметь одинаковый результат оптимизации, и их можно избежать - кроме одного (в моем примере это №3), поэтому OnInit () возвращает INIT_PARAMETERS_INCORRECT, и тестер выполняет эту настройку - пока это так хорошо.

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

Этот «featrure» заставляет Тестер останавливать генетическую оптимизацию в начале, так как максимальное количество проходов (это один из критериев остановки) достигается быстро.

:(

Наверное, решение может быть легким. Просто введите новую константу: «INIT_PARAMETERS_SKIP_BY_TESTER», чтобы Тестер пропускал оценку и не учитывал и вводил ее как действительный проход.

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

 

Некоторые другие пожелания Санта-Клауса Казани:

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