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

 
mila.com:

Merci, mais cela renvoie zéro pour moi. Quelle pourrait être la raison ?

Il ne peut pas y avoir d'autre raison. Aucun ordinateur ne connaît une année de moins que 1970. Commencez par l'année qui apparaît dans les devis du courtier.

 
Alexey Viktorov:

Ça ne pouvait pas être une autre année. Aucun ordinateur ne connaît une année de moins que 1970. Commencez par l'année qui apparaît dans les devis du courtier.

C'est un bon travail, la première année de notre ère).

 
Vitaly Muzichenko:

What's up, it's good, the first year of our era)

Et -1 serait la première année BC.
 
Artyom Trishkin:
Utiliser CopyXXX()

Merci.


Dans MT5, vous pouvez déplacer le graphique de cette façon :

PlotIndexSetInteger(0,PLOT_SHIFT,InpChannelPeriod);

S'il est compilé dans MT4, il ne donne pas d'erreurs, mais rien ne fonctionne, existe-t-il un équivalent pour MT4 ?
 
Aleksey Vyazmikin:

Merci.


Dans MT5, il est possible de déplacer le graphique de cette manière :

PlotIndexSetInteger(0,PLOT_SHIFT,InpChannelPeriod);

Si vous compilez dans MT4, il ne donne pas d'erreurs, mais rien ne fonctionne, y a-t-il un analogue de MT4 ?
Пользовательские индикаторы - Справочник MQL4
Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
Пользовательские индикаторы - Справочник MQL4
 
Alexey Viktorov:

J'ai choisi là.

SetIndexShift(0,InpChannelPeriod); 

mais l'effet est complètement différent, c'est-à-dire que le code ne fonctionne pas, la logique est différente - je ne sais pas...
 

Peut-être que quelqu'un peut aider. L'essence de l'indicateur est de dessiner le canal de Doncian comme d'habitude et ensuite de déplacer les lignes de la dernière valeur du canal derrière la barre moins.

Dans MT5 tout semble fonctionner, mais dans MT4 je ne comprends pas ce qui ne va pas - je l'ai redessiné ici et là, mais il dessine toujours des absurdités - il déplace le canal lui-même, bien que je fasse séparément le calcul des valeurs qui iront à shift.....

//+------------------------------------------------------------------+
//|                                             Donchian_Channel.mq5 |
//+------------------------------------------------------------------+
#property copyright "Vyazmikin Aleksey Vyacheslavovich"
#property link      "https://www.mql5.com/ru/users/-aleks-"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

//--- plot Label1
#property  indicator_label1  "High_Prognoz";
#property  indicator_type1   DRAW_LINE;
#property  indicator_color1  clrAquamarine;
#property  indicator_style1  STYLE_DOT;
#property  indicator_width1  1;
//--- plot Label2
#property  indicator_label2  "Low_Prognoz";
#property  indicator_type2   DRAW_LINE;
#property  indicator_color2  clrAquamarine;
#property  indicator_style2  STYLE_DOT;
#property  indicator_width2  1;


//--- input parameters
input int InpChannelPeriod=48; // Period

//--- indicator buffers
double ExtHighBufferPrognoz[];
double ExtLowBufferPrognoz[];
//---
int i,limit,start;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtHighBufferPrognoz,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowBufferPrognoz,INDICATOR_DATA);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set first bar from what index will be drawn
   SetIndexDrawBegin(0,InpChannelPeriod);
   SetIndexDrawBegin(1,InpChannelPeriod);

   SetIndexShift(0,InpChannelPeriod);
   SetIndexShift(1,InpChannelPeriod);

//---
   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[])
  {

//--- check for rates
   if(rates_total<InpChannelPeriod*2) return(0);
//--- preliminary calculations
   if(prev_calculated==0) limit=InpChannelPeriod;
   else limit=prev_calculated;
//--- the main loop of calculations

   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      start=i-InpChannelPeriod;
      ExtHighBufferPrognoz[i-InpChannelPeriod]=high[ArrayMaximum(high,InpChannelPeriod,start)];
      ExtLowBufferPrognoz[i-InpChannelPeriod] =low[ArrayMinimum(low,InpChannelPeriod,start)];

     }

   for(int x=rates_total-InpChannelPeriod;x<rates_total && !IsStopped();x++)
     {
      ExtHighBufferPrognoz[x]=ExtHighBufferPrognoz[rates_total-InpChannelPeriod];
      ExtLowBufferPrognoz[x]=ExtLowBufferPrognoz[rates_total-InpChannelPeriod];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Aleksey Vyazmikin:

Peut-être que quelqu'un peut aider. L'essence de l'indicateur est de dessiner le canal de Doncian comme d'habitude et ensuite de déplacer les lignes de la dernière valeur du canal derrière la barre moins.

Dans MT5 tout semble fonctionner, mais dans MT4 je ne comprends pas ce qui ne va pas - je l'ai redessiné ici et là, mais il dessine toujours des absurdités - il déplace le canal lui-même, bien que je fasse séparément le calcul des valeurs qui seront déplacées.....

Regardez le code de l'alligator, le changement fonctionne là. Bien que, peut-être que la logique est différente.

 
Alexey Viktorov:

Eh bien, regardez le code alligator, c'est là que le changement fonctionne. La logique peut être différente, cependant.


Oui, le décalage fonctionne pour moi aussi.

Je remplis le tableau avec un décalage, mais il se remplit comme s'il n'y avait pas de décalage, mais le décalage lui-même se produit visuellement.

La première partie du code laisse le tampon non rempli jusqu'à la profondeur deInpChannelPeriod de la dernière barre:

   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      start=i-InpChannelPeriod;
      ExtHighBufferPrognoz[i-InpChannelPeriod]=high[ArrayMaximum(high,InpChannelPeriod,start)];
      ExtLowBufferPrognoz[i-InpChannelPeriod] =low[ArrayMinimum(low,InpChannelPeriod,start)];

     }

La deuxième partie devrait remplir cette zone :

   for(int x=rates_total-InpChannelPeriod;x<rates_total && !IsStopped();x++)
     {
      ExtHighBufferPrognoz[x]=ExtHighBufferPrognoz[rates_total-InpChannelPeriod];
      ExtLowBufferPrognoz[x]=ExtLowBufferPrognoz[rates_total-InpChannelPeriod];
     }

Mais en réalité, ça se passe comme ça :


 

Code dans MT5

#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Predicted_high_price";
#property indicator_type1   DRAW_LINE;
#property indicator_color1  clrAquamarine;
#property indicator_style1  STYLE_DOT;
#property indicator_width1  1;
//--- plot Label2
#property indicator_label2  "Predicted_low_price";
#property indicator_type2   DRAW_LINE;
#property indicator_color2  clrAquamarine;
#property indicator_style2  STYLE_DOT;
#property indicator_width2  1;


//--- input parameters
input int InpChannelPeriod=48; // Period

//--- indicator buffers
double ExtHighBufferPrognoz[];
double ExtLowBufferPrognoz[];
//---
int i,limit,start;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtHighBufferPrognoz,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowBufferPrognoz,INDICATOR_DATA);   
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpChannelPeriod);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpChannelPeriod);   

   PlotIndexSetInteger(0,PLOT_SHIFT,InpChannelPeriod);
   PlotIndexSetInteger(1,PLOT_SHIFT,InpChannelPeriod);   


//---
   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[])
  {

//--- check for rates
   if(rates_total<InpChannelPeriod) return(0);
//--- preliminary calculations
   if(prev_calculated==0) limit=InpChannelPeriod;
   else limit=prev_calculated;
//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      start=i-InpChannelPeriod;          
      ExtHighBufferPrognoz[i-InpChannelPeriod]=high[ArrayMaximum(high,start,InpChannelPeriod)];
      ExtLowBufferPrognoz[i-InpChannelPeriod]=low[ArrayMinimum(low,start,InpChannelPeriod)];

     }

   for(int x=rates_total-InpChannelPeriod;x<rates_total && !IsStopped();x++)
     {
      //int calc=x--;
      ExtHighBufferPrognoz[x]=ExtHighBufferPrognoz[rates_total-InpChannelPeriod-1];
      ExtLowBufferPrognoz[x]=ExtLowBufferPrognoz[rates_total-InpChannelPeriod-1];             
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Résultat :


ZS : J'ai changé le code - le mauvais ME était.
Raison: