Александр #: Мучаюсь вопросом который год. Может кто ответит. Была ли НАСТОЯТЕЛЬНАЯ необходимость коверкать МТ4 в ТАКИХ моментах как iMA с этими хэндлами, да и пр. "штучками". Может это действительно надо было? Просто я любитель и не очень понимаю.
Сначала ответ в виде встречного вопроса на предыдущий вопрос: Для определения пересечения двух МА сколько раз надо вызвать эту функцию???
Правильный ответ ЧЕТЫРЕ!!! А в mql5 только два. По одному разу на каждую МА…
А сколько раз надо вызвать функцию для получения всех значений индикатора «Аллигатор»??? А в mql5 при получении хендла рассчитаны все буферы индикатора на всю глубину истории.
Просто если постараться и понять как это работает, то вам вскоре будет противен mql4.
Сначала ответ в виде встречного вопроса на предыдущий вопрос: Для определения пересечения двух МА сколько раз надо вызвать эту функцию???
Правильный ответ ЧЕТЫРЕ!!! А в mql5 только два. По одному разу на каждую МА…
А сколько раз надо вызвать функцию для получения всех значений индикатора «Аллигатор»??? А в mql5 при получении хендла рассчитаны все буферы индикатора на всю глубину истории.
Просто если постараться и понять как это работает, то вам вскоре будет противен mql4.
А как изменить фунцкию, которую я дал, чтобы, корректно, получить данные с другого символа и периода. Может есть такая функция у вас?
Александр #: А как изменить фунцкию, которую я дал, чтобы, корректно, получить данные с другого символа и периода. Может есть такая функция у вас?
Ответ в документации
intiMA(
string symbol, // имя символаENUM_TIMEFRAMES period, // периодint ma_period, // период усредненияint ma_shift, // смещение индикатора по горизонталиENUM_MA_METHOD ma_method, // тип сглаживанияENUM_APPLIED_PRICE applied_price // тип цены или handle
);
Вместо нулей ставьте нужный символ и период… И массивы не обязательно делать статическими. Размер массива определяется количеством запрошенных данных. Только обязательно изучите направление индексации в массивах. Если вам нужно значение на текущем баре, то сколько-бы данных не запросили индекс будет равен размер_массива минус 1;
Вместо нулей ставьте нужный символ и период… И массивы не обязательно делать статическими. Размер массива определяется количеством запрошенных данных. Только обязательно изучите направление индексации в массивах. Если вам нужно значение на текущем баре, то сколько-бы данных не запросили индекс будет равен размер_массива минус 1;
Ошибка 4086 выскакивает, не пойму где напортачил))
//+------------------------------------------------------------------+//| 2 МА Alarm.mq5 |//+------------------------------------------------------------------+#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_LINE#property indicator_type2DRAW_LINE#property indicator_color1clrRed#property indicator_color2clrYellowinputint MaFast = 21;
inputint MaSlow = 200;
inputENUM_APPLIED_PRICE meth = PRICE_CLOSE;
inputENUM_MA_METHODmod = MODE_EMA;
inputbool ALERT_ON = true;
inputbool Set_i = false;
inputint I = 8; // 11 это установка GAZP если I = -1 , то текущий графикinputint DIGITS = 7;
//---double Fast[];
double Slow[];
int i;
int FastHandle;
int SlowHandle;
bool alert_on_off;
double FAST = 0;
double SLOW = 0;
double SLOW_Long;
int BARS;
//---inputstring objname = "smallchart";
inputint timer = 5;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnInit()
{
SetIndexBuffer(0, Fast, INDICATOR_DATA);
SetIndexBuffer(1, Slow, INDICATOR_DATA);
EventSetTimer(timer);
ObjectCreate(0, objname, OBJ_CHART, 0, 0, 0);
ObjectSetInteger(0, objname, OBJPROP_PERIOD, PERIOD_MN1);
ObjectSetInteger(0, objname, OBJPROP_READONLY, true);
ObjectSetInteger(0, objname, OBJPROP_CHART_SCALE, 0);
}
//+---------------------------------------------------------------+//________________________________________________________________________________voidOnTimer()
{
i++;
ObjectSetString(0, objname, OBJPROP_SYMBOL, SymbolName(i, true));
ChartRedraw(0);
}
//________________________________________________________________________________//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(FastHandle != INVALID_HANDLE)
IndicatorRelease(FastHandle);
if(SlowHandle != INVALID_HANDLE)
IndicatorRelease(SlowHandle);
EventKillTimer();
ObjectDelete(0, objname);
//--- почистим график при удалении индикатораComment(" ");
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+bool FillArrayFromBuffer(double &values[], // индикаторный буфер значений Moving Averageint shift, // смещениеint ind_handle, // хэндл индикатора iMAint amount // количество копируемых значений
)
{
//--- сбросим код ошибкиResetLastError();
//--- заполняем часть массива iMABuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle, 0, -shift, amount, values) < 0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iMA, код ошибки %d", GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- все получилосьreturn(true);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
BARS = rates_total - 1;
// BARS = iBars(SymbolName(i, true), 0);if(iBars(SymbolName(i, true), 0) == 0)
{
// Alert(" Symbol = ", SymbolName(i, true), " ", iBars(SymbolName(i, true), 0));
i--;
}
//---if(Set_i == true)
i = I;
// Print("Slow[BARS] = ", Slow[prev_calculated],"Fast[prev_calculated] = ",Fast[prev_calculated],"open[BARS] = ",open[prev_calculated],"BARS = ",BARS);//Comment("FAST = ", FAST, " SLOW = ", SLOW, " open[BARS] = ", open[BARS], " BARS = ", BARS);int symbols = SymbolsTotal(true);
ENUM_TIMEFRAMES PERIOD = Period();
FastHandle = iMA(SymbolName(i, true), 0, MaFast, 0, mod, meth);
SlowHandle = iMA(SymbolName(i, true), 0, MaSlow, 0, mod, meth);
int calculated_FastHandle = BarsCalculated(FastHandle);
int calculated_SlowHandle = BarsCalculated(SlowHandle);
ResetLastError();
if(calculated_FastHandle <= 0)
{
// Alert("BarsCalculated() вернул %d, код ошибки %d", calculated_FastHandle, GetLastError());return(0);
}
if(calculated_SlowHandle <= 0)
{
// Alert("BarsCalculated() вернул %d, код ошибки %d", calculated_SlowHandle, GetLastError());return(0);
}
ResetLastError();
if(CopyBuffer(FastHandle, 0, 200, BARS, Fast) < 0)
{
//--- если копирование не удалось, сообщим код ошибки// Alert("Не удалось скопировать данные из индикатора iMA, код ошибки %d", GetLastError());//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
if(CopyBuffer(SlowHandle, 0, 200, BARS, Slow) < 0)
{
//--- если копирование не удалось, сообщим код ошибки// Alert("Не удалось скопировать данные из индикатора iMA, код ошибки %d", GetLastError());//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
FAST = Fast[BARS];
SLOW = Slow[BARS];
SLOW_Long = Slow[BARS - 144];
FAST = NormalizeDouble(FAST, DIGITS);
SLOW = NormalizeDouble(SLOW, DIGITS);
SLOW_Long = NormalizeDouble(SLOW_Long, DIGITS);
Comment(" ",
SymbolName(i, true),
" i =", i, " symbols =", symbols, " FAST = ",
FAST, " SLOW = ", SLOW, " SLOW_Long = ", SLOW_Long,
" iOpen = ", iOpen(SymbolName(i, true), 0, 0),
" BARS = ", BARS
);
//---if(BARS < 100)
if(ALERT_ON)
Alert("Надо подкачать историю по ", SymbolName(i, true), " Period ", _Period);
if(BARS > 100)
{
if(FAST != 0)
if(SLOW != 0)
if(FAST > SLOW)
if(iOpen(SymbolName(i, true), 0, 0) < SLOW)
// if(SLOW_Long < SLOW)
{
if(ALERT_ON)
{
Alert("Symbol ", SymbolName(i, true), " Period ", _Period);
IndicatorRelease(FastHandle);
IndicatorRelease(SlowHandle);
}
}
if(FAST == 0 || SLOW == 0)
if(ALERT_ON)
Alert("Надо подкачать историю по ", SymbolName(i, true), " Period ", _Period);
}
//---// i++;if(i == symbols)
i = 0;
// Comment(" Symbol = ", SymbolName(i, true), " ", iBars(SymbolName(i, true), 0));if(GetLastError())
{
// Alert(GetLastError());ResetLastError();
}
return(rates_total);
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+
Мучаюсь вопросом который год. Может кто ответит. Была ли НАСТОЯТЕЛЬНАЯ необходимость коверкать МТ4 в ТАКИХ моментах как iMA с этими хэндлами, да и пр. "штучками". Может это действительно надо было? Просто я любитель и не очень понимаю.
Сначала ответ в виде встречного вопроса на предыдущий вопрос: Для определения пересечения двух МА сколько раз надо вызвать эту функцию???
Правильный ответ ЧЕТЫРЕ!!! А в mql5 только два. По одному разу на каждую МА…
А сколько раз надо вызвать функцию для получения всех значений индикатора «Аллигатор»??? А в mql5 при получении хендла рассчитаны все буферы индикатора на всю глубину истории.
Просто если постараться и понять как это работает, то вам вскоре будет противен mql4.
Сначала ответ в виде встречного вопроса на предыдущий вопрос: Для определения пересечения двух МА сколько раз надо вызвать эту функцию???
Правильный ответ ЧЕТЫРЕ!!! А в mql5 только два. По одному разу на каждую МА…
А сколько раз надо вызвать функцию для получения всех значений индикатора «Аллигатор»??? А в mql5 при получении хендла рассчитаны все буферы индикатора на всю глубину истории.
Просто если постараться и понять как это работает, то вам вскоре будет противен mql4.
А как изменить фунцкию, которую я дал, чтобы, корректно, получить данные с другого символа и периода. Может есть такая функция у вас?
Ответ в документации
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Александр, 2023.06.23 14:06
Есть код в МТ5 в эксперте. Как получить значения 5-го бара МА?Вместо нулей ставьте нужный символ и период… И массивы не обязательно делать статическими. Размер массива определяется количеством запрошенных данных. Только обязательно изучите направление индексации в массивах. Если вам нужно значение на текущем баре, то сколько-бы данных не запросили индекс будет равен размер_массива минус 1;
Ответ в документации
Вместо нулей ставьте нужный символ и период… И массивы не обязательно делать статическими. Размер массива определяется количеством запрошенных данных. Только обязательно изучите направление индексации в массивах. Если вам нужно значение на текущем баре, то сколько-бы данных не запросили индекс будет равен размер_массива минус 1;
Может есть у кого корректно работающая функция чтобы получить значения МА с другого символа и другого ТФ?
Алгоритм известен, в чем проблемы?
Ошибка 4086 выскакивает, не пойму где напортачил))
Хендл получают один раз при инициализации, а не на каждом тике.
Алгоритм известен, в чем проблемы?
Хендл получают один раз при инициализации, а не на каждом тике.
Зашился я что-то с этим МТ5. Тяжело очень идет. Если есть функция киньте кто-нибудь. Не хочется тратить силы на такую ерунду.
Для этого раздел фриланса есть.