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