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

 
Igor Makanu:

Vous ne les avez pas initialisés au début ou ailleurs, vous les avez juste déclarés.

J'ai écrit avant d'utiliser, c'est-à-dire si vous avez les variables SredRazmax, SredRazmin, Sredn comme des sommes de valeurs de tableau, alors pour calculer correctement la somme, vous devez mettre à zéro la variable et ensuite additionner les valeurs de tableau et les enregistrer dans cette variable

c'est-à-dire

Et le deuxième, ce que vous avez une question, dans l'indicateur chaque tick appelleraOnCalculate() et cela signifie que vous compterez constamment les sommets de ZigZag à chaque tick, c'est-à-dire environ 40-60 fois par seconde.

Merci, mais j'ai essayé de les mettre à zéro et j'ai essayé d'utiliserOnStart au lieu deOnCalculate() , les valeurs sautent toujours et ce n'est pas clair pour moi si ww=0 (la valeur du tableau est toujours affichée), pourquoi les valeurs sautent au milieu, comment faire pour ne pas compter chaque tick et seulement compter les valeurs du tableau ?

 
Dmitry Belov:

Merci, mais j'ai essayé de les mettre à zéro et d'utiliserOnStart au lieu deOnCalculate() .

Je pense que je ne peux pas expliquer pourquoi cela se produit ainsi, la question est que OnStart() est utilisé dans les scripts et OnCalculate() est utilisé dans les indicateurs. Vous devriez comprendre la différence entre les scripts et les indicateurs dans MQL.

je ne comprends pas bien quelle est votre tâche ? vous voulez sortir les valeurs de quoi ? dans le code, vous additionnez les prix auxquels les pics de ZigZag sont situés sur l'ensemble du graphique, dans la sortie vous écrivez "Average spread" et imprimez la valeur(SredRazmax-SredRazmin)/nn, et le calcul est effectué pour toutes les barres

pourquoi avez-vous besoin de l'indicateur si vous n'utilisez pas les tampons de l'indicateur pour dessiner ? dans l'indicateur, les tampons sont attachés aux barres, et leurs valeurs se déplacent dès qu'une nouvelle barre apparaît.

 
Igor Makanu:

Je ne peux pas expliquer pourquoi cela se produit, le fait est que OnStart() est utilisé dans les scripts, et OnCalculate() dans les indicateurs, vous devez comprendre comment les scripts diffèrent des indicateurs dans MQL.

je ne comprends pas bien quelle est votre tâche ? vous voulez sortir les valeurs de quoi ? dans le code, vous additionnez les prix auxquels les pics de ZigZag sont situés sur l'ensemble du graphique, dans la sortie vous écrivez "Average spread" et imprimez la valeur(SredRazmax-SredRazmin)/nn, et le calcul est effectué pour toutes les barres

Pourquoi avez-vous besoin d'un indicateur si vous n'utilisez pas les tampons de l'indicateur pour dessiner ? Dans un indicateur, les tampons sont attachés aux barres et leurs valeurs se déplaceront dès qu'une nouvelle barre apparaîtra.

Pour être honnête, j'ai simplifié le problème (la formule originale a l'air un peu différente), je pensais pouvoir comprendre pourquoi les valeurs de la moyenne sautent lorsque la valeur zéro du tableau reste constante. J'ai deux boucles, une pour remplir le tableau, et l'autre pour le calcul de la moyenne, il y a une limite de nn, et je voulais en fait sortir un graphique - c'est un zig zag standard, mais iCustom le dessine à fond, et la moyenne... À partir du nœud zéro, s'il est plus grand que le précédent, soustrayez le nœud précédent et à partir du précédent, soustrayez le précédent (il sera doté du signe moins, il doit donc être multiplié par moins 1) et tout cela doit être additionné et divisé par un nombre donné de nn. On obtient l'étendue moyenne des sommets. Ensuite, j'ai voulu obtenir d'autres moyennes pour le zigzag, mais je suis resté bloqué avec des valeurs "sautantes".

C'est à peu près comme ça que c'était à l'origine :

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax=0.0; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0,HZZ);
  SetIndexStyle(0,DRAW_SECTION);
//---
   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[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++){
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
  for(ww=0;ww<=nn;ww++){
       if(HZZ[ww]>HZZ[ww+1]){
          SredRazmax += (HZZ[ww]- HZZ[ww+1]);      
         }     
        else if(HZZ[ww]<HZZ[ww+1]){
         SredRazmax += (HZZ[ww]- HZZ[ww+1])*(-1);
        }
        else{
        continue;
           }
     }  
        
  if(SredRazmax>0){    
   
      Comment("Средний размах = ", SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);      
        }
   
       
//--- return value of prev_calculated for next call
 return(0);

  
 
  }
 
Dmitry Belov:

Pour être honnête, j'ai juste simplifié le problème (à l'origine, la formule est un peu différente), je pensais pouvoir comprendre pourquoi les valeurs de la moyenne sautent, si la valeur zéro du tableau reste constante. J'ai deux boucles, une pour remplir le tableau, et l'autre pour calculer la moyenne, il y a une limite de nn, et je voulais aussi sortir un graphique - c'est un zig zag standard, mais iCustom le dessine à fond, et la moyenne... À partir du nœud zéro, s'il est plus grand que le précédent, soustrayez le nœud précédent et à partir du précédent, soustrayez le précédent (il sera doté du signe moins, il doit donc être multiplié par moins 1) et tout cela doit être additionné et divisé par un nombre donné de nn. On obtient l'étendue moyenne des sommets. Ensuite, j'ai voulu obtenir d'autres moyennes pour le zigzag, mais je suis resté bloqué avec des valeurs "sautantes".

C'est à peu près comme ça qu'il était à l'origine :

Je ne comprends pas vraiment, il est tard, j'ai sommeil, j'ai bidouillé au fur et à mesure, j'ai des doutes sur le comportement de l'indicateur sur une barre zéro (je n'ai pas vérifié), mais il dessine et affiche les commentaires selon votre formule

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int  ww=0;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,HZZ);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexEmptyValue(0,0.0);
   up = false;
   dn = false;
   lastzz=0.0;
   SredRazmax=0.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[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      up = false;
      dn = false;
      lastzz=0.0;
      SredRazmax=0.0;
      ArrayInitialize(HZZ,0.0);
     }
   else limit=rates_total-prev_calculated+1;
   for(shift=limit; shift>=0; shift--)
     {
      zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,shift);
      if(zz>0.0)
        {
         HZZ[shift]=zz;
         if(lastzz>zz) {up=true;  dn=false;}
         if(lastzz<zz) {up=false; dn=true;}
         if(up) SredRazmax+=zz-lastzz;
         if(dn) SredRazmax+=(zz- lastzz)*(-1);
         lastzz=zz;
        }
      else HZZ[shift]=0.0;
     }
   Comment("Средний размах = ",SredRazmax/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]);
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Pouvez-vous m'aider à résoudre un tel problème ? (Si possible.)

Le conseiller expert émet une alerte dans certaines conditions. Est-il possible de faire en sorte que la fenêtre qui a déclenché l'alerte devienne également active ?

 
Vatal:

Pouvez-vous m'aider à résoudre un tel problème ? (Si possible.)

Le conseiller expert émet une alerte dans certaines conditions. Est-il possible de faire en sorte que la fenêtre qui a déclenché l'alerte devienne également active ?

Il existe un exemple dans la documentation. Obtenez l'ID du graphique sur lequel l'EA fonctionne et allez...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu:

J'ai quelques doutes sur le comportement de l'indicateur sur une barre zéro (je n'ai pas vérifié), mais il dessine et utilise votre formule pour sortir le commentaire.

Oui, merci pour votre temps, ça marche, j'ai dû faire quelque chose de mal. Mais il ne sort pas un tableau dans le commentaire (il ne devrait y avoir que des sommets, non ?) et compte mal les moins et les nombres..., le zigzag a un écart différent entre les sommets. L'idée est de soustraire le plus petit sommet précédent du dernier plus grand (qui vient d'être formé), et du plus petit précédent de soustraire encore celui qui est plus grand et le nombre sera avec le signe moins, nous le multiplions par (-1) et ainsi de suite, et tout cela est additionné nn fois et divisé par nn, nous obtenons le départ moyen. Approximativement sur 4 quarts, cela correspondrait à 1,69(de à) sur USDJPY. De plus, je voulais calculer le nombre moyen de barres entre les sommets. Je vais maintenant essayer de comprendre votre code, ce que j'ai mal fait, pourquoi il n'a pas dessiné et pourquoi il ne calcule pas correctement...

 
Dmitry Belov:
Oui, merci pour votre temps, ça marche vraiment, j'ai dû faire quelque chose de mal. Mais il n'affiche pas le tableau dans le commentaire (il ne devrait avoir que des sommets, non ?) et compte mal avec les moins et les nombres..., le zigzag a un écart différent entre les sommets. L'idée est de soustraire le plus petit sommet précédent du dernier plus grand (qui vient d'être formé), et du plus petit précédent de soustraire encore celui qui est plus grand et le nombre sera avec le signe moins, nous le multiplions par (-1) et ainsi de suite, et tout cela est additionné nn fois et divisé par nn, nous obtenons le départ moyen. Approximativement sur 4 quarts, cela correspondrait à 1,69(de à) sur USDJPY. De plus, je voulais calculer le nombre moyen de barres entre les sommets. Je vais maintenant essayer de comprendre votre code, ce que j'ai mal fait, pourquoi il ne m'a pas dessiné et pourquoi il ne calcule pas correctement...

Les sommets dans le commentaire ne sortiront pas, car le tampon indicateurHZZ[] contient des valeurs copiées du tampon indicateur ZigZag, sinon nous ne pourrons pas dessiner, j'ai délibérément divisé en 2 conditions de détection des sommets vers le haut et vers le bas:

if(up) SredRazmax+=zz-lastzz;
if(dn) SredRazmax+=(zz- lastzz)*(-1);

Si vousavez besoin de connaître plusieurs sommets en ZZ, vous devez créer un autre tableau pour stocker ces données. Le nouveau tampon d'indicateur va compliquer les choses, car tous les tableaux connectés aux tampons d'indicateur vont "glisser" avec le graphique lorsqu'une nouvelle barre apparaît.

ZS : le code est mon exemple, et je pense qu'il faut boucler à la 1ère barre, et non à 0, ce qui recalculera constamment les valeurs de SredRazmax, je ne peux pas vérifier maintenant, pas de terminal dans le PC

 
Igor Makanu:

Les sommets dans le commentaire ne sortiront pas, car le tampon indicateurHZZ[] contient des valeurs copiées du tampon indicateur ZigZag, sinon nous ne pourrons pas dessiner, j'ai délibérément divisé en 2 conditions de détection des sommets vers le haut et vers le bas:

Si vousavez besoin de connaître plusieurs sommets en ZZ, vous devez créer un autre tableau pour stocker ces données. Le nouveau tampon d'indicateur va compliquer les choses, car tous les tableaux connectés aux tampons d'indicateur "glissent" en même temps que le graphique.

SZY : le code est mon exemple, et je pense qu'il faut boucler à la 1ère barre, et non à 0, ce qui recalculera constamment la valeur de SredRazmax, je ne peux pas vérifier maintenant, pas de terminal dans le PC

Mon indicateur dès qu'il est chargé montre les valeurs correctes, puis chaque tick augmente la valeur de la moyenne, bien que dans les valeurs de sortie du tableau zig zag aucun changement dans les sommets se tiennent. C'est ce que je n'arrive pas à comprendre, pourquoi c'est comme ça ? Je manque d'expérience et de connaissance de la langue. J'abandonne le dessin - c'est un zigzag normal pris par iCustum (je comprends maintenant qu'il ne peut pas superposer un tableau sur le graphique, donc il le dessine à fond). Le tableau va "ramper", mais alors les valeurs vont juste se recalculer, n'est-ce pas ? donc je comprends Merci... Je vais essayer... Apprendre...
 
Comment expliquer à un EA (ma standard) qu'il ne faut acheter (vendre) que lorsque les moyennes se croisent, et non en général, lorsque ma_1>ma_2. Mais il achète constamment, il ne peut pas s'arrêter.
Raison: