Regra para fechamento de posição

Para adicionar comentários, por favor Faça o login ou registrar
Mikael Lovrin
126
Mikael Lovrin  

Olá, 

Eu sou relativamente novo na linguagem MQL5 e estou tentando fazer um EA com IFT RSI, onde leva em consideração os valores dos IFTRSI para abrir ordens, ao invés de trabalhar com o Take Profit e Stop Loss eu gostaria de adicionar um regra para fechar posição, vi que tem algo parecido na documentação, mas não consegui implementar no meu código.

Surfando pela internet encontrei essa void fecha posição documentada, porém não consegui rodar.

Qual solução eu poderia adotar, ou meu código está completamente errado?

#property copyright "2020, Mikael Lovrin"

#property description "Esse EA usa níveis fixos do IFTRSI para dar entradas"

#include <Trade\Trade.mqh>

   CTrade trade;

input double   Lots     = 0.01;     // Lotes
input double   Take     = 100;      // Take Profit (em pips)
input double   Stop     = 100;      // Stop Loss (em pips)
input ulong    magicNum = 123456;   // Magic Number
input ulong    desvPts  = 1;        // Desvio em pontos

void FechaPosicao()
   {
      for(int i = PositionsTotal()-1; i>=0; i--)
         {
            string symbol = PositionGetSymbol(i);
            ulong magic = PositionGetInteger(POSITION_MAGIC);
            if(symbol == _Symbol && magic == magicNum)
               {
                  ulong PositionTicket = PositionGetTicket(POSITION_TICKET);
                  if(trade.PositionClose(PositionTicket, desvPts));
               }
         }
   }

void OnTick()
  {
   //Cria uma string vazia
      string ordem = "";
   
   //Lê os preços Ask e Bid
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //Cria uma matriz para vários valores do IFTRSI
      double FastArray[];
      double SlowArray[];
  
   //Define as configurações do IFTRSI
      double IFT_Longo          = iCustom(NULL,0,"IFT_Longo");
      double IFT_Intermediario  = iCustom(NULL,0,"IFT_Intermediario");
   
   //Classifica a matriz de valores da vela atual para trás
      ArraySetAsSeries(FastArray,true);
      ArraySetAsSeries(SlowArray,true);
   
   //Copia os valores dentro da matriz
      CopyBuffer(IFT_Longo,0,0,3,SlowArray);
      CopyBuffer(IFT_Intermediario,0,0,3,FastArray);

   //Calcula o EA para a vela atual
      double FastValue=NormalizeDouble(FastArray[0],2);
      double SlowValue=NormalizeDouble(SlowArray[0],2);
   
   //Calcula o EA para a vela anterior
      double LastFastValue=NormalizeDouble(FastArray[1],2);
      double LastSlowValue=NormalizeDouble(SlowArray[1],2);
  
 
      if (
            //Regra de Venda 
                (SlowValue>50)
         &&     (LastFastValue>-50)
         &&     (FastValue<-50)
         )
            {
               ordem = "sell";
            }
             
      if ( 
            //Regra de Compra
                (SlowValue<-50)
         &&     (LastFastValue<50)
         &&     (FastValue>50)
         )
            {
               ordem = "buy";
            }
            
      //Compra
      if (ordem =="buy" && PositionsTotal()<1)
         trade.Buy(Lots,NULL,Ask,(Ask-Stop*_Point),(Ask+Take*_Point),NULL);
         
      //Vende 
      if (ordem =="sell" && PositionsTotal()<1)
         trade.Sell(Lots,NULL,Bid,(Bid+Stop*_Point),(Bid-Take*_Point),NULL); 
                             
      //Saída para o gráfico do EA atual
      Comment ("Entry Signal: ",ordem);  
      
      //Regra fechar posição de venda
      if (
                (LastFastValue<-50)
         &&     (FastValue>-50)
         )
         {
            FechaPosicao();
         }
         
      //Regra fechar posição de compra
      if (
                (LastFastValue<-50)
         &&     (FastValue>-50)
         )
         {
            FechaPosicao();
         }  
  
  }
Ivan Ronchi
297
Ivan Ronchi  

Olá,

Pela minha análise você está querendo fechar utilizando um Magic Number que não foi informado quando você criou as ordens.

Tire a validação: && magic == magicNum, deixe somente o if(symbol == _Symbol).

Mikael Lovrin
126
Mikael Lovrin  
Ivan Ronchi:

Olá,

Pela minha análise você está querendo fechar utilizando um Magic Number que não foi informado quando você criou as ordens.

Tire a validação: && magic == magicNum, deixe somente o if(symbol == _Symbol).

Entendi, realmente não reparei nisso, retirei o MagicNumber mas o código não tem efeito nenhum, você conhece alguma outra forma de fechar uma ordem com regra?

Para adicionar comentários, por favor Faça o login ou registrar