Questions from Beginners MQL5 MT5 MetaTrader 5 - page 1289

 

MQL5 indicator

Balance and equity values are written only to the zero element of the array.

But when I run the indicator, such spikes appear on different arrays and in different places.

The code in init for all arrays is the same:

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


How to remove it?

 
Sergey Likho:

MQL5 indicator

Balance and equity values are written only to the zero element of the array.

But when I run the indicator, such spikes appear on different arrays and in different places.

The code in init for all arrays is the same:


How to remove it?

You MUST NOT write [0], you MUST consider prev_calculated and zeroize previous bar.

In fact, there is already such a code: LifeHack Balance Equity and LifeHack Balance Equity 2
LifeHack Balance Equity
LifeHack Balance Equity
  • www.mql5.com
Индикатор отображает баланс и эквити торгового счёта.
 
Vladimir Karputov:

Indicator handle in MQL5 MUST BE CREATED ONE TIME!!! And it must be done in OnInit()!!!

It means that you need to create 6 handles of the indicator in OnInit for obtaining data of all needed timeframes?
 
Kira27:
So, you want to create 6 indicator handles in OnInit() to receive data of all needed timeframes?

No. Not necessary if you only need one of the six. And it doesn't have to be created in OnInit(), the main thing is not to create a handle on every tick.

 
Kira27:
So, you want to create six indicator handles in OnInit to receive data of all needed timeframes?

Yes. You can create six different variables to store the six handles, or you can (this is preferred) create an array and store six handles in the array.

 
I am subscribed to the signal provider's signal deal 0.02 lots, but my deal is somehow 0.01. Please advise why?
 
FAQ по сервису Сигналы
FAQ по сервису Сигналы
  • 2013.02.11
  • www.mql5.com
Узнать за 15 минут: смотри обучающие видео по торговым сигналам в MetaTrader 4 и MetaTrader 5 Здесь будут собраны и обработаны наиболее частые вопр...
 
I wrote it like this, everything is fine, but cumbersome))) I want conciseness))) Any options?
 //+------------------------------------------------------------------+
//|                                           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
   );  */

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

Tell me what's wrong with this code

//+------------------------------------------------------------------+
//|                                                        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:

Tell me what's wrong with this code.

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

---

P.S. In general, there are many things wrong with the same array, for example.

Reason: