Offenes Projekt - Tester-Optimierer im Haus - Seite 2

 
Allerdings weiß ich nicht, die Compiler-Reaktion im Voraus, wird es den Handel Konstanten in den Indikator Körper durch oder nicht lassen? <br / translate="no"> Höchstwahrscheinlich wird es das.

Natürlich sollte es, sie sind alle nur ganze Zahlen, nicht ein separater Typ.

Ein kleiner Tipp.

Natürlich ist es wünschenswert, die Strategie nicht für den Tester umzuschreiben, denn einmal geschrieben, sollte die Strategie im Tester und ohne ihn (in der realen Welt) funktionieren.

Dies kann mit Hilfe von Bibliotheken geschehen.
1. Alle Funktionen im Zusammenhang mit dem Handel, ändern Sie ihre Namen ein wenig (meine... - nicht sehr gut, vielleicht besser _....).
2. Erstellen Sie 2 Bibliotheken. Der erste enthält Code zum Testen (ohne tatsächlich Aufträge zu senden), der zweite dupliziert lediglich Parameter in Aufrufen von Standardfunktionen. Die Umstellung von Work/Testing erfolgt einfach durch den Austausch der Bibliothek.

Natürlich könnten wir alles in einer Bibliothek zusammenfassen und einen globalen Parameter zum Umschalten einführen, aber das ist wahrscheinlich unnötig.

Und es wäre wunderbar, in MT eine weitere Funktion einzuführen, die imho das Schreiben eines solchen Testers radikal vereinfachen würde - die Funktion, den aktuellen letzten Takt zu setzen.

Nehmen wir an, wir haben 1000 Balken in der Historie, die wir testen wollen.
Definieren wir 200 Bar als den letzten und verwenden wir Close[200] anstelle von Close[0]. Diese Funktion sollte in allen eingebauten Funktionen funktionieren.

Der Tester sieht dann aus wie eine Schleife über die Taktnummer, in der dieser Wert gesetzt wird (der letzte Takt im Test), und den Aufruf der Startfunktion in der Strategie.

Tatsächlich ist es nicht so einfach :))
Ich brauche noch ein paar Punkte ...
 
Ich verstehe das nicht, bitte erklären Sie es mir.
2. Wir erstellen 2 Bibliotheken. Die erste Bibliothek enthält Code zum Testen (ohne tatsächlich Aufträge zu senden), die zweite dupliziert einfach die Parameter in den Standardfunktionsaufrufen.
Der
Wechsel zwischen Arbeiten und Testen erfolgt durch einfaches Ersetzen der Bibliothek
.
Ist die Formulierung "Code für das Testen" ein Tester-Code oder ein EA-Code? Seien Sie genauer.

Auch das
D.h. wir wollen 1000 Balken in der Historie haben, die wir testen wollen.
Wir definieren 200 Balken als den letzten, dann verwenden wir anstelle von Close[0] überall Close[200].
Und dieser Fic sollte in allen Inline-Funktionen funktionieren (wirken).


Jeder EA-Code lässt sich leicht in Code für einen Indikator umwandeln:
Wir nehmen den start()-Block des EA und fügen ein Konstrukt for (testerconter=Bars;testerconter>=0;testerconter--)
{
mit einer Klammer am Ende abschließen
}
Ersetzen Sie alle Stellen, die Referenzen verwenden, durch [testerconter+reference].

Hier ist ein Beispiel aus dem eingebauten MACD_sample.mq4 Expert Advisor .
Quellcode:
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,1);


Geändert

   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,testerconter+1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,testerconter+1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,MODE_EMA,0,PRICE_CLOSE,testerconter+1);


Wie Sie sehen können, gibt es überhaupt kein Problem. Wenn Sie möchten, können Sie jederzeit testerconter=0 neu definieren, wenn
Der Code wird im Body des Expert Advisors ausgeführt, nicht im Body des Expert Advisors.

 
Handelt es sich bei der Formulierung "Code zum Testen" um einen Tester-Code oder um einen Expert Advisor-Code? Seien Sie genauer.

In der ersten Bibliothek ist die Funktion
_OrderSend(Symbol(), OP_SELL, 1, Bid, 5, Bid + Stop * Point, Bid - Take * Point);


emuliert die Auftragsausführung im Tester, d. h. er fügt sie der Liste der Aufträge im Tester hinzu und sendet den Auftrag nicht an den Server.

In der zweiten Bibliothek ruft diese Funktion einfach die eingebettete Funktion

int _OrderSend( string symbol, int cmd, double volume, double price, int slippage, 
                double stoploss, double takeprofit, string comment=NULL, int magic=0, 
                datetime expiration=0, color arrow_color=CLR_NONE) 
{
   return (OrderSend(symbol, cmd, volume, price, slippage, stoploss, 
                        takeprofit, comment, magic, expiration, arrow_color) );
}


Jeder Code des Expert Advisors kann im Code für den Indikator leicht nachbearbeitet werden:
Wir nehmen den start()-Block des EA und fügen ein Konstrukt for(testerconter=Bars;testerconter>=0;testerconter--)
{
mit einer Klammer am Ende abschließen
}
Ersetzen Sie alle Stellen, die Referenzen verwenden, durch [testerconter+reference]

Das ist es, was ich meine.
Es wäre einfacher, die Funktion aufzurufen, die den Wert der Variablen testerconter in MT setzt (standardmäßig 0), anstatt sie zu ersetzen, und diese Ersetzung ([testerconter+reference]) würde in MT selbst erfolgen.
Dann bräuchten wir diese Ersetzungen in der Strategie selbst nicht vorzunehmen.

for(testerconter=Bars;testerconter>=0;testerconter--)
{
   SetTestPoint(testerconter);
      далее текст эксперта без переделки,
      или лучше вызов его функции start (или _start)
}



Bitte ersetzen Sie pre durch. vor, um in "z.B. sagen wir, wir haben 1000 Balken in ..." zu zitieren.
sonst ist die Seite wieder weg.

 
Ich habe sie durch Anführungszeichen ersetzt, es sieht so aus, als ob Ihr Text verschwindet, machen Sie eine Zwangsübersetzung der Zeichenfolge in Ihrem Beispiel
über
int _OrderSend( string symbol,....


Meine Schlussfolgerung: Es scheint, dass wir über dieselbe Sache sprechen. Wir können die aktuelle Anfrage für den letzten Takt vorerst vergessen.
Ich muss versuchen, es auf diese Weise zu tun.
Für jetzt nur neu zu definieren Standard-Handelsfunktionen, das Präfix _. ist es noch respektabler :)
 
an avm
Diese Art der Prüfung ist möglich. Und das ist gut genug. Aber leider werden Sie keinen Universalismus bekommen. <br / translate="no"> Ich habe ein paar Wochen mit solchen Tests verbracht. Auf den ersten Blick scheint es einfach zu sein.


Ich vermute, dass Sie "mit viel Blut" getestet haben, d. h. Sie haben die Handelsfunktionen nicht neu definiert. Und jeder neue Test
Für jeden neuen Test muss ein neuer Tester-Indikator geschrieben werden. Aber Sie brauchen es nur einmal zu tun - und es gibt keine Probleme.
Wenn ich falsch liege - poste die Funktionen - sei nicht knauserig.
 
Ein weiterer Punkt.

Es scheint, dass wir dieStartfunktion nicht direkt aus dem Expert Advisoraufrufen können.
Daher wäre es besser, den Code des Expert Advisors in einer Bibliothek zu schreiben und dort die Funktionen _init, _deinit und _start zu haben.

Im Expert Advisor werden wir Folgendes schreiben
#include ".....";
   ...............

int init()
{
   return(_init());
}

int deinit()
{
   return(_deinit());
}

int start()
{
   return(_start());
}


Es ist allerdings etwas unklar, was die Parameter sind.

 
Übrigens können Sie mehrere EAs/Signale in einem Chart kombinieren.
So wie es in Omega gemacht wird:
#include "A1.....";
#include "A2.....";
   ...............

int init()
{
   _initA1();
   _initA2();
   return(0);
}

int deinit()
{
   _deinitA1();
   _deinitA2();
   return(0);
}

int start()
{
   _startA1();
   _startA2();
   return(0);
}


Das ist zwar nicht sehr hübsch, aber es wird funktionieren.
Im Allgemeinen wird ein selbstgebautes Ereignisverarbeitungssystem funktionieren :))

 
Vielleicht ist es einfacher? Sie erstellen ein Parser-Skript, das auf eine mq4-Datei (mit Expert Advisor-Code) angewendet wird.
Er verarbeitet diesen Code - fügt alle Arten von Include-, Arbeits-Arrays für Balance, Equity, etc. ein,
benennt die Variablen Lots in _Lots (und andere) um. Im Allgemeinen erledigt sie die grobe Arbeit.
Ich muss nur noch die Ausgabe abheften und loslegen. :)
Einfache Fördermethode.
 
zu avm<br / translate="no">
Diese Art der Prüfung ist möglich. 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.

Ich vermute, dass Sie "mit viel Blut" getestet haben, d. h. Sie haben die Handelsfunktionen nicht neu definiert. Und für jeden neuen Test mussten Sie einen neuen Tester-Indikator schreiben. Aber Sie brauchen es nur einmal zu tun - und dann gibt es keine Probleme mehr. Wenn ich falsch liege, können Sie Funktionen angeben - seien Sie nicht geizig.

Völlig richtig. "Großes Blut". Es gab keine Auswechslungen. Ich habe solche Tester schon in MT3.x gemacht. MQL4 ist von MQL2 so verschieden wie der Himmel von der Erde. Allerdings habe ich die Vorteile von MQL4 nicht genutzt. Ich habe einen psychologischen Stupor. Ich hätte erst nachdenken und dann arbeiten sollen.
Der Frau wurde geraten: "Erst denken, dann sprechen". Die Frau antwortete: "Wie kann ich über etwas nachdenken, was ich noch nicht gesagt habe".
 
Beim Parser bin ich etwas zu weit gegangen, die Funktionen müssen erst geschrieben werden. Aber ich erinnere mich, dass die Entwickler gesagt haben, dass es keinen Multi-Währungs-Tester (Portfolio-Tester) geben wird. Oder bringe ich etwas durcheinander? Wenn ich nicht verwirrt bin, ist das ein Grund mehr, einen eigenen Text zu verfassen.
Grund der Beschwerde: