关闭订单的利润计算 "HELP"

 

平仓订单的利润被认为是正确的,但在平仓后,它的价值增加到前一个(5;5+5=10;10+5=15)
如何使一个系列的每个平仓利润成为一个新的,而不是前一个(5;5;5)?
在一系列的封闭订单中,可以有买入和卖出,也可以只有买入和卖出的订单。

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

我们需要添加一个条件,将已成交的订单分成系列

告诉我们的算法或除法原理

 
Natashe4ka:   ... 关闭订单的利润...将数值加到前一个数值上(5;5+5=10;10+5=15)。

如何使一个系列的每一个封闭的利润是一个新的,而不是前一个(5;5;5)??.....

而不是算术求和,应该用空格或分号和空格添加到字符串中,以你喜欢的方式为准
 
STARIJ:
用空格或分号和空格代替算术求和,将其添加到一个字符串中,以你喜欢的方式为准

好主意。

或者我们可以把它放在一个数组中。

 
Natashe4ka:

平仓订单的利润被认为是正确的,但在平仓后,它的价值增加到前一个(5;5+5=10;10+5=15)
如何使一个系列的每个平仓利润成为一个新的,而不是前一个(5;5;5)?
在一系列的封闭订单中,可以有买入和卖出,也可以只有买入和卖出的订单。

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);
   }
你可以输入一个全局变量,并在其中写入当前的利润。 在关闭订单后,减去之前的金额,剩下的就是利润,并记住它。
 

这很复杂,还有什么更简单的吗?
而你能举出的例子,因为你的大脑正在沸腾?

 
Natashe4ka:
这有点复杂;还有什么更简单的吗?

不,这不会更容易。你总是计算所有的订单,包括那些在你以前使用LastProfitCL 函数时被计算的订单。而且由于订单越来越多,利润额也随之增加。

我们必须想出一个条件,当新的订单完成时,循环将被打破。

 
Vitalie Postolache:

我们需要制定一个条件,当新订单用完时,循环将被中断。

有了,这才是正确的思考方式))。

 
Natashe4ka:

有了,这才是正确的思考方式))。

那么?

条件在哪里?

 
Renat Akhtyamov:

那么?
条件是什么?

类似这样的事情。

double cnt=0;

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

你必须以某种方式从过去的
cnt 1,2,3 past
cnt 4,5,6 new减去cnt new。

 
Natashe4ka:

类似这样的事情。

double cnt=0;

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

你必须以某种方式从过去的
cnt 1,2,3 past
cnt 4,5,6 new减去cnt new。

不,我不是指你已经写好的方式。

用文字告诉我--你感兴趣的平仓订单的利润计算方法

例如:

- 当天

- 亏损

- 最后一个订单

还是别的什么?

描述一下这个系列