Kleiner Moneymanagement-Indikator durch neuen MQL4 ruiniert - Seite 2

 
@deysmacro: Ich weiß, wo die Linie ist, die die Division durch Null verursacht. Es ist, weil ich den täglichen durchschnittlichen Bereich der letzten fünf Tage brauche. Später im Indikator teile ich etwas durch diese ATR und solange die Daten nicht aktualisiert werden, ist die ATR Null und das ist das Problem. Ich muss sicher sein, dass die täglichen Daten von mindestens den letzten 5 Tagen verfügbar sind. Nur dann wird die ATR >0 sein und der Indikator funktioniert.
 
mar:
@deysmacro: Ich weiß, wo die Zeile ist, die die Division durch Null verursacht. Das liegt daran, dass ich den täglichen Durchschnittsbereich der letzten fünf Tage brauche. Später im Indikator teile ich etwas durch diese ATR und solange die Daten nicht aktualisiert werden, ist die ATR Null und das ist das Problem. Ich muss sicher sein, dass die täglichen Daten von mindestens den letzten 5 Tagen verfügbar sind. Nur dann wird die ATR >0 sein und der Indikator funktioniert.

Legen Sie die verfügbaren Daten in GV ein und rufen Sie sie ab. Auf diese Weise können Sie GV einfach aktualisieren, wenn neue Daten hinzukommen oder es Unterschiede in den Daten gibt.

Vielleicht funktioniert ATR auf diese Weise.


Die Leute haben immer gesagt: "Erst soll es funktionieren, dann den Code optimieren."

Damit es funktioniert, sind die Codezeilen manchmal sehr lang, aber sobald es funktioniert, können Sie den Code kürzen :)

 

Vielleicht klingt es dumm, aber was ist GV?

 
Globale Variablen
 

Natürlich... :-)

Etwas anderes kann ich nicht erklären: Der folgende Code ist eine kleine Modifikation meines ersten Codes, den ich gepostet habe. Es handelt sich ebenfalls um einen Moneymanagement-Indikator, aber ich habe die ATR entfernt. Er gibt nur Stop-Loss-Levels von 5 - 100 Pips in 5-Pip-Schritten aus. Es gibt also überhaupt keine ATR-Berechnung. Wenn Sie diesen Indikator auf Ihren Chart ziehen, funktioniert er einwandfrei. Jedes Paar, jeder Zeitrahmen. Keine Probleme. Aber wenn Sie den MetaTrader öffnen, verursacht er einen Fehler bei der Division durch Null und es wird wieder nur "Label" anstelle der Stop-Loss-Levels gedruckt.

Der Fehler wird in dieser Zeile verursacht:

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

Ich habe ALLE Variablen dieser Zeile ausgedruckt und bin zu dem Schluss gekommen, dass AccountBalance() Null ist und MarketInfo(Symbol(), MODE_TICKVALUE) Null ist. Wenn Sie also den MetaTrader öffnen, sind offensichtlich überhaupt keine Daten verfügbar. Das ist im alten MetaTrader nie passiert. Ich habe also keine Ahnung, was ich tun soll...

Hier ist der Code:

#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);
Sie kennen die Grundlagen der mathematischen Berechnungsvorschriften nicht? Ich weiß sofort, wo das Problem liegt. Deine Mathe-Rechenaufträge.
 

Könnten Sie etwas präziser sein? Was genau ist das Problem mit ihnen (denn es hat immer funktioniert...)?


Ich denke, es gibt immer noch das Problem, dass AccountBalance() und andere Daten, die ich vom MetaTrader benötige, nicht direkt nach dem Start der Plattform verfügbar sind.

 

Ein weiteres Beispiel:

#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);
  }
//+------------------------------------------------------------------+
Wenn Sie den MetaTrader öffnen, ist das Ergebnis Null! Und es bleibt Null, bis Sie den Zeitrahmen oder das Paar ändern. Ich denke, das ist genau das Problem des Fehlers bei der Division durch Null. Meinen Sie nicht auch?
 
mar:

Ich habe ALLE Variablen dieser Zeile ausgedruckt und bin zu dem Schluss gekommen, dass AccountBalance() Null ist und MarketInfo(Symbol(), MODE_TICKVALUE) Null ist. Wenn Sie also den MetaTrader öffnen, sind offensichtlich überhaupt keine Daten verfügbar. Das ist im alten MetaTrader nie passiert. Ich habe also keine Ahnung, was ich tun soll...

Hier ist der Code:

Wenn Sie sicher sind, dass dies die Ursache des Problems ist, fügen Sie dies direkt nach Start() ein

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

Hallo GumRai,

ich habe es mit dem obigen Indikator getestet. Der AccountBalance bleibt auf Null, auch wenn ich den MetaTrader für einige Minuten laufen lasse. Erst wenn ich manuell etwas ändere (Paar, Zeitrahmen) wird der richtige Kontostand angezeigt. Und wenn ich Ihre Lösung verwende, habe ich keine Probleme mit dem Fehler der Division durch Null, aber der Indikator wird nie seine Arbeit tun, weil AccountBalance auf Null bleibt.

Ich frage mich, ob ich die einzige Person bin, die dieses Problem hat? Ich denke, es ist ein allgemeines Datenimportproblem des neuen MetaTrader...

Grund der Beschwerde: