Pequeño indicador de gestión del dinero arruinado por el nuevo MQL4 - página 2

 
@deysmacro: Ya sé dónde está la línea que provoca la división por cero. Es porque necesito el rango promedio diario de los últimos cinco días. Luego en el indicador divido algo por ese ATR y mientras no se actualicen los datos el ATR es cero y ese es el problema. Necesito estar seguro de que los datos diarios de al menos los últimos 5 días están disponibles. Sólo entonces el ATR será >0 y el indicador funciona.
 
mar:
@deysmacro: Ya sé dónde está la línea que provoca la división por cero. Es porque necesito el rango promedio diario de los últimos cinco días. Después en el indicador divido algo por ese ATR y mientras no se actualicen los datos el ATR es cero y ese es el problema. Necesito estar seguro de que los datos diarios de al menos los últimos 5 días están disponibles. Sólo entonces el ATR será >0 y el indicador funciona.

Poner los datos disponibles en GV y recuperarlos. De esta manera, cuando haya datos que lleguen o haya diferencias en los datos, sólo hay que actualizar GV.

Quizá ATR funcione así.


La gente siempre decía "haz que funcione primero, luego optimiza el código".

A veces para que funcione, la línea de códigos es muy larga pero una vez que funciona, puedes empezar a recortar el código. :)

 

Tal vez suene estúpido, pero ¿qué es la GV?

 

Por supuesto... :-)

Otra cosa que no puedo explicar: El siguiente código es una pequeña modificación de mi primer código que publiqué. También es un indicador de Moneymanagement pero he eliminado el ATR. Sólo imprime niveles de stop loss de 5 - 100 pips en pasos de 5 pips. Por lo tanto, no hay cálculo de ATR en absoluto. Cuando usted arrastra este indicador a su gráfico funciona bien. Cada par, cada marco de tiempo. No hay problemas. Pero cuando se abre el MetaTrader se produce un error de división por cero y de nuevo sólo se imprime la "etiqueta" en lugar de los niveles de pérdida de la parada.

El error se produce en esta línea:

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

Imprimí TODAS las variables de esta línea y llegué a la conclusión de que AccountBalance() es cero y MarketInfo(Symbol(), MODE_TICKVALUE) es cero. Así que, obviamente, al abrir el MetaTrader, no hay ningún dato disponible. Esto nunca ocurrió en el antiguo MetaTrader. Así que no tengo ni idea de qué hacer...

Aquí está el 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);
¿No sabes lo básico de las órdenes de cálculo de matemáticas? Enseguida sé cuál es el problema. Sus órdenes de cálculo matemático.
 

¿Podría ser un poco más preciso? ¿Cuál es exactamente el problema con ellos (porque siempre ha funcionado..)?


Creo que sigue existiendo el problema de que AccountBalance() y otros datos que necesito de MetaTrader no están disponibles justo después de iniciar la Plataforma.

 

Otro ejemplo:

#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);
  }
//+------------------------------------------------------------------+
Si abre el MetaTrader, el resultado será cero. Y se queda en cero hasta que cambies el marco temporal o el par. Creo que este es exactamente el problema del error de división por cero. ¿No crees tú también?
 
mar:

Imprimí TODAS las variables de esta línea y llegué a la conclusión de que AccountBalance() es cero y MarketInfo(Symbol(), MODE_TICKVALUE) es cero. Así que, obviamente, al abrir el MetaTrader, no hay ningún dato disponible. Esto nunca ocurrió en el antiguo MetaTrader. Así que no tengo ni idea de qué hacer...

Aquí está el código:

Si estás seguro de que esta es la causa del problema, añade esto justo después de Start()

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

Hola GumRai,

Lo he probado con el indicador anterior. El AccountBalance se mantiene en cero incluso si dejo que el MetaTrader funcione durante algunos minutos. Sólo hasta que cambié algo manualmente (par, marco de tiempo) se muestra el AccountBalance correcto. Y si utilizo su solución no tengo problemas con el error de división por cero, pero el indicador nunca hará su trabajo porque AccountBalance permanece cero.

Me pregunto si soy la única persona que tiene este problema. Creo que es un problema general de importación de datos del nuevo MetaTrader...