int init()
{
// Check for input errorsif (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");
//---- indicatorsSetIndexStyle(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 wishResetLastError();
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 pairif ((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 |//+------------------------------------------------------------------+intOnInit()
{
// Check for input errorsif (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");
//---- indicatorsSetIndexStyle(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 wishResetLastError();
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 pairif ((Digits == 4) || (Digits == 5))
NormalizationFactor = 0.0001;
else
NormalizationFactor = 0.01;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint 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.
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 LabelObjectCreate("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 LabelObjectCreate("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, constint nCorner, constint nXpos, constint 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 coordinatesObjectSetInteger(0, strButtonName, OBJPROP_CORNER, nCorner);
ObjectSetInteger(0, strButtonName, OBJPROP_XDISTANCE, nXpos);
ObjectSetInteger(0, strButtonName, OBJPROP_YDISTANCE, nYpos);
//--- set button sizeObjectSet(strButtonName, OBJPROP_XSIZE, nWidth);
ObjectSet(strButtonName, OBJPROP_YSIZE, nHeight);
//--- set the chart's corner, relative to which point coordinates are definedObjectSet(strButtonName, OBJPROP_CORNER, nCorner);
//--- set the textObjectSetString(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 colorObjectSetInteger(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:
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.
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 anythingstring 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ê.
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.
Sem problemas, angevogeur
O código era originalmente este:
Eu simplesmente o modifiquei para isto:
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
Sem problemas, angevogeur
O código era originalmente este:
Prof
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 :
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:
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.
Você tem que usar o truque do retorno (0 ).
Alguém vai elaborar um pouco, se houver interesse.
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:
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
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.