Offenes Projekt - Tester-Optimierer im Haus

 
Ich habe die Idee, meinen eigenen Tester in Form eines Indikators zu schreiben. Die Anforderung - mit minimaler Nacharbeit muss der Expert Advisor sowohl für Standard- als auch für selbstgeschriebene Tester geeignet sein. Dies wird durch Hinzufügen des Präfixes my zu den Standardkonstanten und -funktionen erreicht. Auch eine Optimierung ist möglich.
Die Vorlage ist geschrieben, es ist notwendig, die Handelsfunktionen zu implementieren, indem Sie Ihre eigenen Funktionen schreiben.
Wer gut darin ist - machen Sie mit. Handelsfunktionen durch Array-Manipulation. Außerdem brauchen wir einen Experten für das Zeichnen von Objekten auf dem Diagramm - verwenden Sie Pfeile/Zeichnungen, um Eröffnungs-, Stop- und Take-Profit-Levels darzustellen.
Außerdem müssen wir die Ausgabe der Auftragshistorie und der numerischen Reihen in einer Datei organisieren, um Diagramme in Excel zu öffnen. Im Allgemeinen ist alles sehr ernst :)

Ich habe im Prinzip an alles gedacht, aber ich bin kein Universalist.

Ich kann Ideen vorschlagen, wenn jemand das möchte. Außerdem ist es möglich, dass die selbst erstellte Variante in einigen Fällen der Leistungsoptimierung in der Lage sein wird, die gebaute Variante zu übertreffen.

//+------------------------------------------------------------------+
//|                                                   SelfTester.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 DarkBlue
#property indicator_color3 LawnGreen
//---- input parameters
extern int       mySpread=4;
extern int       BeginYear=2002;
extern int       BeginMonth=1;
extern int       BeginDay=1;
extern string    ReportName="report";
extern int       Param1=8;
extern int       Param2=13;
extern double    myDepo=10000.0;
extern double    mylots=0.1;
extern int       myTakeProfit=100.0;
extern int       myStopLoss=80.0;
extern int       myTrailingStop=20;
//---- buffers
double myBalance[];
double myEquity[];
double myProfit[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,myBalance);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,myEquity);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,myProfit);
   double TradeOrdersArray[100][14];
   double ClosedOrdersArray[2000][14];
   int myOrdersTotal=0;
   double myOrderOpenPrice=0.0;
   double myOrderLots=0.0; 
   string myOrderComment=""; 
   int myOrderMagicNumber;
   int myOrderOpenTime;
   double myOrderProfit=0.0;
   double myOrderStopLoss=0.0;
   double myOrderTakeProfit=0.0;
   int myOrderTicket;
   int myOrderType; 

   int myOP_BUY=0;
   int myOP_SELL=1;
   int myOP_BUYLIMIT=2;
   int myOP_BUYSTOP=3;
   int myOP_SELLLIMIT=4;
   int myOP_SELLSTOP=5;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+




 
Ich weiß nicht, was für ein Kauderwelsch da erschienen ist. Wenn jemand sie haben möchte, werde ich sie in einem anderen Forum veröffentlichen.
 
2 Rosch
Ich bin mir nicht ganz sicher, was Sie mit dieser Voreinstellung sagen wollen. Meiner Meinung nach möchten Sie eine Reihe von Funktionen erhalten, die den Gewinn berechnen und gleichzeitig Einstiegs- und Endpunkte auf dem Chart markieren? Und die Entscheidungsmaschine wird für jeden von ihnen anders sein?

Und ein paar Tipps:
extern int       BeginYear=2002


besser zu ersetzen durch

extern string       BeginDate="2002.01.01 18:00"


- ist es möglich, sofort mit einer Konstruktion des Typs

Time[i] > StrToTime(BeginDate)



Ja und wahrscheinlich Dinge wie

double myOrderOpenPrice=0.0;
double myOrderLots=0.0; 


wäre auch bequemer zu speichern als

#define LOTS 0;
#define OPEN_PRICE 1;

double MyOrder[2] = {0.0, 0.0};
.....................
MyOrder[OPEN_PRICE] = Open[i];
.....................
 


aber das sind nur die kleinen Dinge...

 
Filin, du bist nicht mehr ganz dicht. Warum sollten Sie die Konstante
definieren?
#define LOTS 0;

Dies ist die Eingangsvariable für das Prüfgerät.

Woher kommt das?

#define OPEN_PRICE 1;


Ist Ihnen aufgefallen, dass alle diese Variablen (die besser durch Funktionen definiert werden sollten)

double myOrderOpenPrice=0.0;
double myOrderLots=0.0; 

Sind Zwillinge des eingebauten mql-4. Ich habe geschrieben, dass es das Ziel ist, dass unser Tester und der eingebettete Tester den
EA mit minimaler Nacharbeit verstehen.

Die Entscheidungsmaschine ist der EA-Code. Und es wird sich leicht in diesen EA integrieren lassen. Und der Motor des Testers sind Funktionen, die ich
vorschlage "überschreiben" - d.h. wir nehmen die standardmäßig eingebaute Funktion, z.B. OrderSend(), und schreiben mit ihr eine völlig ähnliche Funktion - myOrderSend(). Und so weiter.
Ich werde diese Funktion heute Abend schreiben, um sie deutlicher zu machen.

Du musst gründlicher sein, gründlicher... :)

 
Ich weiß nicht, was für ein Kauderwelsch da erschienen ist. Wenn jemand sie haben möchte, werde ich sie in einem anderen Forum veröffentlichen.

Dies erschien vor nicht allzu langer Zeit. Beim Übertragen von Text aus MQL erscheinen die russischen Buchstaben auf diese Weise. Das Gleiche macht FronPage mit russischen Buchstaben.
 
Ich dachte, die kursiven Buchstaben würden beim Kopieren und Einfügen in die Indikator-Datei wieder in russische Buchstaben umgewandelt werden. Es stellte sich heraus, dass dem nicht so war. Ich werde es heute Abend in einem anderen Forum veröffentlichen.
und ich werde den Link posten.
 
Rosh,
Kannst du den Müll nicht wegmachen?
Es ist unmöglich, sich das anzusehen.
Es muss sich um einen Fehler des Forums, des Hostings oder von MT handeln, wenn Skripte mit russischem Text kopiert werden.
 
Es ist möglich, auf diese Weise zu testen. Und das ist gut genug. Aber leider werden Sie keinen Universalismus bekommen.
Ich habe ein paar Wochen mit solchen Tests verbracht. Auf den ersten Blick scheint es einfach zu sein. Sie erhalten eine Reihe von Standardfunktionen und können loslegen.
Aber dieses Set ist nur ein Anfang: Öffnen/Schließen, Gewinn/Verlust-Berechnung, Pfeile/Striche zeichnen.
Der wichtigste ist der Algorithmus zum Öffnen/Schließen, der bereits in einigen Expert Advisors beschrieben wurde. Sie können diesen Algorithmus nicht ziehen und ablegen
in seiner Gesamtheit. Sie können es nur in Teilen tun. Und dann die "fehlerfreie" Verfolgung des resultierenden Codes... Außerdem sind mit diesem Prozess alle möglichen Drehungen und Wendungen verbunden...
alle Arten von Basteleien... Kurzum, wir müssen ein zweites Mal ein eigenes Programm zu demselben Thema schreiben, und zwar von Grund auf. Nach all dem erhalten Sie in 1 Sekunde
entweder ein unbefriedigendes Ergebnis, oder die Pfeile befinden sich an der falschen Stelle, oder sie schließen sich an den falschen Stellen. Dann gehen Sie zurück zum Programmtext und versuchen es erneut...
Ihr Gehirn arbeitet anstelle eines Debuggers, Sie werden für eine Weile zum Monitor... Schließlich, am dritten Tag, läuft der Test
scheint in Ordnung zu sein, aber Sie sind überzeugt, dass die Strategie "nicht gut" ist. Und das war's dann auch schon! Denn das Testen der nächsten Strategie auf diese Weise
Es besteht keine Lust, die nächste Strategie zu testen. Warum habe ich das alles geschrieben? Die Idee ist verlockend. Und im Prinzip funktioniert es auch. Aber glauben Sie mir, es ist nicht etwas, das
wird es nicht funktionieren. Wenn wir über eine Vorlage sprechen, muss es sich um eine sehr grundlegende Vorlage handeln, d. h. um ein sehr anständiges, gut durchdachtes Design. Generell,
Das Programm ist nicht ganz einfach. Und wenn jemand nach der Lektüre dieses Werkes wird nicht brechen einen Speer im Rahmen der beschriebenen, dh verwenden Sie diese meine
Wenn jemand meine kleine, aber immerhin praktische Erfahrung nutzt und ohne Zeitverlust weitermacht, könnte es klappen. Dann werden all jene, die leiden
(mich eingeschlossen) werden sich beteiligen und dem Autor ein Denkmal setzen. :)
 
OK, ich werde am Abend eine Funktion machen (wie versprochen), dann wird alles klarer sein. Im Moment bin ich der Meinung, dass es mit einem richtig konzipierten Tester möglich sein wird
um native Expert Advisors mit einigen kosmetischen Änderungen zu verwenden. Das erste "Opfer" ist MACD_sample.mq4 .
 
Rosh,<br / translate="no"> kann der Müll nicht gelöscht werden?
Es ist unmöglich, sich das anzusehen.
Es muss sich um einen Fehler des Forums, des Hostings oder von MT handeln, wenn Skripte mit russischem Text kopiert werden.


"Müll" wurde entfernt. Programmierer wissen wahrscheinlich, wie langweilig es ist, (Kommentare) zu schreiben :).

Weiß jemand, ob ich diese Konstanten nach der Norm richtig definiert habe?
  int myOP_BUY=0;
   int myOP_SELL=1;
   int myOP_BUYLIMIT=2;
   int myOP_BUYSTOP=3;
   int myOP_SELLLIMIT=4;
   int myOP_SELLSTOP=5;


Bedeutung der spezifischen Werte.

 
Ich bin ein Dummkopf, warum das Rad neu erfinden. Machen wir es uns einfach:

   int myOP_BUY=OP_BUY;
   int myOP_SELL=OP_SELL;
   int myOP_BUYLIMIT=OP_BUYLIMIT;
   int myOP_BUYSTOP=OP_BUYSTOP;
   int myOP_SELLLIMIT=OP_SELLLIMIT;
   int myOP_SELLSTOP=OP_SELLSTOP;


Allerdings weiß ich nicht, die Compiler-Reaktion im Voraus, wird es den Handel Konstanten in den Indikator Körper durch oder nicht lassen?
Höchstwahrscheinlich ist das der Fall.