新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 287

 
下午。请帮助解决这个问题,关闭订单的总和损失,当使用关闭订单功能时,metatrader崩溃了,我认为这个功能有一些错误。
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal();
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("历史中出现错误!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//--
if(OrderProfit()>0) break;
如果(OrderProfit()<0)i++;
}
如果(i<0)
summa=OrderProfit()+summa;
}
如果(OrderProfit()>summa)
summa=OrderProfit()+summa。
return(summa);
}
 
Lowech:
你好。请帮助我处理这个函数,它总结了平仓订单的损失,当与平仓订单函数一起使用时,metatrader崩溃了,我认为这个函数有某种错误。

最好是看一下现成的,必要时进行调整。用货币获取利润(GetProfitFromDateInCurrency)。

 
Lowech:
下午。请帮助解决这个问题,总结关闭订单的损失,当与关闭订单功能一起使用时,metatrader崩溃了,我认为这个功能有某种错误。

你说Metatrader 崩溃是什么意思?程序编译时出现了错误!!!。

有三处不是用小写字母 "如果",而是用大写字母 "如果"。

一对大括号显然是不必要的:在int orders=OrdersHistoryTotal()之后的第一个大括号;在summa=OrderProfit()+summa之后的一对大括号;-但这并不重要。

还有...

 
Lowech:
下午。请帮助解决这个功能,它总结了已关闭订单的损失,当与关闭订单功能一起使用时,Metatrader崩溃了,我认为这个功能有某种错误。

试试这个:

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
我写晚了2分钟......让我们仔细考虑这部分。
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

用#property strict指令编译了它--它是最后一行。'i' - 未声明的标识符。问题是,该变量是在循环中声明的,并且只在循环中有效。如果没有#property strict指令,它的编译没有错误,但这是很糟糕的。必须使用该指令。

写if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)而不是if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))比较容易。现在,下一步是中断--这是对循环的退出。但我们需要处理其他订单。然而,在历史上,这是不需要的。如果在处理的时候,订单已经关闭,并且丢失了,那么市场和挂单 就会出现这种错误。一般的经验法则是如果(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))继续;-继续处理下一个订单。

出于同样的原因,将if(OrderProfit()>0)break;改为if(OrderProfit()>0)continue。

而这里是错误的原因:如果(OrderProfit()<0)i++;-如果(OrderProfit()>0;-指数被增加。而循环头for(int i=orders-1;i>=0;i--)减少了它。同一个订单的处理是重复的,程序进入了一个循环。这可能是它应该的方式。

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
写作时迟到了2分钟......让我们仔细考虑这部分。

用#property strict指令编译了它--它是最后一行。'i' - 未声明的标识符。问题是,该变量是在循环中声明的,并且只在循环中有效。如果没有#property strict指令,它的编译没有错误,但这是很糟糕的。必须使用该指令。

写if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)而不是if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))比较容易。现在,下一步是中断--这是对循环的退出。但我们需要处理其他订单。然而,在历史上,这是不需要的。如果在处理的时候,订单已经关闭,并且丢失了,那么市场和挂单 就会出现这种错误。一般的经验法则是如果(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))继续;-继续处理下一个订单。

出于同样的原因,如果(OrderProfit()>0)break;替换为if(OrderProfit()>0)continue。

而这里是错误的原因:如果(OrderProfit()<0)i++; - 如果(OrderProfit()>0; 指数被增加。而循环头for(int i=orders-1;i>=0;i--)减少了它。同一个订单的处理是重复的,程序进入了一个循环。这可能是它应该的方式。


谢谢你,不再有metatrader崩溃了)关于

if(OrderProfit()>0) break; 替换为if(OrderProfit()>0) continue;

我希望这个函数在订单获利平仓时忽略这个利润。 我只希望它包括第一笔订单获利平仓前的损失金额。I.e.

如果(OrderProfit()>0),则休息。


如果订单已经获利平仓,我应该停止反击,我没看错吧?
 
Lowech:

谢谢你,不再有metatrader崩溃了)我需要的是,如果一个订单在盈利时关闭,该功能不考虑这个利润,只考虑损失的金额,并且直到第一个订单盈利时关闭。I.e.
如果订单已经获利平仓,我应该停止反击,我没看错吧?
你的推理几乎是正确的。不保证在历史上有任何订单安排。对你自己来说,你可以,但对卖家来说--不好。
 
STARIJ:
你的推理几乎是正确的。在历史上没有任何秩序安排的保证。对你自己--是的,但对卖家--不好。
基于订单的循环不是按顺序计算订单的吗?
 
STARIJ:

如果有一个来源--DROW_NONE--不画。

没有帮助,仍然在角落里显示数字。

 
Lowech 订单循环不是按顺序计算订单吗?

按照名单上的顺序排列。但不能保证在这个列表中的任何排序

原因: