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

 
fxsaber:

Там весь CopyBuffer INF.

При скользящем алгоритме подсчета достаточно вначале всего две цены DBL_MAX чтобы весь буфер стал INF

DBL_MAX + DBL_MAX = INF

и потом INF уже не уйдет из расчетов

Нужно менять код всех индикаторов, чтобы не учитывать EMPTY_VALUE
 
A100:

При скользящем алгоритме подсчета достаточно вначале всего две цены DBL_MAX чтобы весь буфер стал INF

DBL_MAX + DBL_MAX = INF

и потом INF уже не уйдет из расчетов

Такой вариант вполне вероятен, т.к. значения меньше периода МАшки забиваются как раз DBL_MAX. Тогда баг присутствует в рекурентном алгоритме средней - MODE_SMA.

Так и есть! Внес изменения и заработало

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

Можно точно утверждать, что в рекурентном алгоритме iMA не учитывается случай, когда на вход подается DBL_MAX. Баг.


@A100, Спасибо!

 

Зависает MetaEditor при попытке компиляции прилагаемого файла

Если не зависнет сразу - нужно немного подождать или перейти к итоговой строке и посмотреть время компиляции

Файлы:
Test0.mq5  1 kb
 

Почему бы не показывать во всплывающем окошке при наведении мышой номер ордера/сделки? Ещё тыщу лет назад просил об этом, этого так не хватает! 

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

Таких конструкций нужно избегать.  Порядок выполнения операндов в C++ не регламентирован, поэтому всё на усмотрение конкретного компилятора.  Исключение - операторы && и ||, где операнды всегда выполняются слева направо.

 
Alexey Navoykov:

Таких конструкций нужно избегать.  Порядок выполнения операндов в C++ не регламентирован, поэтому всё на усмотрение конкретного компилятора.  Исключение - операторы && и ||, где операнды всегда выполняются слева направо.

Ну так мы же в MQL!

 
fxsaber:

Ну так мы же в MQL!

В документации нигде не сказано о каком-то конкретном порядке. Поэтому они могут его поменять по собственному усмотрению в любой момент.

Я уже однажды обращался в сервис-деск для прояснения этого вопроса.

 

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

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

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

IndicatorParameters (+ IndicatorRelease)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

В документации нигде не сказано о каком-то конкретном порядке. Поэтому они могут его поменять по собственному усмотрению в любой момент.

Не заморачиваюсь по этому поводу. Очень многое там не описано

Навскиду

  • Сортировка торговых исторических записей по времени в MT4/5.
  • Возможность инициализации глобальной/статической переменной функцией - относительно недавно появилась.
  • Задание препроцессорных директив в одну строку - скоро отключат, правда.
  • Выполнение операндов слева направо.
  • OrderSend в 99% случаев синхронизирован с торговым окружением.
  • ChartApplyTemplate асинхронен.
  • и очень много всяких других  недокументированных нюансов. А ведь есть еще случаи, когда документация не соответствует реальности. И это не баг, а редка фича, о которой просто не упоминается.

Прецедент был - отказ от кастинга, но там причина была.

Поэтому что-то не использовать лишь потому, что не описано - сомнительное решение.


Думаю, такой код не вызвал бы у программеров сомнений

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

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

Причина обращения: