Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2216

 
Александр #:
Мучаюсь вопросом который год. Может кто ответит. Была ли НАСТОЯТЕЛЬНАЯ необходимость коверкать МТ4 в ТАКИХ моментах как iMA  с этими хэндлами, да и пр. "штучками". Может это действительно надо было? Просто я любитель и не очень понимаю.

Сначала ответ в виде встречного вопроса на предыдущий вопрос: Для определения пересечения двух МА сколько раз надо вызвать эту функцию???

Правильный ответ ЧЕТЫРЕ!!! А в mql5 только два. По одному разу на каждую МА…

А сколько раз надо вызвать функцию для получения всех значений индикатора «Аллигатор»??? А в mql5 при получении хендла рассчитаны все буферы индикатора на всю глубину истории.

Просто если постараться и понять как это работает, то вам вскоре будет противен mql4.

 
Alexey Viktorov #:

Сначала ответ в виде встречного вопроса на предыдущий вопрос: Для определения пересечения двух МА сколько раз надо вызвать эту функцию???

Правильный ответ ЧЕТЫРЕ!!! А в mql5 только два. По одному разу на каждую МА…

А сколько раз надо вызвать функцию для получения всех значений индикатора «Аллигатор»??? А в mql5 при получении хендла рассчитаны все буферы индикатора на всю глубину истории.

Просто если постараться и понять как это работает, то вам вскоре будет противен mql4.

А как изменить фунцкию, которую я дал, чтобы, корректно, получить данные с другого символа и периода. Может есть такая функция у вас?
 
Александр #:
А как изменить фунцкию, которую я дал, чтобы, корректно, получить данные с другого символа и периода. Может есть такая функция у вас?

Ответ в документации

int  iMA(
   string               symbol,            // имя символа
   ENUM_TIMEFRAMES      period,            // период
   int                  ma_period,         // период усреднения
   int                  ma_shift,          // смещение индикатора по горизонтали
   ENUM_MA_METHOD       ma_method,         // тип сглаживания
   ENUM_APPLIED_PRICE   applied_price      // тип цены или handle
   );

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Александр, 2023.06.23 14:06

Есть код в МТ5 в эксперте. Как получить значения 5-го бара МА?
void OnInit()
  {
   FastHandle   = iMA(NULL, 0, Ma_Fast, 0, MODE_EMA, PRICE_CLOSE);
   MediumHandle = iMA(NULL, 0, Ma_Medium, 0, MODE_EMA, PRICE_WEIGHTED);
   SlowHandle   = iMA(NULL, 0, Ma_Slow, 0, MODE_EMA, PRICE_WEIGHTED);
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   double Fast[1];
// double Medium[1];
   double Slow[1];
//---
   CopyBuffer(FastHandle, 0, 0, 1, Fast);
//CopyBuffer(MediumHandle, 0, 0, 1, Medium);
   CopyBuffer(SlowHandle, 0, 0, 1, Slow);

Вместо нулей ставьте нужный символ и период… И массивы не обязательно делать статическими. Размер массива определяется количеством запрошенных данных. Только обязательно изучите направление индексации в массивах. Если вам нужно значение на текущем баре, то сколько-бы данных не запросили индекс будет равен размер_массива минус 1;

 
Alexey Viktorov #:

Ответ в документации


Вместо нулей ставьте нужный символ и период… И массивы не обязательно делать статическими. Размер массива определяется количеством запрошенных данных. Только обязательно изучите направление индексации в массивах. Если вам нужно значение на текущем баре, то сколько-бы данных не запросили индекс будет равен размер_массива минус 1;

Ошибка 4086 выскакивает, не пойму где напортачил))
//+------------------------------------------------------------------+
//|                                                   2 МА Alarm.mq5 |
//+------------------------------------------------------------------+
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_plots   2

#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_color2  clrYellow

input                    int MaFast = 21;
input                    int MaSlow = 200;
input ENUM_APPLIED_PRICE meth = PRICE_CLOSE;
input ENUM_MA_METHOD     mod = MODE_EMA;
input                    bool ALERT_ON = true;
input                    bool Set_i = false;
input                    int I = 8; // 11 это установка GAZP если I = -1 , то текущий график
input                    int 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;
//---
input string objname = "smallchart";
input int    timer   = 5;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   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);
  }
//+---------------------------------------------------------------+
//________________________________________________________________________________
void OnTimer()
  {
   i++;
   ObjectSetString(0, objname, OBJPROP_SYMBOL, SymbolName(i, true));
   ChartRedraw(0);
  }
//________________________________________________________________________________
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(FastHandle != INVALID_HANDLE)
      IndicatorRelease(FastHandle);
   if(SlowHandle != INVALID_HANDLE)
      IndicatorRelease(SlowHandle);
   EventKillTimer();
   ObjectDelete(0, objname);
//--- почистим график при удалении индикатора
   Comment("                                                                                                   ");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &values[],   // индикаторный буфер значений Moving Average
                         int shift,          // смещение
                         int ind_handle,     // хэндл индикатора iMA
                         int amount          // количество копируемых значений
                        )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива iMABuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle, 0, -shift, amount, values) < 0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iMA, код ошибки %d", GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &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);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
 
Может есть у кого корректно работающая функция чтобы получить значения МА с другого символа и другого ТФ?
 
Александр #:
Может есть у кого корректно работающая функция чтобы получить значения МА с другого символа и другого ТФ?

Алгоритм известен, в чем проблемы?

 
Александр #:
Ошибка 4086 выскакивает, не пойму где напортачил))

Хендл получают один раз при инициализации, а не на каждом тике.

 
Andrei Sokolov #:

Алгоритм известен, в чем проблемы?

Зашился я что-то с этим МТ5. Тяжело очень идет. Если есть функция киньте кто-нибудь. Не хочется тратить силы на такую ерунду.
 
Alexander Sevastyanov #:

Хендл получают один раз при инициализации, а не на каждом тике.

Попробую, спасибо!
 
Александр #:
Зашился я что-то с этим МТ5. Тяжело очень идет. Если есть функция киньте кто-нибудь. Не хочется тратить силы на такую ерунду.

Для этого раздел фриланса есть.

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