Claudius Marius Walter:
Hallo zusammen,
Habe hier nen Indikator, welcher im live-Chart eine korrekte berechnung ausführt, im Strategy Tester allerdings kompletter Unfug berechnet und anzeigt. Bin tatsächlich auch etwas überfordert, wo ich mit der Fehlersuche beginnen soll, da er augenscheinlich alles korrekt berechnet, laut Live-Chart.
Noch was:
Wenn ich den Indikator im Mode starte, dann berechnet er wieder tadellos alles richtig. Entweder ist mir da ein super banaler leichtsinnsfehler in dem aufrufen des Indikators passiert und es ist einfach noch zu früh am morgen oder es stimmt was anderes nicht..
Es kann sein, dass er im Strategietester keine oder zu wenig hist. Werte hat.
Hallo zusammen,
Habe hier nen Indikator, welcher im live-Chart eine korrekte berechnung ausführt, im Strategy Tester allerdings kompletter Unfug berechnet und anzeigt. Bin tatsächlich auch etwas überfordert, wo ich mit der Fehlersuche beginnen soll, da er augenscheinlich alles korrekt berechnet, laut Live-Chart.
Noch was:
Wenn ich den Indikator im Mode starte, dann berechnet er wieder tadellos alles richtig. Entweder ist mir da ein super banaler leichtsinnsfehler in dem aufrufen des Indikators passiert und es ist einfach noch zu früh am morgen oder es stimmt was anderes nicht..
was genau soll ich posten?
Der code muss ja irgendwo seine richtigkeit haben, wenn er im live-chart und im indicator mode alles richtig anzeigt, nur im EA nicht. Habe gerade beispielhaft einen weiteren indikator im ea aufgerufen, um zu prüfen, ob ich auch kein schmutz programmiert habe. Funktioniert tadellos..
Der code muss ja irgendwo seine richtigkeit haben, wenn er im live-chart und im indicator mode alles richtig anzeigt, nur im EA nicht. Habe gerade beispielhaft einen weiteren indikator im ea aufgerufen, um zu prüfen, ob ich auch kein schmutz programmiert habe. Funktioniert tadellos..
//--- indicator settings #property indicator_separate_window #property indicator_buffers 8 #property indicator_plots 1 #property indicator_type1 DRAW_COLOR_LINE #property indicator_color1 clrDarkGray,clrDeepSkyBlue,clrOrangeRed #property indicator_label1 "Range Identifier" #property indicator_width1 2 #property indicator_level1 0.05 #property indicator_level2 -0.05 //--- input parameters input int MaPeriodFast=3; // Fast Ma input int MaPeriodSlow = 24; // Slow Ma input int AtrPeriod1= 3; //Atr 1 input int AtrPeriod2 = 24; //Atr 2 input double InpLevels = 0.04; //--- indicator buffers double ma1[]; double ma2[]; double maFast[]; double maSlow[]; double atr1[]; double atr2[]; double range[]; double clr[]; int maFastHnd,maSlowHnd,atr1Hnd,atr2Hnd; //--- global variable //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,range,INDICATOR_DATA); SetIndexBuffer(1,clr,INDICATOR_COLOR_INDEX); SetIndexBuffer(2,ma1,INDICATOR_CALCULATIONS); SetIndexBuffer(3,ma2,INDICATOR_CALCULATIONS); SetIndexBuffer(4,maFast,INDICATOR_CALCULATIONS); SetIndexBuffer(5,maSlow,INDICATOR_CALCULATIONS); SetIndexBuffer(6,atr1,INDICATOR_CALCULATIONS); SetIndexBuffer(7,atr2,INDICATOR_CALCULATIONS); //SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS); //--- IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2); //--- name for DataWindow and indicator subwindow label IndicatorSetString(INDICATOR_SHORTNAME,"Range Indicator"); PlotIndexSetString(0,PLOT_LABEL,"Range Indicator"); IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrWhite); IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrWhite); IndicatorSetDouble(INDICATOR_LEVELVALUE,0,InpLevels); IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-InpLevels); //IndicatorSetDouble(INDICATOR_MINIMUM,-5); //IndicatorSetDouble(INDICATOR_MAXIMUM,105); //--- initialization done maFastHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodFast,0,MODE_EMA,PRICE_CLOSE); maSlowHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodSlow,0,MODE_EMA,PRICE_CLOSE); atr1Hnd = iATR(_Symbol,PERIOD_CURRENT,AtrPeriod1); atr2Hnd = iATR(_Symbol,PERIOD_CURRENT,AtrPeriod2); } //+------------------------------------------------------------------+ //| Average True Range | //+------------------------------------------------------------------+ 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 &TickVolume[], const long &Volume[], const int &Spread[]) { if(rates_total<MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2) return(0); //--- not all data may be calculated int calculated=BarsCalculated(maFastHnd); if(calculated<rates_total) { Print("Not all data of maFastHnd is calculated (",calculated," bars). Error ",GetLastError()); return(0); } calculated=BarsCalculated(maSlowHnd); if(calculated<rates_total) { Print("Not all data of maSlowHnd is calculated (",calculated," bars). Error ",GetLastError()); return(0); } calculated=BarsCalculated(atr1Hnd); if(calculated<rates_total) { Print("Not all data of atr1Hnd is calculated (",calculated," bars). Error ",GetLastError()); return(0); } calculated=BarsCalculated(atr2Hnd); if(calculated<rates_total) { Print("Not all data of atr2Hnd is calculated (",calculated," bars). Error ",GetLastError()); return(0); } //--- we can copy not all data int to_copy; if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total; else { to_copy=rates_total-prev_calculated; if(prev_calculated>0) to_copy++; } //--- get Fast EMA buffer if(IsStopped()) // checking for stop flag return(0); if(CopyBuffer(maFastHnd,0,0,to_copy,maFast)<=0) { Print("Getting ma1 is failed! Error ",GetLastError()); return(0); } //--- get SlowSMA buffer if(IsStopped()) // checking for stop flag return(0); if(CopyBuffer(maSlowHnd,0,0,to_copy,maSlow)<=0) { Print("Getting ma2 is failed! Error ",GetLastError()); return(0); } if(IsStopped()) // checking for stop flag return(0); if(CopyBuffer(atr1Hnd,0,0,to_copy,atr1)<=0) { Print("Getting ma2 is failed! Error ",GetLastError()); return(0); } if(IsStopped()) // checking for stop flag return(0); if(CopyBuffer(atr2Hnd,0,0,to_copy,atr2)<=0) { Print("Getting ma2 is failed! Error ",GetLastError()); return(0); } //--- start working int i,start=prev_calculated-1; if(start<MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2-1) { start=MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2-1; for(i=0; i<start; i++) { ma1[i]=0.0; ma2[i]=0.0; range[i]=0.0; } } //--- the main loop of calculations for(i=start; i < rates_total && !IsStopped(); i++) { if(i == rates_total-3)DebugBreak(); //breakpoint if(i <= MaPeriodFast+MaPeriodSlow+AtrPeriod1+AtrPeriod2)continue; // wenn nicht genug kerzen zur Berechnung zur Verfügung stehen ma1[i] = 100 * (maFast[i] - maSlow[i]) * atr1[i] + 0.00001; ma2[i] = ma1[i] * maSlow[i] / atr2[i]; range[i] = (exp(2*ma2[i])-10) / (exp(2*ma2[i]) +1); // valc[i]= (val[i]>inpLevels) ? 1 :(val[i]<-inpLevels) ? 2 : 0; clr[i] = (range[i] > InpLevels) ? 1 : (range[i] > -InpLevels) ? 0 :2 ; //if(range[i] >= UpperLevel)clr[i] = 0; //if(range[i] < UpperLevel && range[i] > LowerLevel)clr[i] = 1; //if(range[i] <= UpperLevel)clr[i] = 2; } return(rates_total); } /* */
bin dem Fehler etwas näher gerückt
Vergleicht man die relevanten Werte (maFast, maSlow und atr1) aus dem korrekten live Chart im linken Comment() mit den Werten aus dem rechten (Tester Chart),
fällt auf, dass für maFast und maSlow im Tester jeweils der selbe Wert ermittelt wird (1.08366..). Dies kann unmöglich sein, da die beiden Ma´s mit verschiedenen Periodenlängen belegt sind. Demzufolge wird das maFast[] falsch befüllt, aber ich kann aus dem oberen programmcode nicht herauslesen, wieso das so ist...
Desweiteren stimmt atr1 auch nicht mit dem linken Comment überein. Absolut rätselhaft
Das Handle scheint korrekt:
maFastHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodFast,0,MODE_EMA,PRICE_CLOSE); maSlowHnd = iMA(_Symbol,PERIOD_CURRENT,MaPeriodSlow,0,MODE_EMA,PRICE_CLOSE);
und die CopyBuffer() scheint auch korrekt:
int to_copy; if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total; else { to_copy=rates_total-prev_calculated; if(prev_calculated>0) to_copy++; } //--- get Fast EMA buffer if(IsStopped()) // checking for stop flag return(0); if(CopyBuffer(maFastHnd,0,0,to_copy,maFast)<=0) { Print("Getting ma1 is failed! Error ",GetLastError()); return(0); } //--- get SlowSMA buffer if(IsStopped()) // checking for stop flag return(0); if(CopyBuffer(maSlowHnd,0,0,to_copy,maSlow)<=0) { Print("Getting ma2 is failed! Error ",GetLastError()); return(0); }
Du musst die ArraySetAsSeries() setzten, sonst kriegst nur mist
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Habe hier nen Indikator, welcher im live-Chart eine korrekte berechnung ausführt, im Strategy Tester allerdings kompletter Unfug berechnet und anzeigt. Bin tatsächlich auch etwas überfordert, wo ich mit der Fehlersuche beginnen soll, da er augenscheinlich alles korrekt berechnet, laut Live-Chart.
Noch was:
Wenn ich den Indikator im Mode starte, dann berechnet er wieder tadellos alles richtig. Entweder ist mir da ein super banaler leichtsinnsfehler in dem aufrufen des Indikators passiert und es ist einfach noch zu früh am morgen oder es stimmt was anderes nicht..