VPS do Metatrader dando erro de indicador customizado

 

Boa tarde, pessoal! Quando eu coloco o meu robô para rodar no meu computador, funciona normalmente, mas quando migro para o VPS do Metatrader dá a seguinte falha: 

"Cannot load custom indicator". Uso um indicador customizado e já tentei de tudo, mas a VPS não está aceitando a migração desse indicador. Alguém poderia me ajudar? 

Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
A rede de hospedagem virtual em nuvem foi desenvolvida especialmente para o MetaTrader 4 e o MetaTrader 5, possuindo todas as vantagens de uma solução nativa. Obtenha os benefícios de nossa oferta gratuita por 24 horas - teste um servidor virtual agora mesmo.
 
LKalemba:

Boa tarde, pessoal! Quando eu coloco o meu robô para rodar no meu computador, funciona normalmente, mas quando migro para o VPS do Metatrader dá a seguinte falha: 

"Cannot load custom indicator". Uso um indicador customizado e já tentei de tudo, mas a VPS não está aceitando a migração desse indicador. Alguém poderia me ajudar? 

Você tem o Código/ID do erro?
 
.
Arquivos anexados:
rt.png  277 kb
 
LKalemba #:
.

Você tem problemas sérios de indicadores com problemas de código... Não tem nada a ver com VPS. Array Out of Range é um problema sério de programação... Sério que você opera isso???

E o LKATR, é seu?

Pois se ele não for seu e reconhecer algo estranho ele pode mandar um INIT_FAILED pro robô e parar tudo...

 
Flavio Jarabeck #:

Você tem problemas sérios de indicadores com problemas de código... Não tem nada a ver com VPS. Array Out of Range é um problema sério de programação... Sério que você opera isso???

E o LKATR, é seu?

Pois se ele não for seu e reconhecer algo estranho ele pode mandar um INIT_FAILED pro robô e parar tudo...

O problema não é no array do indicador personalizado. Eu estava fazendo uma modificação no código para testar o indicador, mas depois retornei para o código original. Além do mais, o robô funciona normalmente na minha máquina e só dá erro quando eu migro para a VPS do MT5. Descobri que o erro é na média móvel que é nativa do MT5. Retirei o indicador personalizado e mantive só a média móvel e retornou o seguinte erro: "initializing of Minima15 (WINZ21,M15) failed with code 1". Depois eu tirei a média móvel nativa e coloquei novamente o indicador personalizado e não deu erro algum. Você sabe dizer pq isso ocorre? Estou tendo que fazer uma gambiarra: estou copiando o código original da média móvel e criando um indicador personalizado para que o robô funcione corretamente.


 
O log do erro:
Arquivos anexados:
fc.png  268 kb
 
LKalemba #:
O log do erro:
Minima15 está dando erro no OnInit, mas sem ver o código é impossível opinar o que pode ser com certeza.
 
Alexandre Borela #:
Minima15 está dando erro no OnInit, mas sem ver o código é impossível opinar o que pode ser com certeza.
//+------------------------------------------------------------------+

//|                                                     Minima15.mq5 |

//|                                  Copyright 2020, Leandro Kalemba |

//|                                            leangel2007@gmail.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2020, Leandro Kalemba"

#property link      "leangel2007@gmail.com"

#property version   "1.00"

//+------------------------------------------------------------------+

//|                            Biblioteca                            |

//+------------------------------------------------------------------+

#include <Trade\Trade.mqh>

//---Instância

CTrade trade;

//+------------------------------------------------------------------+

//|                        Variáveis Globais                         |

//+------------------------------------------------------------------+

string HorarioInicial = "09:00";

string HorarioFinal = "17:50";

string HorarioFechamento = "17:55";

string Ativo = "WINZ21";

double Lote = 1;

double TakeProfit = 0;

double StopLoss = 500;

ulong MagicNumber = 001;

ulong Spread = 100;

ENUM_ORDER_TYPE_FILLING Preenchimento = ORDER_FILLING_FOK;

//+------------------------------------------------------------------+

//| Média Móvel Simples de 200 Períodos                              |

//+------------------------------------------------------------------+

//---Handle

int MMAHandle;



//---Buffer

double MMABuffer[];



//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//--------------------Biblioteca CTrade--------------------\\  

 

   trade.SetExpertMagicNumber(MagicNumber);

   trade.LogLevel(2);

   trade.SetAsyncMode(false);

   trade.SetTypeFilling(Preenchimento);

   trade.SetDeviationInPoints(Spread);

   

//-------------------Validação do Handle-------------------\\



//---Chamando o handle da Média Móvel

MMAHandle = iMA(Ativo,PERIOD_M15,200,0,MODE_SMA,PRICE_CLOSE);


//---Verificando se há erros no handle da Média Móvel

if(MMAHandle == INVALID_HANDLE)

  {

   return INIT_FAILED;

   Print("Erro na Inicialização do handle da Média Móvel."," Erro: ", GetLastError());

  }

  

//-------------------Validação do Array-------------------\\



//---Invertendo o Array da Média Móvel e verificando se há erros na inversão

if(!ArraySetAsSeries(MMABuffer, true))

  {

   return INIT_FAILED;

   Print("Erro ao inverter o array da Média Móvel."," Erro: ", GetLastError());

  }



//-------------------Inserção do Indicador no Gráfico-------------------\\



//---Inserindo a Média Móvel no Gráfico e verificando se há erros na inserção

if(!ChartIndicatorAdd(ChartID(),0,MMAHandle))

  {

   return INIT_FAILED;

   Print("Erro na inserção da Média Móvel no gráfico."," Erro: ", GetLastError());

  }



//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---



  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {



//-------------------Cópia do Buffer-------------------\\



//---Copiando o buffer da Média Móvel e verificando se há erros na cópia

   if(CopyBuffer(MMAHandle, 0, 0, 2, MMABuffer) != 2)

     {

      Print("Erro ao copiar o buffer da Média Móvel."," Erro: ", GetLastError());

      return;

     }  

//--------------Deleta uma ordem ao surgir uma nova barra------------\\

   if(NovaBarra() && OrdemPendente() == true) //Essa nova barra é para que se o preço não alcançar a ordem de compra, a ordem seja cancelada por se descaracterizar da estratégia.

     {

      DeletaOrdens();

      Print("A ordem foi deletada pois surgiu uma nova barra!");

     }

//--------------Fecha uma posição ao surgir uma nova barra------------\\     

   if(NovaBarra2() && PosicaoAberta() == true) //Essa nova barra é para que a operação termine logo que surgir uma nova barra, ou seja, só vai durar uma barra.

     {

      FechaPosicao();

      Print("A posição foi fechada pois surgiu uma nova barra!");

     }     

//-------------------Gatilho de Entrada-------------------\\

   

   if("lógica de entrada"

   && HorarioNegocicao() && OrdemPendente() == false && PosicaoAberta() == false)

     {

      trade.BuyLimit(Lote, Entrada, Ativo, Entrada - StopLoss, 0, ORDER_TIME_GTC, 0, "");

     }    



string HorarioAtual = TimeToString(iTime(Ativo,PERIOD_M1,0),TIME_SECONDS);

//---------Limpeza das Ordens pelo horário---------\\     

if((HorarioAtual >= HorarioFechamento && OrdemPendente() == true))                                                              

  {

   DeletaOrdens();

   Print("A Ordem foi deletada pois atingimos o limite de horário!");

  }

//---------Encerramento das Posições pelo horário---------\\      

if((HorarioAtual >= HorarioFechamento && PosicaoAberta() == true))                                                              

  {

   FechaPosicao();

   Print("A Posição foi fechada pois atingimos o limite de horário!");

  }

//--

  }

//+------------------------------------------------------------------+



//+------------------------------------------------------------------+

//|                      Horário de Negociação                       |

//+------------------------------------------------------------------+

bool HorarioNegocicao()

  {

   string HorarioAtual = TimeToString(iTime(Ativo,PERIOD_M1,0),TIME_SECONDS);

   if(HorarioAtual >= HorarioInicial && HorarioAtual < HorarioFinal)

  {

   return true;

  }

   return false;

  }

//+------------------------------------------------------------------+

//|                   Verificação de Ordem Pendente                  |

//+------------------------------------------------------------------+

bool OrdemPendente() //Para saber há ordens pendentes do robô em questão.

  {

   for(int i=0; i<OrdersTotal(); i++)  //Retorna o número total de ordens pendentes no momento.

     {

      if(OrderGetTicket(i) && Ativo == OrderGetString(ORDER_SYMBOL) 

      && MagicNumber == OrderGetInteger(ORDER_MAGIC))  //Se o ativo possui o mesmo nome e o magic number da posição que está aberta.                                                               //Retorna e armazena o valor do resultado total.

        {

         return true;

        }

     }

   return false;

  }

//+------------------------------------------------------------------+

//|                  Verificação de Posição Aberta                   |

//+------------------------------------------------------------------+

bool PosicaoAberta() //Para saber há posições abertas do robô em questão.

  {

   for(int i=0; i<PositionsTotal(); i++)  //Retorna o número total de posições abertas no momento.

     {

      if(Ativo == PositionGetSymbol(i) && MagicNumber == PositionGetInteger(POSITION_MAGIC))  //Se o ativo possui o mesmo nome e o magic number da posição que está aberta.                                                               //Retorna e armazena o valor do resultado total.

        {

         return true;

        }

     }

   return false;

  }

//+------------------------------------------------------------------+

//|                    Deleta Ordens Pendentes                       |

//+------------------------------------------------------------------+

void DeletaOrdens() // Verificar depois na conta demo se não há de fato a necessidade de um indice para selecionar o ativo e magic number como é feito para fechamento de posições abertas.

  {

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

     {

      if(OrderGetTicket(i) && Ativo == OrderGetString(ORDER_SYMBOL) 

      && MagicNumber == OrderGetInteger(ORDER_MAGIC))

        {

         if(trade.OrderDelete(OrderGetTicket(i)))

           {

            Print("Ordem deletada sem falha. ResultRetcode: ",trade.ResultRetcode(), ",RetcodeDescription: ", trade.ResultRetcodeDescription());

           }

         else

           {

            Print("Ordem deletada com falha. ResultRetcode: ",trade.ResultRetcode(), ",RetcodeDescription: ", trade.ResultRetcodeDescription());

           }  

        }

     }



  }

//+------------------------------------------------------------------+

//|                    Fecha Posição Aberta                          |

//+------------------------------------------------------------------+

void FechaPosicao()

  {

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

     {

      if(Ativo == PositionGetSymbol(i) && MagicNumber == PositionGetInteger(POSITION_MAGIC))

        {

         if(trade.PositionClose(PositionGetInteger(POSITION_TICKET), Spread)) //Checar a necessidade de padronizar usando o "PositionGetTicket(i)" ao invés de PositionGetInteger.

           {                    

            Print("Posição Fechada sem falha. ResultRetcode: ",trade.ResultRetcode(), ",RetcodeDescription: ", trade.ResultRetcodeDescription());

           }

         else

           {

            Print("Posição Fechada com falha. ResultRetcode: ",trade.ResultRetcode(), ",RetcodeDescription: ", trade.ResultRetcodeDescription());

           }  

        }

     }



  }

//+------------------------------------------------------------------+

//|               Surgimento de uma Nova Barra                       |

//+------------------------------------------------------------------+

bool NovaBarra()

  {

   static int BarraAntiga = 0;

   int BarraAtual = Bars(Ativo, PERIOD_CURRENT, iTime(NULL,PERIOD_D1,0), iTime(NULL,PERIOD_CURRENT,0));

   if(BarraAntiga == 0)

     {

      BarraAntiga = BarraAtual;

      return false;

     }

   else if(BarraAntiga != BarraAtual)

        {

         BarraAntiga = BarraAtual;

         return true;

        }

      else

        {

         return false;

        } 

  }

//+------------------------------------------------------------------+

//|               Surgimento de uma Nova Barra 2                     |

//+------------------------------------------------------------------+

bool NovaBarra2()

  {

   static int BarraAntiga = 0;

   int BarraAtual = Bars(Ativo, PERIOD_CURRENT, iTime(NULL,PERIOD_D1,0), iTime(NULL,PERIOD_CURRENT,0));

   if(BarraAntiga == 0)

     {

      BarraAntiga = BarraAtual;

      return false;

     }

   else if(BarraAntiga != BarraAtual)

        {

         BarraAntiga = BarraAtual;

         return true;

        }

      else

        {

         return false;

        } 

  }
 
LKalemba #:
Esse código não compila, a variável Entrada não existe em lugar nenhum.
 
Alexandre Borela #:
Esse código não compila, a variável Entrada não existe em lugar nenhum.

Qual variável "Entrada" no qual vc se refere? a única alteração que eu fiz, foi retirar a lógica de entrada. O resto está igual ao código original.

 
LKalemba #:

Qual variável "Entrada" no qual vc se refere? a única alteração que eu fiz, foi retirar a lógica de entrada. O resto está igual ao código original.


Tenta compilar o código que você postou e vai ver os erros. Esse outro ponto também não faz sentido você fazer um && com a string.


Razão: