Fechamento de meio lote. - página 18

 


Ok (ATUALIZAR!) então basicamente, eu me livrei do fechamento contínuo de "metade de metade de metade de metade etc." nos lotes quando o segundo OrderClose() é chamado (onde a declaração é toda azul se - aparentemente isto funciona ok!) - COMO, eu NÃO quero que isto seja chamado TUDO, a menos que a função FIRST OrderClose() seja "True" e tenha sido bem sucedida. "Close_Half_Order_Buy==True" também não funciona...

Adoraria a ajuda de alguém para terminar isto :)

( Eu removi muitas das "Impressões", por uma questão de clareza na carne do código).

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
Alguém?
 
DomGilberto:


Ok (ATUALIZAR!) então basicamente, eu me livrei do fechamento contínuo de "metade de metade de metade de metade etc." nos lotes quando o segundo OrderClose() é chamado (onde a declaração é toda azul se - aparentemente isto funciona ok!) - COMO, eu NÃO quero que isto seja chamado TUDO, a menos que a função FIRST OrderClose() seja "True" e tenha sido bem sucedida. "Close_Half_Order_Buy==True" também não funciona...

Adoraria a ajuda de alguém para terminar isto :)

O seguinte código compila (declarando a variável MagicNumber e comentando a função MoveToBreakEven()), mas não era testado.

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

O código acima assume que apenas um pedido é colocado por par de moedas.

 

Omg muito obrigado por sua ajuda! Eu realmente agradeço :)

Você se importaria de me ajudar com uma última coisa; no momento eu tenho uma meta de lucro de 1:2 (TP difícil). Na verdade, eu quero remover isto da ordem. Entretanto, como você pode ver acima, as funções OrderClose() relevantes estão usando as funções OrderTakeProfit() para calcular onde as funções OrderClose() devem fechar.

Minha pergunta é: existe uma maneira de armazenar o preço OrderTakeProfit(), mas ao invés de tê-lo fixado na ordem, eu quero fechar uma quantidade definida de lotes usando OrderClose() @ o preço OrderTakeProfit()? A razão é porque às vezes eu terei uma negociação que vai gerar enormes ganhos, mas como eu tenho OrderTakeProfit() fixado com o pedido aberto, todos os lotes vão fechar lá fora e eu quero fechar apenas parcialmente alguns lotes a esse preço de saída. Eu uso uma parada para os grandes corredores. Espero que isso faça sentido?

É isso mesmo! Então estou pronto e polvilhado! Finalmente!

ATUALIZAÇÃO: O código acima é uma boa maneira de escrevê-lo. Tive uma pequena brincadeira, mas não está fechando na ordem correta. Ele ainda só fecha pela metade do que vem primeiro. É mais ou menos o mesmo que eu tinha antes de usar o datetime estático? Alguma idéia?

 
(sentindo como se eu tivesse esgotado este fio)

Eu literalmente tenho essas duas últimas perguntas acima e isso é feito? Tudo que eu preciso saber é como posso armazenar o preço OrderTakeProfit(), para que quando eu o modificar, eu ainda possa usar esse preço exato para fazer um OrderClose()? Será que um Double Static funciona?
 
DomGilberto:

ATUALIZAÇÃO: O código acima é uma boa maneira de escrevê-lo. Tive uma pequena brincadeira, mas não está fechando na ordem correta. Ele ainda só fecha pela metade do que vem primeiro. É mais ou menos o mesmo que eu tinha antes de usar o datetime estático? Alguma idéia?

Poste qualquer mudança que você tenha feito no código acima e poste entradas de log/jornal (ou capturas de tela).

 
DomGilberto:

Omg muito obrigado por sua ajuda! Eu realmente agradeço :)

Você se importaria de me ajudar com uma última coisa; no momento eu tenho uma meta de lucro de 1:2 (TP difícil). Na verdade, eu quero remover isto da ordem. Entretanto, como você pode ver acima, as funções OrderClose() relevantes estão usando as funções OrderTakeProfit() para calcular onde as funções OrderClose() devem fechar.

Minha pergunta é: existe uma maneira de armazenar o preço OrderTakeProfit(), mas em vez de tê-lo fixado na ordem, eu quero fechar uma quantidade definida de lotes usando OrderClose() @ o preço OrderTakeProfit()? A razão é porque às vezes eu terei uma negociação que vai gerar enormes ganhos, mas como eu tenho OrderTakeProfit() fixado com o pedido aberto, todos os lotes vão fechar lá fora e eu quero fechar apenas parcialmente alguns lotes a esse preço de saída. Eu uso uma parada para os grandes corredores. Espero que isso faça sentido?

É isso mesmo! Então estou pronto e polvilhado! Finalmente!

ATUALIZAÇÃO: O código acima é uma boa maneira de escrevê-lo. Tive uma pequena brincadeira, mas não está fechando na ordem correta. Ele ainda só fecha pela metade do que vem primeiro. É mais ou menos o mesmo que eu tinha antes de usar o datetime estático? Alguma idéia?


defina seu takeprofit a um nível enorme e você ainda pode usar suas funções OrderClose() relevantes que estão usando as funções OrderTakeProfit() para calcular onde as funções OrderClose() devem fechar em. apenas faça uma mudança no cálculoonde as funções OrderClose() devem fechar em
 
deVries - literalmente só percebeu isso esta manhã... Comecei a colocar outra modificação... então percebi que deveria apenas mudá-la desde quando o primeiro pedido é feito...

Treze - Não fiz nenhuma modificação. Funcionou da mesma forma que o código que coloquei, mas você está usando um bool estático em vez de uma data estática? Essa é a única diferença real que pude ver quando fiz o back-test? Fora isso, a segunda função OrderClose() com a média móvel e o fechamento abaixo dela; ela ainda fecha se isso vier primeiro antes do outro OrderClose()?
 
DomGilberto:

Treze - Eu não fiz nenhuma alteração. Funcionou da mesma forma que o código que coloquei, mas você está usando um bool estático em vez de uma data estática? Essa é a única diferença real que pude ver quando fiz o back-test? Fora isso, a segunda função OrderClose() com a média móvel e o fechamento abaixo dela; ela ainda fecha se isso vier primeiro antes do outro OrderClose()?
Com seu uso do ponto de interrogação, não tenho certeza se você está me perguntando ou me dizendo a parte destacada. Se o testador mostrar que o segundo fechamento parcial ocorreu antes do primeiro, favor publicar seus resultados comerciais do log/jornal que foram gerados pelo testador de estratégia mostrando que o segundo fechamento parcial (a avg em movimento) ocorreu antes do primeiro fechamento parcial.
 
Thirteen:
Com seu uso do ponto de interrogação, não tenho certeza se você está me perguntando ou me dizendo a parte destacada. Se o testador mostrar que o segundo fechamento parcial ocorreu antes do primeiro, favor postar seus resultados comerciais do log/jornal que foram gerados pelo testador de estratégia mostrando que o segundo fechamento parcial (a avg em movimento) ocorreu antes do primeiro fechamento parcial.

Obrigada por me responder Treze - Publicarei o diário de bordo ainda hoje :)