MetaTrader 5 herunterladen

Moving Averages unterscheiden sich zwischen EA und Chart

Einloggen oder registrieren, um einen Kommentar zu schreiben
chock49
10
chock49  

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]);

Otto Pauser
1051
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:

#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.

Noris Finanz GmbH
133
Filippo La Spina  

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

chock49
10
chock49  

Hallo Zusammen,

danke für die schnelle Rückmeldung.

NormalizeDouble hat das Problem leider nicht behoben.


Viele Grüße

Einloggen oder registrieren, um einen Kommentar zu schreiben