Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Nein, diese Zeile wird entfernt. Das ist eine Gewinnkalkulation, die so nicht funktionieren wird.
Wo befindet sich der Befehl close im Code - dort
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
und in der Abschlussbedingung
{CloseOrder(OrderTicket());t=TimeCurrent();}
{DeleteAll();t=TimeCurrent();}1 zählt nicht, 2 zählt richtig, 3 zählt nicht 0.
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
und in der Abschlussbedingung
{CloseOrder(OrderTicket());t=TimeCurrent();}
{DeleteAll();t=TimeCurrent();}1 wird nicht gezählt, 2 wird richtig gezählt, 3 wird nicht gezählt 0
und das war's.
{DeleteAll();}
Und noch eine Sache.
Sind Ihre Aufträge gemäß dem Ticket abgeschlossen?
Sie müssen sich also die Startzeit merken, um die Serie früher zu beenden
Das heißt, wenn die Entscheidung, eine Serie zu beenden, gerade erst getroffen wurde, spielt es keine Rolle, ob sie tatsächlich beendet wird oder nicht
Ich verstehe Ihr Beharren, aber ich habe Ihnen eine funktionierende Version gegeben, mit einer guten Funktion zum Schließen einer Reihe von Positionen für den realen Handel, die im Testprogramm nicht funktioniert.
Es zählt und speichert alles, auch wenn das Terminal neu gestartet wird.
Hier ist ein Test, führen Sie ihn einfach im Tester aus, und vergleichen Sie die Ergebnisse mit der Historie des Handels
PS. Ich habe vergessen, den Code einzutragen - hier ist die Lösung
Ich verstehe Ihr Beharren, aber ich habe Ihnen eine funktionierende Version gegeben, mit einer guten Funktion zum Schließen einer Reihe von Positionen für den realen Handel, die im Testprogramm nicht funktioniert.
Es zählt und speichert alles, auch wenn das Terminal neu gestartet wird.
Hier ist ein Test, führen Sie ihn einfach im Tester aus, und vergleichen Sie die Ergebnisse mit der Historie des Handels
Wie kann ich dies auf meinen Code anwenden?
Der Wert vonLastProfitCL bestimmt meinweiteres Vorgehen
aber sonst
{DeleteAll();}
Noch eine Sache.
Schließen Ihre Aufträge mit einem Ticket?
Sie müssen sich also daran erinnern, dass die Serie noch früher endet
Das heißt, wenn die Entscheidung, eine Serie zu beenden, gerade erst getroffen wurde, spielt es keine Rolle, ob sie tatsächlich beendet wird oder nicht
Wie wende ich dies auf meinen Code an?
Ich habe einenLastProfitCL-Wert , derdas weitere Vorgehen bestimmt
Damit es klar ist, wenden Sie es einfach nach Bedarf in dieser Form an
Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );
Deklarieren Sie"LastProfit" einmal und verwenden Sie es bei Bedarf
Wenn der Auftrag durch einen Stop geschlossen wird, dann{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} wird der Wert des Gewinns bereits verfehlt
Ja, das wird sie.
Sie können bei jedem Ticken prüfen, wie viele aktuelle Aufträge noch übrig sind.
Wenn sie dieselbe ist, sollten Sie sich die Zeit des letzten Ticks merken.
Dann werden Sie bekommen, was Sie brauchen.
Aber Stopps passieren normalerweise nicht in Automaten
Wenn er auf einem Stopp schließt,{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} wird der Gewinnwert bereits verfehlt
Es werden nur die zuletzt abgeschlossenen Transaktionen gezählt, und zwar unabhängig vom Abschlussbetrag.
Im Allgemeinen ist die Aufgabe nicht ganz klar, daher keine weitere Diskussion.
//---------------------------------------------------------
Hier sehen Sie die Beschreibung, ich verstehe das Problem nicht mehr:
Hier ist alles übersichtlich, ich verstehe die Aufgabe nicht mehr:
Dies ist auch korrekt, wenn "cnt" auf Null gesetzt wird, aber dann ist der Wert wieder unverständlich wie in Screenshot 3 (sollte ein Gewinnwert von 4,27 sein)
int cnt=0;
double LastProfit=0;
for(i=0;i<OrdersHistoryTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue;
if ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
}
return(LastProfit);
}