关闭订单的利润计算 "HELP" - 页 4

 
Renat Akhtyamov:

不,这一行被删除。这是一个利润计算,不会有这样的效果。

代码中的关闭命令在哪里--有

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

并在结束条件中

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1不计,2正确计数,3不计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);
   }

并在结束条件中

{CloseOrder(OrderTicket());t=TimeCurrent();} 

{DeleteAll();t=TimeCurrent();}

1不计数,2正确计数,3不计数 0

就这样了。

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

还有一件事。

您的订单是否根据票据关闭?

所以你需要记住开始的时间,以便更早地结束这个系列。

也就是说,如果关闭一个系列的决定刚刚形成,那么它是否真的会关闭并不重要。

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

我理解你的坚持,但我给了你一个工作版本,具有为真实交易关闭一系列头寸的良好功能,在测试器中不工作。

它计算并记住一切,即使终端被重新启动。

这里有一个测试,只需在测试器中运行它,并将结果与历史交易 进行比较

PS。忘了写代码了--这里是修正版

附加的文件:
e-info.mq4  10 kb
 
Vitaly Muzichenko:

我理解你的坚持,但我给了你一个工作版本,具有为真实交易关闭一系列头寸的良好功能,在测试器中不工作。

它计算并记住一切,即使终端被重新启动。

这里有一个测试,只需在测试器中运行它,并将结果与历史交易 进行比较

我怎样才能将其应用于我的代码?

LastProfitCL 的值决定了我的进一步行动

 
Renat Akhtyamov:

但除此之外

{t=TimeCurrent();CloseOrder(OrderTicket());}
{DeleteAll();}

还有一件事。

你的订单是否在票据上关闭?

因此,你需要记住该系列关闭的时间甚至更早

也就是说,如果关闭一个系列的决定刚刚形成,那么它是否真的会关闭并不重要。

如果订单被止损关闭,那么{t=TimeCurrent();CloseOrder(OrderTicket());}{DeleteAll();}将已经错过了利润的价值
 
Natashe4ka:

我如何将其应用于我的代码?

我有LastProfitCL 值,它决定了进一步的行动

所以很清楚,只要按照你的需要以这种形式应用就可以了

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

声明一次"LastProfit",并在需要时使用它。

 
Natashe4ka:
如果订单被止损关闭,那么{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();}将已经错过了利润的值

是的,会的。

你可以检查每一个刻度,看看还剩下多少个实时订单。

如果是相同的,那么你应该记住前一次打钩的时间。

然后你会得到你所需要的东西。

但停止通常不会发生在自动机上

 
Natashe4ka:
如果它在停止时收盘,{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();}将已经错过了利润值。

它只计算那些在时间上最后关闭的,而不取决于关闭金额。

一般来说,任务并不完全清楚,所以没有进一步讨论。

//---------------------------------------------------------

在这里你看到了描述,我不明白这个问题了。

附加的文件:
e_info.mq4  10 kb
 
Vitaly Muzichenko:

在这里,这一切都被布置好了,我不明白这个任务了。

好的,谢谢你。
 

如果 "cnt "被设置为零,这也是正确的,但这样一来,数值又无法理解了,如截图3(应该是利润值4.27)。

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