需要帮助解决错误#130无效止损的问题 - 页 3 1234 新评论 [删除] 2011.11.11 07:53 #21 同样的问题。该订单在止损=0和止盈=0的情况下开仓正常。 但随后OrderModify失败。 下面的代码是在上一篇文章中的上述代码之后执行的。 bool modify = false; entry_price = OrderOpenPrice(); if(long) { SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT); TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT); modify = OrderModify(result_ticket, entry_price, SL, TP, Red); } else { SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT); TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT); modify = OrderModify(result_ticket, entry_price, SL, TP, Green); } Log("[5] SL: " + SL); Log("[5] TP: " + TP); if(!modify) { Log("error="+GetLastError()); return(-1); } 日志是这样的。 #ESZ1,M5: 开盘位置 #ESZ1,M5: tickvalue: 12.50000000 #ESZ1,M5: 位置大小: 1.00000000 #ESZ1,M5: Ask/Bid 1242.00000000/1241.75000000 #ESZ1,M5: Spread 0.25000000 #ESZ1,M5: open #13679252 buy 1.00 #ESZ1 at 1242.00 ok #ESZ1,M5: 订单13679252已成功打开 #ESZ1,M5: SL: 1241.25000000 #ESZ1,M5: TP: 1242.25000000 #ESZ1,M5: error=130 所以即使是先开仓然后设置止损,似乎也不起作用:-/。 Need Help with Error 回溯测试/优化 Error #130? Simon Gniadkowski 2011.11.11 12:19 #22 点差为0.25 #ESZ1,M5: 点差0.25000000 好的,你在......1242.00(问价) 处开一个买入。 #ESZ1,M5: 打开#13679252买入1.00 #ESZ1在1242.00确定 #ESZ1,M5: 订单13679252已成功打开 然后你试着修改TP为买入价+2*点差,SL为 买入价-2*点差。 #ESZ1,M5: SL: 1241.25000000 #ESZ1,M5: TP: 1242.25000000 如果你的FreezeLevel是0.50,那就是你的问题了 ...你的FreezeLevel是多少? William Roeder 2011.11.11 13:26 #23 shinobi: 同样的问题。订单在止损=0和止盈=0的情况下正常开仓。 但随后OrderModify失败。 没有为4/5位数的经纪人进行调整。不先开仓,然后设置止损。 正如之前回答的 那样 Ian Venner 2011.11.12 04:38 #24 是的,你可能是在ECN经纪商那里交易,你必须用零止损开仓,然后在开仓后修改订单,所以50点的SL和TP是有问题的,所以像Raptor说的那样,也要检查freezelevel和stoplevel,以防万一。 同时检查你的OrderModify()代码....,也许它是这样工作的,但我觉得你应该在做OrderOpenPrice()之前用OrderSelect() 来选择订单。 [删除] 2011.11.15 06:54 #25 再次感谢您的帮助! 唉,130号仍然在夜里困扰着我;) 这是我的下一个尝试: double stoploss = 50; double SL = 0.0; //open position if(long) //take long position result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345); else //take short position result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, 0, 0, "", 12345); //check for errors if(result_ticket == -1) { Log("error="+GetLastError()); return(-1); } Log("Order "+result_ticket+" Successfully Opened"); //select order if (!OrderSelect(result_ticket, SELECT_BY_TICKET)) { Log("error="+GetLastError()); return(-1); } entry_price = OrderOpenPrice(); //check stoplevel double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL); Log("Stoplevel: " + stoplevel); Log("stoploss: " + stoploss); if(stoploss < stoplevel) stoploss = stoplevel + 1; //checl freezelevel double freezelevel = MarketInfo(Symbol(), MODE_FREEZELEVEL); Log("Freezelevel: " + freezelevel); Log("stoploss: " + stoploss); if(stoploss < freezelevel) stoploss = freezelevel + 1; if(long) SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT); else SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT); Log("SL: " + SL*pips2dbl); if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) { Log("error="+GetLastError()); return(-1); } Log("Stoploss successfully set"); 正如你所看到的,我简化了这个例子,没有使用止盈。错误的发生肯定是由于止损,所以我们不需要止盈。 我首先用0止损(和止盈)开立订单,然后尝试用OrderModify设置止损。 在此之前,我检查了 Mode_Stoplevel和Mode_Freezelevel,如果需要的话,调整止损。(在日志中出现了一个调整,因为止损最初是50,但Mode_Stoplevel是75,然后我将止损设置为Mode_Stoplevel+1,所以是76) RaptorUK和SDC: MarketInfo(MODE_FREEZELEVEL)返回0。我不认为Freezelevel是问题所在。 我把输出结果纳入了日志文件。 SDC: 我还插入了一个OrderSelect,在调用OrderOpenPrice之前,只是想确定一下。在日志中你可以看到OrderSelect起作用了,否则代码不会进行到这一步(退出-1)。 WHRoeder。 我遵循SDC的简单例子。但我现在扩展了它,在设置止损时使用了4/5位数的调整,你可以看到上面的情况。你也可以看到,订单首先在止损和止盈设置为零的情况下开仓,然后用OrderModify设置止损。正如你在下面的日志中看到的,在S/L和T/P设置为零的情况下,订单成功打开,但我仍然无法在下一步用OrderModify设置S/L。 以下是完整的日志: #ESZ1,M5: loaded successfully #ESZ1,M5: Date: 2011/11/15 9:24 #ESZ1,M5: Symbol: #ESZ1 #ESZ1,M5: Depot: 56489.95000000 #ESZ1,M5: Stop Level [Points]: 75.00000000 #ESZ1,M5: Freeze Level [Points]: 0.00000000 #ESZ1,M5: Spread [Points]: 25.00000000 #ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000 #ESZ1,M5: Point: 0.01000000 #ESZ1,M5: Tick Size: 0.25000000 #ESZ1,M5: Tick Value: 12.50000000 #ESZ1,M5: Digits: 2.00000000 #ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59 #ESZ1,M5: Init successfully completed. #ESZ1,M5: initialized #ESZ1,M5: Opening Position #ESZ1,M5: tickvalue: 12.50000000 #ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000 #ESZ1,M5: Spread 0.25000000 #ESZ1,M5: pos size: 1 #ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok #ESZ1,M5: Order 13697436 Successfully Opened #ESZ1,M5: Stoplevel: 75.00000000 #ESZ1,M5: stoploss: 50.00000000 #ESZ1,M5: Freezelevel: 0.00000000 #ESZ1,M5: stoploss: 76.00000000 #ESZ1,M5: SL: 12.51260000 #ESZ1,M5: error=130 我真的很感谢你一直以来的帮助,我想我们正在缩小问题的范围:) 那么还有什么问题呢?还有什么我可以尝试的吗? shinobi Simon Gniadkowski 2011.11.15 09:01 #26 RaptorUK: 点差为0.25 #ESZ1,M5: 点差0.25000000 好的,你在......1242.00(问价) 处开一个买入。 #ESZ1,M5: 打开#13679252买入1.00 #ESZ1在1242.00确定 #ESZ1,M5: 订单13679252已成功打开 然后你尝试修改TP为买入价+2*点差,SL为 买入价-2*点差。 你的STOP_LEVEL不是3*点差吗?你的止损太近了 . . #ESZ1,M5: Stoplevel: 75.00000000 #ESZ1,M5: stoploss: 50.00000000 [删除] 2011.11.15 11:34 #27 嘿,猛禽, 是的,这就是为什么我在这里检查 止损水平(来自上面的代码): double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL); Log("Stoplevel: " + stoplevel); Log("stoploss: " + stoploss); if(stoploss < stoplevel) stoploss = stoplevel + 1; 所以在上一个例子中,止损被设置为76,也就是3*Spread +1。 这应该是足够远的,对吗? Simon Gniadkowski 2011.11.15 11:52 #28 shinobi: 嘿,Raptor。 是的,这就是为什么我在这里检查止损水平(来自上面的代码)。 所以在上一个例子中,止损被设置为76,也就是3*Spread +1。 这应该是足够远的,对吗? 是的,它应该......但我想知道你是否有一个四舍五入的问题,你是否需要四舍五入到最接近的0.25(S&P500以0.25步移动),以便你的SL与STOP_LEVEL相差0.25或更多...如果你明白我的意思? [删除] 2011.11.16 05:53 #29 好主意,但可惜这也没有帮助。 我的做法是这样的。 我首先写了一个自定义函数,将双数四舍五入到最近的两倍: double DoubleRound(double number, double step) { double mod = MathMod(number, step); if(mod < step/2.0) step = 0; double rounded = number - mod + step; return (rounded); } 它做了你所期望的事情。如果你用DoubleRound(1237.687360000)调用它,它会返回1237.50。 然后我在调用OrderModify之前在我的S/L上使用它。我使用了MODE_TICKVALUE,对于#ESZ1来说是0.25。 所以: //round to nearest Tickvalue SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKVALUE)); Log("SL: " + SL); if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) { Log("error="+GetLastError()); return(-1); } 在日志中你可以看到,四舍五入工作正常。然而,止损仍然被拒绝 :/ #ESZ1,M5: loaded successfully #ESZ1,M5: Date: 2011/11/16 7:44 #ESZ1,M5: Symbol: #ESZ1 #ESZ1,M5: Depot: 56364.95000000 #ESZ1,M5: Stop Level [Points]: 75.00000000 #ESZ1,M5: Freeze Level [Points]: 0.00000000 #ESZ1,M5: Spread [Points]: 25.00000000 #ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000 #ESZ1,M5: Point: 0.01000000 #ESZ1,M5: Tick Size: 0.25000000 #ESZ1,M5: Tick Value: 12.50000000 #ESZ1,M5: Digits: 2.00000000 #ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59 #ESZ1,M5: Opening Position #ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000 #ESZ1,M5: Spread 0.25000000 #ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok #ESZ1,M5: Order 13708089 Successfully Opened #ESZ1,M5: Stoplevel: 75.00000000 #ESZ1,M5: Freezelevel: 0.00000000 #ESZ1,M5: stoploss: 76.00000000 #ESZ1,M5: SL: 1237.50000000 #ESZ1,M5: error=130 我无法想象问题还能是什么!这个#130真的很顽固!!! Simon Gniadkowski 2011.11.16 08:46 #30 你开了一个卖盘 #ESZ1,M5: 打开#13708089卖出1.00 #ESZ1在1239.75确定 并试图在 它下面 设置一个SL . . #ESZ1,M5: SL: 1237.50000000 #ESZ1,M5: 错误=130 1234 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
但随后OrderModify失败。
下面的代码是在上一篇文章中的上述代码之后执行的。
日志是这样的。
#ESZ1,M5: 开盘位置
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: 位置大小: 1.00000000
#ESZ1,M5: Ask/Bid 1242.00000000/1241.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13679252 buy 1.00 #ESZ1 at 1242.00 ok
#ESZ1,M5: 订单13679252已成功打开
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: error=130
所以即使是先开仓然后设置止损,似乎也不起作用:-/。
点差为0.25
#ESZ1,M5: 点差0.25000000
好的,你在......1242.00(问价) 处开一个买入。
#ESZ1,M5: 打开#13679252买入1.00 #ESZ1在1242.00确定
#ESZ1,M5: 订单13679252已成功打开
然后你试着修改TP为买入价+2*点差,SL为 买入价-2*点差。
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
如果你的FreezeLevel是0.50,那就是你的问题了 ...你的FreezeLevel是多少?
同样的问题。订单在止损=0和止盈=0的情况下正常开仓。
但随后OrderModify失败。
没有为4/5位数的经纪人进行调整。不先开仓,然后设置止损。
正如之前回答的 那样
是的,你可能是在ECN经纪商那里交易,你必须用零止损开仓,然后在开仓后修改订单,所以50点的SL和TP是有问题的,所以像Raptor说的那样,也要检查freezelevel和stoplevel,以防万一。
同时检查你的OrderModify()代码....,也许它是这样工作的,但我觉得你应该在做OrderOpenPrice()之前用OrderSelect() 来选择订单。
唉,130号仍然在夜里困扰着我;)
这是我的下一个尝试:
正如你所看到的,我简化了这个例子,没有使用止盈。错误的发生肯定是由于止损,所以我们不需要止盈。
我首先用0止损(和止盈)开立订单,然后尝试用OrderModify设置止损。
在此之前,我检查了 Mode_Stoplevel和Mode_Freezelevel,如果需要的话,调整止损。(在日志中出现了一个调整,因为止损最初是50,但Mode_Stoplevel是75,然后我将止损设置为Mode_Stoplevel+1,所以是76)
RaptorUK和SDC:
MarketInfo(MODE_FREEZELEVEL)返回0。我不认为Freezelevel是问题所在。
我把输出结果纳入了日志文件。
SDC:
我还插入了一个OrderSelect,在调用OrderOpenPrice之前,只是想确定一下。在日志中你可以看到OrderSelect起作用了,否则代码不会进行到这一步(退出-1)。
WHRoeder。
我遵循SDC的简单例子。但我现在扩展了它,在设置止损时使用了4/5位数的调整,你可以看到上面的情况。你也可以看到,订单首先在止损和止盈设置为零的情况下开仓,然后用OrderModify设置止损。正如你在下面的日志中看到的,在S/L和T/P设置为零的情况下,订单成功打开,但我仍然无法在下一步用OrderModify设置S/L。
以下是完整的日志:
我真的很感谢你一直以来的帮助,我想我们正在缩小问题的范围:)
那么还有什么问题呢?还有什么我可以尝试的吗?
shinobi
点差为0.25
#ESZ1,M5: 点差0.25000000
好的,你在......1242.00(问价) 处开一个买入。
#ESZ1,M5: 打开#13679252买入1.00 #ESZ1在1242.00确定
#ESZ1,M5: 订单13679252已成功打开
然后你尝试修改TP为买入价+2*点差,SL为 买入价-2*点差。
你的STOP_LEVEL不是3*点差吗?你的止损太近了 . .
是的,这就是为什么我在这里检查 止损水平(来自上面的代码):
所以在上一个例子中,止损被设置为76,也就是3*Spread +1。
这应该是足够远的,对吗?
嘿,Raptor。
是的,这就是为什么我在这里检查止损水平(来自上面的代码)。
所以在上一个例子中,止损被设置为76,也就是3*Spread +1。
这应该是足够远的,对吗?
我的做法是这样的。
我首先写了一个自定义函数,将双数四舍五入到最近的两倍:
它做了你所期望的事情。如果你用DoubleRound(1237.687360000)调用它,它会返回1237.50。
然后我在调用OrderModify之前在我的S/L上使用它。我使用了MODE_TICKVALUE,对于#ESZ1来说是0.25。
所以:
在日志中你可以看到,四舍五入工作正常。然而,止损仍然被拒绝 :/
我无法想象问题还能是什么!这个#130真的很顽固!!!
你开了一个卖盘
#ESZ1,M5: 打开#13708089卖出1.00 #ESZ1在1239.75确定
并试图在 它下面 设置一个SL . .
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: 错误=130