关闭半数地段。 - 页 8

 
DomGilberto:

在我的for循环中,在买入止损单的情况下,如果60EMA大于OrderStopLoss,它将关闭挂单,用新的SL(在60EMA后面)打开一个新的订单,调整止盈以获得1:2的回报,并改变相对于止损点的手数和我的风险状况(例如2%)。

因此,当这一切都在进行时,"当前手数 "也就是OrderSend中的 "LotSize "自定义变量是有效的,但它发送的手数对服务器来说是不正确的?"0.18215"?这可能是一个问题,尽管订单实际上是通过发送的 - 这个问题更多的是与 "这可能是我不能调用 "OrderType==OP_BUY "的原因?

你应该解决这个问题,用你已有的方法验证手数大小 ......你甚至可以在你已有的代码的基础上编写一个单独的函数 来做。

double ValidateLots(double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   MinLot  = MarketInfo(Symbol(), MODE_MINLOT);
   
   return( MathFloor(PositionSize / LotStep) * LotStep);
   }


在你的OrderSend()中不使用LotSize,而是使用ValidateLots(LotSize)

不过我怀疑这是否会导致你的问题 ......

 
嗯--是的,我刚刚玩了一下。看来,订单只是被发送,因为服务器只允许0.00(小数点后2位)。所以剩下的数字几乎是不相关的。

啊!真让人沮丧啊!--在这个问题上卡了太久了:(

我不明白为什么这是一个问题,我不能选择一个 "OP_BUY"...我知道我可能已经用尽了这个话题,但如果能在黑暗中找到任何最后的线索,我将非常感激--也谢谢你对我的帮助!!
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)
      
      if(OpenOrdersThisPair(Symbol())==0)  //--//<--- No order open = then open one...
      {
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
      
         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for(int b=OrdersTotal()-1; b >=0; b--) 
                  {
    
                     if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                     {
                     Print(" Stop loss value for the order is ", OrderStopLoss());
                     }
    
                     else if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
                     {
                     Print(" OrderSelect failed error code is ",GetLastError());
                     }
                     if(OrderMagicNumber()==MagicNumber)
                        if(OrderSymbol()==Symbol())
                           if(OrderType()==OP_BUYSTOP)
                              if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
                                //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
                                 }
                                  
                                 if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
                                  { 
                                  int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
                                  if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
                                  if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits), 
                                  " Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));  
                                  } 
                  }
             } 
       }
 
DomGilberto:
嗯--是的,我刚刚玩了一下。看来,订单只是被发送过去,因为服务器只允许0.00(小数点后2位)。所以剩下的数字几乎是不相关的。

啊!真让人沮丧啊!--在这个问题上卡了太久了:(

我不明白为什么这是一个问题,我不能选择一个 "OP_BUY"...我知道我可能已经用尽了这个话题,但如果能在黑暗中找到任何最后的线索,我将非常感激--也谢谢你对我的帮助!!

我认为你需要展示你所有的代码.. .

我在这里看到一些问题。

      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)    //  where is the OrderSelect() ?
 
所有的代码在这里都放不下?不过我已经把它放在了Pastebin上?

- http://pastebin.com/eaY1wKbN

很抱歉语法问题--有点难看,但他们没有MQL4?所以把它放在C++下
 
DomGilberto:
所有的代码在这里都放不下?不过我已经把它放到了Pastebin上?

- http://pastebin.com/eaY1wKbN

很抱歉语法的问题--有点难看,但他们没有MQL4?所以把它放在C++下

没问题 . . .

当你这样做时 . . .

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
     {

如果你的OrderTicket()失败,你的OrderSelect() 会失败,除非你已经有一个订单被选中。 你真的需要这段代码吗? 稍后你有一个循环,在那里你选择订单并检查它们的符号和魔法号码和类型。

这也需要修正。

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())

               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

         if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
            Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
            if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
           }

. . . 加入一些大括号 .. .

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

               if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
                 if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
                 }
              }
 

好吧--我把更多的印刷品打进去,以便更清楚地了解正在做什么和什么要点。我把它粘贴在下面。

上面写着 "选择关闭的订单:-...... "的那一行,就是你上面问的 "关闭OP_BUY半数手@1:1功能 "那一点被选择了。在这个选择点上,票号似乎是不同的?我已经删除了"...&&OrderType()==OP_BUY "部分,因为当这部分不在 "if "语句中时,它似乎会打印其余部分...这是否能让人更清楚一些?

"第一个买入订单:-"是第一个OrderSend函数 开始时的情况。
"检查买入订单:-"是for循环中的一个函数,如果MA>OrderStopLoss(),则删除并重新打开待定订单。
"新买入订单:-"是在for循环中放置的新订单。
"Order Select for closing:-..." - 正如上面已经提到的,这是选择关闭一半手数的部分。

对不起,如果你感到困惑,因为我刚刚添加了这些部分 - 你不会在上面的粘贴链接中看到这些...只是简单的打印功能 :)

2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
 
DomGilberto:

好吧--我把更多的印刷品打进去,以便更清楚地了解正在做什么和什么要点。我把它粘贴在下面。

上面写着 "选择关闭的订单:-...... "的那一行,就是你上面问的 "关闭OP_BUY半数手@1:1功能 "那一点被选择了。在这个选择点上,票号似乎是不同的?我已经删除了"...&&OrderType()==OP_BUY "部分,因为当这部分不在 "if "语句中时,它似乎会打印其余部分...这是否能让人更清楚一些?

"第一个买入订单:-"是第一个OrderSend函数开始时的情况。
"检查买入订单:-"是for循环中的一个函数,如果MA>OrderStopLoss(),则删除并重新打开待定订单。
"新买入订单:-"是在for循环中放置的新订单。
"Order Select for closing:-..." - 正如上面已经提到的,这是选择关闭一半手数的部分。

对不起,如果你感到困惑,因为我刚刚添加了这些部分 - 你不会在上面的粘贴链接中看到这些...只是简单的打印功能 :)


试试附件......这是我对你试图做什么的最佳猜测。
附加的文件:
dom.mq4  24 kb
 

啊,太棒了--谢谢你。这是向正确方向迈出的一大步。我想因为它是在一个for循环中,它想关闭一半和一半,一半@价格......。而不是只做一次?不仅如此,当价格>=到我想要的出场价格时,它似乎没有关闭一半,而是超越了它,然后当价格回落到我想要的出场价格时,它就关闭了--奇怪......感谢你耐心地帮助我!非常感谢您的时间!!


更新:另外,我刚刚发现,如果我在运行策略测试器 之前改变专家属性(extern int),那么平仓部分就完全不起作用了--影响平仓部分的东西是 "MA_PadAmount",这是我想给以点为单位的止损增加多少点,以及 "OrderPrice_PadAmount",它允许我指定在订单的进入价格上增加多少点作为垫子...

 
DomGilberto:
啊,太棒了--谢谢你。这是向正确方向迈出的一大步。我想因为它是在一个for循环中,它想关闭一半和一半,一半@价格......。而不是只做一次?不仅如此,当价格>=到我想要的出场价格时,它似乎没有关闭一半,而是超越了它,然后当价格回落到我想要的出场价格时,它就关闭了--奇怪......感谢你耐心地帮助我!非常感谢您的时间!!
这不是for循环的问题,只是它没有办法知道已经关闭了一半......你打算如何处理?
 
是的--我在删除 for循环的时候才发现。我是否可以这样说,如果我从第一次选择时就追踪订单号码,一旦OrderClose完成了它的工作并返回true,那么我就可以用订单号码来验证,因为它们是不同的--这样就可以打破循环,等到另一个新的订单来时再进行验证?

我不完全确定该怎么写,但这大致上是正确的思路吗?