Diskussion zum Artikel "Entwicklung eines Expertenberaters für mehrere Währungen (Teil 2): Übergang zu virtuellen Positionen von Handelsstrategien" - Seite 2

 
Yuriy Bykov #:

Ich habe diese Option noch nicht in Betracht gezogen, aber ich werde im Hinterkopf behalten, dass sie auch möglich ist. Wenn es mir jedoch gelingt, einen guten Satz vorgefertigter Expert Advisors auf dem Markt zu finden, wie kann ich sie dann zusammen verwenden? Lasse ich einfach den gesamten Satz mit den ausgewählten MM-Parametern laufen?

Ja.

 

Yuriy Bykov #:

Ich bin an die MT5-Handelsfunktionen gewöhnt.

Ich beherrsche sie gut, aber ich habe sie aus diesem Grund aufgegeben.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion des Artikels "Entwicklung eines Multicurrency Expert Advisors (Teil 2): Übergang zu Handelsstrategien für virtuelle Positionen"

fxsaber, 2024.02.07 01:03 Uhr

Gehen Sie bei der Wahl der Handels-API für den virtuellen Handel vorsichtig vor. Wählen Sie aus den verfügbaren. Es ist logisch, der API den Vorzug zu geben, auf der es möglichst einfach ist, den TS zu programmieren. Ich verstehe nicht wirklich die gängige Praxis aller Handelsplattformen, ihr eigenes Fahrrad zu erfinden - die Handels-API. Es mit OOP-Elementen "out of the box" auszustatten, usw. In diesem Sinne ist MQ einen guten Weg gegangen - alle APIs ohne OOP.

 
fxsaber #:

Das Konzept an sich ist gut für den realen Handel. Aber für den Synchronisator müssen Sie die Geschichte des virtuellen Handels aufbewahren. Eine Menge Dinge. Ein ernster Weg, um es gelinde auszudrücken.

Hier verstehe ich nicht, warum man für den realen Handel eine virtuelle Handelshistorie führen muss. Vielleicht haben wir eine etwas andere Interpretation von "Virtualität". Ich habe noch keine Notwendigkeit gesehen, eine Historie zu führen, da ich die virtuellen Positionen immer mit den realen synchronisiert habe und es keine Möglichkeit gibt, die Synchronisierung für eine Weile abzuschalten (noch nicht?).

 
Wo kann ich die EA-Datei erhalten, um sie zu testen?
 
fxsaber #:

Die Virtualisierung würde architektonisch von der TK entkoppelt werden.

Das heißt, der TS verwendet gewöhnliche Handelsfunktionen wie OrderSend(), und wir verwenden unsere Bibliothek, um sie zu überschreiben und virtuelle Positionen zu verwenden?

 
fxsaber #:

Wählen Sie mit Bedacht eine Handels-API für den virtuellen Handel. Wählen Sie unter den verfügbaren aus. Es ist logisch, der API den Vorzug zu geben, mit der die Programmierung des TS so einfach wie möglich ist.

Ich habe festgestellt, dass ich bereits seit Ende 2021 meine API für den virtuellen Handel meines TS verwende. Natürlich habe ich mir angewöhnt, alles, was ich brauche, darauf zu implementieren und nur zwei gängige Methoden für Positionen und Pending Orders zu verwenden - Open() und Close().

Noch einmal: Es tut mir leid, dass ich Ihre virtuelle Bibliothek nicht rechtzeitig gefunden habe )

 
summertop #:
Wo kann ich die EA-Datei zum Testen erhalten?

Eine Liste der angehängten Dateien befindet sich am Ende des Artikels

 
Yuriy Bykov #:

Hier habe ich nicht verstanden, warum man eine virtuelle Handelshistorie für den realen Handel führen muss. Vielleicht haben wir eine etwas andere Interpretation des Konzepts der "Virtualität". Ich habe einfach noch keine Notwendigkeit gesehen, eine Historie zu führen, da ich die virtuellen Positionen immer mit den realen synchronisiert habe und es keine Möglichkeit gibt, die Synchronisation für eine Weile abzuschalten (noch nicht?).

Beispiel.

  1. Synchronisierte virtuelle und reale Positionen mit einer Position und deren Takeout.
  2. Das Häkchen hat den Takeout erreicht: in der virtuellen Position hat es ausgelöst, in der realen Position - den Takeout Re-Jack (Begrenzer).

Es ist nicht möglich, eine reale Position mit einer Market Order zu schließen, da es keine Positionen im virtuellen Markt gibt (z.B. Rollover, großer Slip bei einer Market Order).

Der Kurs hat den Takei nicht wieder berührt, sondern ist in die entgegengesetzte Richtung gegangen. Es scheint, dass es möglich ist, einen Take-Take in der Historie einer geschlossenen Position in einem virtuellen Konto zu halten. Aber der Kurs wird ihn vielleicht nie erreichen. Bei welchen Kursen sollte man dann synchronisieren?

Und dann gibt es ein virtuelles Terminal, das immer handelt - es hat einen Signalkern. Und der wird nur benötigt, um Positionen zu schließen, die auf dem realen Markt hängen.

Im Allgemeinen ist das ein großes Thema. Ich habe drei virtuelle Kernel für die Synchronisation mit dem realen Markt:

  1. Der Kernel, der mit Zeitbeschränkungen handelt - synchronisiert sich nicht mit dem realen Markt.
  2. BestInterval wird auf die erste Virtualisierung geschoben. - Er wird mit dem realen Markt synchronisiert, um Positionen zu eröffnen.
  3. Der Kernel, der ohne Zeitbeschränkungen handelt (immer im Handel) - synchronisiert mit dem Real für das Schließen von Positionen.

 
Yuriy Bykov #:

Das heißt, der TS verwendet normale Handelsfunktionen wie OrderSend(), und wir verwenden unsere Bibliothek, um sie zu überschreiben und virtuelle Positionen zu verwenden?

Ja, für dieses Prinzip muss nichts im TS umgeschrieben werden, da der TS nicht weiß, wo er handelt. Sein Code wird nicht geändert, damit er in verschiedenen virtuellen oder realen Positionen handeln kann.

 
fxsaber #:

Die Eingaben sind ein gutes Beispiel. Jeder Eingabeparameter sollte fünf- oder sechsmal geschrieben werden.

Ich habe das Refactoring nach Eingaben vorgenommen. Einige resultierende Codestücke für das Beispiel.

//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));

   // Hinzufügen einer Instanz der Strategie
   expert.Add(new CSimpleVolumesStrategy( symbol_, inStrategyInput + inSimpleVolumesStrategyInput));

   return(INIT_SUCCEEDED);
}
   InputBase.fixedLot = NormalizeDouble(0.01 / 0.16 * depoPart_, 2);
   const double Array0[] = {13, 0.3, 1.0, 0, 10500, 465, 1000, 3};
   strategies[0] = new CSimpleVolumesStrategy("EURGBP", InputBase + Input[Array0]);
//+------------------------------------------------------------------+
//| Konstruktor|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy( string p_symbol, const string sInputs ) : CStrategy(p_symbol, sInputs)
{
   this.Input = sInputs;

   ArrayResize(m_orders, this.Input.maxCountOfOrders);

   // Laden Sie den Indikator, um Tick-Volumen zu erhalten
   iVolumesHandle = iVolumes(m_symbol, this.InputStrategy.timeframe, VOLUME_TICK);

// Einstellen der Größe des Array-Empfängers von Tick-Volumes und der erforderlichen Adressierung
   ArrayResize(volumes, this.Input.signalPeriod);
   ArraySetAsSeries(volumes, true);
}
Dateien: