Realização Parcial

 

Pessoal,

Gostaria de realizar parcialmente uma operação e mover o stop ao mesmo tempo. Utilizei Ctrade, o stop movimenta, mas a realização não acontece... Alguém pode me ajudar?


Segue o código:

//+------------------------------------------------------------------+

//|Realização Parcial                                                |

//+------------------------------------------------------------------+

// --- Parcial - COMPRA

       if( liga_parcial == SIM && PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY

                           && num_lots>1 && contratos<num_lots)

         {

             double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN);

            double preco_sl      = PositionGetDouble(POSITION_SL);

            double preco_tp      = PositionGetDouble(POSITION_TP); 

           double preco_parcial = preco_entrada + pont_parcial;

                  

            if( tick.last >= preco_parcial && !pa_ativado_c )

              {

                   trade.PositionClosePartial(PositionGetTicket(0),contratos);

                   trade.PositionModify(PositionGetTicket(0),preco_entrada - pont_parcial + ganho ,preco_tp);

                  

                   pa_ativado_c = true;

                    Print("Realização Parcial = ", preco_parcial);

              }

            

 
Juliano G.:

Pessoal,

Gostaria de realizar parcialmente uma operação e mover o stop ao mesmo tempo. Utilizei Ctrade, o stop movimenta, mas a realização não acontece... Alguém pode me ajudar?

...

Por favor ao postar código use o atalho Alt+S para que a postagem fique mais organizada.

 
Juliano G.:

Pessoal,

Gostaria de realizar parcialmente uma operação e mover o stop ao mesmo tempo. Utilizei Ctrade, o stop movimenta, mas a realização não acontece... Alguém pode me ajudar?

....

Conforme a documentação existem duas formas de chamar esse método.

Você está chamando com ticket, então seria a segunda opção. Pelo que da pra ver no seu código falta um parâmetro na chamada.

Sua chamada:

trade.PositionClosePartial(PositionGetTicket(0),contratos);

Documentação:


 
Juliano G.:


Olá Juliano,

você precisa testar o retorno ResultRetcode e em caso de erro imprimir o ResultRetcodeDescription e tratar o erro.   Todas as funções de negociação devem ser testadas.

Você também pode ver no Log Diário o motivo pelo qual o fechamento parcial não foi feito.

Infelizmente a Metaquotes errou na documentação e na implementação dessa função.

 
Jonathan Pereira:

Conforme a documentação existem duas formas de chamar esse método.

Você está chamando com ticket, então seria a segunda opção. Pelo que da pra ver no seu código falta um parâmetro na chamada.

Sua chamada:

Documentação:


Obrigado Jonathan, ainda estou aprendendo...

Fiz a alteração e coloquei desvio máximo de preço de 50 (pontos - WIN). Porém, ainda não vai.

 
Rogerio Giannetti Torres:

Olá Juliano,

você precisa testar o retorno ResultRetcode e em caso de erro imprimir o ResultRetcodeDescription e tratar o erro.   Todas as funções de negociação devem ser testadas.

Você também pode ver no Log Diário o motivo pelo qual o fechamento parcial não foi feito.

Infelizmente a Metaquotes errou na documentação e na implementação dessa função.

Olá Rogério,

Coloquei o ResultRetcode e obtive o erro 4753 - Posição não encontrada. Tentei usar o comando com a variante Symbol invés de Ticket. Mas retorna o mesmo erro.

 
Juliano G.:

Olá Rogério,

Coloquei o ResultRetcode e obtive o erro 4753 - Posição não encontrada. Tentei usar o comando com a variante Symbol invés de Ticket. Mas retorna o mesmo erro.

Juliano

Faltou testar o retorno de  trade.PositionClosePartial(PositionGetTicket(0),contratos);

O problema não é só a falta do parm de derrapagem, o problema é a função que testa se está em modo headging, se for outro modo de negociação  dá erro.

(*) Tinha comentado que a documentação estava errada, foi um equivoco meu, a documentação está correta, a função é usada somente para o modo cobertura (hedging)!

 
Rogerio Giannetti Torres:

...

(*) Tinha comentado que a documentação estava errada, foi um equivoco meu, a documentação está correta, a função é usada somente para o modo cobertura (hedging)!

Seguindo o que o Rogério disse, vc deve fazer algo como:


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ENUM_ACCOUNT_MARGIN_MODE mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(mode!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      if(liga_parcial == SIM && PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && num_lots>1 && contratos<num_lots)
        {
         double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN);
         double preco_sl      = PositionGetDouble(POSITION_SL);
         double preco_tp      = PositionGetDouble(POSITION_TP);
         double preco_parcial = preco_entrada + pont_parcial;

         if(tick.last >= preco_parcial && !pa_ativado_c)
           {
            trade.Sell(contratos);
            trade.PositionModify(PositionGetTicket(0),preco_entrada - pont_parcial + ganho,preco_tp);
            pa_ativado_c = true;
            Print("Realização Parcial = ", preco_parcial);
           }
        }
     }

   if(mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      if(liga_parcial == SIM && PositionSelect(_Symbol) && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && num_lots>1 && contratos<num_lots)
        {
         double preco_entrada = PositionGetDouble(POSITION_PRICE_OPEN);
         double preco_sl      = PositionGetDouble(POSITION_SL);
         double preco_tp      = PositionGetDouble(POSITION_TP);
         double preco_parcial = preco_entrada + pont_parcial;

         if(tick.last >= preco_parcial && !pa_ativado_c)
           {
            trade.PositionClosePartial(PositionGetTicket(0),contratos, 50);
            trade.PositionModify(PositionGetTicket(0),preco_entrada - pont_parcial + ganho,preco_tp);
            pa_ativado_c = true;
            Print("Realização Parcial = ", preco_parcial);
           }
        }
     }
//+------------------------------------------------------------------+
   
 
Rogerio Giannetti Torres:

Juliano

Faltou testar o retorno de  trade.PositionClosePartial(PositionGetTicket(0),contratos);

O problema não é só a falta do parm de derrapagem, o problema é a função que testa se está em modo headging, se for outro modo de negociação  dá erro.

(*) Tinha comentado que a documentação estava errada, foi um equivoco meu, a documentação está correta, a função é usada somente para o modo cobertura (hedging)!

O problema era esse. O modo que está trabahando é netting. Eu mudei a lógica e fiz uma operaçao inversa e resolvi o problema. Mais um dia foi salvo pelo super Rogério! Obrigado.

 
Jonathan Pereira:

Seguindo o que o Rogério disse, vc deve fazer algo como:


Muito Obrigado Jonathan!!!

 
Jonathan Pereira:

Seguindo o que o Rogério disse, vc deve fazer algo como:


Obrigado Jonathan!

Eu estava com um problema semelhante e com a sua adaptação de código do nosso colega, consegui identificar onde eu estava errando.

Razão: