Problema com EA - No memory in OnTick function

 

Prezados,
Meu EA está com problemas nas otimizações. Trava o computador e também pelo Google Coud. Achava que era o próprio MT5, porém percebi que só ocorre com meu EA.

Após pesquisar, percebi que o erro de falta de memória é devido a armazenamento em array.

Alguém poderia explicar ou me ajudar?
Abaixo código da função OnInit

int OnInit()
  {
   Comment("");
   if(!LicenseValidation())
      return(INIT_FAILED);
   sy.Name(Symbol());
   sy.Refresh();
   string pref=(MQLInfoInteger(MQL_TESTER)) ? "test" : "";
   expname=pref+" "+MQLInfoString(MQL_PROGRAM_NAME);
   compos=expname+" ["+IntegerToString(Magic)+"]";
   rulang=(StringFind(term.Language(),"Russian",0)>-1) ? true : false;
   isinit=true;
   test=(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION));
   ch.Attach();
   EventSetTimer(1);

   trd.SetDeviationInPoints(Slipage);
   trd.SetExpertMagicNumber(Magic);
   trd.SetMarginMode();
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK,sy.TradeFillFlags()))
      trd.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC,sy.TradeFillFlags()))
      trd.SetTypeFilling(ORDER_FILLING_IOC);
   else
      trd.SetTypeFilling(ORDER_FILLING_RETURN);

   nameB.Shutdown();
   for(int i=0; i<2; i++)
      nameB.Add(NULL);
   sig.Shutdown();
   for(int i=0; i<2; i++)
      sig.Add(false);
   nbar.SetSymbolPeriod(sy.Name(),WorkTF);
   if(ShowInd && PeriodSeconds(PERIOD_CURRENT)!=PeriodSeconds(WorkTF))
      ch.SetSymbolPeriod(sy.Name(),WorkTF);

   MqlParam    par[];
   int   c=0;  ArrayResize(par,c+1);   par[c].type=TYPE_STRING;   par[c].string_value="::Indicators\\IndicatorSignal.ex5";
   c++;        ArrayResize(par,c+1);   par[c].type=TYPE_INT;      par[c].integer_value=STSssp;
   c++;        ArrayResize(par,c+1);   par[c].type=TYPE_INT;      par[c].integer_value=STSrisk;
   c++;        ArrayResize(par,c+1);   par[c].type=TYPE_INT;      par[c].integer_value=STSbar;
   c++;        ArrayResize(par,c+1);   par[c].type=TYPE_COLOR;    par[c].integer_value=STScolorB;
   c++;        ArrayResize(par,c+1);   par[c].type=TYPE_COLOR;    par[c].integer_value=STScolorS;
   c++;        ArrayResize(par,c+1);   par[c].type=TYPE_INT;      par[c].integer_value=STSwidth;
   cus.NumBuffers(3);
   cus.Create(Symbol(),PERIOD_CURRENT,IND_CUSTOM,c+1,par);
   cus.Refresh();
   if(ShowInd)
      cus.AddToChart(0,0);
   TesterHideIndicators(false);

   SBE   sbe[5];
   sbe[0].start=BEstart1;   sbe[0].distance=BEdistance1;
   sbe[1].start=BEstart2;   sbe[1].distance=BEdistance2;
   sbe[2].start=BEstart3;   sbe[2].distance=BEdistance3;
   sbe[3].start=BEstart4;   sbe[3].distance=BEdistance4;
   sbe[4].start=BEstart5;   sbe[4].distance=BEdistance5;
   c=-1;
   for(int i=0; i<ArrayRange(sbe,0); i++)
     {
      if(sbe[i].start==NULL)
         continue;
      c++;
      ArrayResize(be,c+1);
      be[c].start=sbe[i].start;
      be[c].distance=sbe[i].distance;
     }

   Info();
   return(INIT_SUCCEEDED);
  }

Caso necessário adicionar todo o código, adicionarei, mas pelo que notei as funções de array estão aí. Existe algo que pode ser melhorado para não travar? Ouvi falar em zerar memória.

 
Paulo, diversas postagens como esta estão sendo feitas recentemente, procura se alguém teve solução. Dá uma olhada no fórum em ingles, são outras postagtens lá.

Me diz uma coisa, no g cloud eu vi inúmeros produtos, qual é o que se usa para hospedar o mt5 em nuvem?
 

Bom dia Lucas,
Entendo pouco de programação e esse EA eu encomendei, porém não tenho mais retorno do programador. Hoje percebi que fórum em outra língua é outras postagens, achava que era somente tradução. Abri postagem lá também.

No Google Cloud tem que usar Compute Engine e criar uma instância.

 

Obrigado!

Experimenta re compilar ele, dá F4 no mt5 e dá F7 no código aberto.

 

Descobri, estava tentando otimizar o parâmetro SSP e Risk do Silvertrend e os mesmos se for acima de valor 15 causa isso. Testei com valores menores e funciona. Agora fica, como resolver? Pois o melhor resultado (em uma das poucas que consegui rodar), foi com 18 e 19 respectivamente.

Razão: