CopyBuffer или хэндлы индикаторов работаю неверно.
Этот индикатор выдает на выходе inf-значения. Баг.
В OnInit не нужно инициализацию перенести, так сказать по классике? А проверять CopyBuffer тоже не надо? Ведь пока индюк (по хэндлу) не построился, копироваться ничего не будет.
При скользящем алгоритме подсчета достаточно вначале всего две цены DBL_MAX чтобы весь буфер стал INF
DBL_MAX + DBL_MAX = INF
и потом INF уже не уйдет из расчетов
Такой вариант вполне вероятен, т.к. значения меньше периода МАшки забиваются как раз DBL_MAX. Тогда баг присутствует в рекурентном алгоритме средней - MODE_SMA.
Так и есть! Внес изменения и заработало
// Вычисляем Машку от Машки через хэндл самого себя#property indicator_separate_window#property indicator_buffers1#property indicator_plots1#property indicator_type1 DRAW_LINE#property indicator_color1 clrRed#property indicator_style1 STYLE_SOLID#property indicator_width1 1inputbool CustomData = false; // true - кастомный режим для iCustominputint MAPeriod = 1e1; // Период МАшкиstring GetMyName( void )
{
constint Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
conststring Path = MQLInfoString(MQL_PROGRAM_PATH);
return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}
double Buffer[];
constbool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);
constint 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[], constdouble NewValue = 1e3, constdouble PrevValue = EMPTY_VALUE )
{
for (int i = ArraySize(Array) - 1; i >= 0; i--)
if (Array[i] == PrevValue)
Array[i] = NewValue;
return(0);
}intOnCalculate( constint rates_total, // размер входных таймсерий constint prev_calculated, // обработано баров на предыдущем вызовеconstdatetime& time[], // Time constdouble& open[], // Open constdouble& high[], // High constdouble& low[], // Low constdouble& close[], // Close constlong& tick_volume[], // Tick Volume constlong& volume[], // Real Volume constint& spread[] ) // Spread
{
return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}
Можно точно утверждать, что в рекурентном алгоритме iMA не учитывается случай, когда на вход подается DBL_MAX. Баг.
Про стандартную возможность знаю - предыдущий пост так и сделал.
Были сомнения как будет смотреться такая картинка. Вот и вставил временно скрин. Еле успел, как уже замечание по оформлению :(
Теперь переделал на вставленную картинку.
Спасибо. Так гораздо лучше ;)
CopyBuffer или хэндлы индикаторов работаю неверно.
Этот индикатор выдает на выходе inf-значения. Баг.
CopyBuffer или хэндлы индикаторов работаю неверно.
Этот индикатор выдает на выходе inf-значения. Баг.
В OnInit не нужно инициализацию перенести, так сказать по классике? А проверять CopyBuffer тоже не надо? Ведь пока индюк (по хэндлу) не построился, копироваться ничего не будет.
В OnInit не нужно инициализацию перенести, так сказать по классике?
Не нужно.
А проверять CopyBuffer тоже не надо? Ведь пока индюк (по хэндлу) не построился, копироваться ничего не будет.
CopyBuffer или хэндлы индикаторов работаю неверно.
Этот индикатор выдает на выходе inf-значения. Баг.
INF - потому что у данного конкретного индикатора есть EMPTY_VALUE = DBL_MAX. Не будет пустых значений в индикаторном буфере - не будет и INF
INF - потому что у данного конкретного индикатора есть EMPTY_VALUE = DBL_MAX. Не будет пустых значений в индикаторном буфере - не будет и INF
Там весь CopyBuffer INF.
Там весь CopyBuffer INF.
При скользящем алгоритме подсчета достаточно вначале всего две цены DBL_MAX чтобы весь буфер стал INF
DBL_MAX + DBL_MAX = INF
и потом INF уже не уйдет из расчетов
Нужно менять код всех индикаторов, чтобы не учитывать EMPTY_VALUEПри скользящем алгоритме подсчета достаточно вначале всего две цены DBL_MAX чтобы весь буфер стал INF
DBL_MAX + DBL_MAX = INF
и потом INF уже не уйдет из расчетов
Такой вариант вполне вероятен, т.к. значения меньше периода МАшки забиваются как раз DBL_MAX. Тогда баг присутствует в рекурентном алгоритме средней - MODE_SMA.
Так и есть! Внес изменения и заработало
Можно точно утверждать, что в рекурентном алгоритме iMA не учитывается случай, когда на вход подается DBL_MAX. Баг.
@A100, Спасибо!
Зависает MetaEditor при попытке компиляции прилагаемого файла
Если не зависнет сразу - нужно немного подождать или перейти к итоговой строке и посмотреть время компиляции
Почему бы не показывать во всплывающем окошке при наведении мышой номер ордера/сделки? Ещё тыщу лет назад просил об этом, этого так не хватает!