Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 265

 
C-4:
Was meinen Sie mit "ausrichten"? Normalisieren Sie die Mantisse durch die Anzahl der Dezimalstellen? - Dafür ist die Funktion NormalizeDouble gedacht. Wenn etwas anderes, beschreiben Sie es ausführlicher.

Am Eingang ein beliebiges positives Double, am Ausgang gerundet auf den realen Preis, der an diesem Instrument sein kann.

Beträgt die Preisstufe 0,25, so wird auf 0,25 gerundet. In etwa so:

double RoundPrice(const double price)
{
   if(price<=0) return(-1);
   double tick_size=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
   double p=round(price/tick_size);
   return(NormalizeDouble(p*tick_size,_Digits));
}

Wenn es jedoch eine Abweichung gibt (z. B. 0,13; 0,38; 0,63; 0,88), dann zählt sie. Dann:

am Eingang 1.0 am Ausgang 1.13;

1,25 als Eingang und 1,38 als Ausgang;

1,5 ---> 1,63...

Auf API-Ebene könnte dies in ein paar Assembler-Befehlen kodiert werden, und es handelt sich eindeutig um eine Grundfunktion. Ich dachte, es gäbe einen =/

 
wie man ein Update auf den neuen Build via Live-Update durchführt. Wo ist das Live-Update?
 
Newalligator:
wie man ein Update auf den neuen Build via Live-Update durchführt. Wo ist dieses Live-Update?
Sie sollten ein Demokonto auf dem MetaQuotes-Demo-Server eröffnen und sich gelegentlich mit diesem verbinden, um die Aktualisierungen zu überprüfen. So eröffnen Sie ein Demo-Konto auf dem MetaQuotes-Demo-Server
 
Danke für die Antwort, ich handle live und MT5 ist immer eingeschaltet. Wenn die Software sagt, dass ich sie aktualisieren muss, ist das in Ordnung, wenn nicht, wo ist das Live-Update?
 
Newalligator:
Danke für die Antwort, ich handle live und MT5 ist immer eingeschaltet. Wenn mich das Programm selbst zur Aktualisierung auffordert, ist das gut, aber wenn nicht, wo ist dieses Live-Update?
Wenn Sie sich mit Ihrem Konto auf dem MetaQuotes-Demo-Server verbinden, sucht der MetaTrader automatisch nach Updates. Wenn es eine Aktualisierung gibt, wird die neue Version automatisch heruntergeladen.
 

Es gibt ein Problem - ich kann die Messwerte eines anderen benutzerdefinierten Indikators nicht in einem benutzerdefinierten Indik ator verwenden. Ich bin mir fast sicher, dass ich es falsch mache, aber ich werde den Code trotzdem einfügen:

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
      
   // Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
   CopyBuffer(iRocHandleEURUSD, 0, 0, rates_total, aRocRatesEURUSD);

   for(int bar = first; bar < rates_total; bar++) {

In diesem Code ist der Puffer des Rate Of Changes Indikators(aRocRatesEURUSD) nicht verfügbar. Ich verstehe nicht, wie man diesen Indikator richtig anschließt, bitte helfen Sie mir, es zu verstehen.

 
jommerbot:

Guten Tag zusammen, es gibt ein Problem: Ich kann die Werte eines anderen benutzerdefinierten Indikators nicht in einem benutzerdefinierten Indik ator verwenden. Ich bin mir fast sicher, dass ich es falsch mache, aber ich werde den Code trotzdem einfügen:

In diesem Code ist der Puffer des Rate Of Changes Indikators(aRocRatesEURUSD) nicht verfügbar. Ich verstehe nicht, wie ich diesen Indikator richtig anschließen kann, bitte helfen Sie mir dabei.

Indikator-Handles müssen in OnInit() deklariert werden:

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
Andernfalls müssen Sie bei jedem Aufruf von OnCalculate() einen neuen benutzerdefinierten Indikator erstellen.
 
barabashkakvn:

Indikator-Handles sollten in OnInit() deklariert werden:

Auch das funktioniert nicht. Das Pufferfeld ist entweder leer oder voller linkshändiger Werte.
 
jommerbot:
Auch das funktioniert nicht. Das Ergebnis ist, dass das Array mit dem Puffer entweder leer oder voll mit linken Werten ist.
Dennoch ist es richtig, die Indikatoren-Handles in OnInit() zu deklarieren. Eine andere Frage ist, warum Sie jedes Mal, wenn ein neuer Tick kommt (die Funktion OnCalculate()), schreiben müssen
rates_total,      // размер входных таймсерий

zum Puffer

aRocRatesEURUSD

? Dies kann das Terminal stark verlangsamen. Und außerdem ist dies eine sehr tiefgründige Geschichte.

Ich denke, es wird Sie interessieren, den ArtikelDie Grundsätze der wirtschaftlichen Neuberechnung von Indikatoren zu lesen

Und lesen Sie auch die Hilfe zur Funktion OnCalculate().

 

OK, selbst im einfachsten Fall funktioniert es nicht:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Red

double ExtLineBuffer[];   
int iRocHandleEURUSD;  
int iPlotShift = 0;
int iPeriod = 6;
 
void OnInit() {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, iPlotShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, iPeriod - 1);
   
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");    
   if( iRocHandleEURUSD == INVALID_HANDLE )
   {
      Print("Не удалось получить хендл индикатора ROC EURUSD");  
   }
}

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if(rates_total < iPeriod ) {
      return(0);
   }
   
   int first;
   double aRocRatesEURUSD[]; 
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1;
   }
   
   for(int bar = first; bar < rates_total; bar++) {
      CopyBuffer(iRocHandleEURUSD, 0, bar, 1, aRocRatesEURUSD);
      Print(aRocRatesEURUSD[ 0 ]);   
      ExtLineBuffer[ bar ] = NormalizeDouble(aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS);
   }
     
   return(rates_total);
}

Ich verstehe nicht, wo mein Fehler liegt. Das Kopieren desselben Indikatorpuffers in EA und Skript funktioniert, aber nicht im Indikator. Der Indikatorgriff wird ohne Fehler initialisiert.