Закрытие половинных участков. - страница 8

 
DomGilberto:

Это печатается в журнале во время моего цикла for, где в случае отложенного ордера Buy Stop, если 60 EMA >, чем OrderStopLoss, он закроет отложенный ордер, откроет новый с новым SL (который находится за 60EMA), настроит тейк-профит для получения вознаграждения 1:2, и изменит лоты относительно стопа в пунктах и моего профиля риска (скажем, 2%).

Итак, когда все это делается, пользовательская переменная "Current Lots", которая является "LotSize" в OrderSend работает, она отправляет размер лота, который не является правильным для сервера, чтобы получить "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);
   }


Вместо использования LotSize в OrderSend() вы бы использовали ValidateLots(LotSize)

Я сомневаюсь, что это вызывает вашу проблему. ...

 
Хмм - да, я только что поиграл с этим. Похоже, что заказ просто отправляется, поскольку сервер в любом случае допускает только 0.00 (2 знака после запятой). Так что остальные цифры почти не имеют значения.

Ужас! Так обидно lol - застрял на этом слишком долго :(

Я не могу понять, почему это проблема, и я не могу выбрать "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 знака после запятой). Так что остальные цифры почти не имеют значения.

Ужас! Так обидно lol - застрял на этом слишком долго :(

Я не могу понять, почему это проблема, и я не могу выбрать "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)
     {

...какой ордер уже выбран? Это был отложенный ордер? Ваш OrderSelect() потерпит неудачу, если ваш OrderTicket() потерпит неудачу, если у вас уже нет выбранного ордера. Действительно ли вам вообще нужен этот код? Позже у вас есть цикл, в котором вы выбираете ордера и проверяете их символ, магический номер и тип...

Это тоже нужно исправить...

         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());
                 }
              }
 

Хорошо - я сделал больше отпечатков, чтобы получить немного ясности о том, что делается и в какой момент. Я вставил их ниже.

Строка, где говорится "Выбор ордера для закрытия:-...", это то, что выбирается в точке "Close OP_BUY Half Lots @ 1:1 Function", о которой вы спрашивали выше. Получается, что номер тикета в этой точке выбора другой? Я удалил часть "...&& OrderType()==OP_BUY" из него, так как он, кажется, печатает остальное, когда эта часть не находится в операторе "if"... Дает ли это немного больше ясности?

"First Buy Order Placed:-" - это первая функция OrderSend, проходящая в самом начале.
"Checking Buy Order:-" - это функция внутри цикла for для удаления и повторного открытия отложенного ордера, если MA > OrderStopLoss().
"NEW BUY ORDER:-" - это новый ордер, размещаемый внутри цикла for.
"Order Select for closing:-..." - как уже упоминалось выше, это часть, которая выбирается для закрытия половины лотов.

Извините, если это было непонятно, поскольку я только что добавил эти части - вы не увидите этого в той ссылке на pastebin выше... просто простые функции печати :)

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:

Хорошо - я сделал больше отпечатков, чтобы получить немного ясности о том, что делается и в какой момент. Я вставил их ниже.

Строка, где говорится "Выбор ордера для закрытия:-...", это то, что выбирается в точке "Close OP_BUY Half Lots @ 1:1 Function", о которой вы спрашивали выше. Получается, что номер тикета в этой точке выбора другой? Я удалил часть "...&& OrderType()==OP_BUY" из него, так как он, кажется, печатает остальное, когда эта часть не находится в операторе "if"... Дает ли это немного больше ясности?

"First Buy Order Placed:-" - это первая функция OrderSend, проходящая в самом начале.
"Checking Buy Order:-" - это функция внутри цикла for для удаления и повторного открытия отложенного ордера, если MA > OrderStopLoss().
"NEW BUY ORDER:-" - это новый ордер, размещаемый внутри цикла for.
"Order Select for closing:-..." - как уже упоминалось выше, это часть, которая выбирается для закрытия половины лотов.

Извините, если это было непонятно, поскольку я только что добавил эти части - вы не увидите этого в той ссылке на pastebin выше... просто простые функции печати :)


Попробуйте прикрепить... это мое лучшее предположение о том, что вы пытаетесь сделать...
Файлы:
dom.mq4  24 kb
 

Потрясающе - спасибо. Это большой шаг в правильном направлении. Я думаю, потому что это внутри цикла for, он хочет закрыть половину и половину и половину @ цены... вместо того, чтобы сделать это один раз? Не только это, но кажется, что он не закрывает половину, как только цена >= до нужной мне цены выхода, вместо этого он выходит за ее пределы, а затем, когда цена качается обратно ниже до нужной мне цены выхода, он закрывается тогда - странно... Ценю ваше терпение в помощи мне! Очень благодарен за ваше время!!!


UPDATE: Также, я только что выяснил, что если я изменю свойства эксперта (extern int) перед запуском тестера стратегий, то закрытие половины вообще не работает - вещи, которые влияют на закрытие половины это "MA_PadAmount" это сколько пунктов я хочу добавить в качестве прокладки к стоп лоссу, который отслеживается в пунктах, и "OrderPrice_PadAmount", который позволяет мне указать сколько пунктов я могу добавить в качестве прокладки к цене входа ордеров....

 
DomGilberto:
Потрясающе - спасибо. Это большой шаг в правильном направлении. Я думаю, потому что это внутри цикла for, он хочет закрыть половину и половину и половину @ цены... вместо того, чтобы сделать это один раз? Не только это, но кажется, что он не закрывает половину, как только цена >= до нужной мне цены выхода, вместо этого он выходит за ее пределы, а затем, когда цена качается обратно ниже до нужной мне цены выхода, он закрывается тогда - странно... Ценю ваше терпение в помощи мне! Очень благодарен за ваше время!!!
Это не цикл for, просто у него нет возможности узнать, что половина уже была закрыта... как вы планируете с этим справиться?
 
Да - я буквально только что понял это, когда удалил цикл for. Правильно ли я понимаю, что если я буду отслеживать номер OrderTicket с момента его первого выбора, как только OrderClose сделает свое дело и вернет true, тогда я смогу проверить это с помощью номера OrderTicket, так как они будут отличаться - таким образом, я прерву цикл и буду ждать, пока не придет другой новый заказ?

Не совсем уверен, как это написать, но примерно так?