Pequeno indicador de gestão de dinheiro arruinado pelo novo MQL4 - página 2

 
@deysmacro: Eu sei onde está a linha que causa a divisão por zero. É porque preciso da faixa média diária dos últimos cinco dias. Mais tarde no indicador divido algo por esse ATR e enquanto os dados não forem atualizados, o ATR é zero e esse é o problema. Preciso ter certeza de que os dados diários de pelo menos os últimos 5 dias estão disponíveis. Só então a ATR será >0 e o indicador funcionará.
 
mar:
@deysmacro: Eu sei onde está a linha que causa a divisão por zero. É porque eu preciso da faixa média diária dos últimos cinco dias. Mais tarde no indicador eu divido algo por esse ATR e enquanto os dados não forem atualizados, o ATR é zero e esse é o problema. Preciso ter certeza de que os dados diários de pelo menos os últimos 5 dias estão disponíveis. Só então a ATR será >0 e o indicador funcionará.

Coloque os dados disponíveis na GV e os recupere. Dessa forma, quando houver dados chegando ou houver diferenças nos dados, basta atualizar a GV.

Talvez a ATR funcione dessa forma.


As pessoas sempre diziam "Faça-o funcionar primeiro, depois otimize o código".

Às vezes, para que funcione, a linha de códigos é muito longa, mas uma vez que esteja funcionando, você pode começar a aparar o código :)

 

Talvez pareça estúpido, mas o que é GV?

 
Variáveis globais
 

É claro... :-)

Algo mais que eu não posso explicar: O seguinte código é uma pequena modificação do meu primeiro código que publiquei. É também um indicador de Moneymanagement, mas eu removi o ATR. Ele só imprime níveis de perda de 5 - 100 pips em 5-pip-steps. Portanto, não há nenhum cálculo de ATR. Quando você arrasta este indicador para seu gráfico, ele funciona bem. Cada par, cada período de tempo. Sem problemas. Mas quando você abre o MetaTrader, ele causa uma divisão por erro zero e novamente apenas "Label" é impresso em vez dos níveis de stop loss.

O erro é causado nesta linha:

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

Imprimi TODAS as variáveis desta linha e cheguei à conclusão de que AccountBalance() é zero e MarketInfo(Symbol(), MODE_TICKVALUE) é zero. Portanto, obviamente quando você abre o MetaTrader, não há nenhum dado disponível. Isto nunca aconteceu no antigo MetaTrader. Portanto, não tenho a menor idéia do que fazer...

Aqui está o código:

#property indicator_chart_window
//--- input parameters
extern int  Risk=5;
extern int SL_Levels=20;
int multi, exp1, 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;
   exp1     = 0;
   modifySpread = 1;
   if (Digits==5 || Digits==3)
   {
      modifySpread = 0.1;
      multi=10;
      exp1=1;
   }
//----
   SL = 10;
//----
   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;
   Print(Spread);
   Print(AccountBalance());
   Print(MoneyRisk);
   Print(MarketInfo(Symbol(), MODE_TICKVALUE));
   Print(SL);
   Print(multi);
   for(i=1; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
      ObjectSetText("SL"+i, SL+ " : "+DoubleToStr(lots, 2), 10, "Calibri", White);
      k=k+15;
      SL = SL+5;     
   }
   SL = 10;
   ObjectSetText("Spread", Spread, 10, "Calibri", White);

   WindowRedraw();
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
lots=MoneyRisk/SL/(MarketInfo(Symbol(), MODE_TICKVALUE)*multi);
Você não conhece o básico das ordens de cálculo matemático? Imediatamente eu sei qual é o problema. Suas ordens de cálculo de Matemática.
 

Você poderia ser um pouco mais preciso? Qual é exatamente o problema com eles (porque sempre funcionou...)?


Acho que ainda há o problema de o AccountBalance() e outros dados que preciso do MetaTrader não estarem disponíveis logo após o início da Plataforma.

 

Outro exemplo:

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
//----
  {
   Comment  (AccountBalance());
//----
   return(0);
  }
//+------------------------------------------------------------------+
Se você abrir o MetaTrader, o resultado será zero! E ele permanece zero até que você altere o prazo ou o par. Acho que este é exatamente o problema da divisão por erro zero. Você não acha também?
 
mar:

Imprimi TODAS as variáveis desta linha e cheguei à conclusão de que AccountBalance() é zero e MarketInfo(Symbol(), MODE_TICKVALUE) é zero. Portanto, obviamente quando você abre o MetaTrader, não há nenhum dado disponível. Isto nunca aconteceu no antigo MetaTrader. Portanto, não tenho a menor idéia do que fazer...

Aqui está o código:

Se você tem certeza de que esta é a causa do problema, acrescente isto logo após Start()

if( MarketInfo(Symbol(), MODE_SPREAD)==0 || AccountBalance() == 0 )
   return(0);
 

Ei GumRai,

Eu o testei com o indicador acima. O AccountBalance permanece zero, mesmo se eu deixar o MetaTrader funcionar por alguns minutos. Somente até que eu mudei algo manualmente (par, prazo) o AccountBalance correto é exibido. E se eu usar sua solução, não terei problemas com a divisão por erro zero, mas o indicador nunca fará seu trabalho porque o AccountBalance permanece zero.

Estou me perguntando se sou a única pessoa que tem este problema? Acho que é uma questão geral de importação de dados do novo MetaTrader.