Ошибки, баги, вопросы - страница 2930

 

Перевод индикатора с мт4 на мт5

Проблема в размерах толщины DRAW_HISTOGRAM

При установке "1" или "2" размер меняется, а вот "3" или "4" = размер всё-равно остаётся "2"


Почему в мт4 всё работает, а вот в мт5 такая проблема?

#property indicator_separate_window
#property indicator_plots   4
#property indicator_buffers 4
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrDodgerBlue
#property indicator_color3 clrLimeGreen
#property indicator_color4 clrFireBrick
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3

Результат в мт4


Результат в мт5, отображает толщину всего "2", хотя в настройках стоит "3"



Также не помогает установка свойства в OnInit()

PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 3);

 

Критическая ошибка при отладке:

struct sA
  {
   int               i;
   string            s;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
public:
   sA                my_array[];
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   cA *ca;
   ca=new cA();
   ArrayResize(ca.my_array,1);
   ZeroMemory(ca.my_array);
   ArrayPrint(ca.my_array);
  }

Результат:

2020.12.27 17:04:26.966 1 (EURUSD,M1)   Access violation at 0x000001FE5AF10199 read to 0xFFFFFFFFFFFFFFFF in 'D:\Alpari MT5\MQL5\Scripts\Test\1.ex5'
2020.12.27 17:04:26.967 1 (EURUSD,M1)      crash -->  000001FE5AF10199 8B4318            mov        eax, [rbx+0x18]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF1019C 4089442420        mov        [rsp+0x20], eax
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A1 41B910000000      mov        r9d, 0x10
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A7 49B8B807F15AFE01  mov        r8, 0x1fe5af107b8
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B1 488D17            lea        rdx, [rdi]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B4 48B998D45F5FFE01  mov        rcx, 0x1fe5f5fd498
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101BE 49FF96A8120000    call       qword near [r14+0x12a8]  ; #11378 (terminal64.exe)
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
2020.12.27 17:04:26.967 1 (EURUSD,M1)   00: 0x000001FE5AF10199
2020.12.27 17:04:26.967 1 (EURUSD,M1)   01: 0x000001FE633F0010
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
Последняя бета-версия на текущий момент
Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Кто-нибудь придумал способ получить по хэндлу индикатора свойство отображения в главном окне или подокне? Речь про произвольные сторонние индикаторы, которые создаются с помощью IndicatorCreate и потом по запросу пользователя могли бы добавляться на чарт с помощью ChartIndicatorAdd.
 
Stanislav Korotky:
Кто-нибудь придумал способ получить по хэндлу индикатора свойство отображения в главном окне или подокне? Речь про произвольные сторонние индикаторы, которые создаются с помощью IndicatorCreate и потом по запросу пользователя могли бы добавляться на чарт с помощью ChartIndicatorAdd.

Наверное, можно индикатор запихать в OBJ_CHART и посмотреть, где он там расположился.

 
Stanislav Korotky:
Кто-нибудь придумал способ получить по хэндлу индикатора свойство отображения в главном окне или подокне? Речь про произвольные сторонние индикаторы, которые создаются с помощью IndicatorCreate и потом по запросу пользователя могли бы добавляться на чарт с помощью ChartIndicatorAdd.

что-то делал подобное. 
Вот у себя нашел. Не помню, работает или нет. Проверьте пожалуйста.

bool FindIndicatorByHandle(long handle, string &symbol, ENUM_TIMEFRAMES &timeframe, long &ChartId, int &sub_win, string &Name) {
   long chart_id =ChartFirst();
   while (chart_id!=-1) {
      int total_sub = (int)ChartGetInteger(chart_id,CHART_WINDOWS_TOTAL);
      int total_ind; 
      for(int i=0; i<total_sub; i++) {
         total_ind = ChartIndicatorsTotal(chart_id,i);
         for (int j=0; j<total_ind; j++) {
            string name = ChartIndicatorName(chart_id,i,j);
            if (ChartIndicatorGet(chart_id,i,name)== handle) {
               ChartId=chart_id;
               symbol= ChartSymbol(chart_id);
               timeframe=ChartPeriod(chart_id);
               sub_win=i;
               Name=name;
               return true;
            }
         }
      }
      chart_id=ChartNext(chart_id);
   }
   return false;
}
Судя по коду ищет во всех открытых чартах индикатор по хэндлу. Возвращает символ, таймфрейм, id чарта, подокно и имя индикатора.
 
fxsaber:

Наверное, можно индикатор запихать в OBJ_CHART и посмотреть, где он там расположился.

Попробую, пока пришлось сделать опцию указания пользователем.

 
Nikolai Semko:

что-то делал подобное. 
Вот у себя нашел. Не помню, работает или нет. Проверьте пожалуйста.

Судя по коду ищет во всех открытых чартах индикатор по хэндлу. Возвращает символ, таймфрейм, id чарта, подокно и имя индикатора.

Это не подходит к описанному вопросу: индикаторы, созданные IndicatorCreate не размещены ни в каком окне - они "сидят" внутри, и задача как раз такой индикатор по его хэндлу разместить в окно. Сейчас MQL5 позволяет с помощью функции ChartIndicatorAdd добавить произвольный хэндл как в главное окно, так и в подокно, невзирая на "проперти" самого индикатора (без всяких ошибок!), и результат выглядит очень странно, когда добавление делается не по назначению.

 

Есть еще бОльшая засада с индикаторами.

Некоторые из них реализуют обработчик OnCalculate по упрощенному варианту с одним входным массивом, и для них можно выбрать тип цены для расчета. Как из сторонней MQL5-программы узнать, что индюк ожидает этот тип цены, который нужно передавать после всех параметров при создании индикатора? Похоже, что никак. А если этого не делать, то индикатор строится по #property indicator_applied_price, доступ к которой извне также отсутствует. Вот простой эксперт, который добавляет Examples/AMA на график программным способом:

int OnInit()
{
  const int h = iCustom(NULL, 0, "Examples/AMA");
  if(h == INVALID_HANDLE)
  {
    Print("iCustom failed: ", _LastError);
    return INIT_FAILED;
  }

  if(!ChartIndicatorAdd(0, 0, h))
  {
    Print("ChartIndicatorAdd failed: ", _LastError);
    return INIT_FAILED;
  }
  ChartRedraw();
  
  return INIT_SUCCEEDED;
}

Если после этого переключить таймфрейм графика, получим уже 2 индикатора AMA: один по цене close (создан программно), а второй по цене open (генерируется из-за смены таймфрейма и #property indicator_applied_price PRICE_OPEN; тут также не понятно, почему это свойство не подхватилось в iCustom).

 

В продолжение темы индикаторов прикладываю эксперт, на котором удалось выяснить и обойти проблему с параметрами MqlParam.

Задача эксперта - добавить на график индикатор "Examples/Price_Channel", если его там еще нет с теми же параметрами.

Для этого создается экземпляр с помощью iCustom/IndicatorCreate, получается массив его параметров через IndicatorParameters, и далее производится в цикле опрос IndicatorParameters для уже существующих на чарте индикаторов: если совпадения массивов параметров нет, индикатор добавляется на чарт, если совпадение есть, новый хэндл просто уничтожается.

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

Из анализа выполнения и лога видно, что происходит это из-за ошибочного неравенства строк с именем индикатора в параметрах. Строки там длиной 260 символов, но терминальный 0 расположен гораздо раньше. После него - или какая-то служебная информация или мусор. Так вот сравнение строк "==" или StringCompare учитывает этот "мусор" и получается неравенство строк.

Если преобразовывать строки в массив char - полное совпадение массивов. Если преобразовывать в массив short - виден мусор. В целом, какое-то неконсистентное поведение, не описанное в документации.

Window N: 1
   0, Price Channel(22), 12
    [type] [integer_value] [double_value]                                                                                                                                                                                                                                                         [string_value]
[0]     14               0          0.000 "Indicators\Examples/Price_Channel"                                                                                                                                                                                                                                   
[1]      7              22          0.000 null                                                                                                                                                                                                                                                                  
ind1: 'Indicators\Examples/Price_Channel
ind2: 'Indicators\Examples/Price_Channel
260 0 / 260 0
Char arrays 34 34
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
Short arrays 260 260
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0     0     0     0     0     0     0     0     0     0
[ 48]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 72]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 96]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[120]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0    13  3328 58074    86 13696    54     0     0 35120  3210     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     0     0     0     0 61841 38184 17648 16370     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[240]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0    32    32    77    32    65    32    82    32    75
[ 48]    32    83     0    32    99   111   109   109    97    32   115   101   112    97   114    97   116   101   100    32   108   105   115   116
[ 72]    41     0    32   112   114   111   116   111   116   121   112   101   115    41     0     0   115     0     0     0     0     0     0     0
[ 96]   528     0     0     0     0    45     0     0     3     0     0     0   512     0     0     0  1160    45     0     0  7256 30655     0     0
[120]     0     0     0     0   512     0     0     0     0 65535  2272     0 29648    45     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     3     0     0     0 26341 16284     1     0  1308    16     0     0 49814 30635     0     0     0     0     0     0 32016    37     0     0
[240]     2     0     0     0 50336 16481     1     0     2     0     0     0     3     0     0     0 45520    37     0     0
1 0

Не уверен, в чем именно заключается баг - то ли в принципе обработки строк в MQL, то ли еще в чем.

Если кто в курсе нюансов, плиз дайте наводку.

Файлы:
 
Stanislav Korotky:

Если кто в курсе нюансов, плиз дайте наводку.

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

Здесь делал определение наличия себя же. Вроде, работало при переключении ТФ.

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов
Причина обращения: