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

 
azolotta:
OK, alors comment puis-je retravailler le code si j'ai besoin, par exemple, de sélectionner le plus haut sommet des 3 dernières barres (qui remplissent les conditions dans if) et de placer un point dessus (juste sur ce haut !), puis de trouver également le point bas.

Essayez de cette façon, mais je ne suis pas sûr

//+------------------------------------------------------------------+
//|                                                           AZ.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Anastasiya Zolotareva"
#property link      "insta"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
//--- plot myAZ
#property indicator_label1  "myAZ"
#property indicator_color1  Black
#property indicator_color2  Blue
#property indicator_color3  Orange
#property indicator_color4  Blue
#property indicator_color5  Orange
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1

extern int barsToProcess=200; //количество последних баров в истории
//--- indicator buffers
double myAZBuffer[];
double ExtHighBuffer01[];
double ExtLowBuffer01[];
double ExtHighBuffer02[];
double ExtLowBuffer02[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexShift(1,-2);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexShift(2,-2);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexShift(3,-3);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexShift(4,-3);

//--- indicator buffers mapping
   SetIndexBuffer(0,myAZBuffer);
   SetIndexBuffer(1,ExtHighBuffer01);
   SetIndexBuffer(2,ExtLowBuffer01);
   SetIndexBuffer(3,ExtHighBuffer02);
   SetIndexBuffer(4,ExtLowBuffer02);
   IndicatorShortName("AZ");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//|         deinit                                                         |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   if((rates_total-prev_calculated-barsToProcess)<=0)return(0);
   int limit, val_index;
   if(barsToProcess>0) limit=barsToProcess; 
   else
   limit=rates_total-prev_calculated-barsToProcess-1;
  
   for(int n=limit;n>=0;n--)
     {
      if(Close[n+1]>Open[n+1] && Open[n+2]>=Close[n+2])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer01[n]=Low[val_index];
        }
      else
      if(Open[n+1]>Close[n+1] && Close[n+2]>=Open[n+2])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer01[n]=High[val_index];
        }
      else
      if(Close[n+1]>Open[n+1] && Open[n+3]>Close[n+3])
        {
         val_index=iLowest(NULL,0,MODE_LOW,3,n+1);
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer02[n]=Low[val_index];
        }
      else
      if(Close[n+1]<Open[n+1] && Close[n+3]>Open[n+3])
        {
         val_index=iHighest(NULL,0,MODE_HIGH,3,n+1);
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer02[n]=High[val_index];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
MakarFX:

Essayez comme ça, mais je ne suis pas sûr.

Malheureusement, le décalage des horaires n'est pas la bonne option. Je pense que je devrais peut-être essayer d'insérer mon code dans standard-zigzag. J'essaie maintenant, mais sans succès jusqu'à présent. Parce qu'à la fin, je dois trouver des sommets connectés alternativement, comme haut-bas-haut, et si je rencontre une option haut-haut, ou bas-bas, alors ces deuxièmes hauts et bas ne sont pas inclus dans le tableau, et j'attends le contraire.

 
azolotta:

Malheureusement, le décalage des horaires n'est pas une option appropriée. Je pense que je devrais peut-être essayer d'insérer mon code dans le zigzag standard. Maintenant, je fouille un peu partout, mais sans succès jusqu'à présent. Pensez-vous qu'il est possible de passer par le zigzag ? Parce qu'à la fin je dois connecter les sommets trouvés alternativement, comme haut-bas-haut, et si je rencontre une option haut-bas, ou bas-bas, alors ces deuxièmes hauts et bas ne doivent pas être inclus dans les tableaux, et attendre le contraire.

Non. Le précédent doit être mis à zéro et le courant doit être ajouté au tampon de l'indicateur.

 
azolotta:

Malheureusement, le changement de vitesse n'est pas une option. Je pense que je devrais peut-être essayer d'insérer mon code dans le zigzag standard. Maintenant, je fouille un peu partout, mais sans succès jusqu'à présent. Parce qu'à la fin je dois trouver des sommets connectés alternativement, comme haut-bas-haut, et si je rencontre une option haut-haut, ou bas-bas, alors ces deuxièmes hauts et bas ne sont pas inclus dans le tableau, et j'attends le contraire.

Dans tous les cas, il y aura un décalage, c'est-à-dire que tant que les conditions des 2 ou 3 barres précédentes ne sont pas remplies - il ne tirera pas.

Je comprends que nous avons besoin d'un zig-zag du haut vers le bas ?
 
MakarFX:

Dans tous les cas, il y aura un décalage, c'est-à-dire que tant que les conditions des 2 ou 3 barres précédentes ne sont pas remplies - il ne tirera pas.

Je suppose que j'ai besoin de zig-zaguer des hauts aux bas ?

Oui, idéalement nous avons besoin d'un zig-zag des hauts vers les bas (donc ces hauts et bas sont dans mes conditions dans le cas où, et s'il y a deux ou plusieurs hauts/bas dans une rangée, alors ces deuxièmes hauts/bas ne devraient pas être affichés, et nous devrions attendre le renversement). Il me suffit d'afficher les 6 derniers bas et 6 derniers hauts dans l'indicateur. Et ensuite, je veux appeler ces points en zig-zag trouvés dans le script/conseiller pour d'autres besoins.

 

Bonjour !

Quelqu'un peut-il expliquer pourquoi aucune valeur n'est affichée en mode débogage ?

On dirait qu'après avoir mis à jour le programme mt5, le problème a commencé.

Et que signifie le rouge dans la colonne "Valeurs" ?

 
Mikhail Toptunov:

Bonjour !

Quelqu'un peut-il expliquer pourquoi aucune valeur n'est affichée en mode débogage ?

On dirait qu'après avoir mis à jour le programme mt5, le problème a commencé.

Et que signifie la couleur rouge de la valeur dans la colonne - Valeurs ?

1. Veuillez donner un minimum d'informations (les trois premières lignes de l'onglet du journal après avoir redémarré le terminal)

2) Mettre à jour le build

 
azolotta:

Oui, idéalement nous avons besoin d'un zig-zag des hauts vers les bas (pour que ces hauts et bas soient dans mes conditions dans le cas où, et s'il y a deux ou plusieurs hauts/bas dans une rangée, alors ces deuxièmes hauts/bas ne devraient pas être affichés, mais attendre un renversement). Il me suffit d'afficher les 6 derniers bas et 6 derniers hauts dans mon indicateur. Et ensuite, je veux appeler ces points en zig-zag trouvés dans le script/conseiller pour d'autres besoins.

Je ne suis pas un programmeur et je ne sais pas encore comment aider, mais je vais y réfléchir...
 
MakarFX:
Je ne suis pas un programmeur et je ne sais pas encore comment aider, mais je vais y réfléchir...
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,                                                           |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}

indicateurZigZag standardpersonnalisé et renvoie son niveau de prix. La fonction accepte les paramètres facultatifs suivants :
  • sy- Nom de l'instrument."" ouNULL- symbole actuel. La valeur par défaut estNULL.
  • tf- Période de temps. Valeur par défaut 0- symbole actuel.
  • ne- Nombre extrême. 0- dernier, 1- précédent, 2- précédent, etc.
  • dp,dv,bs- paramètres de ZigZaga : ExtDepth, ExtDeviation, ExtBackstep.

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
Iurii Tokman:

indicateurZigZag standardpersonnalisé et renvoie son niveau de prix. La fonction accepte les paramètres facultatifs suivants :
  • sy- Nom de l'instrument."" ouNULL- symbole actuel. La valeur par défaut estNULL.
  • tf- Période de temps. Valeur par défaut 0- symbole actuel.
  • ne- Nombre extrême. 0- dernier, 1- précédent, 2- précédent, etc.
  • dp,dv,bs- paramètres de ZigZaga : ExtDepth, ExtDeviation, ExtBackstep.

Cela ne convient pas, il faut des extrêmes non zigzagants.
Raison: