Moving Averages unterscheiden sich zwischen EA und Chart

 

Hallo Zusammen,

ich bin noch neu auf dem Gebiet der EA Programmierung.

Ich möchte im Programm auf einen Moving Average zugreifen, klappt auch soweit.

Mir ist jedoch folgendes aufgefallen: Setze ich einen Moving Average mit den selben Einstellungen wie im EA händisch in den Chart, sind die im EA berechneten Werte deutlich unterschiedlich zu den angezeigten im Chart. Bsp: im EURUSD Chart wird für den MA an der aktuellen Kerze "Value: 1.177749" angezeigt. Der Print Befehl am Ende des Codes gibt "1.1776438333..." aus.

Woran könnte das liegen?

Danke schon Mal im Voraus!


MqlParam params4[4];
   // Setting the period of MA
      params4[0].type=TYPE_INT; 
      params4[0].integer_value=60; 
      //--- Verschiebung 
      params4[1].type=TYPE_INT; 
      params4[1].integer_value=0; 
      //--- Art der Glättung 
      params4[2].type=TYPE_INT; 
      params4[2].integer_value=MODE_SMA; 
      //--- Preistyp 
      params4[3].type=TYPE_INT; 
      params4[3].integer_value=PRICE_TYPICAL;
     
handle4=IndicatorCreate(_Symbol,PERIOD_M1,IND_MA,4,params4);
      
CopyBuffer(handle4,0,0,10,MA);

Print(MA[9]);

 

Hi,

Ich habe es getestet (mit statischem und dynamischem Buffer und mit iMA), du hast recht, es kommen unterschiedliche Werte heraus.

Hier der Code mit dem ich es getestet habe:

#define  STATIC               // zum Testen mit dynamischem Buffer diese Zeile auskommentieren
#define  BUFSIZE 1            // static buffersize

int      handleMA;

#ifdef STATIC
   double bufferMA[BUFSIZE];  // static buffer
#else
   double bufferMA[];         // dynamic buffer
#endif

input int                  ma_Period = 60;
input int                  ma_Shift  =  0;
input ENUM_MA_METHOD       ma_Method = MODE_SMA; 
input ENUM_APPLIED_PRICE   ma_Price  = PRICE_CLOSE;
input bool                 offline   = true;          // offline (when market is closed)

int OnInit()
{
   handleMA=iMA(_Symbol,_Period,ma_Period,ma_Shift,ma_Method,ma_Price);
   if(handleMA==INVALID_HANDLE)
      {
         MessageBox("*ERROR* creating handle to iMA",MQLInfoString(MQL_PROGRAM_NAME),MB_ICONERROR);
         return(INIT_FAILED);
      }

   #ifndef STATIC
      ArraySetAsSeries(bufferMA,true);  // only for dynamic arrays
   #endif

   if(offline)
      OnTick();
      
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   IndicatorRelease(handleMA);            // not really necessary, compler doe's it for you
}

void OnTick()
{
   if(CopyBuffer(handleMA,0,0,BUFSIZE,bufferMA)!=BUFSIZE)
      {
         MessageBox("*ERROR* CopyBuffer",MQLInfoString(MQL_PROGRAM_NAME),MB_ICONERROR);
         return;
      }

   Comment("Aktueller MA("+IntegerToString(ma_Period)+") Wert: "+DoubleToString(bufferMA[0],_Digits));
}

Ich reiche die Frage an die Spezialisten weiter.

Was stimmt hier nicht?

Ebenso Dank im Vorraus.

 

Hallo Chock49, 

probiere es mal mit der Normalisierung auf die Nachkommastelle des Symbols.

NormalizeDouble(iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,1),Digits);

NormalizeDouble(iATR(NULL,0,14,0),Digits);


Grüße,

frlaspina

 

Hallo Zusammen,

danke für die schnelle Rückmeldung.

NormalizeDouble hat das Problem leider nicht behoben.


Viele Grüße

 

Hallo,

gab es hier eine Lösung? Denn ich habe das selbe Problem... (im MT5)

Gruß csicsicsi

 
Otto Pauser:

Hi,

Ich habe es getestet (mit statischem und dynamischem Buffer und mit iMA), du hast recht, es kommen unterschiedliche Werte heraus.

Hier der Code mit dem ich es getestet habe:

Ich reiche die Frage an die Spezialisten weiter.

Was stimmt hier nicht?

Ebenso Dank im Vorraus.

das kann nicht den Wert der aktuellen Kerze ausgeben, da Du ja die Kerze 9 auf Print hast

anstelle von

Print(MA[9]);

musst Du

Print(MA[0]);

aber ich empfehle Dir den Code von Otto, das mit dem MqlParams das versteh ich nicht wie das funktionieren soll