Fechamento de meio lote. - página 2

 

Preciso ler no MathFloor e sua ligação lá - tudo isso é novo para mim e estou lutando para entendê-lo. Amanhã, eu vou lidar com isso.

Obrigado, pessoal!

 
         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());
         }
         } 
Alguém poderia me dar uma pequena orientação sobre onde estou errado? Comecei agora mesmo a dar uma olhada nisto. Além da linha onde escrevi uma nota, alguém poderia me indicar a direção certa?
 
Alguma idéia?
 
DomGilberto:
Alguma idéia?
Você quer fechar metade do OrderLots() ? mas como você pode usar OrderLots() antes de ter selecionado um OrderLots() ?
 
Whoops - sim, ordenou rs. Mas isso não mudou nada?

Está me faltando alguma coisa?
 
DomGilberto:
Whoops - sim, resolveu isso rs. Mas isso não mudou nada?

Está me faltando alguma coisa?

Por que você está fazendo o seguinte, mesmo que seu OrderSelect() tenha falhado?

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

Você não fecha uma ordem pendente, o que o seu relatório de erro lhe diz ?

 

Creio que você está tentando selecionar a mesma profissão duas vezes

isto não deveria ser apenas "outra coisa"?

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

você pode receber mensagens contraditórias se a primeira vez que você tentar selecionar a profissão, ela falhará, mas terá sucesso na 2ª vez.

 
Não estou recebendo nenhum erro...

Estou ficando um pouco frustrado com isso... Continuo recebendo "OrderModify error 1" - mas vou analisar isso mais tarde. Fora isso, nada!
            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());
         
         } 
Tive a impressão de que o MathFloor apenas arredonda a resposta para o número inteiro? Então, não tenho certeza se o MathFloor está correto? Os corretores que estou usando usarão 0,01 como um passo de lote. (IBFX para começar no teste de avanço - então tamanho nano)
 
DomGilberto:
Eu não estou recebendo nenhum erro...

Estou ficando um pouco frustrado com isso... Continuo recebendo "OrderModify error 1" - mas vou analisar isso mais tarde. Tirando isso, nada! Tive a impressão de que o MathFloor apenas arredonda a resposta para o número inteiro? Então, não tenho certeza se o MathFloor está correto? Os corretores que estou usando usarão 0,01 como um passo de lote. (IBFX para começar no teste de avanço - então tamanho nano)

Eu lhe dei um código que vai funcionar, por que você não está usando-o? por que você não está imprimindo suas variáveis para ver o que está acontecendo? você não tem uma OrderModify() no código que você postou, como é relevante? como eu já disse ... por que você está chamando funções de negociação que dependem da OrderSelect() se a OrderSelect() falhou?

Pare de codificar, olhe seu código, leia-o linha por linha, entenda o que ele está realmente fazendo e se não é o que você pretendia, então você tem um problema que precisa consertar.

 

O MathFloor arredonda as casas decimais para o número INTEGRAL mais próximo?

FirstTarget faz sentido como parâmetro personalizado dentro de "OrderClose()" - Assumindo que "sizeClose" estava correto? (veja código citado)

Seu código não ajudou - desculpe.

Você pode imprimir variáveis personalizadas? Se sim, devo estar fazendo isso errado, pois não está aparecendo na revista.

OrderModify não é relevante, você está certo.

           double FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();
              CloseHalfLong = OrderClose(OrderTicket(),sizeClose,FirstTarget,3,CLR_NONE);