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

 

Мне нужно почитать о MathFloor и вашей ссылке - это все новое для меня и я пытаюсь понять это. Займусь этим завтра.

Спасибо, ребята!

 
         if(Bid == btp-OrderOpenPrice()/2+OrderOpenPrice()){ // need to double check this.
               
               
         double  minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                 lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                 Lots    = OrderLots(),
                 half_close = MathFloor(Lots/2/lotStep)*lotStep;
                 
                    
               
         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)
               if (half_close > minLot)

                
               CloseHalfLong = OrderClose(OrderTicket(),half_close,Bid,3,CLR_NONE);
               if(CloseHalfLong!=TRUE)Print("LastError = ", GetLastError());
         }
         } 
Не мог бы кто-нибудь подсказать мне, где я ошибаюсь? Только сейчас начал разбираться с этим. Кроме строки, где я написал примечание, не мог бы кто-нибудь указать мне правильное направление?
 
Есть идеи?
 
DomGilberto:
Есть идеи?
Вы хотите закрыть половину OrderLots() ? но как вы можете использовать OrderLots() до того, как вы выбрали ордер?
 
Упс - да, я разобрался с этим, лол. Но это ничего не изменило?

Я что-то упустил?
 
DomGilberto:
Упс - да, разобрался, лол. Но это ничего не изменило?

Я что-то упустил?

Почему вы делаете следующее, даже если ваш OrderSelect() потерпел неудачу?

if(OrderMagicNumber()==MagicNumber)
             if(OrderSymbol()==Symbol())
              if(OrderType()==OP_BUYSTOP)
               if (half_close > minLot)

Вы не закрываете отложенный ордер, что вам сообщило ваше сообщение об ошибке?

 

Я полагаю, что вы пытаетесь выбрать одну и ту же сделку дважды.

Разве это не должно быть просто "else"?

else if(OrderSelect(q,SELECT_BY_POS,MODE_TRADES)==false){

Вы можете получить противоречивые сообщения, если при первой попытке выбрать сделку она не удалась, а при второй - удалась.

 
Я не получаю никаких ошибок...

Я начинаю немного расстраиваться... Я продолжаю получать "OrderModify error 1" - но я рассмотрю это позже. Кроме этого, ничего!
            if(OrderSelect(NewOrder,SELECT_BY_TICKET,MODE_TRADES)==true){
              Print(" Stop loss value for the order is ", OrderStopLoss());
              Print("lots for the order ",OrderLots());
            }
            else if(OrderSelect(NewOrder,SELECT_BY_TICKET,MODE_TRADES)==false){
              Print(" OrderSelect failed error code is ",GetLastError());
            }
            
            double  minLot = MarketInfo(Symbol(), MODE_MINLOT),
            lotStep     = MarketInfo(Symbol(), MODE_LOTSTEP),
            sizeCurr    = OrderLots(),
            sizeClose   = MathFloor(sizeCurr/lotStep)*lotStep/2,
            sizeRem     = sizeCurr - sizeClose;
           //if (sizeClose < minLot)                                     return(false);
            //if (sizeRem   < minLot){ sizeClose = sizeCurr;
                 
           if(OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice() == Bid) // Does this make sense? I am wanting this "if" statement to be true, if price (bid) reaches the price in this comparison statement?

             if(OpenOrdersThisPair(Symbol())==1)
               
               CloseHalfLong = OrderClose(OrderTicket(),sizeClose,Bid,3,CLR_NONE);
                
                if(CloseHalfLong!=TRUE)Print("Last Error = ", GetLastError());
         
         } 
У меня
сложилось впечатление, что MathFloor просто округляет ответ до целого числа? Поэтому я не уверен, что MathFloor верен? Брокеры, которыми я пользуюсь, используют 0.01 в качестве шага лота... (IBFX, чтобы начать с форвард-тестирования - так что нано размер)
 
DomGilberto:
Я не получаю никаких ошибок...

Я начинаю немного расстраиваться... Я продолжаю получать "OrderModify error 1" - но я рассмотрю это позже. Кроме этого, ничего! У меня сложилось впечатление, что MathFloor просто округляет ответ до целого числа? Поэтому я не уверен, правильно ли работает MathFloor? Брокеры, которыми я пользуюсь, используют 0.01 в качестве шага лота... (IBFX, чтобы начать с форвардного тестирования - так что нано размер)

Я дал вам код, который будет работать, почему вы не используете его? Почему вы не распечатываете свои переменные, чтобы увидеть, что происходит? У вас нет OrderModify() в коде, который вы разместили, как это связано? Как я уже сказал... почему вы вызываете торговые функции, которые полагаются на OrderSelect(), если OrderSelect() потерпел неудачу?

Прекратите кодировать, посмотрите на свой код, прочитайте его построчно, поймите, что он на самом деле делает, и если это не то, что вы задумали, то у вас есть проблема, которую нужно исправить.

 

Округляет ли MathFloor десятичные знаки до ближайшего целого числа?

Имеет ли смысл использовать FirstTarget в качестве пользовательского параметра в "OrderClose()" - Если предположить, что "sizeClose" был правильным? (см. процитированный код)

Ваш код не помог - извините.

Можете ли вы вывести пользовательские переменные? Если да, то я, должно быть, делаю это неправильно, поскольку они не отображаются в журнале.

OrderModify не имеет значения, вы правы.

           double FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();
              CloseHalfLong = OrderClose(OrderTicket(),sizeClose,FirstTarget,3,CLR_NONE);
Причина обращения: