关闭半数地段。

 

所以我设法加入了一个循环,删除了挂单,并在止损点与移动平均线同步的基础上重新应用另一个挂单。手数将根据进场到止损的点位距离来计算。不仅如此,我还设法解决了利润目标与止损距离的比率问题(extern int - 我选择1-2-3 R;R等的东西)--所以这也会移动。

因此,感谢大家在以前的帖子中对打印出我的代码和其他零碎内容的评论!不管怎样--我正试图平仓。


总之--我试图在价格达到我的2倍比率盈利目标的50%时平掉一半的头寸......。我知道我需要把东西打印到日志中,我现在正在写,但谁能告诉我,我是否写错了?也许是关于 "OrderLots()/2 "的问题?

"btp"=返回一个特定的价格。

         if(Bid == btp-OrderOpenPrice()/2+OrderOpenPrice()){
         
         for(int q=OrdersTotal()-1; q >=0; q--)
         {
            if(OrderSelect(q,SELECT_BY_POS,MODE_TRADES)==true){
              Print(" Stop loss value for the order is ", OrderStopLoss());
              Print("lots for the order ",OrderLots());
            }
            else if(OrderSelect(q,SELECT_BY_POS,MODE_TRADES)==false){
              Print(" OrderSelect failed error code is ",GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
             if(OrderSymbol()==Symbol())
              if(OrderType()==OP_BUYSTOP)
               
               CloseHalfLong = OrderClose(OrderTicket(),OrderLots()/2,Bid,3,CLR_NONE);
         
            if(CloseHalfLong!=TRUE)Print("LastError = ", GetLastError());
         }
         }
 
DomGilberto:

所以我设法加入了一个循环,删除了挂单,并在止损点与移动平均线同步的基础上重新应用另一个挂单。手数将根据进场到止损的点位距离来计算。不仅如此,我还设法解决了利润目标与止损距离的比率问题(extern int - 我选择1-2-3 R;R等的东西)--所以这也会移动。

因此,感谢大家在以前的帖子中对打印出我的代码和其他零碎内容的评论!


总之--我试图在价格达到2倍比率利润目标的50%时平掉一半的头寸...。我知道我需要把东西打印到日志中,我现在正在写,但谁能告诉我,我是否写错了?也许是关于 "OrderLots()/2 "的问题?

"btp" = 返回一个特定的价格。

我不认为OrderLots()/2在所有情况下都能解决问题(请原谅双关语),我很确定你需要根据MarketInfo()的MODE_LOTSTEP和MODE_MINLOT来验证你想要关闭的头寸大小。

看这里:https://www.mql5.com/en/forum/143966

 
RaptorUK: 我不认为OrderLots()/2在所有情况下都能解决问题(请原谅双关语),我很确定你需要根据MarketInfo()的MODE_LOTSTEP和MODE_MINLOT来验证你想要关闭的头寸大小。
正是如此。见我的CloseOrder()
 

谢谢RaptorUK--不知道我在你的链接上寻找WHOeder,但是谢谢。

是我的问题,还是在未平仓的情况下平仓的过程有点违反直觉......考虑到我想做的事情,似乎是不必要的复杂......

伙计,我想我今天已经看够了这段代码--我不明白我是如何使用MarkerInfo()与OrderClose的......这似乎不必要的复杂。

 
DomGilberto:

谢谢RaptorUK--不知道我在你的链接上寻找WHOeder,但是谢谢。

是我的问题,还是在未平仓的情况下平仓的过程有点违反直觉......考虑到我想做的事情,似乎是不必要的复杂......

伙计,我想我今天已经看够了这段代码--我不明白我是如何使用MarkerInfo()与OrderClose的......这似乎不必要的复杂。

如果你的订单头寸大小是0.3手,你想关闭一半,那就是0.15手,如果你的经纪商的MODE_LOTSTEP是0.1,那么0.15就是一个无效的手数......所以在你使用OrderClose()之前要验证你要关闭的头寸大小。
 
啊,我知道了!谢谢RaptorUK!最后一个问题,当你说验证手数时,你是说用If语句进行比较吗?
 
DomGilberto: 我不知道我在你的链接上看到的是什么,但谢谢。
该页最上面的链接
 
Ah gotchya!那是一些史诗般的编码... :o!

我希望有一天我也能保持这样的编程水平...(以你的名义多一点耐心--只是开玩笑 :P)


谢谢WHRoeder!
 
DomGilberto:
啊,我明白了!谢谢RaptorUK!最后一个问题,当你说验证手数时,你是说用If语句进行比较吗?

不,我是说调整它,使其符合MODE_LOTSTEP和MODE_MINLOT ......那么它就是有效的(验证的),如果你看我发布的链接......。

mlots = MathFloor(mlots / lotstep) * lotstep; 

假设mlots是0.15 mlots(MODE_MINLOT)是0.1,lotstep(MODE_LOTSTEP)是0.1,所以代码会这样做

mlots = MathFloor(0.15 / 0.1) * 0.1; 
//  MathFloor(0.15 / 0.1) ==  MathFloor( 1.5 )  gives 1

//  mlots = 1 * 0.1;  

所以mlots将从0.15调整到0.1,并且是有效的。

 
啊,说对了!谢谢你澄清这一点--我明白了!