Einzelnen Beitrag anzeigen
  #5 (permalink)  
Alt 02.04.12
Peter-R. Peter-R. ist offline
Neues Mitglied
 
Registriert seit: Apr 2012
Beiträge: 3
Peter-R. befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

Ich habe vor mir einen Indikator zu programmieren der mir die Differenz des MA von der aktuellen Candle zur vorherigen Candle anzeigt, d. h. bei steigenden Preis ist der Wert über 0, bei fallenden Preis der Wert unter 0.
Das geschieht folgendermaßen: Vom aktuellen Preis wird der MA1 (für die aktuelle Candle) und der MA1_v (vorherige Candle) berechnet. Auf den MA1 wird nochmal ein gleitender Durchschnitt berechnet, ergibt den MA2 (aktueller und vorheriger), dann entsprechend der Arbeit von Dürschner den MA3 ermitteln.
Alle Werte für die MA´s werden in Arrays gespeichert. Beim Berechnen der Differenz zieht man vom aktuellen MA3 einfach den vorherigen MA3 ab und erhält dadurch die Differenz welche aussagt wohin der Trend geht.

Irgendwo ist aber was falsch, ich bekomme nur den aktuellen MA3 im Fenster angezeigt.

Code:
//+------------------------------------------------------------------+
//|                                   Raten - Änderung basierend auf |
//|                                     Moving Average 3. Generation |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, DI (FH) Peter R*****"
#property link      "/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red 

//---- indicator parameters
extern int Periode_1 = 30;
extern int Periode_2 = 12;
extern int MA_Methode = 3; //0=SMA, 1=EMA, 2=SMMA, 3=LWMA
extern int MA_Preis = 0; // 0=PRICE_CLOSE, 1=PRICE_OPEN, 2=PRICE_HIGH, 3=PRICE_LOW, 4=PRICE_MEDIAN, 5=PRICE_TYPICAL, 6=PRICE_WEIGHTED

//---- indicator buffers
double MA1[];
double MA2[];
double MA1_v[];
double MA2_v[];
double MA3[];
double MA3_v[];
double Diff[];

//---- Variablen zur Berechnung
double Lambda, Alpha;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   int    draw_begin;
   string short_name;
//--------------------------------------------------------------------
   IndicatorBuffers(7);

//---- Indukator Aussehen
   SetIndexStyle(6, DRAW_LINE);
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));

//--------------------------------------------------------------------- 
   draw_begin = Periode_1 - 1;

//---- indicator short name
   switch(MA_Methode)
   {
      case 1:
         short_name="Diff_EMA(";  
         draw_begin=0;
         break;
      case 2:
         short_name="Diff_SMMA(";
         break;
      case 3:
         short_name="Diff_LW(";
         break;
      default:
         MA_Methode = 0;
         short_name = "Diff_SMA(";
   }
   IndicatorShortName(short_name + Periode_1 + ")");

   SetIndexDrawBegin(6, draw_begin);

//---- indicator buffers mapping
   SetIndexBuffer(0, MA1);
   SetIndexBuffer(1, MA1_v);
   SetIndexBuffer(2, MA2);
   SetIndexBuffer(3, MA3);
   SetIndexBuffer(4, MA2_v);
   SetIndexBuffer(5, MA3_v);
   SetIndexBuffer(6, Diff);

//---- Berechnung Lambda, Alpha
   Lambda = Periode_1 / Periode_2;
   Alpha = Lambda * (Periode_1 - 1) / (Periode_2 - Lambda);
   Print("Lambda = ", Lambda, "; Alpha = ", Alpha);

//---- initialization done
   return(0);
}

//+------------------------------------------------------------------+
//| Berechnung des MA 3. Generation nach Dürschner                 |
//+------------------------------------------------------------------+
int start()
{
   int i;
   
   if (Periode_1 * 2 < Periode_2)
   {
      Print("Periode_1 should be >= Periode_2 * 2.");
      return(-1);
   }
   if (Bars <= Periode_1) return(0);
   int ExtCountedBars = IndicatorCounted();
//----------------------------------------------------------------------------
   if (ExtCountedBars < 0) return(-1);
   if (ExtCountedBars > 0) ExtCountedBars--;
   if (ExtCountedBars < Periode_1) ExtCountedBars = Periode_1;
//-----------------------------------------------------------------------------

   for (i = Bars - ExtCountedBars - 1; i >= 0; i--)
   {
      MA1[i] = iMA(NULL, 0, Periode_1, 0, MA_Methode, MA_Preis, i);
      MA1_v[i] = iMA(NULL, 0, Periode_1, 0, MA_Methode, MA_Preis, i + 1);    
   }
   
   for (i = Bars - ExtCountedBars - 1; i >= 0; i--)
   {
      MA2[i] = iMAOnArray(MA1, 0, Periode_2, 0, MA_Methode, i);
      MA3[i] = (Alpha + 1) * MA1[i] - Alpha * MA2[i];
   }
   
   for (i = Bars - ExtCountedBars - 1; i >= 0; i--)
   {
      MA2_v[i] = iMAOnArray(MA1_v, 0, Periode_2, 0, MA_Methode, i + 1);
      MA3_v[i] = (Alpha + 1) * MA1_v[i] - Alpha * MA2_v[i];
   }
//----------------------------------------------------------------------------- 
   while(i>=0)
   {
      Diff[i] = MA3[i] - MA3_v[i];
      i--;
   }
//-----------------------------------------------------------------------------
   
//---- done
   return(0);
}
//+------------------------------------------------------------------+
Wahrscheinlich ist die Lösung ganz einfach, ich komm einfach nicht drauf warum der nicht rechnen mag.

mfG
Peter