需要帮助解决错误#130无效止损的问题 - 页 3

 
同样的问题。该订单在止损=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

所以即使是先开仓然后设置止损,似乎也不起作用:-/。
 

点差为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是多少?

 
shinobi:
同样的问题。订单在止损=0和止盈=0的情况下正常开仓。
但随后OrderModify失败。

没有为4/5位数的经纪人进行调整。不先开仓,然后设置止损。

正如之前回答的 那样

 

是的,你可能是在ECN经纪商那里交易,你必须用零止损开仓,然后在开仓后修改订单,所以50点的SL和TP是有问题的,所以像Raptor说的那样,也要检查freezelevel和stoplevel,以防万一。

同时检查你的OrderModify()代码....,也许它是这样工作的,但我觉得你应该在做OrderOpenPrice()之前用OrderSelect() 来选择订单。

 
再次感谢您的帮助!
唉,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
 
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
 
嘿,猛禽,

是的,这就是为什么我在这里检查 止损水平(来自上面的代码):

   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

所以在上一个例子中,止损被设置为76,也就是3*Spread +1。
这应该是足够远的,对吗?
 
shinobi:
嘿,Raptor。

是的,这就是为什么我在这里检查止损水平(来自上面的代码)。


所以在上一个例子中,止损被设置为76,也就是3*Spread +1。
这应该是足够远的,对吗?
是的,它应该......但我想知道你是否有一个四舍五入的问题,你是否需要四舍五入到最接近的0.25(S&P500以0.25步移动),以便你的SL与STOP_LEVEL相差0.25或更多...如果你明白我的意思?
 
好主意,但可惜这也没有帮助。
我的做法是这样的。

我首先写了一个自定义函数,将双数四舍五入到最近的两倍:
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真的很顽固!!!
 

你开了一个卖盘

#ESZ1,M5: 打开#13708089卖出1.00 #ESZ1在1239.75确定

并试图下面 设置一个SL . .

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: 错误=130