Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 695

 
psyman:

Pour une raison quelconque, je n'arrive pas à attraper une barre dans la boucle, qui commence à 15 heures.

Si j'écris if(i<24) comme condition, le journal affiche l'heure de chaque barre de la journée, mais la condition requise n'est pas remplie :


Et sur quelle période utilisez-vous l'indicateur ?

 
psyman:

Sentinelle dans les deux cas.

Ça marche :

//+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property strict
//--- plot Hour
#property indicator_label1  "Hour"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar    InpHour  =  15;   // The required hour
//--- indicator buffers
double         BufferHour[];
//--- global variables
int            hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   hour_req=int(InpHour>23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferHour,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Hour("+(string)hour_req+")");
#ifdef __MQL4__
   SetIndexLabel(0,"Hour("+(string)hour_req+")");
#else 
   PlotIndexSetString(0,PLOT_LABEL,"Hour("+(string)hour_req+")");
   ArraySetAsSeries(BufferHour,true);
#endif 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(time,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<1) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferHour,0);
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour(const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour(time);
   #endif 
   MqlDateTime tm;
   if(!TimeToStruct(time,tm)) return WRONG_VALUE;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

Merci, mais c'est tellement compliqué pour quelqu'un qui n'est pas encombré d'expérience et de connaissances, c'est le bordel :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);

Pourquoi faire un contrôleheure>0 lors du transfert des données vers le tampon? Et si ce n'est pas le cas, pourquoi attribuer 0,1 ?



Je voulais faire une mise en évidence sur le graphique principal, mais pas par une ligne, mais par le jour de la semaine Mon, Wed, Wed... via SetIndexArrow(0, 140) ; (il y a peut-être un moyen plus simple, mais jusqu'à présent rien d'autre n'est apparu), mais pour une raison quelconque, je ne peux pas faire fonctionner votre code dans la fenêtre principale en quatre, et en cinq aucune propriété de ce type déjà.

 
psyman:

Merci, mais c'est tellement compliqué pour quelqu'un qui n'est pas encombré d'expérience et de connaissances, c'est le bordel :-)


Pourquoi faire un contrôleheure>0lors du transfert des données vers le tampon? Et si ce n'est pas le cas, pourquoi attribuer 0,1 ?



Je voulais faire une mise en évidence sur le graphique principal, mais pas par une ligne, mais par le jour de la semaine Mon, Wed, Wed... via SetIndexArrow(0, 140) ; (il y a peut-être un moyen plus simple, mais jusqu'à présent rien d'autre n'est apparu), mais pour une raison quelconque, je ne peux pas faire fonctionner votre code dans la fenêtre principale en quatre, et en cinq aucune propriété de ce type déjà.

Le tampon est rempli avec la valeur de l'heure. Et si l'heure est zéro, l'histogramme ne sera pas dessiné. Nous devons donc vérifier si l'heure est égale à zéro (nous l'avons configuré pour qu'il recherche l'heure zéro dans les paramètres), et si c'est le cas, nous devons entrer 0,1 dans le tampon, et non la valeur de l'heure (zéro), pour afficher la colonne de l'histogramme. La fenêtre de données affichera une valeur de 0 au lieu de 0,1, car l'indicateur Digits est réglé sur zéro.

 
psyman:

Merci, mais c'est tellement compliqué pour quelqu'un qui n'est pas encombré d'expérience et de connaissances, c'est le bordel :-)


Pourquoi faire un contrôleheure>0 lors du transfert des données vers le tampon? Et si ce n'est pas le cas, pourquoi attribuer 0,1 ?



Je voulais faire une mise en évidence sur le graphique principal, mais pas par une ligne, mais par le jour de la semaine Mon, Wed, Wed... via SetIndexArrow(0, 140) ; (il y a peut-être un moyen plus simple, mais jusqu'à présent rien d'autre n'est apparu), mais pour une raison quelconque, je ne peux pas faire fonctionner votre code dans la fenêtre principale en quatre, et en cinq aucune propriété de ce type déjà.

PlotIndexSetInteger(0,PLOT_ARROW,140) ;

Mais vous devez créer un nombre de tampons égal au nombre de semaines. Et chaque tampon reçoit un code fléché de 140 à 149 - 1,2,3,4,5,6,7,8,9,10 - dix semaines suffisent pour une année ? C'est seulement 70 jours. Ou comment tu le voulais ?

 
Bonne journée à vous tous !
Aidez-moi !
Cet indicateur BB MACD pour MetaTrader 4 a été téléchargé par mes soins à partir de l'adresse suivante :https://www.mql5.com/en/code/9325
Cet indicateur est calculé en deux cycles.
En utilisant les données du tampon MACD précédent, les bandes de Bollinger sont calculées.

Une tentative de changer le sens de comptage du cycle principal et de tout calculer en une seule fois dans un seul cycle et en même temps de se débarrasser de
En même temps, se débarrasser du cycle supplémentaire lors du calcul des bandes de Bollinger s'est soldé par un fiasco.
L'indicateur produit les mêmes résultats que son homologue non modifié, mais freine sauvagement le terminal lors du calcul de l'historique.
Si vous le laissez sur une période mensuelle, vous ne le remarquerez pas, mais si vous le laissez sur 15 minutes...

Je dois le redémarrer.

Je ne sais pas trop quoi en faire.

Je peux demander qui peut suggérer comment calculer les endroits les plus lents dans les programmes ?

Merci d'avance pour les conseils !


Voici l'original. Et ci-dessous, le même avec mes modifications.

//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property  copyright "Copyright © 2005, adoleh2000"
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Lime    //bbMacd up
#property  indicator_color2  Magenta //bbMacd up
#property  indicator_color3  Blue    //Upperband
#property  indicator_color4  Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12;
extern int SlowLen = 26;
extern int Length = 10;
extern double StDv = 2.5;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];  // bbMacd
double ExtMapBuffer2[];  // bbMacd
double ExtMapBuffer3[];  // Upperband Line
double ExtMapBuffer4[];  // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers(8);   
//---- drawing settings     
   SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 108);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 108);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(2, ExtMapBuffer3); // Upperband line
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(4, bbMacd);
   SetIndexBuffer(5, Upperband);        
   SetIndexBuffer(6, Lowerband);
   SetIndexBuffer(7, avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("BB MACD(" + FastLen + "," + SlowLen + "," + Length+")");
   SetIndexLabel(0, "bbMacd");
   SetIndexLabel(1, "Upperband");
   SetIndexLabel(2, "Lowerband");  
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = 0; i < limit; i++)
       bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) - 
                   iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);
//----
   for(i = 0; i < limit; i++)
     {
       avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);
       sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];  // Upperband
       ExtMapBuffer4[i]=Lowerband[i];  // Lowerband
       //----
       if(bbMacd[i] > bbMacd[i+1])
           ExtMapBuffer2[i] = EMPTY_VALUE;
       //----
       if(bbMacd[i] < bbMacd[i+1])
           ExtMapBuffer1[i] = EMPTY_VALUE;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+


//================


//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */
#property  copyright "Copyright © 2005, adoleh2000" #property  link      "http://www.metaquotes.net/" //---- indicator settings #property  indicator_separate_window #property  indicator_buffers 4 #property  indicator_color1  Lime    //bbMacd up #property  indicator_color2  Magenta //bbMacd up #property  indicator_color3  Blue    //Upperband #property  indicator_color4  Red     //Lowerband //---- indicator parameters extern int FastLen = 12; extern int SlowLen = 26; extern int Length = 10; extern double StDv = 2.5; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];  // bbMacd double ExtMapBuffer2[];  // bbMacd double ExtMapBuffer3[];  // Upperband Line double ExtMapBuffer4[];  // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers(8);   //---- drawing settings        SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line    SetIndexStyle(0, DRAW_ARROW);    SetIndexArrow(0, 108);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line    SetIndexStyle(1, DRAW_ARROW);    SetIndexArrow(1, 108);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(2, ExtMapBuffer3); // Upperband line    SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line    SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(4, bbMacd);    SetIndexBuffer(5, Upperband);            SetIndexBuffer(6, Lowerband);    SetIndexBuffer(7, avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName("BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+")");    SetIndexLabel(0, "bbMacd");    SetIndexLabel(1, "Upperband");    SetIndexLabel(2, "Lowerband");            //---- initialization done    return(0);   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return(0);   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted(); //---- check for possible errors    if(counted_bars < 0)        return(-1); //---- last counted bar will be recounted    if(counted_bars > 0)        counted_bars--;    limit = Bars - counted_bars;             if(counted_bars==0){              for(i=Bars-1; i>=1; i--) bbMacd[i]=0.0;//обнулим первый рассчитываемый массив              MaxPeriod= MathMax(MathMax(FastLen,SlowLen), Length);//это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл   for(i=limit; i>=1; i--){//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) -                    iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);                           avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);        sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];  // Upperband        ExtMapBuffer4[i]=Lowerband[i];  // Lowerband        //----        if(bbMacd[i] > bbMacd[i+1])            ExtMapBuffer2[i] = EMPTY_VALUE;        //----        if(bbMacd[i] < bbMacd[i+1])            ExtMapBuffer1[i] = EMPTY_VALUE;      }//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return(0);   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest:
Bonne journée à vous tous !
Aidez-moi !
Cet indicateur BB MACD pour MetaTrader 4 a été téléchargé par mes soins à partir de l'adresse suivante :https://www.mql5.com/en/code/9325
Cet indicateur est calculé en deux cycles.
En utilisant les données du tampon MACD précédent, les bandes de Bollinger sont calculées.

Une tentative de changer le sens de comptage du cycle principal et de tout calculer en une seule fois dans un seul cycle et en même temps de se débarrasser de
En même temps, se débarrasser du cycle supplémentaire lors du calcul des bandes de Bollinger s'est soldé par un fiasco.
L'indicateur produit les mêmes résultats que son homologue non modifié, mais freine sauvagement le terminal lors du calcul de l'historique.
Si vous le laissez sur une période mensuelle, vous ne le remarquerez pas, mais si vous le laissez sur 15 minutes...

Je dois le redémarrer.

Je ne sais pas trop quoi en faire.

Je peux demander qui peut suggérer comment calculer les endroits les plus lents dans les programmes ?

Merci d'avance pour les conseils !


Voici l'original. Et ci-dessous, le même avec mes modifications.


//================


Rends tout, ne torture pas l'ordinateur.

iBandsOnArray, iStdDevOnArray calculés pour les données stockées dans un tableau

Le tableau, quant à lui, est rempli en 1 boucle

 
Alekseu Fedotov:

Remettez tout en place, ne torturez pas l'ordinateur.

iBandsOnArray, iStdDevOnArray calculés pour les données stockées dans un tableau

Un tableau, par contre, est rempli en 1 cycle.

1. Remettez tout en place, ne torturez pas votre ordinateur .

Désolé, mais vous ne le récupérerez pas. Vous devez faire en sorte que l'indicateur compte de gauche à droite.

Je ne l'embête pas, je l'utilise pour son objectif.

2.iBandsOnArray, iStdDevOnArray calculés en utilisant les données stockées dans le tableau.

Oui, ils sont calculés en utilisant les données du tableau bbMacd[], alors quelle est la suite ?

Letableau est rempli en une seule boucle.

Dans l'un ou l'autre ou dans le premier ?

Êtes-vous en train de dire que pour remplir un tableau, vous avez besoin d'une boucle personnelle, dans laquelle ce tableau est rempli.

est rempli et qu'aucune autre opération ne peut être effectuée ?


Il est important pour moi de découvrir pourquoi l'indicateur ralentit et comment calculer les endroits où cela se produit.

J'ai d'autres questions mais pas de réponses.

Malheureusement, vous n'avez offert aucun indice.

 

Comment désactiver la réinitialisation lorsque l'horizon temporel de l'EA change ?


Il y a quelques informations ici :

EAEn exécutant OnDeinit et OnInit, l'objet global de la classe ne change pas.

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


Est-ce également correct pour mql4 ?