Fechamento de meio lote. - página 3

 
DomGilberto:

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

MathFloor() faz o que diz na documentação ... "A função MathFloor retorna um valor numérico representando o maior número inteiro que é menor ou igual a x".

DomGilberto:


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

Não . . . você tem isto:

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

quando você provavelmente quer dizer isto . . .

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

Use parênteses (e espaços) para deixar as coisas claras e sem ambigüidades.

DomGilberto:


Seu código não ajudou - desculpe.

Por que ? é errado ? de que forma ?

DomGilberto:


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

Sim, você pode imprimir qualquer variável . . o que você está fazendo ? mostre seu código.

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


Com relação à impressão de variáveis personalizadas, como eu faria isso para o "FirstTarget_Buy"?

Vou passar o tempo vasculhando todo o meu código e imprimindo muito - entendo como fazê-lo com bools e ints (integer -1 falha e bool é uma afirmação verdadeira ou falsa - fácil.) mas não entendo como fazê-lo quando você atribui funções a uma variável personalizada?

Obrigado por lançar luz sobre a fórmula "FirsTarget" acima! Desculpe, eu queria dizer que seu código não ajudou no sentido de que eu não estou entendendo como montar a fórmula... Acho isso realmente contra intuitivo - Você teria pensado que chamar "OrderSelect" lhe permitiria simplesmente ver qual era o tamanho do lote naquela ordem... e depois simplesmente dividi-lo...

Desculpe por ter se deparado como um completo idiota!

 
DomGilberto:

Desculpe por ter se deparado como um completo idiota!

De forma alguma, você só precisa encontrar seu ponto cego e iluminá-lo, uma vez que o tenha, você vai se perguntar por que achou tão difícil, tudo é fácil quando você sabe como.

DomGilberto:

Com relação à impressão de variáveis personalizadas, como eu faria isso para o "FirstTarget_Buy"?

Vou passar o tempo vasculhando todo o meu código e imprimindo muito - entendo como fazê-lo com bools e ints (integer -1 falha e bool é uma afirmação verdadeira ou falsa - fácil.) mas não entendo como fazê-lo quando você atribui funções a uma variável personalizada?

Assim . . . . anote também o comentário sobre o aparelho de frisar
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

DomGilberto:

Eu queria dizer que seu código não ajudou no sentido de que eu não estou entendendo como colocar a fórmula junto... Acho isso realmente contra intuitivo - você teria pensado que chamar "OrderSelect" lhe permitiria simplesmente ver qual era o tamanho do lote naquela ordem de seleção... e depois simplesmente dividi-lo...

Você pode simplesmente ordenarSelecionar a ordem, usar OrderLots() e dividir por dois ... você pode fazer isso, e em muitas situações isso funcionará. Eu escrevo código para todos os casos que posso prever para que não tenha que consertá-la continuamente quando ela se quebra ...

Se o tamanho de sua posição for 2,0 lotes; isto dividido por dois é 1,0 lotes e isto funcionará . .

Se o tamanho de sua posição for 0,3 lotes; este dividido por dois é 0,15 lotes e este será um tamanho de posição inválido se MODE_LOTSTEP for 0,1 . . . você pode usar 0,1 ou 0,2 NÃO 0,15, então você precisa codificar esta verificação e ajuste.


O que você tem aqui não funcionará em todos os casos . .

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

Ahhhh! Acabei de passar os últimos 15 a 20 minutos apagando impressões em todo o lugar - estou começando a entender onde estou indo errado. Estou basicamente selecionando a ordem PENDENTE... ENTANTO, por ser uma ordem pendente, no ponto em que a seleciono, há uma grande chance de que as OrdensLots, paradas e alvos tenham mudado, portanto precisarei colocá-la em loop para que esteja sincronizada com a forma como minhas ordens pendentes estão sendo constantemente calculadas antes de serem acionadas.

Esse maldito doubletostr :P - Spot on RaptorUK! Agora posso ver que isto é calculado corretamente, graças ao seu ajuste :)

Acho que sei como fazer a maior parte agora - só por curiosidade, e se a afirmação "se" funcionasse para chamar APENAS a ordem que foi TRIGERADO. No momento, eu tenho que chamar quando tenho uma ordem de mercado aberta, mas estou tentando descobrir como chamar quando a ordem pendente foi acionada?

O código abaixo e a declaração "se" correspondente parece apenas chamar as ordens pendentes em aberto. Só quero uma maneira de "ir para" uma função personalizada específica (nula, por exemplo) com base no fato de que uma ordem foi acionada? (se isso fizer sentido!)

Obrigado por me esclarecerem tanto :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

Ahhhh! Acabei de passar os últimos 15 a 20 minutos apagando impressões em todo o lugar - estou começando a entender onde estou indo errado.

Fácil quando você sabe como

DomGilberto:


Acho que sei como fazer a maior parte agora - só por curiosidade, o que "se" a declaração funcionaria para chamar APENAS a ordem que foi TRIGERADO. No momento, eu tenho que chamar quando tenho uma ordem de mercado aberta, mas estou tentando descobrir como chamar quando a ordem pendente foi acionada?

Quando uma ordem pendente for acionada, ela se tornará um OP_BUY ou OP_SELL, portanto . .

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

Uma dica, use m o r e espaços . . quando você recebe uma divisão por erro zero e quer encontrar onde ela está acontecendo é fácil procurar por espaço/espaço e apenas encontrar suas divisões ao invés de todos os seus comentários . . então eu uso espaços ao redor = + - / % etc.

 
Ah, é claro (facepalm!)

Boa dica - eu farei! Obrigado por sua ajuda :) Eu postarei de volta se eu conseguir fazer isso!
 
Ok, estou de volta! ... Mas não tão boas notícias - eu tentei e testei múltiplas variações de código sem sorte. É aqui que eu estou agora.

Não estou recebendo nenhuma informação sobre as impressões digitais? Absolutamente nada está aparecendo no Jornal. Presumo que isto seja porque nada está sendo selecionado até onde o OrderType vai desde a primeira declaração "se"? Pelo que posso ver aqui no código, eu teria pensado que não estou muito longe, pelo menos...?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
Ok, estou de volta! ... Mas não tão boas notícias - eu tentei e testei múltiplas variações de código sem sorte. É aqui que eu estou agora.

Não estou recebendo nenhuma informação sobre as impressões digitais? Absolutamente nada está aparecendo no Jornal. Presumo que isto seja porque nada está sendo selecionado até onde o OrderType vai desde a primeira declaração "se"? Pelo que posso ver aqui no código, eu teria pensado que não estou muito longe, pelo menos...?

Como você está selecionando a Ordem antes de fazer isso ?

if(OrderType() == OP_BUY ){

Você ainda tem problemas aqui

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

Por que não . . .

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
Não acredito que estou cometendo esses erros de novato... Me aborrece! Sim, eu consegui imprimir agora e selecionar o pedido. Este é o código que está funcionando em termos de impressão - mas os lotes ainda não estão sendo fechados? Eu também colei as mensagens do diário abaixo.
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.