Backtest _ Atualização de posição após SL e TP

 

Bom dia!

Me deparei com um problema e gostaria da ajuda de vocês. Meu expert funciona da seguinte maneira, quando a variável1 é igual a um e quando não há posições em aberto no ativo em questão, ele dispara uma ordem a mercado com Stop Loss e Take Profit. Eu atualizo os dados da posição sempre antes de checar se o volume da posição.

Quando vou utilizar este E.A no Strategy Tester, ele atualiza o volume da operação quando uma ordem a mercado é dada, porém quando a mesma é fechada por um stop loss ou take profit o volume da posição não se altera e continua como se estivesse com a operação em aberto. Mesmo  após passar no código abaixo.

Só há alteração na posição, quando outra ordem a mercado é dada. Fora do Strategy Tester tudo funciona normalmente!

Alguém poderia me ajudar? Agradeço antecipadamente. 

            PositionSelect(_Symbol);
            Positionvolume = PositionGetDouble(POSITION_VOLUME);
            PositionSL = PositionGetDouble(POSITION_SL);
            Print(" Volume da posição = ",Positionvolume,"| Stop Loss da posição = ",PositionSL);
            
            if((variavel1 == 1) %% (Positionvolume == 0))
            {
             //ordem a mercado
            }

 

Fórum de negociação, sistemas de negociação automatizados e testes de estratégias de negociação

Você tem alguma questão sobre Metatrader 5! Pergunte Aqui!

Rogerio Figurelli, 2015.10.29 04:07

Olá Gabriel, note que você deve testar o retorno da PositionSelect(). Veja mais detalhes em https://www.mql5.com/pt/docs/trading/positionselect

Isso por que ela retorna true se a função for concluída com êxito e false em caso de falha, cuja razão poderá ser verificada pela função GetLastError().

Se ocorreu o S/L ou T/P, como referido, a posição não existirá mais, e por isso esse teste se torna ainda mais relevante. 


 
Rogerio Figurelli:

Obrigado Figurelli!

 

Através do código abaixo estou obtendo êxito! Abraços

{
        if(pSymbol == NULL) pSymbol = _Symbol;
        bool select = PositionSelect(pSymbol);
        if(select == true) return(PositionGetDouble(POSITION_VOLUME));
        else return(WRONG_VALUE);
}
Razão: