a inicialização global falhou!!!!!!! - página 2

 

Sem problemas, angevogeur

O código era originalmente este:

int init()
  {
      // Check for input errors
      if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively.");
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1.");
         }
      }
      
      IndicatorShortName("White Wolf Custom Software Moving Averages Indicator");
      
//---- indicators
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,EMABuffer1);
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,EMABuffer2);
      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,EMABuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,SMABuffer);
   
      SetIndexEmptyValue(0,0.0);
      SetIndexEmptyValue(1,0.0);
      SetIndexEmptyValue(2,0.0);
      SetIndexEmptyValue(3,0.0);
//----

      // MA Period Buttons
      MA_Display_Time_Frame = Period(); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
      ResetLastError();
      Alert("In init() - Calling CreateMAPeriodButtons()");
      CreateMAPeriodButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
         
      ResetLastError();
      Alert("In init() - Calling CreateDismissSignalButtons()");
      CreateDismissSignalButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
      
      ResetLastError();
      Alert("In init() - Calling SetPeriodButtonState()");
      SetPeriodButtonState();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
   
   // Set normalization factor for current currency pair
   if ((Digits == 4) || (Digits == 5))
         NormalizationFactor = 0.0001;
      else
         NormalizationFactor = 0.01;
   
   return(0);
  }

void deinit()
  {
      Alert("In de-init() - getting ready to delete objects ");
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_LABEL);
      Alert("In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString(GetLastError()));
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_BUTTON);
      Alert("In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString(GetLastError()));

return(0);
 }

Eu simplesmente o modifiquei para isto:

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit()
  {
      // Check for input errors
      if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively.");
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2)
         {
            Alert("Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1.");
         }
      }
      
      IndicatorShortName("White Wolf Custom Software Moving Averages Indicator");
      
//---- indicators
      SetIndexStyle(0,DRAW_LINE);
      SetIndexBuffer(0,EMABuffer1);
      SetIndexStyle(1,DRAW_LINE);
      SetIndexBuffer(1,EMABuffer2);
      SetIndexStyle(2,DRAW_LINE);
      SetIndexBuffer(2,EMABuffer3);
      SetIndexStyle(3,DRAW_LINE);
      SetIndexBuffer(3,SMABuffer);
   
      SetIndexEmptyValue(0,0.0);
      SetIndexEmptyValue(1,0.0);
      SetIndexEmptyValue(2,0.0);
      SetIndexEmptyValue(3,0.0);
//----

      // MA Period Buttons
      MA_Display_Time_Frame = Period(); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
      ResetLastError();
      Alert("In init() - Calling CreateMAPeriodButtons()");
      CreateMAPeriodButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
         
      ResetLastError();
      Alert("In init() - Calling CreateDismissSignalButtons()");
      CreateDismissSignalButtons();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
      
      ResetLastError();
      Alert("In init() - Calling SetPeriodButtonState()");
      SetPeriodButtonState();
      if (GetLastError() != 0)
         Alert("GetLasteError() returned " + IntegerToString(GetLastError()));
   
   // Set normalization factor for current currency pair
   if ((Digits == 4) || (Digits == 5))
         NormalizationFactor = 0.0001;
      else
         NormalizationFactor = 0.01;
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
      Alert("In de-init() - getting ready to delete objects ");
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_LABEL);
      Alert("In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString(GetLastError()));
      
      ResetLastError();
      ObjectsDeleteAll(0, OBJ_BUTTON);
      Alert("In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString(GetLastError()));
  }

Como podem ver, eu não mudei a "carne" das funções. Eu simplesmente fiz os mods necessários para se adequar à nova funcionalidade. Uma coisa que ainda estou um pouco enevoado é a mudança de start() para OnStart() ou OnTick(), o que quer que seja(esqueci no momento, mas ainda estou usando start() sem problemas. Devo mencionar que este é um indicador personalizado. Outra coisa sobre a qual tenho uma queixa são as limitações do que você pode usar, dependendo se você está codificando um EA, indicador ou roteiro. Há algumas coisas que fazem sentido (como não permitir que as negociações sejam implementadas a menos que você esteja codificando um EA) e outras que não o fazem (como a proibição de usar uma MessageBox in e um indicador). Outra coisa que realmente me incomoda é não ter eventos disponíveis para coisas como abertura e fechamento de comércios. Isto seria realmente útil para o que estou organizando agora.

Um exemplo do que estou querendo dizer com minha última declaração é este: Quero ser capaz de exibir um sinal de Compra se certos critérios forem atendidos, exibir um sinal de Compra Fechada se certos critérios forem atendidos, mas também quero permitir que meu usuário possa cancelar o sinal de Compra e esperar por outro se desejar e idem para o sinal Fechar. Se eles optarem por fechar a negociação, quero que os sinais de Compra e Fechar Compra desapareçam e que o indicador observe os critérios de entrada para outra negociação. As peças de cancelamento funcionam perfeitamente, mas não consigo detectar eventos de Abertura e Fechamento porque a MQL4 não fornece as mensagens para isso.

Se você tiver olhado meu perfil, terá visto que não sou de forma alguma um programador novato. A linguagem simplesmente não oferece todas as funcionalidades que um profissional espera e precisa de uma plataforma de desenvolvimento moderna. Por outro lado, não consigo que a depuração funcione, o que é uma grande queixa. Segui a documentação, mas quando tentei colocar o depurador em movimento, recebi um gráfico que apareceu no diálogo de propriedades para inicializar meu indicador, mas quando apertei Ok para terminar a configuração do indicador, o gráfico desapareceu e pronto. Talvez as coisas estejam se perdendo na tradução do russo para o inglês e eu esteja apenas perdendo algo ou talvez o "bolo" não esteja bem assado. Como profissional, sei como é monumental a tarefa de criar uma linguagem e um ambiente de desenvolvimento como este. Minhas observações têm mais a ver com a natureza dos FYI's para o pessoal de desenvolvimento do que com reclamações.

Prof

 
ProfessorMetal:

Sem problemas, angevogeur

O código era originalmente este:


Prof

Desculpe, mas o código que você postou não foi compilado. Eu lhe peço o código para tentar reproduzir seu problema.
 

Se você não tiver declarado as variáveis que estou definindo e também não tiver os métodos que estou chamando declarados e preenchidos, ele não será compilado. Não pode. Eu teria esperado que você soubesse disso. Eu postei o que eu pensava que você estava pedindo - a solução que resolveu meu problema. De qualquer forma, se você está com MetaQuotes e está tentando descobrir o que está acontecendo com MetaTrader e consertá-lo, eu postei mais abaixo. Comente o if block init(), declare MA_Display_Time_Frame globalmente como um número inteiro e adicione estes métodos :

void CreateMAPeriodButtons()
  {
//  Alert("In CreateMAPeriodButtons()");
      int X_Distance = 10;
      int Y_Distance = 20;
      // Create MA Period Label
      ObjectCreate("MAPeriodLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSet("MAPeriodLabel", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
      ObjectSet("MAPeriodLabel", OBJPROP_XDISTANCE, X_Distance);
      ObjectSet("MAPeriodLabel", OBJPROP_YDISTANCE, Y_Distance);
      ObjectSetText("MAPeriodLabel", "MA Display Period", 12, "Arial", clrYellow);
      
      // Create Period Buttons
      CreateButton("M1", "M1", 1, 140, 50, 100, 20, "Arial", 12, clrYellow, clrGray);
}

void CreateDismissSignalButtons()
  {
      int X_Distance = 25;
      int Y_Distance = 100;
      
      // Create Dismiss Label
      ObjectCreate("DismissSignalsLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSet("DismissSignalsLabel", OBJPROP_CORNER, CORNER_RIGHT_LOWER);
      ObjectSet("DismissSignalsLabel", OBJPROP_XDISTANCE, X_Distance);
      ObjectSet("DismissSignalsLabel", OBJPROP_YDISTANCE, Y_Distance);
      ObjectSetText("DismissSignalsLabel", "Dismiss Trade Signals", 12, "Arial", clrYellow);
      
      // Create Dismiss Buttons
      
      CreateButton("DismissBuySignal", "Dismiss Buy Signal", CORNER_RIGHT_LOWER, 200, 95, 190, 20, "Arial", 12, clrYellow, clrGray);
}

void CreateButton(string strButtonName, string strButtonText, const int nCorner, const int nXpos, const int nYpos, int nWidth, int nHeight, string strFont, 
                    int nFontSize, int nFontColor, int nBackColor, bool bSelected = false)
  {      
      ObjectCreate(0, strButtonName, OBJ_BUTTON, 0, 0, 0);

      //--- set button coordinates
      
      ObjectSetInteger(0, strButtonName, OBJPROP_CORNER, nCorner);

      ObjectSetInteger(0, strButtonName, OBJPROP_XDISTANCE, nXpos);

      ObjectSetInteger(0, strButtonName, OBJPROP_YDISTANCE, nYpos);
 
      //--- set button size
      ObjectSet(strButtonName, OBJPROP_XSIZE, nWidth);
     
      ObjectSet(strButtonName, OBJPROP_YSIZE, nHeight);

      //--- set the chart's corner, relative to which point coordinates are defined
      
      ObjectSet(strButtonName, OBJPROP_CORNER, nCorner);

      //--- set the text
      
      ObjectSetString(0, strButtonName, OBJPROP_TEXT, strButtonText);
      ObjectSetString(0, strButtonName, OBJPROP_FONT, strFont);
      ObjectSetInteger(0, strButtonName, OBJPROP_FONTSIZE, nFontSize);
      ObjectSetInteger(0, strButtonName, OBJPROP_COLOR, nFontColor);

      //--- set background color
      
      ObjectSetInteger(0, strButtonName, OBJPROP_BGCOLOR, nBackColor);
      
      return;
  }

Já que se pretende que este seja um produto comercial que não é todo o código indicador por qualquer meio, mas isto deve compilar e potencialmente causar o problema usando os métodos init() e deinit() originais. É suficiente criar alguns rótulos e botões. Como um dos cartazes mencionados, a falha foi intermitente. Estava, no entanto, relacionada a qualquer ação que causasse a desinicialização do indicador, como a mudança das propriedades do indicador, a mudança dos períodos de tempo ou a parada e reinicialização do terminal. Se você quiser testar a mudança das propriedades, adicione estes externs aos globos:

extern int               Number_Of_TimeFrames = 2;
extern int               Number_Of_Periods_For_Trend_Agreement = 25;
extern bool             Allow_Modify_Entry_Timeframe = true;

Se você adicionar os externs, não há necessidade de comentar o se bloco que os referencia. Isso deve ser suficiente para que você possa compilá-lo e tentar reproduzir o problema. O problema não ocorreu desde que mudei as antigas funções de inicialização e desinicialização e fui para as novas versões. Se você precisar de mais alguma coisa, me avise. Ficarei de olho no fio da meada.

 

Eu tinha uma situação semelhante, o índio trabalhou bem quando caiu na tabela.

Funcionou bem após a mudança de parâmetros, funcionou bem após o turno Tf.

Depois de fechar o MT4 e reiniciá-lo, o índio não apareceu.

Estava na lista de indicadores no gráfico, mas não funcionou.

Depois de abrir a janela de parâmetros e clicar no botão OK, o indi desapareceu imediatamente da lista.

Tentei todos os truques, incluindo os descritos nos posts acima, nada funcionou.

Acabou sendo a divisão por edição 0!

A condição simples: se(x!=0) resolveu o problema.

 

Sim, acabo de ter o mesmo problema com outro índio.

Sem o "se" toda vez que a plataforma é iniciada, o índio tem a divisão por 0 questão,

o novo MT4 parece não ter nenhuma informação armazenada até que seja assinalado.

A outra solução seria usar o OnCalculate() em vez de start() ou OnStart(), eu acho que?

Mas, isso é algo a reclamar da MetaQuotes.

   double pipValue = MarketInfo(Symbol(),MODE_TICKVALUE); 

   if(pipValue!=0)
    {
   double lots   = AccountBalance()*(RiskPercent/100.0)/(StopLoss*pipValue);
    }
 

Você tem que usar o truque do retorno (0 ).

Alguém vai elaborar um pouco, se houver interesse.

 
deysmacro:

Você tem que usar o truque do retorno (0 ).

Alguém vai elaborar um pouco, se houver interesse.


Bem, os indicadores antigos que você pode encontrar em qualquer lugar na Internet não têm seu código modificado automaticamente.

Se alguém pode ajustar códigos e entender o problema, pode fazê-lo por conta própria.

Todo o resto é obrigado a sentir o desconforto de não ver seus índios toda vez que eles abrem o MT4.

Se eles tiverem um modelo, podem usá-lo para restaurar o índio, mas isso significa fazer isso todas as vezes.

Os gabaritos são outra história, no novo Construído 625.

 

Gente,

Vocês estão todos fora da marca. O que vocês estão descrevendo é uma questão de tempo que sempre foi um problema. Você pode tratar disso de forma muito simples com isto:

// Wait for the server "turmoil" to settle before doing anything
      string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(0);

Qualquer divisão por erro zero que você possa estar recebendo é devido a você tentar fazer cálculos antes que o servidor tenha se estabelecido. Se você estiver fazendo cálculos na função de inicialização - NÃO! Coloque o código acima em seu start() ou OnStart() e ENTÃO faça o que você precisa fazer. Dadas, tentando torná-lo tão simples quanto você vai te morder muito. Você está tendo sorte em seu índio.

Quando um índio desaparece, você tem um fracasso na inicialização. Se você olhar para seus registros, você verá "falha na inicialização global". Você precisa descobrir por que está conseguindo isso e endireitar as coisas. Se não o fizer, tudo o que você fez foi colocar uma BandAid num corte que precisava de pontos e ele voltará para cima de você.

 

Parece-me que este erro não tem nada a ver com o OnInit() e a descrição do erro é enganosa.

Com apenas uma única linha de código

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  Print(High[rates_total]);
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ele dará à matriz um erro fora de alcance.

Mudar o cronograma e obter a inicialização Global falhou e o indicador é removido do gráfico.

 
Pode ser, GumRai, Parece que há diferentes questões aqui. Uma é não ser chamado quando deveria ser e deixar as coisas penduradas por aí. O que você está vendo com OnCalculate() soa como uma falha na implementação da função da MQL, se eu entender como ela deve funcionar. Outro é tentar fazer coisas antes que o servidor tenha se estabelecido e "inicializado" as informações do lado do servidor. Estou apenas adivinhando aqui, mas o último pode também estar causando o que você está vendo com a OnCalculate(). Parece que os desenvolvedores de MQL têm um pouco de depuração a fazer. Para ser justo, o que eles estão tentando fazer não é trivial. Só é de se esperar que haja falhas.
Razão: