Новая версия платформы MetaTrader 5 build 3440: Новый отчет по торговому счету - страница 16

 
Нарвался на ошибку, когда OnChartEvent реагирует на нажатия клавиши с текущего чарта, а затем переключается на другой чарт.
input bool inMode = false; // На первом чарте сделать false, втором - true.

void OnInit()
{
  MessageBox("После OK в этом окне " + (inMode ? "нажимайте несколько раз любую клавишу.\n\nСмотрите в Alert, от какого чарта фиксируются нажатия."
                                               : "запустите на другом чарте в true-режиме.\n\nНе обращайте внимание на пустые Alert."));
                                              
  if (!inMode)
    EventSetTimer(1);
}

void OnTimer()
{
  Alert("");
}

void OnChartEvent( const int id, const long&, const double&, const string& ) 
{         
  if (id == CHARTEVENT_KEYDOWN) 
  {
    Alert("Key down from Chart (" + _Symbol + "-" + (string)inMode + ") " + (string)ChartID());
    
    if (inMode )
      ChartSetInteger(0, CHART_IS_DOCKED, !ChartGetInteger(0, CHART_IS_DOCKED)); // Переключаем Docked-режим.
  }
}


Скрипт сообщит, что нужно сделать для воспроизведения. Результат.

// Запустили на EURCHF в false-режиме.
2022.10.06 15:11:18.956 Message После OK в этом окне запустите на другом чарте в true-режиме.
2022.10.06 15:11:18.956 Message 
2022.10.06 15:11:18.956 Message Не обращайте внимание на пустые Alert.

2022.10.06 15:11:20.777 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:21.774 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:22.773 Test9 (EURCHF,M1)       Alert: 

// Запустили на GBPAUD в true-режиме.
2022.10.06 15:11:23.643 Message После OK в этом окне нажимайте несколько раз любую клавишу.
2022.10.06 15:11:23.643 Message 
2022.10.06 15:11:23.643 Message Смотрите в Alert, от какого чарта фиксируются нажатия.

2022.10.06 15:11:23.781 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:24.775 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:25.768 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:25.919 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382 // Нажатия фиксируются с активного GBPAUD-чарта.
2022.10.06 15:11:26.263 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382
2022.10.06 15:11:26.668 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382
2022.10.06 15:11:26.782 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:26.976 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382
2022.10.06 15:11:27.242 Test9 (EURCHF,M1)       Alert: Key down from Chart (EURCHF-false) 132503570123939381 // Нажатия стали фиксироваться с EURCHF-чарта.
2022.10.06 15:11:27.437 Test9 (EURCHF,M1)       Alert: Key down from Chart (EURCHF-false) 132503570123939381
2022.10.06 15:11:27.636 Test9 (EURCHF,M1)       Alert: Key down from Chart (EURCHF-false) 132503570123939381
2022.10.06 15:11:27.776 Test9 (EURCHF,M1)       Alert: 
2022.10.06 15:11:27.891 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382
2022.10.06 15:11:28.157 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382
2022.10.06 15:11:28.466 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382
2022.10.06 15:11:28.630 Test9 (GBPAUD,M1)       Alert: Key down from Chart (GBPAUD-true) 132503570123939382

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

Строка для поискаOshibka 047.

 

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

Обсуждение статьи "Работа с матрицами и векторами в MQL5"

Aleksey Vyazmikin, 2022.10.07 00:56

В инструкции есть такое

void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0)

frombuffer

Создает матрицу из одномерного массива


но по факту не работает. Есть ли другой способ одномерный массив скопировать в матрицу?


 
fxsaber #:

Используйте Print((string)NULL);

 
Ilyas #:

Используйте Print((string)NULL);

Спасибо.

 
Хорошо бы сделать перенос данных из массива в вектор\матрицу. Нужно не копирование, а поэтапное заполнение матрицы с очищением памяти массива - это актуально при больших объемах, иначе копируя данные в матрицу мы увеличиваем потребляемую память, что критично для работы с большими выборками. Ну и обратный процесс нужен, уже с динамичным уничтожением матрицы.
 
Aleksey Vyazmikin #:
Хорошо бы сделать перенос данных из массива в вектор\матрицу. Нужно не копирование, а поэтапное заполнение матрицы с очищением памяти массива - это актуально при больших объемах, иначе копируя данные в матрицу мы увеличиваем потребляемую память, что критично для работы с большими выборками. Ну и обратный процесс нужен, уже с динамичным уничтожением матрицы.

Наверное, лучше реализовать через перегрузку ArraySwap.

 
fxsaber #:

Наверное, лучше реализовать через перегрузку ArraySwap.

Не знаю - никогда не пользовался этой возможностью. Для чего Вы её используете?

 
Aleksey Vyazmikin #:

Не знаю - никогда не пользовался этой возможностью. Для чего Вы её используете?

Тут swap, начисляют за разнонаправленные, позиции, хотя должна быть нулевая поза, ну теперь и за использование массивов ))

 
Aleksey Vyazmikin #:

Не знаю - никогда не пользовался этой возможностью. Для чего Вы её используете?

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

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

fxsaber, 2022.05.19 18:12

При использовании ArrayInsert можно экономить на памяти в случае, когда Array_Destination[] меньше, чем Array_Source[], из которого добавляются элементы.

Для этого надо дважды применить ArraySwap: до и после ArrayInsert.


Например, это актуально, когда работаешь с большими MqlTick-архивами и т.д.

В одном из своих кодов это выглядит так.

          if (Res > Size)
            ArrayInsert(Ticks, TicksBackup, 0);
          else // Экономия памяти.
          {
            ArraySwap(Ticks, TicksBackup);
            
            ArrayInsert(TicksBackup, Ticks, 0);
            ArraySwap(Ticks, TicksBackup);            
          }


В более простых случаях следующий сценарий использования очень популярен:

  • Есть огромный массив данных, которыми нужно заполнить массив, находящийся внутри класса. Можно, конечно, просто скопировать его туда, но тогда это двойной расход памяти. Что крайне нежелательно при работе с той же тиковой историей на многие гигабайты. А вот ArraySwap - бесплатное решение.
 
BillionerClub #:

Тут swap, начисляют за разнонаправленные, позиции, хотя должна быть нулевая поза, ну теперь и за использование массивов ))

Понял, понял, некий налог с алготрейдеров, забавно.