Gewinnberechnung von abgeschlossenen Aufträgen "HELP" - Seite 4

 
Renat Akhtyamov:

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.

 
Natashe4ka:
//+----------------------------------------------------------------------------+
//     Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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.

{t=TimeCurrent();CloseOrder(OrderTicket());}
{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

 
Natashe4ka:
//+----------------------------------------------------------------------------+

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

Dateien:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

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

 
Renat Akhtyamov:

aber sonst

{t=TimeCurrent();CloseOrder(OrderTicket());}
{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

Wenn der Auftrag durch den Stop geschlossen wird, dann{t=TimeCurrent();CloseOrder(OrderTicket());}{DeleteAll();} wird der Wert des Gewinns bereits verfehlt
 
Natashe4ka:

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

  double LastProfit = LastProfitCL(-1, (datetime)GlobalVariableGet(GetGlobalVariableName("LastProfit")));
  
  Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );

Deklarieren Sie"LastProfit" einmal und verwenden Sie es bei Bedarf

 
Natashe4ka:
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

 
Natashe4ka:
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:

Dateien:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

Hier ist alles übersichtlich, ich verstehe die Aufgabe nicht mehr:

OK, vielen Dank.
 

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)

double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
  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);
   }

Grund der Beschwerde: