Fechamento de meio lote. - página 8

 
DomGilberto:

Isto é impresso no Diário durante meu loop for, onde, no caso de uma ordem de parada de compra pendente, se o 60 EMA for > do que o OrderStopLoss, ele fechará a ordem pendente, abrirá um novo SL (que está atrás do 60EMA), ajustará o take profit para entreter a recompensa 1:2, e mudará os lotes relativos à parada em pontos e meu perfil de risco (digamos 2%).

Então, quando tudo isto está sendo feito, o "Lotes Atuais" que é a variável personalizada "LotSize" dentro da OrderSend funciona, está enviando um tamanho de lote que não é correto para o servidor receber? "0.18215"? Isto poderia ser um problema, apesar dos pedidos serem realmente enviados de qualquer maneira - esta pergunta é mais em conexão com "poderia esta ser a razão pela qual eu não posso chamar "OrderType==OP_BUY"?

Você deveria corrigir isso, validar o tamanho do lote da mesma forma que você já tem . . . você poderia até mesmo codificar uma função separada para fazê-lo com base no código que você já tem . . . por exemplo:

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

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


Ao invés de usar LotSize em seu OrderSend() você usaria ValidateLots(LotSize)

Eu duvido que isso esteja causando seu problema, no entanto . . .

 
Hmm - sim, eu acabei de brincar com isso. Parece que a ordem só é enviada porque o servidor permite apenas 0,00 (2 casas decimais) de qualquer forma. Portanto, os dígitos restantes são quase irrelevantes.

Argh! Tão frustrante rs - presa nisto por muito tempo agora :(

Não vejo porque isto é um problema e não posso selecionar um "OP_BUY"... Eu sei que provavelmente já esgotei este tópico, mas qualquer última facada no escuro seria muito apreciada - obrigado por me ajudar também!!
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:
Hmm - sim, acabei de brincar com isso. Parece que a ordem só é enviada porque o servidor permite apenas 0,00 (2 casas decimais) de qualquer forma. Portanto, os dígitos restantes são quase irrelevantes.

Argh! Tão frustrante rs - presa nisto por muito tempo agora :(

Não vejo porque isto é um problema e não posso selecionar um "OP_BUY"... Eu sei que provavelmente já esgotei este tópico, mas qualquer última facada no escuro seria muito apreciada - obrigado por me ajudar também!!

Eu acho que você precisa mostrar todo o seu código . . .

Vejo aqui alguns problemas:

      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() ?
 
Todo o código não caberá aqui? Mas eu o coloquei em pastebin?

-http://pastebin.com/eaY1wKbN

Desculpe a sintaxe - um pouco mais difícil de ver tudo, mas eles não têm MQL4? Então coloque-a em C++
 
DomGilberto:
Todo o código não vai caber aqui? Mas eu o coloquei no pastebin?

-http://pastebin.com/eaY1wKbN

Desculpe pela sintaxe - um pouco mais difícil de ver tudo, mas eles não têm MQL4? Então coloque-a em C++

Sem problemas . . .

Quando você faz isto . . .

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

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

. qual ordem está selecionada ? foi a ordem pendente ? sua OrderSelect() falhará se sua OrderTicket() falhar, a menos que você já tenha uma ordem selecionada. Você realmente precisa deste código ? mais tarde você tem um laço onde você seleciona as ordens e verifica seu símbolo e número mágico e digita . .

Isto também precisa ser corrigido. . .

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

. ad algumas chaves . . .

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

Ok - Eu deixei mais impressões para obter um pouco de clareza sobre o que está sendo feito e qual o ponto. Coloquei abaixo.

A linha onde diz "Order Select for closing:-..." é o que está sendo selecionado no ponto "Close OP_BUY Half Lots @ 1:1 Function" que você perguntou acima. Parece que o número do bilhete é diferente neste ponto de seleção? Eu tinha excluído a parte "...&& OrderType()==OP_BUY" dela, pois parece imprimir o resto quando esta parte não está na declaração "se"... Isto dá um pouco mais de clareza?

"First Buy Order Placed:-" é a primeira função OrderSend a passar no início
"Checking Buy Order:-" é aquele dentro do loop para excluir e reabrir o pedido pendente se o MA for > o OrderStopLoss().
"NEW BUY ORDER:-" é o novo pedido que está sendo colocado dentro do laço.
"Order Select for closing:-..." - como já mencionado acima, esta é a parte que está sendo selecionada para fechar a metade dos lotes.

Desculpe se isto foi confuso, pois acabei de acrescentar estas peças - você não verá isto dentro daquele link de pastebin acima... apenas simples funções de impressão :)

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:

Ok - Eu deixei mais impressões para obter um pouco de clareza sobre o que está sendo feito e qual o ponto. Coloquei abaixo.

A linha onde diz "Order Select for closing:-..." é o que está sendo selecionado no ponto "Close OP_BUY Half Lots @ 1:1 Function" que você perguntou acima. Parece que o número do bilhete é diferente neste ponto de seleção? Eu tinha excluído a parte "...&& OrderType()==OP_BUY" dela, pois parece imprimir o resto quando esta parte não está na declaração "se"... Isto dá um pouco mais de clareza?

"First Buy Order Placed:-" é a primeira função OrderSend a passar no início
"Checking Buy Order:-" é aquele dentro do loop para excluir e reabrir o pedido pendente se o MA for > o OrderStopLoss().
"NEW BUY ORDER:-" é o novo pedido que está sendo colocado dentro do laço.
"Order Select for closing:-..." - como já mencionado acima, esta é a parte que está sendo selecionada para fechar a metade dos lotes.

Desculpe se isto foi confuso, pois acabei de acrescentar estas peças - você não verá isto dentro daquele link de pastebin acima... apenas simples funções de impressão :)


Tente o anexo . . . é o meu melhor palpite para o que você está tentando fazer . .
Arquivos anexados:
dom.mq4  24 kb
 

Ah fantástico - obrigado. É um grande passo na direção certa. Acho que por estar dentro de um loop, quer fechar pela metade e pela metade e pela metade ao preço. Ao invés de fazer isso apenas uma vez? Não só isso, mas parece que não fecha pela metade assim que o preço >= ao preço de saída que eu quero, ao invés disso, vai além dele, e então quando o preço volta mais baixo ao preço de saída que eu quero, ele fecha então - estranho... Aprecie sua paciência em me ajudar! Muito grato por seu tempo!!


ATUALIZAÇÃO: Também, acabei de descobrir, que se eu mudar as propriedades do especialista (int externo) antes de executar o testador de estratégia, então a metade fechada não funciona - coisas que afetam a metade fechada é "MA_PadAmount", isto é quantos pontos eu quero adicionar como um bloco para a parada de perda que segue em pips, e "OrderPrice_PadAmount", que me permite especificar quantos pips eu posso colocar como bloco no preço de entrada dos pedidos...

 
DomGilberto:
Ah fantástico - obrigado. É um grande passo na direção certa. Acho que por estar dentro de um loop, quer fechar pela metade e pela metade e pela metade ao preço. Ao invés de fazer isso apenas uma vez? Não só isso, mas parece não fechar pela metade assim que o preço >= ao preço de saída que eu quero, ao invés disso, vai além dele, e então, quando o preço volta mais baixo ao preço de saída que eu quero, ele fecha então - estranho... Aprecie sua paciência em me ajudar! Muito grato por seu tempo!!
Não é o loop for loop, só que não tem como saber que a metade já foi fechada ... como você planejava lidar com isso?
 
Sim - Eu literalmente percebi isso quando removi o loop for. Estou certo em dizer que se eu rastrear o número OrderTicket desde quando ele é selecionado pela primeira vez, uma vez que o OrderClose tenha feito sua coisa e retornado verdadeiro, então eu poderia verificar isso com o número OrderTicket, pois eles serão diferentes - quebrando assim o laço e esperando até que outra nova ordem chegue?

Não tenho certeza absoluta de como escrever isso, mas isso está mais ou menos nas linhas certas?