Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так??? Надо что бы значение было из одного периода.
//+------------------------------------------------------------------+//| 77777.mq5 |//| Copyright 2019, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2018, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"#property strict#property indicator_chart_window#property indicator_buffers1#property indicator_plots0//+----------------------------------------------+//| Параметры отрисовки индикатора 1 |//+----------------------------------------------+//----inputstring xBars="2018.11.19 00:00"; //Дата начала отсчетаinputbool DataBars=false; //Считать по дате (true)inputint InpMAShift=1; //Сдвиг бара расчета inputENUM_TIMEFRAMES Timeframes=PERIOD_D1; //Таймфрейм скользящейinputENUM_MA_METHOD Method=MODE_EMA; //Метод расчета скользящейinputENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящейinputENUM_LINE_STYLE MAStyle=STYLE_DASH; //Стиль всех скользящих линийinputint InpMAPeriod1=5; //Скользящая 1 периода//----int handle_ma,shift;
double BufferPrice[];
//---int period;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---
period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
ArraySetAsSeries(BufferPrice,true);
//--- create MA's handlesResetLastError();
//----------------------------------------------------------------+// ПРОБЛЕМА ТУТ ////----------------------------------------------------------------+
handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE); //ПРОБЛЕМА ТУТ
// handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE); // БЕЗ ПРОБЛЕМЫif(handle_ma==INVALID_HANDLE)
{
Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
returnINIT_FAILED;
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function | //+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
ObjectDelete(0,"Proba");
Comment("");
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баровif(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if(limit>1)
{
limit=rates_total-1;
ArrayInitialize(BufferPrice,0);
}
//--- Подготовка данныхint count=(limit>1 ? rates_total : 2),copied=0;
copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
if(copied!=count) return0;
//---- if(DataBars==false)
shift=InpMAShift;
else
shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars));
double ma1=BufferPrice[shift];
datetime tm=iTime(NULL,Timeframes,shift);
Comment(NormalizeDouble(BufferPrice[shift],_Digits)," ",shift);
HLine("Proba","",tm,ma1,MAStyle,1,Red);
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+void HLine(string name,
string text,
datetime tm,
double price,
int stl,
int wid,
color clr)
{
if(ObjectFind(0,name)!=0)
{
ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
ObjectSetInteger(0,name,OBJPROP_TIME, tm);
ObjectSetString(0,name,OBJPROP_TEXT,text);
ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman");
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10);
ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
}
}
kopeyka2: Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так???
ResetLastError();
if(CopyBuffer(handle_ma,0,0,count,BufferPrice)<0)
{
PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError());
return(0.0);
}
// copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
Изучайте ошибку, правильно же Артём говорит, что надо все проверять по 10 раз...
2019.01.2520:12:26.169 Test777 (Si Splice,M1) Failed to copy data from the handle_ma indicator, error code 4806
ERR_INVALID_ARRAY
4006
Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива
kopeyka2: Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так??? Надо что бы значение было из одного периода.
Вы же примеры берёте из КодоБазы из индикаторов от Scriptor? Верно? Тогда поищите в его кодах (совсем недавно публиковались) примеры, в названии которых фигурирует MTF, но без MCP.
MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Т.е., раз вы хотите получать данные на текущем символе, но с иного таймфрейма нежели период графика, то вам нужен пример мультитаймфреймного индикатора. В MCP пока не стоит лезть - там на ООП с использованием стандартных классов. Запутаетесь.
он только для МА, работающей на текущем периоде и символе. Для работы на ином периоде, расчёт будет отличаться. Поищите - всё близко, и направление я вам подсказал.
Вы же примеры берёте из КодоБазы из индикаторов от Scriptor? Верно? Тогда поищите в его кодах (совсем недавно публиковались) примеры, в названии которых фигурирует MTF, но без MCP.
MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Т.е., раз вы хотите получать данные на текущем символе, но с иного таймфрейма нежели период графика, то вам нужен пример мультитаймфреймного индикатора. В MCP пока не стоит лезть - там на ООП с использованием стандартных классов. Запутаетесь.
Например, вот этот расчёт:
он только для МА, работающей на текущем периоде и символе. Для работы на ином периоде, расчёт будет отличаться. Поищите - всё близко, и направление я вам подсказал.
Пожалуйста, только не ту ошибку я скопировал, надо так
ERR_INDICATOR_DATA_NOT_FOUND
4806
Запрошенные данные не найдены
Суть в том, что число баров разное на разных ТФ и это надо учитывать.
Как раз это проверял. Но ПРОБЛЕМА в том, что установив хендэл на один постоянный период, в
CopyBuffer значение на других таймфреймах НЕ ПЕРЕДАЕТСЯ. На установленном хендлэ периоде значение было, а на меньших таймфремах 0.0 (ноль). Подвигал в поисках по буферу... ноль. Почему не передается в CopyBuffer ?
Вопрос: Почему хендэл установленный на один период не передает значения в CopyBuffer на других таймфремах. И что сделать?
Если бы проблема была в сдвиге элемента массива буфера при другом таймфрейме я бы решил вопрос. А так непонятно вообще.
Если хэндл создан успешно, то создан он с теми параметрами, которые вы ему передали при создании. И уж отдавать данные индикатора он будет на любом таймфрейме. Вот только данные он будет отдавать того таймфрейма, который ему задали при создании. И чтобы их корректно отобразить на рабочем таймфрейме, нужно преобразовать полученные данные от хэндла индикатора к тому тф, на котором работает ваш индикатор.
Профилировщик
А если оно бывает раз в сутки или того реже?
Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так???
Изучайте ошибку, правильно же Артём говорит, что надо все проверять по 10 раз...
ERR_INVALID_ARRAY
4006
Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива
ERR_INDICATOR_DATA_NOT_FOUND
4806
Запрошенные данные не найдены
Здравствуйте. Почему то хендэл передает только когда установлен на все периоды, а ставлю на определенный и ничего нет. В чем проблема непонятно. Пробовал вбивать в хендэл напрямую не из глобальных переменных, результат тот же. Что не так??? Надо что бы значение было из одного периода.
Вы же примеры берёте из КодоБазы из индикаторов от Scriptor? Верно? Тогда поищите в его кодах (совсем недавно публиковались) примеры, в названии которых фигурирует MTF, но без MCP.
MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Т.е., раз вы хотите получать данные на текущем символе, но с иного таймфрейма нежели период графика, то вам нужен пример мультитаймфреймного индикатора. В MCP пока не стоит лезть - там на ООП с использованием стандартных классов. Запутаетесь.
Например, вот этот расчёт:
он только для МА, работающей на текущем периоде и символе. Для работы на ином периоде, расчёт будет отличаться. Поищите - всё близко, и направление я вам подсказал.
Вы же примеры берёте из КодоБазы из индикаторов от Scriptor? Верно? Тогда поищите в его кодах (совсем недавно публиковались) примеры, в названии которых фигурирует MTF, но без MCP.
MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Т.е., раз вы хотите получать данные на текущем символе, но с иного таймфрейма нежели период графика, то вам нужен пример мультитаймфреймного индикатора. В MCP пока не стоит лезть - там на ООП с использованием стандартных классов. Запутаетесь.
Например, вот этот расчёт:
он только для МА, работающей на текущем периоде и символе. Для работы на ином периоде, расчёт будет отличаться. Поищите - всё близко, и направление я вам подсказал.
Изучайте ошибку, правильно же Артём говорит, что надо все проверять по 10 раз...
ERR_INVALID_ARRAY
4006
Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива
Спасибо
Пожалуйста, только не ту ошибку я скопировал, надо так
ERR_INDICATOR_DATA_NOT_FOUND
4806
Запрошенные данные не найдены
Суть в том, что число баров разное на разных ТФ и это надо учитывать.
Пожалуйста, только не ту ошибку я скопировал, надо так
ERR_INDICATOR_DATA_NOT_FOUND
4806
Запрошенные данные не найдены
Суть в том, что число баров разное на разных ТФ и это надо учитывать.
Как раз это проверял. Но ПРОБЛЕМА в том, что установив хендэл на один постоянный период, в
CopyBuffer значение на других таймфреймах НЕ ПЕРЕДАЕТСЯ. На установленном хендлэ периоде значение было, а на меньших таймфремах 0.0 (ноль). Подвигал в поисках по буферу... ноль. Почему не передается в CopyBuffer ?
Вопрос: Почему хендэл установленный на один период не передает значения в CopyBuffer на других таймфремах. И что сделать?
Если бы проблема была в сдвиге элемента массива буфера при другом таймфрейме я бы решил вопрос. А так непонятно вообще.
Вопрос: Почему хендэл установленный на один период не передает значения в CopyBuffer на других таймфремах. И что сделать?
Если бы проблема была в сдвиге элемента массива буфера при другом таймфрейме я бы решил вопрос. А так непонятно вообще.
Если хэндл создан успешно, то создан он с теми параметрами, которые вы ему передали при создании. И уж отдавать данные индикатора он будет на любом таймфрейме. Вот только данные он будет отдавать того таймфрейма, который ему задали при создании. И чтобы их корректно отобразить на рабочем таймфрейме, нужно преобразовать полученные данные от хэндла индикатора к тому тф, на котором работает ваш индикатор.