新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 287 1...280281282283284285286287288289290291292293294...1953 新评论 Lowech 2017.08.31 10:01 #2861 下午。请帮助解决这个问题,关闭订单的总和损失,当使用关闭订单功能时,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);} Nauris Zukas 2017.08.31 12:07 #2862 Lowech: 你好。请帮助我处理这个函数,它总结了平仓订单的损失,当与平仓订单函数一起使用时,metatrader崩溃了,我认为这个函数有某种错误。最好是看一下现成的,必要时进行调整。用货币获取利润(GetProfitFromDateInCurrency)。 Konstantin Erin 2017.08.31 13:09 #2863 Lowech: 下午。请帮助解决这个问题,总结关闭订单的损失,当与关闭订单功能一起使用时,metatrader崩溃了,我认为这个功能有某种错误。你说Metatrader 崩溃是什么意思?程序编译时出现了错误!!!。有三处不是用小写字母 "如果",而是用大写字母 "如果"。一对大括号显然是不必要的:在int orders=OrdersHistoryTotal()之后的第一个大括号;在summa=OrderProfit()+summa之后的一对大括号;-但这并不重要。还有... Ivan Ivanov 2017.08.31 13:32 #2864 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); } Konstantin Erin 2017.08.31 13:34 #2865 我写晚了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); } Lowech 2017.08.31 15:20 #2866 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),则休息。 如果订单已经获利平仓,我应该停止反击,我没看错吧? Konstantin Erin 2017.08.31 15:27 #2867 Lowech: 谢谢你,不再有metatrader崩溃了)我需要的是,如果一个订单在盈利时关闭,该功能不考虑这个利润,只考虑损失的金额,并且直到第一个订单盈利时关闭。I.e. 如果订单已经获利平仓,我应该停止反击,我没看错吧? 你的推理几乎是正确的。不保证在历史上有任何订单安排。对你自己来说,你可以,但对卖家来说--不好。 Lowech 2017.08.31 17:10 #2868 STARIJ: 你的推理几乎是正确的。在历史上没有任何秩序安排的保证。对你自己--是的,但对卖家--不好。 基于订单的循环不是按顺序计算订单的吗? Vitaly Muzichenko 2017.08.31 18:13 #2869 STARIJ:如果有一个来源--DROW_NONE--不画。没有帮助,仍然在角落里显示数字。 Konstantin Erin 2017.08.31 19:27 #2870 Lowech: 订单循环不是按顺序计算订单吗?按照名单上的顺序排列。但不能保证在这个列表中的任何排序 1...280281282283284285286287288289290291292293294...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
{
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;
summa=OrderProfit()+summa;
}
}
你好。请帮助我处理这个函数,它总结了平仓订单的损失,当与平仓订单函数一起使用时,metatrader崩溃了,我认为这个函数有某种错误。
最好是看一下现成的,必要时进行调整。用货币获取利润(GetProfitFromDateInCurrency)。
下午。请帮助解决这个问题,总结关闭订单的损失,当与关闭订单功能一起使用时,metatrader崩溃了,我认为这个功能有某种错误。
你说Metatrader 崩溃是什么意思?程序编译时出现了错误!!!。
有三处不是用小写字母 "如果",而是用大写字母 "如果"。
一对大括号显然是不必要的:在int orders=OrdersHistoryTotal()之后的第一个大括号;在summa=OrderProfit()+summa之后的一对大括号;-但这并不重要。
还有...
下午。请帮助解决这个功能,它总结了已关闭订单的损失,当与关闭订单功能一起使用时,Metatrader崩溃了,我认为这个功能有某种错误。
试试这个:
用#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--)减少了它。同一个订单的处理是重复的,程序进入了一个循环。这可能是它应该的方式。
写作时迟到了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;
如果(OrderProfit()>0),则休息。
如果订单已经获利平仓,我应该停止反击,我没看错吧?
谢谢你,不再有metatrader崩溃了)我需要的是,如果一个订单在盈利时关闭,该功能不考虑这个利润,只考虑损失的金额,并且直到第一个订单盈利时关闭。I.e.
如果订单已经获利平仓,我应该停止反击,我没看错吧?
你的推理几乎是正确的。在历史上没有任何秩序安排的保证。对你自己--是的,但对卖家--不好。
如果有一个来源--DROW_NONE--不画。
没有帮助,仍然在角落里显示数字。
按照名单上的顺序排列。但不能保证在这个列表中的任何排序