Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1494

 
ANDREY:
Könnten Sie mir bitte sagen, warum das Programm (auf mql 4, auf Minuten, alle Ticks) liest die Zahl explizit und die gleiche Zahl in der Funktion anders berechnet.
Hier ist der Code

Das Programm liest Pr nicht als 1,60854, obwohlPrint( ) den Wert von Pr als 1,60854 anzeigt. Infolgedessen öffnet das Programm den zweiten Auftrag, aber das sollte es nicht tun
.


Und wenn wir anstelle der Variable Pr die Zahl 1,60854 setzen , liest das Programm sie und öffnet nicht die zweite Ordnung.

FRAGE Welche Änderungen sollten am Code vorgenommen werden, damit das Programm Pr liest und nicht die zweite Bestellung öffnet?
Vielen Dank
für Ihre Hilfe

Es wird nicht empfohlen, reelle Zahlen direkt zu vergleichen. Korrekter ist es, ihre normalisierte Differenz mit Null zu vergleichen.

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

Es wird nicht empfohlen, reelle Zahlen direkt zu vergleichen. Es ist richtig, ihre normalisierte Differenz mit Null zu vergleichen.

Vielen Dank für die wertvollen Informationen. Das hätte ich selbst nie gedacht.

 
ANDREY:

Ich danke Ihnen für die wertvollen Informationen. Das hätte ich selbst nie gedacht.

Nicht empfohlen ist nicht gleichbedeutend mit verboten. Wenn wir zum Beispiel den aktuellen Preis mit dem Preis des erwarteten Stopps vergleichen, können wir direkt vergleichen, ob es mehr oder weniger ist... Der Unterschied wird ziemlich signifikant sein. Aber es ist eine ganz andere Sache, sie unter gleichen Bedingungen zu vergleichen...

 
Alexey Viktorov:

Nicht empfohlen heißt nicht, dass es verboten ist. Wenn wir zum Beispiel den aktuellen Preis mit dem Preis des erwarteten Stopps vergleichen, können wir direkt vergleichen, ob es mehr oder weniger ist... Der Unterschied wird ziemlich signifikant sein. Und es ist eine ganz andere Sache, wenn man es mit der Gleichstellung vergleicht...

Ich hab's. Ich danke Ihnen.

 
Ich dachte daran, eine separate mqh-Datei mit einer Liste von Makro-Ersetzungen zu erstellen, um die angegebenen Code-Dateien einzuschließen.
// файл со списком макроподстановок

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

#include <JvL/Includes.mqh>
ARRAY_С
Aber so einfach funktioniert das nicht.

Makro-Argument anstelle von 'include' erwartet Includes.mqh
'include' - Ausdrücke sind auf globaler Ebene nicht erlaubt C_Meter.mqh


Wie kann ich den Compiler überlisten?

 

Hallo. Bitte helfen Sie mir, den Zickzack-Indikator zu verstehen. Es stellt sich heraus, dass das gesamte Array ZigZagBuffer[] den Wert 0.0 angenommen hat. Warum wird der Ausdruck if(res != 0.0) manchmal wahr? Schließlich hat das gesamte Feld den Wert 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;
 

Hallo zusammen. Liebe Programmierer, ich brauche Ihre Hilfe.

Ich versuche, einen Multicurrency-Indikator zu erstellen, der die SMA von zwei Symbolen im Keller anzeigen soll.

Wenn dies nicht schwierig ist, geben Sie bitte an, wo der Fehler liegt.


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

Guten Tag an alle.
Können Sie mir bitte sagen, wie ich die folgende Bedingung richtig kodieren kann, wobei ich mich nicht mehr an die mathematische Funktion erinnere.

if (Bid - Low[1]>=0.0030 && Bid - Low[1]<0.0035) {action;}
Ich weiß, dass es eine mathematische Funktion gibt, die in der obigen Bedingung ohne && Zeichen verwendet werden kann . Aber ich weiß nicht mehr, wie diese mathematische Funktion heißt und wie man sie anwendet.
Ich danke Ihnen für Ihre Hilfe.

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

 
Taras Slobodyanik:

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

Oh Taras, Taras... Hast du in der Schule nicht gelernt, zu denken? Ist 0,0004 jemals kleiner als 0,0035 ...............

 
Alexey Viktorov:

Oh Taras, Taras... Hat man dir in der Schule nicht beigebracht zu denken? Ist 0,0004 weniger als 0,0035 ...............

Lernen Sie lesen, Sie Lügner.

und das Programm prüft auf Preiskonsistenz im 4-Punkte-Bereich.

Grund der Beschwerde: