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

 
ANDREY:
Pourriez-vous me dire pourquoi le programme (sur mql 4, sur les minutes, tous les ticks) lit le nombre explicitement et le même nombre calculé dans la fonction différemment.
Voici le code

Le programme ne lit pas Pr comme 1.60854 bien quePrint( ) montre la valeur de Pr comme 1.60854 . En conséquence, le programme ouvre le deuxième ordre, mais il ne devrait pas le faire
.


Et si nous définissons le nombre 1.60854 au lieu de la variable Pr , le programme le lit et n'ouvre pas le deuxième ordre.

QUESTION Quelles sont les modifications à apporter au code pour que le programme lise Pr et n'ouvre pas le second ordre.
Merci
pour votre aide

Il n'est pas recommandé de comparer directement des nombres réels. Il est plus correct de comparer leur différence normalisée avec zéro.

NormalizeDouble(Lt1-Pr, _Digits) != 0.0;
 
Alexey Viktorov:

Il n'est pas recommandé de comparer directement des nombres réels. Il est correct de comparer leur différence normalisée à zéro.

Merci pour ces informations précieuses. Je ne l'aurais jamais deviné moi-même.

 
ANDREY:

Merci pour ces informations précieuses. Je ne l'aurais jamais deviné moi-même.

Non recommandé ne signifie pas interdit. Si, par exemple, nous comparons le prix actuel avec le prix de l'arrêt prévu, nous pouvons alors comparer directement si c'est plus ou moins... La différence sera assez significative. Mais c'est une autre affaire que de les comparer sur un pied d'égalité...

 
Alexey Viktorov:

Le fait de ne pas être recommandé ne signifie pas que c'est interdit. Si, par exemple, nous comparons le prix actuel avec le prix de l'arrêt prévu, nous pouvons alors comparer directement si c'est plus ou moins... La différence sera assez significative. Et c'est une toute autre affaire quand on la compare à l'égalité...

Je l'ai. Merci.

 
J'ai pensé à créer un fichier mqh séparé avec une liste de substitutions de macro pour inclure les fichiers de code spécifiés.
// файл со списком макроподстановок

#define  ARRAY_C #include <JvL/Arrays/C_Array.mqh>
#define  MTF_C #include <JvL/C_MTF.mqh>
// файл с кодом в котором нужно использовать включения других файлов с кодом

#include <JvL/Includes.mqh>
ARRAY_С
Mais ça ne marche pas si facilement.

argument macro attendu à la place de 'include' Includes.mqh
'include' - les expressions ne sont pas autorisées sur une portée globale C_Meter.mqh


Comment puis-je être plus malin que le compilateur ?

 

Bonjour. Veuillez m'aider à comprendre l'indicateur Zigzag. Il s'avère que l'ensemble du tableau ZigZagBuffer[] a pris la valeur 0.0. Pourquoi l'expression if(res != 0.0) devient-elle parfois vraie ? Après tout, le tableau entier a la valeur 0.0 ?????

 if(prev_calculated==0)
     {
      ArrayInitialize(ZigZagBuffer,0.0);
      ArrayInitialize(HighMapBuffer,0.0);
      ArrayInitialize(LowMapBuffer,0.0);
      start=InpDepth;//Print(start);
     }
   if(prev_calculated>0) 
     {
      i=rates_total-1;//Print(i);
      //--- searching for the third extremum from the last uncompleted bar
      while(extreme_counter<ExtRecalc && i>rates_total-100)
        {
         res=ZigZagBuffer[i]; 
         if(res!=0.0)                       //!!!
            extreme_counter++; x++;
         i--;
        }
      i++;
      start=i;
 

Bonjour à tous. Chers programmeurs, j'ai besoin de votre aide.

J'essaie de faire un indicateur multidevises, il doit montrer la SMA de deux symboles dans le sous-sol.

Si ce n'est pas difficile, veuillez indiquer quelle est l'erreur.


//+------------------------------------------------------------------+
//|                                          Normalzd_I_I_Oscill.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Normlzd_I_I_Oscill"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2
//--- plot Int0
#property indicator_label1  "Int0"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDeepSkyBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Int1
#property indicator_label2  "Int1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- input parameters - buffer 0 ---------
input string          symbol0="EURUSD";      //----- Instrument 1 ------
input ENUM_TIMEFRAMES tf0=PERIOD_CURRENT; //Timeframe 1
input uint            InpPeriod0=10;   // Period1
//--- input parameters - buffer 1 ---------
input string          symbol1="USDCAD";      //----- Instrument 2 ------
input ENUM_TIMEFRAMES tf1=PERIOD_CURRENT; //Timeframe 2
input uint            InpPeriod1=10;   // Period2
//--- input other parameters --------------
input int             max_bars=100;       //Maximum Bars Calculate

//--- indicator buffers
double         Buffer1NII[];
double         Buffer1Temp[];
double         Buffer1Raw[];
double         Buffer2NII[];
double         Buffer2Temp[];
double         Buffer2Raw[];
//--- global variables
int            period_sm0;
int            period_sm1;
string         _symbol0,_symbol1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(symbol0==symbol1)
     {
      Alert("Wrong setting Symbol NAME");
      return(INIT_FAILED);
     }
   _symbol0=symbol0;
   _symbol1=symbol1;
   if(symbol0=="")
      _symbol0=Symbol();
   if(symbol1=="")
      _symbol1=Symbol();
//--- set global variables
   period_sm0=int(InpPeriod0<1 ? 1 : InpPeriod0);
   period_sm1=int(InpPeriod1<1 ? 1 : InpPeriod1);
   
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer1NII,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer1Raw,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,Buffer1Temp,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,Buffer2NII,INDICATOR_DATA);
   SetIndexBuffer(4,Buffer2Raw,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,Buffer2Temp,INDICATOR_CALCULATIONS);

   PlotIndexSetString(0,PLOT_LABEL,symbol0+" Int0-" +EnumToString(tf0));   
   PlotIndexSetString(1,PLOT_LABEL,symbol1+" Int1-" +EnumToString(tf0));   
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Normlzd_I_I_O"); 
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(Buffer1NII,true);
   ArraySetAsSeries(Buffer1Temp,true);
   ArraySetAsSeries(Buffer1Raw,true);
   ArraySetAsSeries(Buffer2NII,true);
   ArraySetAsSeries(Buffer2Temp,true);
   ArraySetAsSeries(Buffer2Raw,true);
   
   if(!SymbolInfoInteger(symbol0,SYMBOL_SELECT)) 
      SymbolSelect(symbol0,true);                
   if(!SymbolInfoInteger(symbol1,SYMBOL_SELECT))
      SymbolSelect(symbol1,true);
//---
   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[])
  {
   bool error=false;
   string symerror="";
   ResetLastError();
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(tick_volume,true);
//--- Проверка и расчёт количества просчитываемых баров
   if(rates_total<fmax(period_sm0,4)) return 0;
   if(rates_total<fmax(period_sm1,4)) return 1;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-0;
      ArrayInitialize(Buffer1NII,EMPTY_VALUE);
      ArrayInitialize(Buffer1Temp,0);
      ArrayInitialize(Buffer1Raw,0);
          
      limit=rates_total-1;
      ArrayInitialize(Buffer2NII,EMPTY_VALUE);
      ArrayInitialize(Buffer2Temp,1);
      ArrayInitialize(Buffer2Raw,1);
     }

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      Buffer1Temp[i]=(high[i]-low[i]!=0 ? (2.0*close[i]-high[i]-low[i])/(high[i]-low[i])*tick_volume[i] : 0);
      Buffer1Raw[i]=(double)tick_volume[i];
      double raw_avg1=GetSMA(rates_total,i,period_sm0,Buffer1Raw);
      Buffer1NII[i]=(raw_avg1!=0 ? GetSMA(rates_total,i,period_sm0,Buffer1Temp)/raw_avg1 : 0);
           {
            error=true;
            symerror=symbol0; 
           }
     
      Buffer2Temp[i]=(high[i]-low[i]!=0 ? (2.0*close[i]-high[i]-low[i])/(high[i]-low[i])*tick_volume[i] : 0);
      Buffer2Raw[i]=(double)tick_volume[i];
      double raw_avg2=GetSMA(rates_total,i,period_sm1,Buffer2Raw);
      Buffer2NII[i]=(raw_avg2!=0 ? GetSMA(rates_total,i,period_sm1,Buffer2Temp)/raw_avg2 : 0);
           {
            error=true;
            symerror=symbol0; 
           } 
     }
//--- return value of prev_calculated for next call
   if(error)
     
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
double GetSMA(const int rates_total,const int index,const int period,const double &price[],const bool as_series=true)
  {
//---
   double result=0.0; 
//--- check position
   bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
   if(period<1 || !check_index)
      return 0;
//--- calculate value
   for(int i=0; i<period; i++)
      result=result+(as_series ? price[index+i]: price[index-i]);
//---
   return(result/period);
  }
//+------------------------------------------------------------------+
 
ANDREY:

Bonne journée à tous.
Pouvez-vous me dire comment coder correctement la condition suivante en utilisant je ne sais plus quelle fonction mathématique.

if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;}
Je sais qu'il existe une fonction mathématique qui peut être utilisée dans la condition ci-dessus sans le signe &&. Mais je ne me souviens pas comment s'appelle cette fonction mathématique et comment l'appliquer.
Merci pour votre aide.

si(MathAbs(Bid - Low[1]) >= 0.0004) {action;}

 
Taras Slobodyanik:

si(MathAbs(Bid - Low[1]) >= 0.0004) {action;}

Oh Taras, Taras... Tu n'as pas appris à réfléchir à l'école ? Est-ce que 0,0004 est toujours inférieur à 0,0035 ...............

 
Alexey Viktorov:

Oh Taras, Taras... On ne t'a pas appris à réfléchir à l'école ? Est-ce que 0,0004 est inférieur à 0,0035 ...............

Apprends à lire, menteur.

et le programme vérifiera la cohérence des prix dans la fourchette de 4 points.

Raison: