Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Twitter!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Object Emulator - Bibliothek für den MetaTrader 5

Ansichten:
800
Rating:
(38)
Veröffentlicht:
2016.06.20 12:53
\MQL5\Indicators\ \MQL5\Scripts\ \MQL5\Include\
objectemul.mqh (34.25 KB) ansehen
MQL5 Freelance Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Beschreibung

MetaTrader 4 erlaubt die Verwendung von Objekten im Expert Advisor beim Testen. Der Chart mit den Objekten wird nach Beendigung des Tests geöffnet. Pfeile zeigen an, wann der Expert Advisor die passenden Operationen ausführen kann, aber diese Bedingung hat es nicht erlaubt. Es gibt viele Beispiele für die Verwendung.

Ander als bei MetaTrader 4, können wir Objekte beim Testen in MetaTrader 5 nicht verwenden. Diese Situation hat mir nicht gepasst! Nun, lassen Sie uns das ändern.

Hinweis:

Jetzt werden Expert Advisors ohne Verwendung von Objekten in MetaTrader 5 erstellt. Object Emulator erlaubt es, Daten von einem Objekt zu holen, aber ich rate davon ab, das der Testdurchlauf dadurch verlangsamt wird und es einige Abweichungen zu den offiziellen Funktionen gibt.

Verwenden Sie Object Emulator nur um Objekte im Chart nach dem Testen anzuzeigen.

Einstellung

Fügen Sie zum tester.tpl Tester Template den ObjectEmul_indicator Indikator hinzu.

Für diejenigen, die wissen nicht, wie das geht:

  • Diagramm für ein Währungspaar öffnen.
  • Legen Sie den ObjectEmul_indicator Indikator im Chart ab.
  • Rechtsklick auf den Chart.
  • Vorlagen => Vorlage speichern durch Angabe des Dateinamens "tester".

Verwendung

Der "Open chart" Button im Tab "Einstellungen" wurde im MetaTrader 5 Strategy Tester entfernt. Wenn der Expert Advisor im Test keine Handelsoperationen ausgeführt hat, wird der Chart nicht automatisch angezeigt. Sie müssen auf "Back-testing" umschlaten, mit der rechten Maustaste klicken und "Öffne Chart" wählen.

Legen Sie vor der Verwendung das ObjectEmul_UnitTest_script auf dem leeren Chart ab und lesen Sie den Log im Tab "Experten", um Unterschiede zu den offiziellen Funktionen für die Arbeit mit Objekten festzustellen.

Fügen Sie in der Hauptdatei des Expert Advisor ein:

#include <ObjectEmul.mqh>
CObjectEmul _objs;

Und ändern Sie Object zu _objs.Objct für Standardfunktionen.

Um die Hilfe für die Objektfunktionen im Editor aufzurufen, fügen Sie einfach den Buchstaben "e" in "Object" ein und drücken F1.

Beispiel

EURUSD, H1, MetaQuotes Software Corp., MetaTrader 5, Demo

//+------------------------------------------------------------------+
//|    Beispiel für die Verwendung des Object Emulator               |
//+------------------------------------------------------------------+
#include <ObjectEmul.mqh>
CObjectEmul _objs;

int ZigZag;
datetime lastbar=0;

double trianglePrice[3];
datetime triangleTime[3];
int triangleIndex=0;

int OnInit()
  {
   ZigZag=iCustom(_Symbol,_Period,"Examples\\ZigZag",5,5,3);
   MathSrand(GetTickCount());
   return(0);
  }

void OnTick()
  {
   datetime time[];
   CopyTime(_Symbol,_Period,0,15,time);
   if(lastbar==time[0]) return;
   lastbar=time[0];

   double zgbuffer[];
   if(CopyBuffer(ZigZag,0,0,15,zgbuffer)==0) {Print("CopyBuffer(ZigZag) Error"); return;}

   bool first=true;
   for(int x=0,count=ArraySize(zgbuffer);x<count && triangleIndex<3;x++)
     {
      // Hier ist irgend etwas falsch, aber ich mag das Ergebnis :)
      if(zgbuffer[x]>0 && first) {first=false; x+=3;}
      else if(zgbuffer[x]>0 && (triangleIndex==0 || trianglePrice[triangleIndex-1]!=zgbuffer[x]))
        {
         trianglePrice[triangleIndex]=zgbuffer[x];
         triangleTime[triangleIndex]=time[x];
         triangleIndex++;
         break;
        }
      else if(zgbuffer[x]>0) break;
     }

   if(triangleIndex<3) return;

   string objname="ObjectEmul_Demo_"+(string)(int)lastbar;

//////////////////////////
// Object Emulator

// Standard Object*() analogues
   if(_objs.ObjctCreate(0,objname,OBJ_TRIANGLE,0,
      triangleTime[0],trianglePrice[0],triangleTime[1],trianglePrice[1]))
     {
      _objs.ObjctSetInteger(0,objname,OBJPROP_TIME,2,triangleTime[2]);
      _objs.ObjctSetDouble(0,objname,OBJPROP_PRICE,2,trianglePrice[2]);
      _objs.ObjctSetInteger(0,objname,OBJPROP_COLOR,(MathRand()%255)*(MathRand()%255)*(MathRand()%255));

      // Beispiel für die Vewendung von Indezes
      int index=_objs.ObjctFindIndex(0,objname);
      if(index>-1) _objs.ObjctSetIntegerIndex(index,OBJPROP_FILL,0,true);
     }
   else Print("ObjctCreate Fehler");

// Object Emulation
//////////////////////////

   trianglePrice[0]=trianglePrice[1];
   triangleTime[0]=triangleTime[1];
   trianglePrice[1]=trianglePrice[2];
   triangleTime[1]=triangleTime[2];
   triangleIndex=2;
  }

Variablen

  • string FileName - Dateiname. Ist Standard, aber Sie können ihn ändern.
  • bool SaveAuto = false - Sollen wir die Objekte in eine Datei speichern, wenn das Klassenobjekt gelöscht wird? Standard "true" (wahr) ist nur für einen einfachen Test.

Funktionen

All graphischen Object*() Objekte weden realisiert , aber haben Objct*() Namen. Aber es gibt keine Analogien zu TextSetFont(), TextOut() und TextGetSize().

  • int Count() - Die Anzahl der Objekte.
  • void ReleaseAll() - Löscht alle Objekte (schneller als ObjctDeleteAll).
  • bool LoadFile(string fname = "", bool print_error = false) - Herunterladen der Objekte von der Datei.
  • bool SaveFile(string fname = "", bool print_error = false) - Speichern der Objekte in eine Datei.
  • void DrawAll() - Zeichne alle Objekte im Chart.

Es gibt auch Objct*Index() Funktionen, um die Arbeit zu beschleunigen:

  • int ObjctFindIndex(long chart_id, string name) - im Vergleich zu ObjctFind() wird eine Seriennummer des Objektes zurückgegeben.

Um Unklarheiten der Überladung zu vermeiden, musste ich getrennte Funktionen für Indizes auswählen. Diese Funktionen rufen nicht ObjctFindIndex() für die Suche auf und die Objekte müssen für die Benützung kontrolliert werden!

ObjctSetInteger(0,"objname",OBJPROP_STYLE,STYLE_DASH) == ObjctSetIntegerIndex(ObjctFindIndex(0,"objname"),OBJPROP_STYLE,STYLE_DASH);

Die LoadFile() Funktion verwendet diese Funktionen, aber die Count() Funktion zeigt die Anzahl aller Objekte.

Sicherlich gibt es Dinge, die bei der Umsetzung erarbeitet werden sollte, aber ich musste eine Entscheidung treffen. Natürlich werde ich versuchen, diese Bibliothek zu aktualisieren und hoffe dabei auf Hilfe von der Community .

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/1583

MinPriceChange MinPriceChange

Indikator der kleinsten Summe von Preisänderungen die Signale nach Seitwärtsbewegungen und vor potenziellem Ausbruch in die eine oder andere Richtung bildet

RSIOMA RSIOMA

RSI Indikator gezeichnet auf Basis von geglätteten Preiszeitreihen mit zusätzlicher Signallinie.

TrendStrength TrendStrength

Indikator um den globalen Trend zu definieren.

SmPriceBend-T01 SmPriceBend-T01

Indikator der ersten Preisänderungsableitung oder einfach Trendgeschwindigkeit und Vorzeichen.