Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 265

 
C-4:
Cosa intende per 'allineare'? Normalizzare la mantissa per il numero di cifre decimali? - Ecco a cosa serve la funzione NormalizeDouble. Se c'è qualcos'altro, descrivilo in modo più dettagliato.

In ingresso qualsiasi doppio positivo, in uscita arrotondato al prezzo reale che può essere a questo strumento.

Se il passo di prezzo è 0,25, allora arrotonda a 0,25. Più o meno così:

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

Ma detto questo, se c'è un offset (come 0,13; 0,38; 0,63; 0,88), allora conta. Allora:

sull'ingresso 1.0 sull'uscita 1.13;

1,25 come ingresso e 1,38 come uscita;

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

A livello di API, questo potrebbe essere codificato in un paio di comandi in linguaggio assembly ed è chiaramente una funzione di base. Pensavo ce ne fosse uno =/

 
come fare un aggiornamento alla nuova build tramite Live update. Dov'è l'aggiornamento dal vivo
 
Newalligator:
come fare un aggiornamento alla nuova build tramite Live update. Dov'è questo aggiornamento dal vivo
Dovresti aprire un conto demo sul server MetaQuotes-Demo e connetterti ad esso occasionalmente per controllare gli aggiornamenti. Come aprire un conto demo sul server MetaQuotes-Demo
 
Grazie per la risposta, faccio trading dal vivo e la MT5 è sempre attiva. Non sono sicuro se si aggiornerà automaticamente, ma se non è così, dov'è l'aggiornamento dal vivo?
 
Newalligator:
Grazie per la risposta, faccio trading dal vivo e la MT5 è sempre attiva. Se il programma stesso mi chiede di aggiornare, va bene, ma se non lo fa, dov'è questo aggiornamento Live?
Quando ti connetti al tuo conto sul server MetaQuotes-Demo, la MetaTrader controllerà automaticamente gli aggiornamenti. Se c'è un aggiornamento, scaricherà automaticamente la nuova versione.
 

Buongiorno a tutti, c'è un problema: non posso usare le letture di un altro indicatore personalizzato in un indicatore personalizzato. Sono quasi sicuro che sto sbagliando, ma incollerò comunque il codice:

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 questo codice, il buffer dell'indicatore Rate Of Changes(aRocRatesEURUSD) non è disponibile. Non capisco come collegare correttamente questo indicatore, per favore aiutatemi a capirlo.

 
jommerbot:

C'è un problema: non posso usare le letture di un altro indicatore personalizzato in un indicatore personalizzato. Sono quasi sicuro che sto sbagliando, ma incollerò comunque il codice:

In questo codice, il buffer dell'indicatore Rate Of Changes(aRocRatesEURUSD) non è disponibile. Non riesco a capire come collegare correttamente questo indicatore, per favore aiutatemi a capirlo.

Le maniglie degli indicatori devono essere dichiarate in OnInit():

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
Altrimenti, risulta che si crea un nuovo indicatore personalizzato ogni volta che si chiama OnCalculate().
 
barabashkakvn:

Le maniglie degli indicatori dovrebbero essere dichiarate in OnInit():

Anche questo non funziona. L'array di buffer finisce o vuoto o pieno di valori di sinistra.
 
jommerbot:
Anche questo non funziona. Come risultato, l'array con il buffer è vuoto o pieno di valori di sinistra.
Tuttavia, è corretto dichiarare le maniglie degli indicatori in OnInit(). Un'altra questione è perché dovete scrivere ogni volta che arriva un nuovo tick (la funzione OnCalculate())
rates_total,      // размер входных таймсерий

al buffer

aRocRatesEURUSD

? Questo può davvero rallentare il terminale. E poi, è una storia molto profonda.

Penso che troverete interessante leggere l'articoloI principi del ricalcolo economico degli indicatori

E leggete anche l'aiuto sulla funzione OnCalculate().

 

Ok, anche nel caso più semplice non funziona:

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

Non capisco dove sia il mio errore. Copiare lo stesso buffer dell'indicatore nell'EA e nello script funziona, ma non nell'indicatore. La maniglia dell'indicatore viene inizializzata senza errori.