Calcolo dei profitti degli ordini chiusi "HELP

 

Il profitto degli ordini chiusi è considerato correttamente, ma dopo la chiusura aggiunge il valore al precedente (5; 5+5=10; 10+5=15)
Come fare in modo che ogni profitto chiuso di una serie sia nuovo, invece del precedente (5; 5; 5)?
In una serie di ordini chiusi ci possono essere ordini di acquisto e di vendita, o solo di acquisto e solo di vendita

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==0)ProfitColor=DarkGray;
   ObjectCreate("Last Profit", OBJ_LABEL, 0, 0, 0);
   ObjectSet("Last Profit", OBJPROP_CORNER, 1);
   ObjectSet("Last Profit", OBJPROP_XDISTANCE, 5);
   ObjectSet("Last Profit", OBJPROP_YDISTANCE, 15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
 

Dobbiamo aggiungere una condizione per dividere gli ordini chiusi in serie

Dicci l'algoritmo o il principio di divisione

 
Natashe4ka:   ... Profitto degli ordini chiusi ... aggiunge il valore al precedente (5; 5+5=10; 10+5=15)

Come fare in modo che ogni profitto chiuso di una serie sia uno nuovo, non il precedente (5; 5; 5)? .....

Invece della somma aritmetica, dovremmo aggiungere una stringa di caratteri con uno spazio o un punto e virgola e uno spazio, se è meglio
 
STARIJ:
Invece della somma aritmetica, potremmo aggiungere una stringa di caratteri con uno spazio o punto e virgola e spazio, come preferite.

Buona idea.

Oppure potremmo metterlo in un array.

 
Natashe4ka:

Il profitto degli ordini chiusi è considerato correttamente, ma dopo la chiusura aggiunge il valore al precedente (5; 5+5=10; 10+5=15)
Come fare in modo che ogni profitto chiuso di una serie sia nuovo, invece del precedente (5; 5; 5)?
In una serie di ordini chiusi ci possono essere ordini di acquisto e di vendita, o solo di acquisto e solo di vendita

color ProfitColor;

// START //
   if(LastProfitCL(-1)<0) ProfitColor=Red;
   if(LastProfitCL(-1)>0) ProfitColor=LimeGreen;
   if(LastProfitCL(-1)==0)ProfitColor=DarkGray;
   ObjectCreate("Last Profit", OBJ_LABEL, 0, 0, 0);
   ObjectSet("Last Profit", OBJPROP_CORNER, 1);
   ObjectSet("Last Profit", OBJPROP_XDISTANCE, 5);
   ObjectSet("Last Profit", OBJPROP_YDISTANCE, 15);
   ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(LastProfitCL(-1),2)),10,"Arial",ProfitColor);
// END START //

//+----------------------------------------------------------------------------+
//|    Возвращает суммарный профит в валюте депозита серии закрытых ордеров    |
//+----------------------------------------------------------------------------+
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 (OrderSymbol()!= Symbol()) continue;
       if (OrderMagicNumber()!= magic) continue;        
       if (OrderType()!= op) continue;
       if (op<0 || OrderType()==op) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
       }
  return(LastProfit);
   }
Potete inserire una variabile globale, e scriverci il profitto attuale. Dopo aver chiuso l'ordine, sottraete l'importo precedente, e ciò che rimane sarà il profitto e ricordatelo
 

È complicato, c'è qualcosa di più semplice?
E puoi fare degli esempi, perché il tuo cervello sta bollendo?

 
Natashe4ka:
Questo è un po' complicato; c'è qualcosa di più semplice?

No, non sarà più facile. Si contano sempre TUTTI gli ordini, compresi quelli che sono stati contati durante le volte precedenti in cui si è usata la funzioneLastProfitCL.E poiché ci sono sempre più ordini, aumenta anche il profitto.

Dobbiamo elaborare la condizione secondo la quale il ciclo sarà interrotto quando i nuovi ordini saranno completati.

 
Vitalie Postolache:

Dobbiamo elaborare una condizione per cui il ciclo sarà interrotto quando i nuovi ordini si esauriscono.

Ecco, questo è il modo giusto di pensarla))

 
Natashe4ka:

Ecco, questo è il modo giusto di pensarla))

Quindi?

Dov'è la condizione?

 
Renat Akhtyamov:

Quindi?
Dov'è la condizione?

qualcosa del genere:

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

e devi in qualche modo sottrarre il cnt nuovo dal passato
cnt 1,2,3 passato
cnt 4,5,6 nuovo

 
Natashe4ka:

qualcosa del genere:

double cnt=0;

if (op<0||OrderType()==op) {lastprof+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++}  

e devi in qualche modo sottrarre il cnt nuovo dal passato
cnt 1,2,3 passato
cnt 4,5,6 nuovo

No, non intendo il modo in cui l'hai già scritto.

Dimmi in parole - calcolo del profitto per gli ordini chiusi che ti interessa

per esempio:

- per il giorno

- in perdita

- ultimo ordine

o qualcos'altro?

Descrivere la serie