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

 
Konstantin Nikitin:

Oui, c'est ce que je veux dire. Ok, on l'a raté. L'essentiel est qu'il comprenne ce qui est quoi...

Qui ? C'est là que j'ai commencé.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toute question des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes

Alexey Viktorov, 2019.06.11 09:06

Vous ne pouvez pas utiliser SymbolInfoInteger pour obtenir Point()).

Et en général, il est nécessaire de se rappeler que Point() ou _Point ne concerne que le symbole courant. Pour les symboles autres que celui sur lequel l'EA fonctionne, vous devez utiliser cette fonction.

La fonction SymbolInfoInteger renvoie non seulement des valeurs int, mais aussi des valeurs long, bool et des énumérations.

Ensuite, bien sûr, il voulait dire Digits() ou _Digits et a écrit ce qu'il avait écrit. Et la dernière ligne de la réponse concernait la deuxième partie de la question. N'oubliez pas le proverbe russe : "Un homme intelligent ne dira rien, un idiot ne devinera rien." a deviné et dit, donc ce n'est ni l'un ni l'autre.
 
Alexey Viktorov:

Может вам очень не повезло, но я не люблю колупаться в чужом коде. Тем более править его...

Alexey Viktorov:

Question suivante : Combien de fois pensez-vous que la valeur de l'indicateur sera exactement 50 ?

Si j'ai bien compris le problème, il devrait s'agir d'une couleur >50 et d'une autre <=50, mais ==50, je ne l'ai vu nulle part. Bien sûr, pour éviter de perdre dans le cas ==50, nous devrions ajouter >=50 à l'un d'eux et <=50 à un autre. Cela peut paraître mieux.

Et la deuxième question : dans quelle mesure était-il nécessaire de modifier l'indexation de tout le tampon ? Après la réindexation, avez-vous tout corrigé dans votre code ? Il serait peut-être plus simple de créer un tampon de couleur d'index 4, et des tampons auxiliaires 5 et 6 en conséquence. Vous auriez moins à éditer et moins de chances de faire quelques erreurs supplémentaires.

  • Merci pour la réponse. Si Luby avait fouillé dans le code de quelqu'un d'autre, nous vous aurions très probablement perdu en tant qu'expert, donc c'est juste de la CHANCE à cet égard.
  • A propos de <= ou >= je suis d'accord, omission, bien sûr l'un des deux doit être présent, dès que j'ai parcouru, mais pour l'instant ce n'est pas une question de principe.
  • J'ai essayé, j'ai réaffecté un tampon de couleur, j'ai réaffecté des groupes entiers, j'ai interverti les groupes par endroits (au-dessus/au-dessous) - rien n'y fait. Je vais maintenant terminer le post et essayer de faire un indicateur d'histogramme séparé, sans lignes. Si cela fonctionne, je vais essayer de les combiner à nouveau. C'est une question de principe. Je ne veux pas laisser derrière moi des taches blanches d'incompréhension.

 
Sergey Voytsekhovsky:

  • Merci pour votre réponse. Si Luby avait fouillé dans le code d'autres personnes, nous vous aurions très probablement perdu en tant qu'expert, donc c'est juste de la CHANCE à cet égard.
  • A propos de <= ou >= je suis d'accord, omission, bien sûr l'un des deux doit être présent, dès que j'ai parcouru, mais pour l'instant ce n'est pas une question de principe.
  • J'ai essayé, j'ai réaffecté un tampon de couleur, j'ai réaffecté des groupes entiers, j'ai échangé des groupes (au-dessus/au-dessous) - rien n'y fait. Je vais maintenant terminer le post et essayer de faire un indicateur d'histogramme séparé, sans lignes. Si cela fonctionne, je vais essayer de les combiner à nouveau. C'est une question de principe. Je ne veux pas laisser derrière moi des taches blanches d'incompréhension.

Je pense que vous vous êtes creusé la tête lorsque vous avez modifié l'indexation du tampon.

Reprenez l'ancien code du message 8806 et ne changez que la séquence du tampon.

   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
Puis trace les conditions quand il faut mettre 0 et quand il faut mettre 1
 
Alexey Viktorov:

Vous n'avez pas dû trop réfléchir lorsque vous avez modifié l'indexation du tampon.

Revenez en arrière et prenez l'ancien code du post 8806 et changez juste la séquence du tampon.

Ensuite, tracez les conditions quand il faut mettre 0 dans le tampon de couleur et quand il faut mettre 1.

J'ai fait ça, ça n'a pas aidé, j'ai admis que je faisais des erreurs, après ton post j'ai recommencé. Voici les endroits du code que j'ai modifiés. L'ancien n'est pas commenté.

//+------------------------------------------------------------------+
//|                                       Stoch_HISTOGRAM_MQL5_4.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3

#property indicator_type1   DRAW_LINE       // основная
#property indicator_color1  clrLightSeaGreen
#property indicator_style1  STYLE_SOLID

#property indicator_type2   DRAW_LINE       // сигнальная
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID

#property indicator_type3   DRAW_COLOR_HISTOGRAM2
#property indicator_color3  clrGreen,clrRed
#property indicator_style3  STYLE_SOLID

#property indicator_width1  3 
#property indicator_width2  2 
#property indicator_width3  1 
//--- input parameters
input int InpKPeriod=5;  // K period
input int InpDPeriod=3;  // D period
input int InpSlowing=3;  // Slowing
//--- indicator buffers
double    ExtMainBuffer[];
double    ExtSignalBuffer[];
double    ColorHistogram_2Buffer1[]; 
double    ColorHistogram_2Buffer2[]; 
     //double    ExtHighesBuffer[];
     //double    ExtLowesBuffer[];
     //double    ColorHistogram_2Colors[];
double    ColorHistogram_2Colors[];
double    ExtHighesBuffer[];
double    ExtLowesBuffer[];
color     colors[]={clrRed,clrGreen};
int       cl;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(3,ColorHistogram_2Buffer2,INDICATOR_DATA);
        //SetIndexBuffer(4,ExtHighesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(5,ExtLowesBuffer,INDICATOR_CALCULATIONS);
        //SetIndexBuffer(6,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(5,ExtHighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtLowesBuffer,INDICATOR_CALCULATIONS);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,2,80);
//--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch_HISTOGRAM("+(string)InpKPeriod+","+(string)InpDPeriod+","+(string)InpSlowing+")");
   //PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");
        //PlotIndexSetString(2,PLOT_LABEL,"UP");
        //PlotIndexSetString(3,PLOT_LABEL,"LOW");
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpKPeriod+InpDPeriod);
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,InpKPeriod+InpSlowing-2);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Stochastic Oscillator                                            |
//+------------------------------------------------------------------+
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 i,k,start;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//---
   start=InpKPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1;k<=i;k++)
        {
         if(dmin>low[k])  dmin=low[k];
         if(dmax<high[k]) dmax=high[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K
   start=InpKPeriod-1+InpSlowing-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1);k<=i;k++)
        {
         sumlow +=(close[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0) ExtMainBuffer[i]=100.0;
         else ExtMainBuffer[i]=sumlow/sumhigh*100;
      if(ExtMainBuffer[i]>=50){
         cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
      if(ExtMainBuffer[i]<50){
         cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=colors[cl];
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " cl=",cl,
           " ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
     }
//--- signal
   start=InpDPeriod-1;
   if(start+1<prev_calculated) start=prev_calculated-2;
   else
     {
      for(i=0;i<start;i++) ExtSignalBuffer[i]=0.0;
     }
   for(i=start;i<rates_total && !IsStopped();i++)
     {
      double sum=0.0;
      for(k=0;k<InpDPeriod;k++) sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   //PlotIndexSetInteger(2,PLOT_LINE_COLOR,colors[i]);
   return(rates_total);
  }
//+------------------------------------------------------------------+ 

C'est comme ça que c'était avant que je fasse les changements. L'histogramme est là, la bonne couleur ne l'est pas.

C'est comme ça que ça se passe maintenant. L'histogramme a disparu, il n'est pas affiché.

Je suppose que je n'ai plus les idées claires.


 
Sergey Voytsekhovsky:

Je l'ai fait, ça n'a pas marché, j'ai fait des erreurs, après votre post je l'ai refait. Voici les endroits du code que j'ai modifiés. L'ancien n'est pas commenté.

C'est comme ça que c'était avant que je fasse les changements. L'histogramme est là, la bonne couleur ne l'est pas.

C'est comme ça que ça se passe maintenant. L'histogramme a disparu, il n'est pas affiché.

Je dois encore me creuser les méninges.


Il n'y a aucune logique ici. La séquence doit être la suivante : la valeur de l'histogramme est déterminée et le i-ième indice du tampon indicateur est rempli. Ensuite, une vérification séparée, si cette valeur >=50 le tampon de couleur est rempli avec 0, sinon 1. Il est défini par la séquence de couleur dans la directive

#property indicator_color3  clrGreen,clrRed

Si 0, la couleur clrGreen est prise et si 1, clrRed.

Cette ligne est complètement inutile, et la séquence est l'inverse de la première.

color     colors[]={clrRed,clrGreen};

Et ceci

int       cl;

ajoutés dans quel but ? Il est plus facile de le remplir directement.

ColorHistogram_2Colors[i]=0;
// или 
ColorHistogram_2Colors[i]=1;

Pour remplir le tampon de couleur, j'utiliserais cette construction

         ColorHistogram_2Colors[i]=ExtMainBuffer[i] >= 50 ? 0 : 1; 
L'opérateur ? : est équivalent à if else, mais plus facile à utiliser.
 
Alexey Viktorov:

La logique ici est cassée en général. La séquence doit être la suivante : définir la valeur de l'histogramme, remplir le i-ième indice du tampon indicateur. Ensuite, une vérification séparée, si cette valeur >=50 le tampon de couleur est rempli avec 0, sinon 1. Ceci est déterminé par la séquence de couleur dans la directive

Si 0, la couleur clrGreen est prise et si 1, clrRed.

Cette ligne est absolument inutile, et la séquence est l'inverse de la première.

Et ceci

ajoutés dans quel but ? Il est plus facile de le remplir directement.

Pour remplir le tampon de couleurs, j'utiliserais cette construction

L'opérateur ? : est équivalent à if else mais s'applique plus facilement.

WURRAA, et mon âme a chanté. Alexey, merci beaucoup ! !!!!

Tout a fonctionné, je ne comprends pas bien comment il est possible de se passer du tableau.

color     colors[]={clrRed,clrGreen};

car sa description a été supprimée. Vous pouvez donc vous passer d'un tableau supplémentaire ici ?


 
Sergey Voytsekhovsky:

  • Merci pour votre réponse. Si Luby avait fouillé dans le code d'autres personnes, nous vous aurions très probablement perdu en tant qu'expert, donc c'est juste de la CHANCE à cet égard.
  • A propos de <= ou >= je suis d'accord, omission, bien sûr l'un des deux doit être présent, dès que je passe, mais jusqu'à présent pas une question de principe.
  • J'ai essayé, j'ai réaffecté un tampon de couleur, j'ai réaffecté des groupes entiers, j'ai échangé des groupes (au-dessus/au-dessous) - rien n'y fait. Je vais maintenant terminer le post et essayer de faire un indicateur d'histogramme séparé, sans lignes. Si cela fonctionne, je vais essayer de les combiner à nouveau. C'est une question de principe. Je ne veux pas laisser derrière moi des taches blanches d'incompréhension.

Mon Squeaky est juste un miracle, il l'emmène partout et partout.

p.s Je n'ai toujours pas appris comment attacher correctement l'image, veuillez m'excuser, je vais poster des captures d'écran.

Dossiers :
EURUSD.png  52 kb
GBPUSD.png  54 kb
 
Alexey Viktorov:

Pour remplir le tampon de couleur, j'utiliserais cette construction

L'opérateur ? : est équivalent à if else, mais plus facile à utiliser.

De bons conseils et une grande science pour l'avenir ! !! Il est même allé un peu plus loin. Voici le résultat.

C'était donc le cas :

if(ExtMainBuffer[i]>=50){
         //cl=1;
         ColorHistogram_2Buffer1[i]=50; 
         ColorHistogram_2Buffer2[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Colors[i]=0;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 
if(ExtMainBuffer[i]<50){
         //cl=0;
         ColorHistogram_2Buffer1[i]=ExtMainBuffer[i]; 
         ColorHistogram_2Buffer2[i]=50; 
         ColorHistogram_2Colors[i]=1;
     Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
           " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
           " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
           " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
           " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
         } 

Il en est ainsi, l'efficacité de la démarche est évidente ! !! Merci.

      ColorHistogram_2Buffer1[i]=ExtMainBuffer[i] >= 50 ? 50 : ExtMainBuffer[i]; 
      ColorHistogram_2Buffer2[i]=ExtMainBuffer[i] >= 50 ? ExtMainBuffer[i] : 50; 
      ColorHistogram_2Colors [i]=ExtMainBuffer[i] >= 50 ? 0 : 1;
         Print("ExtMainBuffer[i]=",ExtMainBuffer[i],
            " # ExtSignalBuffer[i]=",ExtSignalBuffer[i],
            " # ColorHistogram_2Buffer1[i]=",ColorHistogram_2Buffer1[i],
            " # ColorHistogram_2Buffer2[i]=",ColorHistogram_2Buffer2[i],
            " # ColorHistogram_2Colors[i]=",ColorHistogram_2Colors[i]);
 
Sergey Voytsekhovsky:

De bons conseils et une grande science pour l'avenir ! !! Il est même allé un peu plus loin que ça. Voici le résultat.

C'était donc le cas :

Il en est ainsi, l'efficacité de la démarche est évidente ! !! Merci.

Aucune efficacité ici - trois conditions if-else au lieu d'une. Ici, c'est pire comme ça...

 
Artyom Trishkin:

Il n'y a pas d'efficacité ici : il y a trois conditions if-else au lieu d'une. C'est pire ici...

Oui, en effet. Je ne l'avais pas remarqué. C'est plus beau, il y a moins de lettres.

Et il n'y a aucun moyen de placer trois exécutions (je ne sais pas comment le dire correctement) sous la responsabilité d'un seul opérateur: en même temps ?

Raison: