Piccolo Moneymanagement-Indicator rovinato dal nuovo MQL4 - pagina 2

 
@deysmacro: So dov'è la linea che causa la divisione per zero. È perché ho bisogno dell'intervallo medio giornaliero degli ultimi cinque giorni. Più tardi nell'indicatore divido qualcosa per quell'ATR e finché i dati non sono aggiornati l'ATR è zero e questo è il problema. Ho bisogno di essere sicuro che i dati giornalieri di almeno gli ultimi 5 giorni siano disponibili. Solo allora l'ATR sarà >0 e l'indicatore funziona.
 
mar:
@deysmacro: So dov'è la linea che causa la divisione per zero. È perché ho bisogno della media giornaliera degli ultimi cinque giorni. Più tardi nell'indicatore divido qualcosa per quell'ATR e finché i dati non sono aggiornati l'ATR è zero e questo è il problema. Ho bisogno di essere sicuro che i dati giornalieri di almeno gli ultimi 5 giorni siano disponibili. Solo allora l'ATR sarà >0 e l'indicatore funziona.

Metti i dati disponibili in GV e recuperali. In questo modo, quando ci sono dati in arrivo o ci sono differenze nei dati, basta aggiornare GV.

Forse ATR funziona così.


La gente ha sempre detto "Prima fallo funzionare, poi ottimizza il codice".

A volte, per farlo funzionare, le linee di codice sono molto lunghe, ma una volta che funziona, si può iniziare a tagliare il codice. :)

 

Forse sembra stupido, ma cos'è GV?

 
Variabili globali
 

Naturalmente... :-)

Un'altra cosa che non riesco a spiegare: Il seguente codice è una piccola modifica del mio primo codice che ho postato. È anche un indicatore Moneymanagement ma ho rimosso l'ATR. Stampa solo i livelli di stop loss da 5 a 100 pips in step di 5 pips. Quindi, non c'è nessun calcolo dell'ATR. Quando trascini questo indicatore sul tuo grafico funziona bene. Ogni coppia, ogni timeframe. Nessun problema. Ma quando apri la MetaTrader causa un errore di divisione per zero e ancora una volta viene stampata solo "Label" invece dei livelli di stop loss.

L'errore è causato da questa linea:

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

Ho stampato TUTTE le variabili di questa linea e sono arrivato alla conclusione che AccountBalance() è zero e MarketInfo(Symbol(), MODE_TICKVALUE) è zero. Quindi ovviamente quando si apre la MetaTrader, nessun dato è disponibile. Questo non è mai successo nella vecchia MetaTrader. Quindi non ho idea di cosa fare...

Ecco il codice:

#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);
Non conosci le basi degli ordini di calcolo matematico? So subito qual è il problema. I tuoi ordini di calcolo matematico.
 

Potresti essere un po' più preciso? Qual è esattamente il problema (perché ha sempre funzionato..)?


Penso che ci sia ancora il problema che AccountBalance() e altri dati di cui ho bisogno da MetaTrader non sono disponibili subito dopo aver avviato la piattaforma.

 

Un altro esempio:

#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 aprite la MetaTrader, il risultato sarà zero! E rimane zero finché non si cambia il timeframe o la coppia. Penso che questo sia esattamente il problema dell'errore di divisione per zero. Non credi anche tu?
 
mar:

Ho stampato TUTTE le variabili di questa linea e sono arrivato alla conclusione che AccountBalance() è zero e MarketInfo(Symbol(), MODE_TICKVALUE) è zero. Quindi ovviamente quando si apre la MetaTrader, nessun dato è disponibile. Questo non è mai successo nella vecchia MetaTrader. Quindi non ho idea di cosa fare...

Ecco il codice:

Se siete sicuri che questa sia la causa del problema, aggiungete questo subito dopo Start()

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

Ciao GumRai,

L'ho testato con l'indicatore di cui sopra. L'AccountBalance rimane a zero anche se lascio la MetaTrader in funzione per alcuni minuti. Solo fino a quando non ho cambiato qualcosa manualmente (coppia, timeframe) l'AccountBalance corretto viene visualizzato. E se uso la tua soluzione non ho problemi con l'errore di divisione per zero ma l'indicatore non farà mai il suo lavoro perché AccountBalance rimane a zero.

Mi sto chiedendo se sono l'unica persona che ha questo problema? Penso che sia un problema generale di importazione di dati della nuova MetaTrader...