Dúvida ao colocar gain móvel



  • Prezados, estou criando um EA para realizar backtests, no entanto estou com duas dúvidas:

    1- Estou querendo usar uma média de 9 para sair da operação. Por exemplo, se estou comprado e ela virar para baixo eu fecho a posição comprada. Como eu preencho o atributo http://mrequest.tp, sabendo que meu gain depende da média móvel virar?

    2- Se eu já possuo um stop loss criado através do mqltraderequest, como eu faço para alterá-lo?

    Segue o trecho do meu código que preenche o objeto mqltraderequest:

            mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
    
            mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // latest Bid price
    
            http://mrequest.sl = NormalizeDouble(stop,_Digits); // Stop Loss
    
            http://mrequest.tp = ?????
    
            mrequest.symbol = _Symbol;                                          // currency pair
    
            mrequest.volume = Lot;                                              // number of lots to trade
    
            mrequest.magic = EA_Magic;                                          // Order Magic Number
    
            mrequest.type= ORDER_TYPE_BUY;                                     // Sell Order
    
            mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
    
            mrequest.deviation=100;                                             // Deviation from current price
    

    Obrigado

    Everton



  • Oi Everton!!

    Vamos as respostas:

    1 - Basta colocar 0 no TP e ele deixa em branco.

    2 - Você vai ter que alterar a posição com a propriedade abaixo:

    mrequest.action = TRADE_ACTION_SLTP; // para modificar o SL e o TP

    http://mrequest.sl = _SL; // Stop Loss

    http://mrequest.tp = _TP;

    mrequest.symbol = _Symbol;

    Onde _SL e _TP são o stoploss e o TakeProfit respectivamente.


  • TNT

    Everton,

    Não sei se entendi bem, mas para tentar te ajudar: segue o que faço sobre gerenciamento do ordens:

    Para monitorar suas operações depois que vc postou as ordens, vc usa o PositonSelect e depois PositonGetDouble (se a ordem foi executada e a posicao está aberta) ou OrderSelect e OrdemGetDouble (para ordens ainda pendentes).

    Para alterar sl e tp vc tem q enviar um novo MqlTradeRequest do tipo TRADE_ACTION_SLTP (para posições abertas) ou TRADE_ACTION_MODIFY (para ordens pendentes).

    mais informações em: https://www.mql5.com/en/docs/trading

    Alternativamente vc pode usar a biblioteca CTrade (https://www.mql5.com/en/docs/standardlibrary/tradeclasses/ctrade) que tem métodos de mais alto nível para esse gerenciamento de ordens).

    caso vc não tenha um TP fixo, pode deixar esse campo em branco e ir monitorando as médias para encerrar sua operação quando a média virar



  • Oi Rodrigo, obrigado pela resposta!

    Pelo que entendi, posso deixar o código abaixo dentro do OnTick. No ontick eu verifico se a condição para sair do trade ocorreu. Em caso positivo eu posso inserir no atributo TP o valor de mercado para sair do trade?

    Outra pergunta: Eu tenho que passar o identificador da posição aberta para poder alterar ela?

    void OnTick()

    {

    ...

    if(media9Virou) {



  • Ou no ontick ou cria uma variável camada isNewBar pra verificar se é uma nova barra (comparando o horário do timeframe escolhido com a barra anterior.
    Isso depende do seu setup.

    A boa prática é zerar a mercado e não alterar o stop, mesmo porque até ele alterar o stop o preço pode mudar, dar erro na alteração e não sair com o gain.

    Se você roda só esse setup nesse robô e só tem 1 entrada por vez, não é necessário passar nenhum identificador, porque ele vai alterar a ordem corrente.



  • Oi Rodrigo, com relação a isNewBar eu já verifico isso.
    Como que eu faço para zerar a mercado?

    E para zerar ordens pendentes?

    Teria um exemplo disso?

    Abraços

    Everton



  • Eu faço assim:

            if(PositionSelect(_Symbol)) //checa se tem alguma posição
    
            {
    
               Print("????????????? ZERANDO POSIÇÕES");
    
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    
               {
    
                  zeraPosicao(1);                        
    
               }     
    
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
    
               {
    
                  zeraPosicao(0); 
    
               }
    
            }
    

    Depois la em baixo eu faço uma ordem a mercado (DEAL)

    mrequest.action = TRADE_ACTION_DEAL; // executa a mercado

    if(operacao) //testa se é 1 (ou seja, se está comprado)

     {
    
      mrequest.type = ORDER_TYPE_SELL;
    
     }
    

    else

     {
    
      mrequest.type = ORDER_TYPE_BUY;
    
     }
    

    o resto é o padrão do mqltraderequest.

    Hugo, você tem alguma prática diferente?


  • TNT

    Nao rodrigo, quando quero fehcar uma posição aberta eu mando uma ordem contraria a mercado (DEAL), do mesmo jeito que vc faz.
    Se usar a classe CTrade, existe um método chamado PositionClose.

    Para cancelar as ordens pendentes, eu mando um novo MqlTradeRequest do tipo TRADE_ACTION_REMOVE, daí tem que passar o número da ordem que vc quer alterar.

    Hugo


Entre para responder
 


O Portal do Trader não se responsabiliza pelas informações e opiniões veiculadas neste fórum, sendo elas de autoria individual de cada participante. Vale ainda ressaltar que investimentos em mercado de renda variável possuem riscos, ganhos passados não garantem ganhos futuros, e a decisão final e responsabilidade sobre cada operação é de cada investidor, devendo ser tomada individualmente.
© 2018 Portal do Trader. Todos os direitos reservados.

Parece que sua conexão com Fórum Portal do Trader caiu, por favor aguarde enquanto tentamos reconectar.