EA não respeitando posição aberta e criando ordem infinita

moslley  

Estava terminando um EA que usa Bandas de Bollinger (Fecha fora e fecha dentro), mas o script não está respeitando a ordem aberta e criando um loop infinito de abertura de ordens.

Estou usando a bool posAberta true quando ele reconhece Ordem existente, mas não está respeitando.

#include <Trade\Trade.mqh>
CTrade trade;

double                        upBand[];
double                        middleBand[];
double                        lowBand[];

MqlRates                      rates[];
int                           handle;

input ulong                   magicNum    = 123456;   //Magic Number

input double                  lote        = 1;        //Volume
input double                  stopLoss    = 250;      //Stop Loss
input double                  takeProfit  = 600;      //Take Profit

double                        PRC;  //Preço normalizado
double                        STL;  //StopLoss normalizado
double                        TKP;  //TakeProfit normalizado

bool                          posAberta;

MqlTick                       ultimoTick;

int OnInit() {
        
        handle = iBands(Symbol(), Period(), 20, 0, 2, PRICE_CLOSE);
        
        return(INIT_SUCCEEDED);
}

void OnTick() {

   if(!SymbolInfoTick(Symbol(),ultimoTick))
      {
         Alert("Erro ao obter informações de Preços: ", GetLastError());
         return;
      }
        
        CopyRates(Symbol(), Period(), 0, 3, rates);
        CopyBuffer(handle, 0, 0, 3, middleBand);
        CopyBuffer(handle, 1, 0, 3, upBand);
        CopyBuffer(handle, 2, 0, 3, lowBand);
        
        ArraySetAsSeries(rates, true);  
        ArraySetAsSeries(upBand, true);
        ArraySetAsSeries(middleBand, true);
        ArraySetAsSeries(lowBand, true);
        
        posAberta = false;


   for(int i = PositionsTotal()-1; i>=0; i--)
      {
        string symbol = PositionGetSymbol(i);
	ulong magic = PositionGetInteger(POSITION_MAGIC);
         if(symbol == _Symbol && magic == magicNum)
            {
               posAberta = true;
               break;
            }
      }

        if(rates[2].close < lowBand[2] && rates[1].close > lowBand[1] && !posAberta) 
        {
         PRC = NormalizeDouble(ultimoTick.ask, _Digits);
         STL = NormalizeDouble(PRC - stopLoss, _Digits);
         TKP = NormalizeDouble(PRC + takeProfit, _Digits);
         trade.Buy(lote, _Symbol, PRC, STL, TKP, "");
        }
}




 

Jonathan Pereira  
moslley:

... 

   for(int i = OrdersTotal()-1; i>=0; i--)
  for(int i = PositionsTotal()-1; i>=0; i--)


OrdesTotal -> busca ordens

PositionsTotal -> busca posições


https://www.mql5.com/pt/docs/trading

moslley  
Jonathan Pereira:


OrdesTotal -> busca ordens

PositionsTotal -> busca posições


https://www.mql5.com/pt/docs/trading

Modifiquei para PositionsTotal, mas mesmo assim o problema continua. Continua abrindo ordens infinitamente.

PS: Modifiquei no código pra que as novas pessoas não respondam o mesmo.

Rogerio Giannetti Torres  
moslley:


Boa noite,

está faltando vc. setar o magic number , fazendo com que  ordem de compra seja aberta com magicNum = 0;

Coloque o comando abaixo no OnInit(), pois só precisa uma vez. 

trade.SetExpertMagicNumber(magicNum);
moslley  
Rogerio Giannetti Torres:

Boa noite,

está faltando vc. setar o magic number , fazendo com que  ordem de compra seja aberta com magicNum = 0;

Coloque o comando abaixo no OnInit(), pois só precisa uma vez. 

Funcionou perfeitamente, muito obrigado Rorgerião!
Razão: