Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1010

 

MQL5

Никак не могу добиться толку. Может тут кто-нибудь подскажет?

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

Прошу подсказку.

Сергей Таболин, 2019.03.07 08:14

На основе одного индикатора из кодабазы написал пример того что я хочу. Работает. Но при запуске выдаёт ошибку:

2019.03.06 21:24:26.091 my_MA_S (GBPUSD,M15)    array out of range in 'my_MA_S.mq5' (103,59)

Не подскажете где ошибка?

//+------------------------------------------------------------------+
//|                                                       myMA_S.mq5 |
//|                                     Copyright 2019, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property   copyright   "Copyright 2019, Tabolin S.N."
#property   link        "https://www.mql5.com/ru/users/vip.avos"
#property   version     "1.07"
//#property   icon        "\\Images\\mi2.ico"
//----------------------------------------------------------------------------------------------
#define     GS          1.618
#define     PI          3.14159
//----------------------------------------------------------------------------------------------
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "myMA_S"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

//--- input parameters
input int      InpPeriodMA          = 45; // MA period
input int      InpShiftCorrection   = 9;  // Correction shift
//--- indicator buffers
double         Buffer1[];
int            handle_MA;                           // переменная для хранения хэндла индикатора HMA5
double         buffer_MA[];                         // массив для хранения значений индикатора HMA5
int            n=0;
int            ma_bars_calculated = 0; 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buffer1,        true);
   ArraySetAsSeries(buffer_MA,      true);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,-1);

   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
//--- set shortname and change label
   string short_name="myMA_S("+
                              IntegerToString(InpPeriodMA)+","+
                              IntegerToString(InpShiftCorrection)+")";
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
   PlotIndexSetString(0,PLOT_LABEL,short_name);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpPeriodMA);

   handle_MA = iMA(Symbol(),0,InpPeriodMA,0,MODE_SMA,PRICE_CLOSE);
   if(handle_MA == INVALID_HANDLE)                                       // проверяем наличие хендла индикатора
   {
      Comment("Не удалось получить хендл индикатора handle_MA");         // если хендл не получен, то выводим сообщение в лог об ошибке
      Print("Не удалось получить хендл индикатора handle_MA");
      return(INIT_FAILED);                                                 // завершаем работу с ошибкой
   }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   
   int ma_values_to_copy; 
   int ma_calculated = BarsCalculated(handle_MA); 
   if(ma_calculated <= 0){ 
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",ma_calculated,GetLastError()); 
      return(0); 
     }  
   if(prev_calculated == 0 || ma_calculated != ma_bars_calculated || rates_total > prev_calculated + 1){ 
      if(ma_calculated > rates_total) ma_values_to_copy = rates_total; 
      else ma_values_to_copy = ma_calculated; 
     } else { 
      ma_values_to_copy = (rates_total - prev_calculated) + 1; 
     } 
     
   if(CopyBuffer(handle_MA,0,0,ma_values_to_copy,buffer_MA) < 0 ) // копируем данные из индикаторного массива в массив buffer_HMA5
   {                                                                                // если не скопировалось
      Print("Не удалось скопировать данные из индикаторного буфера в buffer_MA");   // то выводим сообщение об ошибке
      return(0);                                                                    // и выходим из функции
   }

   for(int i = 0; i < ma_values_to_copy; i++)
     {
      Buffer1[i]  = buffer_MA[i]+(buffer_MA[i+1]-buffer_MA[i+InpShiftCorrection])/(InpShiftCorrection/GS);//1.314;
     }
   
   return(rates_total);
  }
//+------------------------------------------------------------------+

Что где не так?
Файлы:
my_MA_S.mq5  10 kb
 
Сергей Таболин:

MQL5

Никак не могу добиться толку. Может тут кто-нибудь подскажет?

Что где не так?
Два буфера, а в #property указан один
 
Artyom Trishkin:
Два буфера, а в #property указан один

Спасибо за подсказку...

Но ничего не изменилось. В индикаторах я полный минус (((

#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1

#property indicator_label1  "myMA_S"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1 

//--- input parameters
input int      InpPeriodMA          = 45; // MA period
input int      InpShiftCorrection   = 9;  // Correction shift
//--- indicator buffers
double         Buffer1[];
int            handle_MA;                           // переменная для хранения хэндла индикатора HMA5
double         buffer_MA[];                         // массив для хранения значений индикатора HMA5
int            n=0;
int            ma_bars_calculated = 0; 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(Buffer1,        true);
   ArraySetAsSeries(buffer_MA,      true);

   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,-1);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,-1);

   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,buffer_MA,INDICATOR_CALCULATIONS);
 
Сергей Таболин:

Спасибо за подсказку...

Но ничего не изменилось. В индикаторах я полный минус (((

С мобильного не подскажу
 
Сергей Таболин:

Спасибо за подсказку...

Но ничего не изменилось. В индикаторах я полный минус (((

Код не очень смотрел и не понятно в какой строке ошибка, но как-бы ошибка не здесь.

Попробуйте уменьшить лимит

for(int i = 0; i < ma_values_to_copy-5; i++)
 
Vitaly Muzichenko:

Код не очень смотрел и не понятно в какой строке ошибка, но как-бы ошибка не здесь.

Попробуйте уменьшить лимит

Ошибка именно в этом цикле.

   for(int i = 0; i < ma_values_to_copy; i++)
     {
      Buffer1[i]  = buffer_MA[i]+(buffer_MA[i+1]-buffer_MA[i+InpShiftCorrection])/(InpShiftCorrection/GS);// ошибка тут
     }

Но Ваше предположение натолкнуло меня на маленькое изменение:

   for(int i = 0; i < ma_values_to_copy-InpShiftCorrection; i++)
     {
      Buffer1[i]  = buffer_MA[i]+(buffer_MA[i+1]-buffer_MA[i+InpShiftCorrection])/(InpShiftCorrection/GS);//1.314;
     }

Ошибка пропала. Спасибо )))

 
Скачал мт5. для торгового счёта. Подскажите куда надо и де произвести оплату для реальной торговли??? я НОВИЧОК
 
Раиль Алеев:
Скачал мт5. для торгового счёта. Подскажите куда надо и де произвести оплату для реальной торговли??? я НОВИЧОК

Включить компьютер. Загрузить браузер. В строке поиска забить слова "открыть счет MetaTrader 5".

 
Есть ли в CodeBase советник с функцией "одна сделка на бар" (исключая EA "по открытию бара")?
 

Это работало когда нибудь, или нет?

Как сделать так, чтобы при смене цвета во входных параметрах, этот цвет находился в "indicator_color1" ? Сейчас как не изменяй - находится первоначальный

#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua


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[])
  {
   Comment( indicator_color1 ); // постоянно clrAqua

   return(rates_total);
  }
Причина обращения: