PositionGetDouble(POSITION_VOLUME)

 
Amigos, estou tentando montar um robô que dentro da estratégia busca o POSITION_VOLUME, pois estou dividindo meus lotes e colocando SLs e TPs diferentes para cada entrada. Isso funciona perfeitamente bem na primeira vez, mas após a primeira operação quando busco o POSITION_VOLUME não é zero, ele volta no mínimo para o lote inicial, isso desmonta toda lógica que criei. Alguém sabe me dizer porque isso ocorre, ou se há uma maneira melhor de dividir meus lotes com controle dos SLs e TPs?
 
Você tem mais de uma operação ao mesmo tempo? Se sim é preciso identificá-las pelo ticket.
 

Identificar o ticket não resolve. O problema é o seguinte, enquanto tenho uma operação aberta ele pega o VOLUME do ticket e me passa pelo operador, mas quando a posição fecha ele mantem o POSITION_VOLUME com o último valor que tinha antes do ticket fechar, entende? Para a lógica que eu estava tentando montar eu precisava que quando não houvesse ticket aberto ele retornasse o volume como sendo 0.


Thiago Duarte:
Você tem mais de uma operação ao mesmo tempo? Se sim é preciso identificá-las pelo ticket.
 
guidc #:

Identificar o ticket não resolve. O problema é o seguinte, enquanto tenho uma operação aberta ele pega o VOLUME do ticket e me passa pelo operador, mas quando a posição fecha ele mantem o POSITION_VOLUME com o último valor que tinha antes do ticket fechar, entende? Para a lógica que eu estava tentando montar eu precisava que quando não houvesse ticket aberto ele retornasse o volume como sendo 0.


//+------------------------------------------------------------------+
//|   FUNCAO CHECKPOSITIONS                                          |
//+------------------------------------------------------------------+

bool CheckPositions()
  {


    //--- number of current positions

    position_total=PositionsTotal();
    //Print("Total : ",total);
    //--- go through orders in a loop

    if (position_total>0)
      {
        for(uint i=0;i<position_total;i++)
          {
            //--- return order ticket by its position in the list
            //--- Function PositionSelect() copies data about a position into the program environment, and further calls of PositionGetDouble(), PositionGetInteger() and PositionGetString() 
            //--- return the earlier copied data. This means that the position itself may no longer exist (or its volume, direction, etc. has changed), but data of this position still can be obtained. 
            //--- To ensure receipt of fresh data about a position, it is recommended to call PositionSelect() right before referring to them.

            if(PositionSelect(_Symbol)==true)
              {
                //--- return order properties
                  position_open_price = PositionGetDouble(POSITION_PRICE_OPEN);
                  position_ID         = PositionGetInteger(POSITION_IDENTIFIER);
                  position_volume     = PositionGetDouble(POSITION_VOLUME);
                  position_profit     = PositionGetDouble(POSITION_PROFIT);
                  position_type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
  
                  //Print("position_open_price: ",position_open_price);
                  //Print("position_ID: ",position_ID);
                  //Print("position_volume: ",position_volume);
                  //Print("position_profit: ",position_profit);
                  //Print("position_type: ",EnumToString(position_type));
               }
           }
          }
     else
        {
            position_volume = 0;
        }  
       
    

  return(true);
  }
 
guidc:
Amigos, estou tentando montar um robô que dentro da estratégia busca o POSITION_VOLUME, pois estou dividindo meus lotes e colocando SLs e TPs diferentes para cada entrada. Isso funciona perfeitamente bem na primeira vez, mas após a primeira operação quando busco o POSITION_VOLUME não é zero, ele volta no mínimo para o lote inicial, isso desmonta toda lógica que criei. Alguém sabe me dizer porque isso ocorre, ou se há uma maneira melhor de dividir meus lotes com controle dos SLs e TPs?
Voce nao disse, mas como esta querendo dividir o volume de uma posicao vou assumir que esta com conta netting. Eu recomendaria trocar para conta hedge dai tu teria cada posicao independentemente identificada pelo ticket e cada uma com SL/TP. Se quiser continuar com a conta netting tu precisa identificar as ordens abertas de SL/TP com a posicao, entretanto tu nao tem como vincular ele com algo da posicao ja que so vai manter a ultima como vigente (vale para o comentario tambem). O que tu pode fazer seria vincular a ordem de SL/TP que tu colocar com comentario para saber a entrada ou outro dado que precise. Mas talvez o melhor seria guardar num banco sqlite ou algo para caso no dia seguinte precise recolocar tu conseguir recuperar essa informacao facilmente...
Razão: