Piccolo Moneymanagement-Indicator rovinato dal nuovo MQL4

 

Ehi, codificatori!

Ho fatto un piccolo indicatore Moneymanagement che ha funzionato bene per me. Ma dal nuovo MQL4 causa problemi che non riesco a gestire.

Quando trascini questo indicatore sul tuo grafico alcuni numeri sono stampati sul lato destro. Il primo numero indica lo Stoploss in pip e il secondo è la dimensione del lotto. Nelle opzioni puoi scegliere il rischio. L'altro numero sono i livelli di Stoploss. Ma quando cambio la coppia di valute i numeri non ci sono più. Invece vedo diverse volte la parola "Label". E quando guardo l'elenco degli indicatori, anche il mio indicatore è sparito. Quindi, in sintesi, dopo aver cambiato la coppia di valute, l'indicatore è sparito e sono rimaste le etichette al posto dei numeri.

Sono totalmente confuso. Questo indicatore funzionava senza alcun problema. L'aiuto è molto apprezzato.

Ecco il codice:

#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);
  }
//+------------------------------------------------------------------+
 

Innanzitutto non potete usare "exp" per un int , è riservato

poi esprimi lo "SL"

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

nella sezione init, cattiva idea

perché se ottenete l'errore 4066 il "SL" = 0

allora si ottiene zero dividere su "lotti"

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

e l'indicatore si ferma e devi ricaricare l'indicatore

 
Ho capito. Ho appena cambiato la variabile exp ma potete dirmi come controllare o evitare l'errore 4066? Ho letto che ha a che fare con il fatto che MetaTrader aggiorna solo le quotazioni del grafico e del timeframe corrente. Ma cosa mi consigliate di fare per evitare il 4066?
 

ovviamente non potete evitare l'aggiornamento ;-) ma dovete evitare una situazione di "zero divide"

quindi dovete controllare se una delle variabili è uguale a 0.... nel caso in cui si eviti lo zero divide

e siccome non puoi fermare un indicatore devi inventarti qualcosa

esempio:

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);
 

Hai ragione... Non posso evitarlo :-)

Quello che volevo dire è che posso aspettare che l'aggiornamento sia completato prima di continuare con il calcolo di SL? Il problema è che non posso dare a SL un valore casuale perché allora l'intero indicatore è inutile. Quindi vorrei controllare l'errore 4066 e se si verifica, vorrei aspettare in qualche modo e controllare di nuovo prima di andare avanti.

 

A proposito, ho lo stesso problema con questo indicatore. Ma perché non era un problema nella "vecchia" MetaTrader? Qui ricevo sempre uno zero per l'ATR(5). PERCHE'?!? Questo non è mai successo prima... Odio questa nuova 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);
  }
 
Cosa intendi per zero? Stampo tutto il commento e ATR(5) mostra un output più grande di zero... sopra 50 in effetti...
 

Penso di aver trovato il problema! È sicuramente un problema di aggiornamento. Quando ora cambio valuta, l'indicatore funziona. Ma poi ho aperto una coppia di valute che non avevo ancora aperto oggi. Poi ho ricevuto questo messaggio:


Apri una coppia che non hai ancora aperto oggi. Passa a qualsiasi timeframe tu voglia, tranne D1. Poi trascinate l'indicatore sul vostro grafico. Il risultato sarà un errore come sopra. Mi sembra che l'ATR(5) del grafico giornaliero non sia corretto a causa dei DATI GIORNALIERI mancanti. L'apertura di un grafico "fresco" nel timeframe D1 non causa alcun problema. E quando si passa a un altro timeframe allora va bene anche perché l'ATR(5) è corretto. Ho notato che posso passare a qualsiasi coppia finché resto nel grafico D1. Ma passare ad altre coppie in altri timeframe diversi da D1 causa problemi finché MetaTrader non ha ricevuto i dati giornalieri. Quindi, la mia domanda è ora, come posso ottenere i dati giornalieri che il mio calcolo dell'ATR è corretto quando apro un nuovo grafico in un timeframe che non è D1?
 

Dovete mettere qualcosa come

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

in ShowSpread.mq4


Cerca solo la linea in cui si verifica questa divisione dello zero.

 
mar:

Penso di aver trovato il problema! È sicuramente un problema di aggiornamento. Quando ora cambio valuta, l'indicatore funziona. Ma poi ho aperto una coppia di valute che non avevo ancora aperto oggi. Poi ho ricevuto questo messaggio:


Apri una coppia che non hai ancora aperto oggi. Passa a qualsiasi timeframe che ti piace, tranne D1. Poi trascina l'indicatore sul tuo grafico. Il risultato sarà un errore come sopra. Mi sembra che l'ATR(5) del grafico giornaliero non sia corretto a causa dei DATI GIORNALIERI mancanti. Aprire un grafico "fresco" nel timeframe D1 non causa alcun problema. E quando si passa a un altro timeframe allora va bene anche perché l'ATR(5) è corretto. Ho notato che posso passare a qualsiasi coppia finché resto nel grafico D1. Ma passare ad altre coppie in altri timeframe diversi da D1 causa problemi finché MetaTrader non ha ricevuto i dati giornalieri. Quindi, la mia domanda ora è: come posso ottenere i dati giornalieri che il mio calcolo dell'ATR sia corretto quando apro un nuovo grafico in un timeframe che non sia D1?
qjol ti ha già detto dov'è il problema. Perché non segui o almeno controlli ciò che le persone ti hanno consigliato se stai chiedendo aiuto?
 

angevoyageur, credo che tu non abbia visto questo mio post:

mar 2014.04.02 08:16 #

Hai ragione... Non posso evitarlo :-)

"Quello che volevo dire è: posso aspettare che l'aggiornamento sia completato prima di procedere con il calcolo SL? Il problema è che non posso dare a SL un valore casuale perché allora l'intero indicatore è inutile. Quindi vorrei controllare l'errore 4066 e se si verifica, vorrei aspettare in qualche modo e controllare di nuovo prima di andare avanti".

Lì potete vedere che ha descritto che non posso seguire il consiglio e siccome sono arrivato a quella soluzione potete anche vedere che ho definitivamente controllato quello che qjol mi ha consigliato.