Regra para fechamento de posição

 

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();
         }  
  
  }
 

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).

 
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?