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

 
Vitaly Muzichenko:

---

P.S.  а вообще, много чего не так, с тем-же массивом к примеру.

Спасибо за помощь и за наводку!!!   Вот так компилируется

//+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];    // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int  Fractal_W1=iFractals(Symbol(),PERIOD_W1); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart()
  {
   CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal(PERIOD_W1, HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  

  }
//+------------------------------------------------------------------+

//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике
   
   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
        }
     }
  }
//+------------------------------------------------------------------+
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • 2021.02.13
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
Подправил чутка, почти как нужно работает, до 51.20 там вылетает с ошибкой    

Массив Funct (BRN, W1) вне допустимого диапазона

//+------------------------------------------------------------------+
//|                                                        Funct.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int UP; //Глобальная переменная

//_____________________________________Массивы для Handleлов____________________________________
double HandleFractalDown_W1[],HandleFractalUP_W1[];    // одномерный динамический массив

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив

//-----------------------------------------------------------------------------------------------
int  Fractal_W1=iFractals(Symbol(),PERIOD_W1); //Хендл индикатора

//----------------------------------------------------------------------
void OnStart()
  {
   CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),HandleFractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(HandleFractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(HandleFractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

  Search_Fractal(PERIOD_W1, HandleFractalUP_W1, FractalUP_W1); //Пользовательская функция заполнения массива FractalUP_W1 значениями
                                                               //верхних фракталов  
  }
//+------------------------------------------------------------------+



//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике

   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+
Что может быть?
 
Kira27:
Подправил чутка, почти как нужно работает, до 51.20 там вылетает с ошибкой   

Массив Funct (BRN, W1) вне допустимого диапазона

Что может быть?

Попробуйте так, у вас не задана размерность массива

void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике
   ArrayResize(fract_mass,i+1);
   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }

А вообще, это не лучшее решение

 
Kira27:
Подправил чутка, почти как нужно работает, до 51.20 там вылетает с ошибкой   

Массив Funct (BRN, W1) вне допустимого диапазона

Что может быть?

Строчка решившая проблему краша  

 ArrayResize(handle,i,0);//*------Строчка решившая проблему
//+-----------------------Функция заполнения массива-------------------------------------------+
void Search_Fractal(ENUM_TIMEFRAMES period, double &handle[], double &fract_mass[])
  {
   UP = 0;                      //Глобальная переменная
   int i=Bars(Symbol(),period); //Колличество баров на W1 графике

//***************************
   ArrayResize(handle,i,0);//*------Строчка решившая проблему
//***************************

   for(int n=0; n< i; n++)
     {
      //--- если непустое значение, пишем в массив fract_mass[UP] цену фрактала
      if(handle[n]!=EMPTY_VALUE)
        {
         UP++;
         fract_mass[UP] = handle[n];
         Alert("Frakt= ",fract_mass[UP]);
        }
     }
  }
//+------------------------------------------------------------------+

Правильно теперь?   Поправьте если не сложно.

 
Kira27:
Подправил чутка, почти как нужно работает, до 51.20 там вылетает с ошибкой   

Массив Funct (BRN, W1) вне допустимого диапазона

Что может быть?

При этом, вы копируете в массив HandleFractalUP_W1 некое количество элементов, но сколько именно - не контролируете.

Далее, делаете цикл по int i=Bars(Symbol(),period); //Колличество баров на W1 графике

По итогу, снова получите выход за пределы массива, но уже в handle[n]

Разберитесь немного с логикой заполнения, не спешите.

----

Kira27:

Строчка решившая проблему краша  

Правильно теперь?   Поправьте если не сложно.

Так всё мудрёно, но у вас всё получится

 
Kira27:

Строчка решившая проблему краша  

Правильно теперь?   Поправьте если не сложно.

Только вот фракталов меньше чем баров в окне недельного графика, и при заполнении массива ценовыми значениями фракталов заполняется только 90 клеток, и вся остальная разметка памяти избыточна     Получактся сначала нужно посчитать колличество фракталов, а уже потом применять   ArrayResize для резервирования памяти?

 
Vitaly Muzichenko:

При этом, вы копируете в массив HandleFractalUP_W1 некое количество элементов, но сколько именно - не контролируете.

Далее, делаете цикл по int i=Bars(Symbol(),period); //Колличество баров на W1 графике

По итогу, снова получите выход за пределы массива, но уже в handle[n]

Разберитесь немного с логикой заполнения, не спешите.

----

Так всё мудрёно, но у вас всё получится

Спасибо!!!

 

Всем добрый день. Помогите пожалуйста разобраться, почему не удается получить историю объемов. Пытался это сделать 2 способами. 

Первый способ:

MqlRates mrate5[];

      if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)

        {

            Alert("Ошибка копирования исторических данных для М5 - ошибка:",GetLastError(),"!!");

            return;

        }

for (int i=0;i<bars_used;i++) {

Print(mrate5[i].real_volume)

}

Второй способ:

long volumes5[];

      if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)

        {

            Alert("Ошибка копирования объемов для М5 - ошибка:",GetLastError(),"!!");

            return;

        }

for (int i=0;i<bars_used;i++) {

Print(volumes5[i])

}

В обоих случаях массив объемов всегда содержит только нули. Никакой осмысленной информации получить просто не получается...


 
seleand:

Всем добрый день. Помогите пожалуйста разобраться, почему не удается получить историю объемов. Пытался это сделать 2 способами. 

Первый способ:

MqlRates mrate5[];
      if(CopyRates(_Symbol,PERIOD_M5,1,bars_used,mrate5)<0)
        {
            Alert("Ошибка копирования исторических данных для М5 - ошибка:",GetLastError(),"!!");
            return;
        }
for (int i=0;i<bars_used;i++) {
Print(mrate5[i].real_volume)
}

Второй способ:

long volumes5[];
      if(CopyRealVolume(_Symbol,PERIOD_M5,1,bars_used,volumes5)<0)
        {
            Alert("Ошибка копирования объемов для М5 - ошибка:",GetLastError(),"!!");
            return;
        }
for (int i=0;i<bars_used;i++) {
Print(volumes5[i])
}

В обоих случаях массив объемов всегда содержит только нули. Никакой осмысленной информации получить просто не получается...


  1. Научитесь вставлять код.
  2. На форексе нет реальных объёмов от слова вообще.
 

Спасибо. Я правильно понимаю, что есть тиковый объем

Просто когда я скачивал историю котировок для форекса например с сайта финам, там кроме open, high, low, close был еще vol. Без уточнения какой именно это объем. Это тиковый объем надо полагать? 

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