Questions des débutants MQL5 MT5 MetaTrader 5 - page 265

 
C-4:
Qu'entendez-vous par "aligner" ? Normaliser la mantisse par le nombre de décimales? - C'est à cela que sert la fonction NormalizeDouble. Si c'est autre chose, décrivez-le plus en détail.

A l'entrée tout double positif, à la sortie arrondi au prix réel qui peut être à cet instrument.

Si l'échelon de prix est de 0,25, arrondissez à 0,25. Un peu comme ça :

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

Cela dit, s'il y a un décalage (comme 0,13 ; 0,38 ; 0,63 ; 0,88), alors cela compte. Ensuite :

sur l'entrée 1.0 sur la sortie 1.13 ;

1,25 en entrée et 1,38 en sortie ;

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

Au niveau de l'API, cela pourrait être codé en quelques commandes en langage assembleur et il s'agit clairement d'une fonction de base. Je pensais qu'il y en avait un =/

 
comment faire une mise à jour vers la nouvelle version via Live update. Où se trouve la mise à jour en direct
 
Newalligator:
comment faire une mise à jour vers la nouvelle version via Live update. Où est cette mise à jour en direct ?
Vous devriez ouvrir un compte de démonstration sur le serveur MetaQuotes-Demo et vous y connecter de temps en temps pour vérifier les mises à jour. Comment ouvrir un compte de démonstration sur le serveur MetaQuotes-Demo ?
 
Merci pour la réponse, je négocie en direct et MT5 est toujours activé. Je ne sais pas si la mise à jour est automatique, mais si ce n'est pas le cas, où se trouve la mise à jour en direct ?
 
Newalligator:
Merci pour la réponse, je négocie en direct et MT5 est toujours activé. Si le programme lui-même me demande de mettre à jour, c'est bien, mais sinon, où se trouve cette mise à jour Live ?
Lorsque vous vous connectez à votre compte sur le serveur MetaQuotes-Demo, le MetaTrader vérifie automatiquement les mises à jour. S'il y a une mise à jour, il téléchargera automatiquement la nouvelle version.
 

Bonjour à tous ! Il y a un problème - je ne peux pas utiliser les lectures d'un autre indicateur personnalisé dans un indicateur personnalisé. Je suis presque sûr que je m'y prends mal, mais je vais quand même coller le code :

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++) {

Dans ce code, le tampon de l'indicateur Rate Of Changes(aRocRatesEURUSD) n'est pas disponible. Je ne comprends pas comment connecter cet indicateur correctement, s'il vous plaît aidez-moi à le comprendre.

 
jommerbot:

Bonjour à tous ! Il y a un problème - je ne peux pas utiliser les lectures d'un autre indicateur personnalisé dans un indicateur personnalisé. Je suis presque sûr que je m'y prends mal, mais je vais quand même coller le code :

Dans ce code, le tampon de l'indicateur Rate Of Changes(aRocRatesEURUSD) n'est pas disponible. Je n'arrive pas à comprendre comment connecter cet indicateur correctement, s'il vous plaît aidez-moi à le comprendre.

Les poignées de l'indicateur doivent être déclarées dans OnInit() :

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom("EURUSD", 0, "Examples\\ROC");   
  }
Sinon, il s'avère que vous créez un nouvel indicateur personnalisé chaque fois que vous appelez OnCalculate().
 
barabashkakvn:

Les poignées de l'indicateur doivent être déclarées dans OnInit() :

Cela ne fonctionne pas non plus. Le tableau tampon se retrouve soit vide, soit plein de valeurs gauches.
 
jommerbot:
Cela ne fonctionne pas non plus. En conséquence, le tableau contenant le tampon est soit vide, soit plein de valeurs gauches.
Néanmoins, il est correct de déclarer les poignées des indicateurs dans OnInit(). Une autre question est de savoir pourquoi vous devez écrire à chaque fois qu'un nouveau tick arrive (la fonction OnCalculate())
rates_total,      // размер входных таймсерий

au tampon

aRocRatesEURUSD

? Cela peut vraiment ralentir le terminal. Et en plus, c'est une histoire très profonde.

Je pense que vous trouverez intéressant de lire l'articleLes principes du recalcul économique des indicateurs

Et lisez aussi l'aide sur la fonction OnCalculate().

 

OK, même dans le cas le plus simple, ça ne marche pas :

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

Je ne comprends pas où est mon erreur. La copie du même tampon d'indicateur dans l'EA et le script fonctionne, mais pas dans l'indicateur. Le manche de l'indicateur est initialisé sans erreur.