Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1494

 
ANDREY:
Potreste dirmi perché il programma (su mql 4, su minuti, tutti i tick) legge il numero esplicitamente e lo stesso numero calcolato nella funzione in modo diverso.
Ecco il codice

Il programma non legge Pr come 1,60854 anche sePrint( ) mostra il valore di Pr come 1,60854. Di conseguenza, il programma apre il secondo ordine, ma non dovrebbe farlo
.


E se impostiamo il numero 1,60854 invece della variabile Pr , il programma lo legge e non apre il secondo ordine.

DOMANDA Quali modifiche devono essere apportate al codice in modo che il programma legga Pr e non apra il secondo ordine.
Grazie
per il vostro aiuto

Non si raccomanda di confrontare direttamente i numeri reali. È più corretto confrontare la loro differenza normalizzata con lo zero.

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

Non si raccomanda di confrontare direttamente i numeri reali. È corretto confrontare la loro differenza normalizzata con zero.

Grazie per le preziose informazioni. Io stesso non l'avrei mai immaginato.

 
ANDREY:

Grazie per le preziose informazioni. Io stesso non l'avrei mai immaginato.

Non raccomandato non significa proibito. Se, per esempio, confrontiamo il prezzo attuale con il prezzo dello stop previsto, allora possiamo confrontare direttamente se è più o meno... La differenza sarà abbastanza significativa. Ma è tutta un'altra cosa confrontarlo a parità di condizioni...

 
Alexey Viktorov:

Non raccomandato non significa che sia proibito. Se, per esempio, confrontiamo il prezzo attuale con il prezzo dello stop previsto, allora possiamo confrontare direttamente se è più o meno... La differenza sarà abbastanza significativa. Ed è tutta un'altra cosa quando la si paragona all'uguaglianza...

Capito. Grazie.

 
Ho pensato di creare un file mqh separato con una lista di sostituzioni macro per includere i file di codice specificati.
// файл со списком макроподстановок

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

#include <JvL/Includes.mqh>
ARRAY_С
Ma non funziona così facilmente.

atteso argomento macro invece di 'include' Includes.mqh
'include' - le espressioni non sono permesse in un ambito globale C_Meter.mqh


Come posso superare in astuzia il compilatore?

 

Salve. Per favore, aiutatemi a capire l'indicatore Zigzag. Si scopre che l'intero array ZigZagBuffer[] ha assunto il valore 0.0. Perché l'espressione if(res != 0.0) a volte diventa vera? Dopo tutto, l'intero array ha il valore 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;
 

Ciao a tutti. Cari programmatori, ho bisogno del vostro aiuto.

Sto cercando di fare un indicatore multicurrency, dovrebbe mostrare SMA di due simboli nel seminterrato.

Se non è difficile, si prega di consigliare qual è l'errore.


//+------------------------------------------------------------------+
//|                                          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:

Buona giornata a tutti.
Potete per favore dirmi come codificare correttamente la seguente condizione usando non ricordo quale funzione matematica.

if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;}
So che c'è una funzione matematica che può essere usata nella condizione precedente senza il segno &&. Ma non ricordo come si chiama questa funzione matematica e come applicarla.
Grazie per il vostro aiuto.

se(MathAbs(Bid - Low[1]) >= 0,0004) {action;}

 
Taras Slobodyanik:

se(MathAbs(Bid - Low[1]) >= 0,0004) {action;}

Oh Taras, Taras... Non hai imparato a pensare a scuola? 0,0004 è mai inferiore a 0,0035 ...............

 
Alexey Viktorov:

Oh Taras, Taras... Non ti hanno insegnato a pensare a scuola? È 0,0004 meno di 0,0035 ...............

Impara a leggere, bugiardo.

e il programma verificherà la coerenza dei prezzi nell'intervallo di 4 punti.

Motivazione: