Новая версия платформы MetaTrader 5 build 2470 - страница 2

 
Если в качестве параметра советника передана строка, то после запуска генетического тестирования при попытке запустить какой-то один из проходов в качестве параметра этой строки будет подхвачено только первые 63 символа. Полагаю, это фича, поскольку поля фиксированного, а не динамического размера в формате файла кеша оптимизации?
 

Добрый день, раньше если тиков не было в диапазоне запроса CopyTicksRange, то возвращался ноль, начиная с билда 2450 функция запрашивает тики с начала дня указанной даты, а не с указанного времени. Данная проблема возникает в пятницу после окончания торговой сессии. 

void OnStart()
  {
   MqlTick Ticks[];
   datetime start = D'2020.04.17 22:00:00'; //пятница
   datetime end   = D'2020.04.18 22:00:00';
   ulong s = ulong (start * 1000);
   ulong e = ulong (end * 1000);
   int n = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL,s,e);
   Print ("start - ",(datetime) (Ticks[0].time_msc/1000),"   n=", n);
  }

результат на различных инструментах, брокер AMP. 


 
Реter Konow:
Вопрос: а данные оформляемые подпиской в МТ5 имеют ОИ? Если да, то поле по определение должно быть, иначе, куда они будут поступать?

Пока это не известно, так как на сервере MQ-Demo доступна только витрна с описаниями, оформить подписку пока невозможно.

Полагаю, что это будет зависеть от поставщика данных, выбранных MQ. Если напрямую с бирж - то скорре нет, чем да, если через какого аграгатора-реселлера, типа dxFeed, то определеный шанс есть что будет, так как многие проф. поставщики биржевых данных включают в историю баров доп. информацию (WAP, OI etc)

 
MQL4 is not supported. To compile this program, use MetaEditor from your MetaTrader 4 installation folder
'SYMBOL_ORDER_CLOSEBY' - undeclared identifier

Судя по этому сообщения, в ME оставили синтаксическую проверку MQL4-кода.

 

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

Неправильный синтаксис MQL?

Дан Маринеску , 2020.05.27 22:47

Я определил универсальный интерфейс, и я хочу использовать его в другом классе. Я не могу понять, что не так с этим кодом:

 #property  strict

template < typename T> interface IGenericHandler {
     bool Handle(T &item);
};

#define  DOES_NOT_WORK

class GenericHandler {
     public :
#ifdef  DOES_NOT_WORK   
         template < typename T> bool Handle(T &val, IGenericHandler<T> *handler);
#else   
         template < typename T> bool Handle(T &val, IGenericHandler<T> *handler) { return false ; }
#endif        
 };

#ifdef  DOES_NOT_WORK
template < typename T> bool GenericHandler::Handle(T &val, IGenericHandler<T> *handler) { return false ; }
#endif 

Если DOES_NOT_WORK не определено, то все работает. Но когда DOES_NOT_WORK определен, компилятор говорит:

'Handle' - member function already defined with different parameters

Почему?

Это было исправлено в сборке 2460, но снова появляется в сборке 2470.

 

Что-то у меня символы кракозябрами написаны.

Это в билде 2470


 

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

4D вид
3D-представление позволяет связать только два параметра, 3 будут возможны, а 3D-представление станет четким (!) 4D-представлением. Результат оптимизации не должен использоваться в качестве собственного (вертикального) размера или оси Z, но результат может быть легко помечен цветом (см. Цветовое колесо). Тогда будет 3 параметра измерения! Результатом будет облако точек (или небольших цветных блоков), окрашенных от черного (наихудший результат) до белого (лучший результат). Таким образом, кластеры плохих значений параметров и кластеры хороших значений параметров могут быть легко распознаны.


Увеличительное стекло:

Еще лучше для пользователя будет возможность выбрать область результатов и отобразить только эту область. Все, что лучше и хуже указанных пределов, скрыто. И если нижний предел снова отображается черным в этом разделе, а верхний предел белым, то при представлении результатов на результатах отображается очаровательная лупа.
Например, я мог бы более внимательно взглянуть на результаты оптимизации один раз в диапазоне 130 - 155 и один раз в диапазоне 40 - 90, каждый с тремя выбранными параметрами.


Анимация:

Было бы хорошо, если бы пользователь мог скрыть все блоки результатов в виде 4D, а затем, либо с каждым щелчком мыши (или нажатием клавиши пробела), либо автоматически каждые 0,5 секунды подряд (от лучшего к худшему или наоборот) блоки отображаются снова с соответствующим цветом результата. Таким образом, облако точек постепенно появляется, и вы можете остановиться, чтобы рассмотреть сцену с нескольких сторон. Чтобы пользователи могли получать больше удовольствия, вы можете даже смоделировать анимационный полет от лучшего дону до худшего результата, раскрасив курс в эквивалентный цвет в трехмерном пространстве параметров. Это была бы альтернативная презентация кластеров результатов.

Цветовое колесо:
Однажды я запрограммировал цветовое колесо, которым я хотел бы поделиться здесь в качестве примера. Существует 29 различных цветов от черного до красного, синего, зеленого, желтого и белого, которые могут быть доступны в том или ином порядке.

Дополнительное отображение результатов
Желательно было бы иметь функцию графического представления о том, что, если таблица результатов оптимизации сортируется в соответствии с другими возможными критериями (Custom, Profit, Exp. Value, DD, ...), 3D или 4D представление результатов автоматически отрегулировано также. На 4D-дисплее цвет будет основываться на значениях в столбце, выбранном для сортировки.

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

Ошибка инициализации
Если инициализация заканчивается с ошибкой, этот параметр не проверяется - хорошо! Но генетическая оптимизация все еще считает ее действительным тестом, и это влияет на критерий остановки, который, безусловно, учитывает количество прогонов и, таким образом, приводит к раннему прерыванию.

MagicNumber
Пожалуйста, экспортируйте MagicNumber также в файл Excel для одного теста (Backtest => Report => Open XML (Excel 2007)). Стандартная оценка тестера показывает только количество положительных и отрицательных позиций по отношению к часу, в который они были закрыты. Но тогда уже слишком поздно для исправлений. Например, если я назначу определенный номер MagicNumber для каждого часа, в течение которого был размещен заказ (100 = 0 ч, 101 = 1 ч, 102 = 2 ч, ...), я мог бы легко (!) Проанализировать файл Excel, и MagicNumbers распознает какие часы хороши, а какие нет!

Пропуск №
Файл Excel имеет другую нумерацию (1, .. 12.000), чем таблица оптимизации 6,123. Это раздражает и не нужно. Кроме того, в таблице оптимизации, импортированной из кэша, отсутствует нумерация :(

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


3D surface versus 3D blocks:
Since the 3D surface representation is not so clear, I would like to be able to switch between this and the block representation.

4D view
The 3D-representation allows to relate only two parameters, 3 would be possible and the 3D-representation would become a clear(!) 4D-representation. The result of the optimization does not have to be used as an own (vertical) dimension or Z-axis, but the result can be easily color-coded (see below the color wheel). Then there would be 3 parameter dimensions! The result would be a cloud of points (or small coloured blocks), coloured from black (worst result) to white (best result). This way clusters of bad parameter values and clusters of good parameter values could easily be recognized.


Magnifying glass:

Even better for the user would be the possibility to select a result area and display only that one. Everything that is better and worse than the specified limits is hidden. And if the lower limit is then displayed black again in this section and the upper limit white, the presentation of the results has a fascinating magnifying glass on the results.
For example, I could take a closer look at optimization results once in the range 130 - 155 and once in the range 40 - 90, each with three selected parameters.


Animation:

It would be nice if the user could hide all result blocks in the 4D view and then, either with every mouse click (or pressing the space bar) or automatically every 0.5 seconds in succession (from best to worst or vice versa), the blocks are displayed again with the corresponding color of the result. This way the point cloud slowly reappears and you can stop to view the scene from several sides. For the users to have more fun you can even simulate an animated flight from the best donw to the worst result painting the course in the equivalent color in the 3D space of the parameters. It would be an alternative presentation of result clusters.

Color wheel:
I once programmed a color wheel, which I would like to share here as an example. There are 29 different colors from black via red, blue, green, yellow to white, which can be accessed in this or the opposite order.

Additional result display
Desirable would be a feature of the graphical representation that, if the table of optimization results is sorted according to another possible criteria (Custom, Profit, Exp. Value, DD, ...), the 3D or 4D representation of the results is automatically adjusted as well. In a 4D display, the color would then be based on the values in the column selected for sorting.

Optimization interruption
If a genetic optimization is interrupted and then continued again, it would be nice if the previous results were taken into account by the new optimization and continued from there.

Initialization failed
If the initialization ends with an error, this parameter setting is not tested - good! But the genetic optimization still counts it as a valid test and this influences the stop criterion, which certainly takes the number of runs into account, and thus leads to an early abort.

MagicNumber
Please export the MagicNumber also to the Excel file for a single test (Backtest => Report => Open XML (Excel 2007)). The standard evaluation of the tester shows only the number of positive and negative positions in relation to the hour at which they were closed. But then it is too late for corrections. If I e.g. assign a specific MagicNumber for each hour in which an order was placed (100=0h, 101=1h, 102=2h, ...) I could easily(!) with an analysis of the Excel file and the MagicNumbers recognize which hours are good and which are not!

Pass No.
The Excel file has a different numbering (1,..12.000) than the optimization table 6,123. This is annoying and unnecessary. Also, an optimization table imported from the cache is missing any numbering :(

One last request about the editor:
The cursor is the only one that cannot be changed when the coloring is changed. Therefore it is not visible in dark mode if it is next to a bracket, which always leads to errors when deleting or entering. :(


The color wheel:

color getColorWheel(const int i ) {
   if (i>=0) return(ColorWheel[(i%29)]);        // i=>0 => forward
   return(ColorWheel[ (29-(fabs(i)%29))%29 ]);  // i<0 => backwards
}
color ColorWheel[29] = {                        // 0xBBGGRR
            0x000000,  //  rgb(0,   0,    0)    //     black
            0x400000,  //  rgb(64,  0,    0)    //  
            0x800000,  //  rgb(128, 0,    0)    //  
            0xc00000,  //  rgb(192, 0,    0)    //  
            0xff0000,  //  rgb(255, 0,    0)    //     red
            0xff0040,  //  rgb(255, 0,    64)   //  
            0xff0080,  //  rgb(255, 0,    128)  //  
            0xff00c0,  //  rgb(255, 0,    192)  //  
            0xff00ff,  //  rgb(255, 0,    255)  //     magenta
            0xc000ff,  //  rgb(192, 0,    255)  //  
            0x8000ff,  //  rgb(128, 0,    255)  //  
            0x4000ff,  //  rgb(64,  0,    255)  //  
            0x0000ff,  //  rgb(0,   0,    255)  //     blue
            0x0040ff,  //  rgb(0,   64,   255)  //  
            0x0080ff,  //  rgb(0,   128,  255)  //  
            0x00c0ff,  //  rgb(0,   192,  255)  //  
            0x00ffff,  //  rgb(0,   255,  255)  //     cyan
            0x00ffc0,  //  rgb(0,   255,  192)  //  
            0x00ff80,  //  rgb(0,   255,  128)  //  
            0x00ff40,  //  rgb(0,   255,  64)   //  
            0x00ff00,  //  rgb(0,   255,  0)    //     green
            0x40ff00,  //  rgb(64,  255,  0)    //  
            0x80ff00,  //  rgb(128, 255,  0)    //  
            0xc0ff00,  //  rgb(192, 255,  0)    //  
            0xffff00,  //  rgb(255, 255,  0)    //     yellow
            0xffff40,  //  rgb(255, 255,  64)   //  
            0xffff80,  //  rgb(255, 255,  128)  //  
            0xffffc0,  //  rgb(255, 255,  192)  //  
            0xffffff,  //  rgb(255, 255,  255)  //     white
};

The reason why it would helk to be able to focus on different clusters - this is an optimization result:



A block view:

View of planes:

Where is the cursor? Whalt will be deleted if I press DEL?


 

В билде 2470 если мы узнаем Хендл индикатора из самого индикатора, то потом невозможно удалить индикатор.

Индикатор удаляется из списка запущенных индикаторов но работает в фоновом режиме.

OnDeinit не вызывается.

 
Vladimir Pastushak:

В билде 2470 если мы узнаем Хендл индикатора из самого индикатора, то потом невозможно удалить индикатор.

Индикатор удаляется из списка запущенных индикаторов но работает в фоновом режиме.

OnDeinit не вызывается.

Опишите как именно вы "узнаете" хендл индикатора?

 
Renat Fatkhullin:

Опишите как именно вы "узнаете" хендл индикатора?

Вот

bool CGetIndicatorsAll::GetAll(void)
  {
// ================================================================
// === Запросим количество окон
   m_winndows_total   = (int)ChartGetInteger(m_chart_id, CHART_WINDOWS_TOTAL);
// ================================================================
// === Запросим количество индикаторов в главном окне
   m_indicators_win_0 = ChartIndicatorsTotal(m_chart_id, 0);

// ================================================================
// === Если изменилось количество индикаторов в главном окне
// === Или появилось новое подокно индикатора
   if((m_winndows_total_old != m_winndows_total) || (m_indicators_win_0_old != m_indicators_win_0))
     {
      // ================================================================
      // === Запомним значения
      m_winndows_total_old   = m_winndows_total;
      m_indicators_win_0_old = m_indicators_win_0;
      // ================================================================
      // === Пойдем собирать структуру данных индикаторов
      m_total_indicators = 0;
      for(int i = 0; i < m_winndows_total; i++)
         if((m_sub_window = ChartIndicatorsTotal(m_chart_id, i)) > 0)
            for(int k = 0; k < m_sub_window; k++)
              {
               // ================================================================
               // === Увеличиваем массив индикаторов
               ArrayResize(ind, m_total_indicators + 1, 1000);
               ind[m_total_indicators].m_name   = ChartIndicatorName(m_chart_id, i, k);
               ind[m_total_indicators].m_handle = ChartIndicatorGet(m_chart_id, i, ind[m_total_indicators].m_name);
               ind[m_total_indicators].m_window = i;
               m_total_indicators++;
              }
      return true;
     }
   return false;
  }
Причина обращения: