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

 
Kirill Belousov:

Про стандартную возможность знаю - предыдущий пост так и сделал.

Были сомнения как будет смотреться такая картинка. Вот и вставил временно скрин. Еле успел, как уже замечание по оформлению :(

Теперь переделал на вставленную картинку.

Спасибо. Так гораздо лучше ;)

 

CopyBuffer или хэндлы индикаторов работаю неверно.

// Вычисляем Машку от Машки через хэндл самого себя
#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 = 1e3;      // Период МАшки

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 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));
}

Этот индикатор выдает на выходе inf-значения. Баг.

 
fxsaber:

CopyBuffer или хэндлы индикаторов работаю неверно.

Этот индикатор выдает на выходе inf-значения. Баг.

В OnInit не нужно инициализацию перенести, так сказать по классике? А проверять CopyBuffer тоже не надо? Ведь пока индюк (по хэндлу) не построился, копироваться ничего не будет.

 
Stanislav Korotky:

В OnInit не нужно инициализацию перенести, так сказать по классике?

Не нужно.

А проверять CopyBuffer тоже не надо? Ведь пока индюк (по хэндлу) не построился, копироваться ничего не будет.

Проверял, там баг 99%.
 
fxsaber:

CopyBuffer или хэндлы индикаторов работаю неверно.

Этот индикатор выдает на выходе inf-значения. Баг.

INF - потому что у данного конкретного индикатора есть EMPTY_VALUE = DBL_MAX. Не будет пустых значений в индикаторном буфере - не будет и INF

 
A100:

INF - потому что у данного конкретного индикатора есть EMPTY_VALUE = DBL_MAX. Не будет пустых значений в индикаторном буфере - не будет и INF

Там весь CopyBuffer INF.

 
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
 

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