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

 

Индикатор MQL5 

Значение баланса и эквити пишется только в нулевой элемент массива.

Но при запуске индикатора появляются вот такие шпили на разных массивах и в разных местах. 

 Код в init для всех массивов такой:

  SetIndexBuffer(0,Balance1Buffer,INDICATOR_DATA);
  ArraySetAsSeries(Balance1Buffer,true);
  PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);


Как это убрать?

 

 
Sergey Likho:

Индикатор MQL5 

Значение баланса и эквити пишется только в нулевой элемент массива.

Но при запуске индикатора появляются вот такие шпили на разных массивах и в разных местах. 

 Код в init для всех массивов такой:


Как это убрать?

 

Нельзя ТОЛЬКО в [0] писать, нужно ОБЯЗАТЕЛЬНО учитывать prev_calculated и обнулять предыдущий бар.

А вообще есть уже такой код: LifeHack Balance Equity и  LifeHack Balance Equity 2
LifeHack Balance Equity
LifeHack Balance Equity
  • www.mql5.com
Индикатор отображает баланс и эквити торгового счёта.
 
Vladimir Karputov:

Хендл индикатора в MQL5 НУЖНО СОЗДАВАТЬ ОДИН РАЗ!!! И делать это нужно в OnInit()!!!

То есть, нужно создавать 6 хендлов  индикатора в   OnInit   для получения данных всех нужных таймфреймов?
 
Kira27:
То есть, нужно создавать 6 хендлов  индикатора в   OnInit   для получения данных всех нужных таймфреймов?

Нет. Не обязательно, если вам нужен только один из шести. И не обязательно создавать в OnInit(), главное не создавать хендл на каждом тике.

 
Kira27:
То есть, нужно создавать 6 хендлов  индикатора в   OnInit   для получения данных всех нужных таймфреймов?

Да. Можете создать шесть разных переменных для хранения шести хендлов, а можете (такой вариант предпочтительнее) создать массив и в массиве хранить шесть хендлов.

 
я подписан на сигнал у провайдера сигнала зделка 0.02 лота а у меня почемуто исполняется 0.01 подскажите почему так?
 
FAQ по сервису Сигналы
FAQ по сервису Сигналы
  • 2013.02.11
  • www.mql5.com
Узнать за 15 минут: смотри обучающие видео по торговым сигналам в MetaTrader 4 и MetaTrader 5 Здесь будут собраны и обработаны наиболее частые вопр...
 
Написал я значит так, всё хорошо, но громоздко)))   Хочется лаконичности)))  Есть варианты?  
//+------------------------------------------------------------------+
//|                                           Fraktal_Time_Frame.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"
//+------------------------------------------------------------------+

//_____________________________________Массивы для фракталов____________________________________
double FractalDown_W1[],FractalUP_W1[];    // одномерный динамический массив, так как в [] пусто
double FractalDown_D1[],FractalUp_D1[];  // одномерный динамический массив, так как в [] пусто
double FractalDown_H4[],FractalUp_H4[];  // одномерный динамический массив, так как в [] пусто
double FractalDown_1H[],FractalUp_1H[];  // одномерный динамический массив, так как в [] пусто
double FractalDown_30[],FractalUp_30[];  // одномерный динамический массив, так как в [] пусто
double FractalDown_15[],FractalUp_15[];  // одномерный динамический массив, так как в [] пусто
//____________________________________Переменные под хендлы____________________________________
int Fractal_W1;
int Fractal_D1;
int Fractal_H4;
int Fractal_1H;
int Fractal_30;
int Fractal_15;
//_____________________________________________________________________________________________
datetime Time_Mass_OLD[7];  //массивы для нранения времени открытия нулевого бара
datetime Time_Mass_NEW[7];  //ассивы для нранения времени открытия нулевого бара

//+------------------------------------------------------------------+
int OnInit()
  {
   Fractal_W1=iFractals(Symbol(),PERIOD_W1);
   Fractal_D1=iFractals(Symbol(),PERIOD_D1);
   Fractal_H4=iFractals(Symbol(),PERIOD_H4);
   Fractal_1H=iFractals(Symbol(),PERIOD_H1);
   Fractal_30=iFractals(Symbol(),PERIOD_M30);
   Fractal_15=iFractals(Symbol(),PERIOD_M15);



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

   Time_Mass_OLD[2]= iTime(NULL,PERIOD_D1,0);
   CopyBuffer(Fractal_D1,0,TimeCurrent(),Bars(Symbol(),PERIOD_D1),FractalUp_D1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_D1,1,TimeCurrent(),Bars(Symbol(),PERIOD_D1),FractalDown_D1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

   Time_Mass_OLD[3]= iTime(NULL,PERIOD_H4,0);
   CopyBuffer(Fractal_H4,0,TimeCurrent(),Bars(Symbol(),PERIOD_H4),FractalUp_H4);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_H4,1,TimeCurrent(),Bars(Symbol(),PERIOD_H4),FractalDown_H4); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

   Time_Mass_OLD[4]= iTime(NULL,PERIOD_H1,0);
   CopyBuffer(Fractal_1H,0,TimeCurrent(),Bars(Symbol(),PERIOD_H1),FractalUp_1H);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_1H,1,TimeCurrent(),Bars(Symbol(),PERIOD_H1),FractalDown_1H); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.

   Time_Mass_OLD[5]= iTime(NULL,PERIOD_M30,0);
   CopyBuffer(Fractal_30,0,TimeCurrent(),Bars(Symbol(),PERIOD_M30),FractalUp_30);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_30,1,TimeCurrent(),Bars(Symbol(),PERIOD_M30),FractalDown_30); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.


   Time_Mass_OLD[6]= iTime(NULL,PERIOD_M15,0);
   CopyBuffer(Fractal_15,0,TimeCurrent(),Bars(Symbol(),PERIOD_M15),FractalUp_15);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
   CopyBuffer(Fractal_15,1,TimeCurrent(),Bars(Symbol(),PERIOD_M15),FractalDown_15); // заполнение масива FractalUp[] нижними фракталами на дневном графике
//--- индексация как в таймсериях
   ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
   ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.


   /* Alert("OnInit");
    ArrayRemove(FractalDown_W1,0,WHOLE_ARRAY);
    ArrayPrint(
       FractalUP_W1,             // выводимый массив
       0,      // количество десятичных знаков после запятой
       NULL,      // разделитель между значениями полей структуры
       0,             // индекс первого выводимого элемента
       WHOLE_ARRAY,   // количество выводимых элементов
       ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_ALIGN
    );

    ArrayRemove(FractalUp_1H,0,WHOLE_ARRAY);
    ArrayPrint(
       FractalDown_W1,             // выводимый массив
       0,      // количество десятичных знаков после запятой
       NULL,      // разделитель между значениями полей структуры
       0,             // индекс первого выводимого элемента
       WHOLE_ARRAY,   // количество выводимых элементов
       ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_ALIGN
    );  */
//------------------------------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Time_Mass_NEW[1]= iTime(NULL,PERIOD_W1,0);
   Time_Mass_NEW[2]= iTime(NULL,PERIOD_D1,0);
   Time_Mass_NEW[3]= iTime(NULL,PERIOD_H4,0);
   Time_Mass_NEW[4]= iTime(NULL,PERIOD_H1,0);
   Time_Mass_NEW[5]= iTime(NULL,PERIOD_M30,0);
   Time_Mass_NEW[6]= iTime(NULL,PERIOD_M15,0);


   for(int tik =1; tik <= 6; tik++)
     {
      if(Time_Mass_NEW[tik]!=Time_Mass_OLD[tik])
        {
         switch(tik)
           {
            case 1:
               Time_Mass_OLD[tik]=Time_Mass_NEW[tik];
               CopyBuffer(Fractal_W1,0,TimeCurrent(),Bars(Symbol(),PERIOD_W1),FractalUP_W1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
               CopyBuffer(Fractal_W1,1,TimeCurrent(),Bars(Symbol(),PERIOD_W1),FractalDown_W1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
               //--- индексация как в таймсериях
               ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
               ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.
               ;
               break;
            case 2:
               Time_Mass_OLD[tik]=Time_Mass_NEW[tik];
               CopyBuffer(Fractal_D1,0,TimeCurrent(),Bars(Symbol(),PERIOD_D1),FractalUp_D1);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
               CopyBuffer(Fractal_D1,1,TimeCurrent(),Bars(Symbol(),PERIOD_D1),FractalDown_D1); // заполнение масива FractalUp[] нижними фракталами на дневном графике
               //--- индексация как в таймсериях
               ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
               ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.
               ;
               break;
            case 3:
               Time_Mass_OLD[tik]=Time_Mass_NEW[tik];
               CopyBuffer(Fractal_H4,0,TimeCurrent(),Bars(Symbol(),PERIOD_H4),FractalUp_H4);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
               CopyBuffer(Fractal_H4,1,TimeCurrent(),Bars(Symbol(),PERIOD_H4),FractalDown_H4); // заполнение масива FractalUp[] нижними фракталами на дневном графике
               //--- индексация как в таймсериях
               ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
               ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.
               ;
               break;
            case 4:
               Time_Mass_OLD[tik]=Time_Mass_NEW[tik];
               CopyBuffer(Fractal_1H,0,TimeCurrent(),Bars(Symbol(),PERIOD_H1),FractalUp_1H);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
               CopyBuffer(Fractal_1H,1,TimeCurrent(),Bars(Symbol(),PERIOD_H1),FractalDown_1H); // заполнение масива FractalUp[] нижними фракталами на дневном графике
               //--- индексация как в таймсериях
               ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
               ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.
               ;
               break;
            case 5:
               Time_Mass_OLD[tik]=Time_Mass_NEW[tik];
               CopyBuffer(Fractal_30,0,TimeCurrent(),Bars(Symbol(),PERIOD_M30),FractalUp_30);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
               CopyBuffer(Fractal_30,1,TimeCurrent(),Bars(Symbol(),PERIOD_M30),FractalDown_30); // заполнение масива FractalUp[] нижними фракталами на дневном графике
               //--- индексация как в таймсериях
               ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
               ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.
               ;
               break;
            case 6:
               Time_Mass_OLD[tik]=Time_Mass_NEW[tik];
               CopyBuffer(Fractal_15,0,TimeCurrent(),Bars(Symbol(),PERIOD_M15),FractalUp_15);   // заполнение масива FractalUp[] верхними фракталами на дневном графике
               CopyBuffer(Fractal_15,1,TimeCurrent(),Bars(Symbol(),PERIOD_M15),FractalDown_15); // заполнение масива FractalUp[] нижними фракталами на дневном графике
               //--- индексация как в таймсериях
               ArraySetAsSeries(FractalUP_W1,true);  //Заполнение массива FractalUp[],FractalDown, нулевым баром в первом окне массива и далее по порядку убывания от нулевого в тайм-серии
               ArraySetAsSeries(FractalDown_W1,true);//Второй параметр -true- функции ArraySetAsSeries Устанавливает флаг индексации как в таймсериях.
               ;
               break;
           }
        }
     }

/*   int n=0;
//----------------------------------------------------
//--- 1 далее используем оператор цикла for для поиска первого верхнего фрактала
   int i=Bars(Symbol(),PERIOD_W1); //Колличество баров на H1 графике

   for(n=0; n< i; n++)
     {
      //--- если непустое значение, прерываем цикл
      if(FractalUP_W1[n]!=EMPTY_VALUE)
         break;
     }
//--- запишем ценовое значение первого фрактала в переменную UpFractal_1 из массива с индексом где обнаружился верхний фрактал
   double UpFractal_1=FractalUP_W1[n];
   Alert("UpFractal_1= ",UpFractal_1);
//---
   ArrayPrint(
      FractalUP_W1,             // выводимый массив
      0,      // количество десятичных знаков после запятой
      NULL,      // разделитель между значениями полей структуры
      0,             // индекс первого выводимого элемента
      WHOLE_ARRAY,   // количество выводимых элементов
      ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_ALIGN
   );


   ArrayPrint(
      FractalDown_W1,             // выводимый массив
      0,      // количество десятичных знаков после запятой
      NULL,      // разделитель между значениями полей структуры
      0,             // индекс первого выводимого элемента
      WHOLE_ARRAY,   // количество выводимых элементов
      ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_ALIGN
   );  */

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

Подскажите что не так с этим кодом   

//+------------------------------------------------------------------+
//|                                                        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 значениями
                                                               //верхних фракталов  

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

//+-----------------------Функция заполнения массива-------------------------------------------+
double Search_Fractal(enum 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];
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
 
Kira27:

Подскажите что не так с этим кодом   

//+-----------------------Функция заполнения массива-------------------------------------------+
double Search_Fractal(ENUM_TIMEFRAMES period, double handle, double fract_mass)
  {
   UP = 0;                      //Глобальная переменная

---

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

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