Kira27: Donc, vous voulez créer 6 poignées d'indicateurs dans OnInit() pour recevoir les données de toutes les périodes nécessaires ?
Non. Pas nécessaire si vous n'avez besoin que d'un seul des six. Et il n'est pas nécessaire de le créer dans OnInit(), l'essentiel étant de ne pas créer un handle à chaque tick.
Kira27: Donc, vous voulez créer six poignées d'indicateur dans OnInit pour recevoir les données de toutes les périodes nécessaires ?
Oui. Vous pouvez créer six variables différentes pour stocker les six poignées, ou vous pouvez (ce qui est préférable) créer un tableau et stocker six poignées dans le tableau.
Je l'ai écrit comme ça, tout va bien, mais encombrant))) Je veux de la concision))) Des 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 ]; //ассивы для нранения времени открытия нулевого бара//+------------------------------------------------------------------+intOnInit ()
{
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 |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
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)
{
case1 :
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 ;
case2 :
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 ;
case3 :
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 ;
case4 :
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 ;
case5 :
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 ;
case6 :
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
); */
}
//+------------------------------------------------------------------+
Indicateur MQL5
Les valeurs de la balance et des fonds propres sont écrites uniquement dans l'élément zéro du tableau.
Mais lorsque j'exécute l'indicateur, ces pics apparaissent sur différents tableaux et à différents endroits.
Le code dans init pour tous les tableaux est le même :
Comment l'enlever ?
Indicateur MQL5
Les valeurs de la balance et des fonds propres sont écrites uniquement dans l'élément zéro du tableau.
Mais lorsque j'exécute l'indicateur, ces pics apparaissent sur différents tableaux et à différents endroits.
Le code dans init pour tous les tableaux est le même :
Comment l'enlever ?
Vous NE DEVEZ PAS écrire [0], vous DEVEZ considérer prev_calculé et remettre à zéro la barre précédente.
En fait, il existe déjà un tel code : LifeHack Balance Equity et LifeHack Balance Equity 2La poignée de l'indicateur dans MQL5 DOIT ÊTRE CRÉÉE UNE SEULE FOIS !!! Et cela doit être fait dans OnInit() !!!
Donc, vous voulez créer 6 poignées d'indicateurs dans OnInit() pour recevoir les données de toutes les périodes nécessaires ?
Non. Pas nécessaire si vous n'avez besoin que d'un seul des six. Et il n'est pas nécessaire de le créer dans OnInit(), l'essentiel étant de ne pas créer un handle à chaque tick.
Donc, vous voulez créer six poignées d'indicateur dans OnInit pour recevoir les données de toutes les périodes nécessaires ?
Oui. Vous pouvez créer six variables différentes pour stocker les six poignées, ou vous pouvez (ce qui est préférable) créer un tableau et stocker six poignées dans le tableau.
Je suis abonné au signal du fournisseur de 0,02 lots, mais ma transaction est exécutée à 0,01 pour une raison quelconque ?
Les réponses aux questions les plus courantes sont rassemblées dans uneFAQ spécialesur le service Signaux.
La première chose avec laquelle vous devez vous familiariser :
Dites-moi ce qui ne va pas avec ce code
Dites-moi ce qui ne va pas avec ce code.
---
P.S. En général, il y a beaucoup de choses qui ne vont pas avec le même tableau, par exemple.