Bibliotheken: Easy Canvas - Seite 9

 
Wird die Bibliothek im Strategy Tester funktionieren? Ich möchte manuelle Tests mit dem Strategy Tester durchführen.
 
jaffer wilson:
Wird die Bibliothek im Strategy Tester funktionieren? Ich möchte manuelle Tests mit dem Strategy Tester durchführen.
Ja, das wird sie. Sie müssen jedoch einige Dinge beachten, da die Ereignisse im Tester nicht richtig funktionieren und der Tester aufgrund der höheren Zeitdichte nicht mit Canvas-Berechnungen überlastet wird.
Ich werde etwas später ein Beispiel geben.
Aber für den Moment können Sie sich das hier ansehen.
https://www.mql5.com/en/forum/229521/page4#comment_15005864
Possibilities of Canvas.
Possibilities of Canvas.
  • 2020.01.18
  • www.mql5.com
Demonstration of the possibilities of Сanvas in dynamics. The picture never repeats. This script also works on MQL4, but much slower...
 
jaffer wilson:
Wird die Bibliothek im Strategy Tester funktionieren? Ich möchte manuelle Tests mit dem Strategy Tester durchführen.
#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/de/code/22164
//+------------------------------------------------------------------+
int max=0,min=0;
double Max=0,Min=0;
int OnInit() {
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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& tick_volume[],  
                 const long& volume[],        
                 const int& spread[]) {
   max= ArrayMaximum(high,rates_total-W.Left_bar,W.BarsInWind);
   min= ArrayMinimum(low,rates_total-W.Left_bar,W.BarsInWind);
   Max=high[max];
   Min=low[min];
   max=rates_total-1-max;
   min=rates_total-1-min;
   if (rates_total>0) Draw();
   return(rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Kennung des Ereignisses
                  const long& lparam,   // Ereignisparameter vom Typ long
                  const double& dparam, // Ereignisparameter vom Typ Double
                  const string& sparam) { // Ereignisparameter vom Typ String
   if (id==CHARTEVENT_MOUSE_MOVE) Draw(); 
}
//+------------------------------------------------------------------+
void Draw () {
   static double pr=0;
   static uint clr=0;
   static uint lastCalc=0;
   uint cur=GetTickCount();
   if (cur-lastCalc<30) return;
   lastCalc=cur; 
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if (Canvas.tester) ChartChanged();        // Aktualisierung der Diagrammparameter im Testermodus
   if (pr<Ask) clr=0x800000FF;               // rot
   if (pr>Ask) clr=0x80FF0000;               // blau
   Canvas.Erase(clr);
   Canvas.FillCircle((int)Canvas.X(double(max)),(int)Canvas.Y(Max),20,0xAA50FF50);
   Canvas.FillCircle((int)Canvas.X(double(min)),(int)Canvas.Y(Min),20,0xAAFFFF50);
   Canvas.CurentFont("Tahoma",50,50,0xFF80FF80,0.4);
   Canvas.TextPosition(W.MouseX,W.MouseY);
   Canvas.Comm("Ask = " + DoubleToString(Ask,_Digits));
   Canvas.Comm("Bid = " + DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits));
   Canvas.Comm("Spread = " + DoubleToString((Ask-Bid)/_Point,0));
   Canvas.Update();
   pr=Ask;
}
//+------------------------------------------------------------------+

Was gelb hervorgehoben ist, ist notwendig, um die Belastung des Testers zu verringern
Was grün hervorgehoben ist, ist notwendig, um die Koordinaten korrekt darzustellen. Versuchen Sie, diese Zeile zu entfernen und sehen Sie, was im Tester passiert.

Bei diesem Indikator ändert sich die Farbe des Bildschirms in Abhängigkeit von der Richtung der Preisänderung, der Mindest- und Höchstpreis auf dem Bildschirm wird hervorgehoben und es werden Textinformationen zu Bid und Ask an der aktuellen Position des Mauszeigers angezeigt.


Aber leider wird in Tester das Mausbewegungsereignis nur ausgeführt, wenn die linke Maustaste gedrückt wird.
Dies gilt nicht nur für meine iCanvas-Klasse, sondern auch für jede grafische Ausgabe in Tester.
Nur habe ich eine einfachere Möglichkeit, dies zu implementieren.
Und auch das GUI-Steuerelement funktioniert recht gut:


 
Herzlichen Dank für die Antwort und das Beispiel.
 
jaffer wilson:
Vielen Dank für die Antwort und das Beispiel.
Kein Problem
 

Hallo,

sehr schöne Arbeit. Vielen Dank!

Können Sie bitte das CanvasBar-Beispiel überprüfen? Es funktioniert nicht in Tester auch mit Ihren vorgeschlagenen Änderungen.


Mit freundlichen Grüßen, Mighty

 
Mighty7:

Hallo,

sehr schöne Arbeit. Ich danke Ihnen.

Können Sie bitte das CanvasBar-Beispiel überprüfen? Es wird nicht in Tester auch mit Ihren vorgeschlagenen Änderungen funktionieren.

Mit freundlichen Grüßen, Mighty

Versuchen Sie ChartChanged vor CopyRates zu verschieben

 
Danke für die schnelle Antwort, aber es funktioniert immer noch nicht.
 
Mighty7:
Danke für die schnelle Antwort, aber es funktioniert immer noch nicht.

Dies ist, weil der Aufruf von OnChartEvent kommt, die nicht richtig in der Tester funktioniert.

Versuchen Sie dies.

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 &tick_volume[],const long &volume[],const int &spread[])
  {
   if(rates_total==prev_calculated)
     {
      Bar0.close=close[rates_total-1];Bar0.open=open[rates_total-1]; Bar0.high=high[rates_total-1];Bar0.low=low[rates_total-1];
      ShowBars(false);
     }
   else if (Canvas.tester) ShowBars();
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE) ShowBars(true);
  }
In Zukunft fügen Sie bitte einen Code oder Link bei. Schließlich erinnere ich mich nicht an den Namen meines Codes, den ich vor fast 2 Jahren geschrieben habe.
Dateien:
CanvasBar.mq5  7 kb
 

"Bitte fügen Sie in Zukunft einen Code oder Link bei. Ich erinnere mich nämlich nicht mehr an den Namen meines Codes, den ich vor fast 2 Jahren geschrieben habe."

Ok, mache ich. Jetzt funktioniert es (ich musste die GetTickCount-Zeilen entfernen, um es zu synchronisieren). Ich danke Ihnen.