Pequeno indicador de gestão de dinheiro arruinado pelo novo MQL4

 

Ei, codificadores,

Eu fiz um pequeno indicador de Moneymanagement que funcionou bem para mim. Mas desde o novo MQL4 ele causa problemas que eu não consigo lidar.

Quando você arrasta este indicador para o seu gráfico, alguns números são impressos no lado direito. O primeiro número significa o Stoploss em pips e o segundo é o tamanho do lote. Nas opções, você pode escolher o risco. O outro número são os níveis de Stoploss. Mas quando eu troco o par de moedas, os números desaparecem. Em vez disso, vejo várias vezes a palavra "Rótulo". E quando olho para a lista de indicadores, meu indicador também desaparece. Assim, em resumo, depois de mudar o par de moedas, o indicador desaparece e deixa as etiquetas em vez dos números.

Estou totalmente confuso. Este indicador costumava funcionar sem nenhum problema. A ajuda é muito apreciada.

Aqui está o código:

#property indicator_chart_window
//--- input parameters
extern int  Risk=2;
extern int SL_Levels=20;
int multi, exp, SL, i, k;
double MoneyRisk, Spread, _modifySpread, lots;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   k=0;
   for(i=1; i<=SL_Levels; i++)
   {
      if (ObjectFind("SL"+i) == -1)
      {
         ObjectCreate("SL"+i, OBJ_LABEL, 0, 0, 0);
         ObjectSet("SL"+i, OBJPROP_CORNER, 1);
         ObjectSet("SL"+i, OBJPROP_XDISTANCE, 3);
         ObjectSet("SL"+i, OBJPROP_YDISTANCE, k);
         k=k+15;    
      }
   }
   if (ObjectFind("Spread") == -1)
   {
      ObjectCreate("Spread", OBJ_LABEL, 0, 0, 0);
      ObjectSet("Spread", OBJPROP_CORNER, 3);
      ObjectSet("Spread", OBJPROP_XDISTANCE, 3);
      ObjectSet("Spread", OBJPROP_YDISTANCE, 1);
   }
   
//-- 4 / 5 Digit Settings --
   multi   = 1;
   exp     = 0;
   if (Digits==5 || Digits==3)
   {
      _modifySpread = 0.1;
      multi=10;
      exp=1;
   }
//----
   SL = MathFloor((iATR(NULL, PERIOD_D1, 7, 0)*MathPow(10,Digits-exp)+1)*0.1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(i=1; i<=SL_Levels; i++)
   {
      ObjectDelete("SL"+i);
   }
   ObjectDelete("Spread");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   Spread     = MarketInfo(Symbol(), MODE_SPREAD)*_modifySpread;
   MoneyRisk  = AccountBalance()*Risk*0.01;
   k=0;
   for(i=1; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
      ObjectSetText("SL"+i, SL+ " : "+DoubleToStr(lots, 2), 10, "Calibri", Red);
      k=k+15;
      SL = SL+MathFloor(((iATR(NULL, PERIOD_D1, 7, 0)*MathPow(10,Digits-exp)+1)*0.1)/2);     
   }
   SL = MathFloor((iATR(NULL, PERIOD_D1, 7, 0)*MathPow(10,Digits-exp)+1)*0.1);
   ObjectSetText("Spread", DoubleToStr(Spread,1), 10, "Calibri", Red);
   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

primeiro você não pode usar "exp" para um int que está reservado

segundo você expressa o "SL

SL = MathFloor((iATR(NULL, PERIOD_D1, 7, 0)*MathPow(10,Digits-exp)+1)*0.1);

na seção init, má idéia

porque se você receber Erro 4066 o "SL" = 0

então você recebe divisão zero em "lotes".

lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);

e o indicador pára e você tem que recarregar o indicador

 
Eu entendo. Apenas mudei a variável exp, mas você pode me dizer como verificar ou evitar o erro 4066? Li que tem a ver com o fato de que o MetaTrader atualiza apenas as citações do gráfico atual e o cronograma. Mas o que você sugeriria fazer para evitar o 4066?
 

obviamente você não pode evitar a atualização ;-) mas você tem que evitar uma situação de "divisão zero".

então você tem que verificar se uma das variáveis é igual a 0.... no caso de evitar divisão zero

e porque você não pode parar um indicador, você tem que descobrir algo

exemplo:

SL = MathFloor((iATR(NULL, PERIOD_D1, 7, 0)*MathPow(10,Digits-exp)+1)*0.1);
if (SL == 0) // because error 4066 (for example)
   {
   SL = Someting;
   }
lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
 

Você está certo... Não posso evitá-lo. :-)

O que eu quis dizer é: posso esperar até que a atualização seja concluída antes de continuar com o cálculo do SL? O problema é que eu não posso dar ao SL um valor aleatório porque então todo o indicador é inútil. Portanto, eu gostaria de verificar o erro 4066 e se ele ocorrer, gostaria de esperar de alguma forma e verificar novamente antes de continuar.

 

A propósito, eu tenho o mesmo problema com este indicador. Mas por que não foi um problema no "velho" MetaTrader? Aqui eu sempre recebo um zero para o ATR(5). POR QUÊ?!?! Isso nunca aconteceu antes... Eu odeio este novo MetaTrader...!

int start()
//----
  {
   double Spread = MarketInfo(Symbol(), MODE_SPREAD);
   double ATR = iATR(NULL, PERIOD_D1, 5, 0);
   int exp1 = 0;
   if (Digits==5 || Digits==3)
   {
      Spread=Spread*0.1;
      exp1 = 1;
   }
   Comment  (
            "ADR(5): ",DoubleToStr(ATR*MathPow(10,Digits-exp1),1),
            " || TODAY: ",(iHigh(NULL, PERIOD_D1, 0)-iLow(NULL, PERIOD_D1, 0))*MathPow(10,Digits-exp1),
            " || ", DoubleToStr(((iHigh(NULL, PERIOD_D1, 0)-iLow(NULL, PERIOD_D1, 0))*MathPow(10,Digits-exp1)/(ATR*MathPow(10,Digits-exp1))*100), 2), "%",
            "\n" +
            "SPREAD: ", Spread,
            " || RATIO: ",DoubleToStr((Spread/ATR)*MathPow(10,-(Digits-exp1-2)), 2),"%"
            );
//----
   return(0);
  }
 
O que você quer dizer com zero? Imprimo todos os comentários e o ATR(5) mostra uma produção maior que zero ... acima de 50 na verdade ...
 

Acho que encontrei o problema! É definitivamente um problema de atualização. Quando eu agora mudo de moeda, o indicador funciona. Mas então abri um par de moedas que ainda não tinha aberto hoje. Então recebi esta mensagem:


Abra um par que você ainda não tenha aberto hoje. Mude para o tempo que você quiser, exceto D1. Em seguida, arraste o indicador para o seu gráfico. O resultado será um erro como acima. Parece-me que o ATR(5) do gráfico diário não está correto por causa da falta de DADOS DIÁRIOS. A abertura de um gráfico "fresco" no cronograma D1 não causa nenhum problema. E quando você muda para outro período de tempo, também está bem porque o ATR(5) está correto. Notei que posso mudar para qualquer par desde que eu permaneça na tabela D1. Mas mudar para outros pares em outros períodos de tempo que não D1 causa problemas desde que o MetaTrader não tenha recebido os dados diários. Então, minha pergunta agora é: como posso obter os dados diários que meu cálculo ATR está correto quando abro um novo gráfico em um período de tempo que não é D1?
 

Você tem que colocar algo como

if(number==0)dothis; else dothis; 

em ShowSpread.mq4


Basta pesquisar a linha onde ocorre esta divisão zero.

 
mar:

Acho que encontrei o problema! É definitivamente um problema de atualização. Quando eu agora mudo de moeda, o indicador funciona. Mas então abri um par de moedas que ainda não tinha aberto hoje. Então recebi esta mensagem:


Abra um par que você ainda não tenha aberto hoje. Mude para o tempo que você quiser, exceto D1. Em seguida, arraste o indicador para o seu gráfico. O resultado será um erro como acima. Parece-me que o ATR(5) do gráfico diário não está correto por causa da falta de DADOS DIÁRIOS. A abertura de um gráfico "fresco" no cronograma D1 não causa nenhum problema. E quando você muda para outro período de tempo, também está bem porque o ATR(5) está correto. Notei que posso mudar para qualquer par desde que eu permaneça na tabela D1. Mas mudar para outros pares em outros períodos de tempo que não D1 causa problemas desde que o MetaTrader não tenha recebido os dados diários. Então, minha pergunta agora é: como posso obter os dados diários que meu cálculo ATR está correto quando abro um novo gráfico em um período de tempo que não é D1?
qjol já lhe disse onde está o problema. Por que você não segue ou pelo menos verifica o que as pessoas lhe aconselharam se você está solicitando ajuda?
 

angevoyageur, acho que você não viu este post de mim:

mar 2014.04.02 08:16 #

Você está certo... Não posso evitá-lo. :-)

"O que eu quis dizer é: posso esperar até que a atualização seja concluída antes de prosseguir com o cálculo do SL? O problema é que eu não posso dar ao SL um valor aleatório porque então todo o indicador é inútil. Portanto, eu gostaria de verificar o erro 4066 e se ele ocorrer, gostaria de esperar de alguma forma e verificar novamente antes de continuar".

Lá você pode ver que não posso seguir o conselho e porque cheguei a essa solução você também pode ver que eu definitivamente verifiquei o que qjol me aconselhou.