Version 1.105: Einführung von separaten Funktionen OpenBuy und OpenSell
//| BUY-Position nach Symbol eröffnen|
//+------------------------------------------------------------------+
bool OpenBuy(const double lot)
{
bool res=false;
double price=m_symbol.Ask();
double tp=m_symbol.NormalizePrice(m_symbol.Bid()+InpTP*m_adjusted_point);
if(m_trade.Buy(lot,m_symbol.Name(),price,0.0,tp))
if(m_trade.ResultDeal()>0)
res=true;
return(res);
}
//+------------------------------------------------------------------+
//| Eröffnung einer SELL-Position nach Symbol|
//+------------------------------------------------------------------+
bool OpenSell(const double lot)
{
bool res=false;
double price=m_symbol.Bid();
double tp=m_symbol.NormalizePrice(m_symbol.Ask()-InpTP*m_adjusted_point);
if(m_trade.Sell(lot,m_symbol.Name(),price,0.0,tp))
if(m_trade.ResultDeal()>0)
res=true;
return(res);
}
Der Code ist nun besser lesbar.
Wie immer stellt sich das Problem, was man mit unrentablen Positionen, die hängen bleiben, tun soll. Hier ist ein Beispiel der Version 1.105:

und Version 1.105 mit einer kleinen Änderung: in OnTradeTransaction (wenn ein TakeProfit-Positionsschluss erkannt wird) suchen wir die unrentabelste Position und schließen diese unrentabelste Position:

Ich möchte daran erinnern, dass die einzelnen Tests ausschließlich im Modus"Every Tick Based on Real Tick" durchgeführt werden.
Beide Varianten begannen bei 10000. Welche Variante Sie wählen sollten, hängt von Ihren spezifischen Zielen ab.
Es besteht die Möglichkeit, alle Positionen zu schließen, wenn mindestens eine von ihnen ein tp erhält.
In diesem Fall kann es folgendermaßen ablaufen:
Der erste Start - zwei multidirektionale Positionen, eine von ihnen erhält TakeProfit und wir schließen alle (d.h. wir schließen die verbleibende Position - die unrentable). Das Ergebnis ist, dass wir einen Gewinn bei TakeProfit und gleichzeitig einen Verlust bei der zweiten Position machen.
Das hört sich nicht sehr gut an.
In diesem Fall kann es wie folgt aussehen:
Wir beginnen mit zwei multidirektionalen Positionen, eine davon erhält TakeProfit und wir schließen sie alle (d.h. wir schließen die verbleibende Position - die unrentable). Das Ergebnis ist, dass wir einen Gewinn bei TakeProfit und gleichzeitig einen Verlust bei der zweiten Position machen.
Das ist nicht sehr gut.
Ich habe eine dieser Positionen, aber es sollten mindestens 2 sein + erfolgreicher Einstieg.
Das Hauptproblem ist, einen Einstieg zu finden, bei dem die Summe der erfolgreichen Einstiege mehr als die Hälfte der Summe der erfolglosen Einstiege betragen sollte.
8 Knie von 0,01 ist genug, wenn es nicht ein Kreuz ist.
Theorie
1) 2 Orders zu je 0,01 werden auf das Signal hin in verschiedenen Richtungen eröffnet
2) wenn der Preis den erforderlichen Abstand zum Gewinn überschreitet, dann ein Nachfüllen mit einem Take, die Anzahl der Nachfüllungen, der Schritt des Knies und des Takes - damit kann man lange spielen.
Ich habe mich entschieden, die zweite Option zu belassen (... mit einer kleinen Änderung: in OnTradeTransaction (wenn das Schließen einer Position durch TakeProfit erkannt wird) suchen wir nach der unprofitabelsten Position und schließen diese unprofitabelste Position ...):
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Vladimir Karputov, 2017.01.22 19:00
Wie immer das Problem - was tun mit unrentablen Positionen, die hängen? Hier ist ein Beispiel der Version 1.105:

und Version 1.105 mit einer kleinen Änderung: in OnTradeTransaction (wenn TakeProfit Positionsschließung erkannt wird) suchen wir nach der unprofitabelsten Position und schließen diese unprofitabelste Position:

Ich möchte daran erinnern, dass die einzelnen Tests ausschließlich im Modus"Every Tick Based on Real Tick" durchgeführt werden.
Beide Varianten begannen bei 10000. Welche Variante Sie wählen sollten, hängt von Ihren spezifischen Zielen ab.
jetzt Version 1.106
Version 1.007 - Schutz gegen Neustart des Terminals:
if(!RefreshRates())
return;
if(m_first)
{
//--- Schutz gegen Neustart des Terminals:
int total=0;
for(int i=PositionsTotal()-1;i>=0;i--) // gibt die Anzahl der offenen Positionen zurück
if(m_position.SelectByIndex(i)) // wählt die Position über den Index aus, um weiteren Zugriff auf ihre Eigenschaften zu erhalten
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
total++;
//--- wenn es bereits Positionen gibt, die von diesem Expert Advisor auf dem Handelskonto eröffnet wurden -
//--- wir initialisieren also die Variablen so, dass es so aussieht, als wäre es schon das erste Mal gewesen.
if(total>0)
{
bln_buy=true;
bln_sell=true;
m_first=false;
return;
}
if(OpenBuy(InpLot))
bln_buy=true;
if(OpenSell(InpLot))
bln_sell=true;
m_first=false;
}
//---
Wenn das Terminal neu gestartet wurde oder der EA neu kompiliert wurde und der EA bereits Positionen auf dem gegebenen Handelskonto geöffnet hat, gibt es jetzt keine "First Run"-Situation mehr.
Version 1.108 Jetzt wird beim Crossover und beim TakeProfit, wenn es eine profitable Position gibt, diese auch geschlossen.
Vergleichen Sie die Version 1.108 (obere Charts) mit der vorherigen Version 1.107:
и
Die Version 1.108 hat einen kleineren Gesamtgewinn, aber auch die Drawdowns in schwierigen Perioden sind doppelt so klein wie bei der Version 1.107.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.


New Martin:
New Martin - der EA, der beim Start zwei entgegengesetzte Positionen öffnet. Die Bearbeitung OnTradeTransaction. Bei der Aktivierung, öffnet Take Profit EINE Position in gleiche Richtung. Die Kreuzung zwei Indikatoren MA ist ein Signal zur Eröffnung der Position mit vergrößertem Lot.
Autor: Vladimir Karputov