Cálculo de beneficios de las órdenes cerradas "AYUDA"

 

El beneficio de las órdenes cerradas se considera correctamente, pero tras el cierre añade el valor al anterior (5; 5+5=10; 10+5=15)
¿Cómo hacer que cada beneficio cerrado de una serie sea uno nuevo, en lugar del anterior (5; 5; 5)?
En una serie de órdenes cerradas puede haber órdenes de compra y de venta, o sólo de compra y sólo de venta

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);
   }
 

Tenemos que añadir una condición para dividir las órdenes cerradas en series

Díganos el algoritmo o principio de división

 
Natashe4ka:   ... Beneficio de los pedidos cerrados ... añade el valor al anterior (5; 5+5=10; 10+5=15)

¿Cómo hacer que cada beneficio cerrado de una serie sea uno nuevo y no el anterior (5; 5; 5)? .....

En lugar de la suma aritmética, deberíamos añadir una cadena de caracteres con un espacio o un punto y coma y un espacio, lo que sea mejor
 
STARIJ:
En lugar de la suma aritmética, añádela a una cadena de caracteres con un espacio o con un punto y coma y un espacio, lo que prefieras

Buena idea.

O podemos ponerlo en un array.

 
Natashe4ka:

El beneficio de las órdenes cerradas se considera correctamente, pero tras el cierre añade el valor al anterior (5; 5+5=10; 10+5=15)
¿Cómo hacer que cada beneficio cerrado de una serie sea uno nuevo, en lugar del anterior (5; 5; 5)?
En una serie de órdenes cerradas puede haber órdenes de compra y de venta, o sólo de compra y sólo de venta

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);
   }
Puedes introducir una variable global, y escribir en ella el beneficio actual. Después de cerrar la orden, resta la cantidad anterior, y lo que quede será el beneficio y recuérdalo
 

Es complicado, ¿hay algo más sencillo?
¿Y puedes dar ejemplos, porque tu cerebro está hirviendo?

 
Natashe4ka:
Esto es un poco complicado; ¿hay algo más sencillo?

No, no será más fácil. Siempre se cuentan TODAS las órdenes, incluyendo las que se contaron durante las veces anteriores que se utilizó la funciónLastProfitCL.Y como cada vez hay más pedidos, la cantidad de beneficios también aumenta.

Tenemos que elaborar la condición según la cual el bucle se romperá cuando se completen los nuevos pedidos.

 
Vitalie Postolache:

Necesitamos elaborar una condición para que el bucle se interrumpa cuando se agoten los nuevos pedidos.

Ya está, esa es la forma correcta de pensarlo))

 
Natashe4ka:

Ya está, esa es la forma correcta de pensarlo))

¿Y qué?

¿Dónde está la condición?

 
Renat Akhtyamov:

¿Y qué?
¿Dónde está la condición?

algo así:

double cnt=0;

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

y hay que restar de alguna manera el cnt nuevo del pasado
cnt 1,2,3 pasado
cnt 4,5,6 nuevo

 
Natashe4ka:

algo así:

double cnt=0;

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

y hay que restar de alguna manera el cnt nuevo del pasado
cnt 1,2,3 pasado
cnt 4,5,6 nuevo

No, no me refiero a la forma en que ya lo has escrito.

Dígame en palabras - cálculo de beneficios para las órdenes cerradas que le interesan

por ejemplo:

- para el día

- con pérdidas

- último pedido

¿o algo más?

Describa la serie