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

 
Maksym Mudrakov:

L'erreur peut provenir du nombre de chiffres après la virgule :


Ce n'est pas l'erreur, les données ne sont pas calculées sur l'historique, mais à partir du moment où le symbole est créé tout est calculé correctement, je soupçonne la fonction de calcul de l'historique de ne pas fonctionner correctement, c'est à dire que c'est un bug.
 
Bonjour, messieurs.

J'ai un tel problème, je viens de commencer à utiliser MT5, je transfère mes indicateurs de MT4 et j'ai rencontré quelques problèmes. J'ai besoin d'utiliser iMA dans une ligne et d'obtenir la valeur d'un indice spécifique. J'ai vu des messages sur le forum et j'utilise la fonction iMAGet (ainsi que la fonction similaire iATRGet etc.). Comme je le vois, les fonctions ne fonctionnent plus, alors cette question : comment obtenir gracieusement une seule valeur iMA ? J'ai essayé d'utiliser les fonctions ci-dessus pour ce faire :

NormalizeDouble(iMAGet(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW), shift), Digits())

Je sais que c'est mauvais sans vérification, mais je dois porter un vieux code MT4, je n'ai pas trouvé d'autre moyen de le rendre plus simple (j'ai des dizaines d'assistants, et ils travaillent tous sur des horizons temporels différents). Je ne peux pas initialiser les assistants dans oninit, parce que le code a trois étapes imbriquées et je ne peux pas appeler l'assistant nécessaire sans problèmes. Donc, en bref, mon but est de transformer

Cette :

NormalizeDouble(iMA(Symbol(), timeframe, signal_period, 0, MODE_LWMA, PRICE_LOW, shift), Digits())

En quelque chose qui fonctionne sur MT5 sans gestes drastiques.

 
Olga Miakhovich:
Bonjour, messieurs.

J'ai un problème, je viens de commencer MT5 et j'ai des problèmes avec lui lorsque je transfère mes indicateurs de MT4. J'ai besoin d'utiliser iMA dans une ligne et d'obtenir la valeur d'un indice spécifique. J'ai vu des messages sur le forum et j'utilise la fonction iMAGet (ainsi que la fonction similaire iATRGet etc.). Comme je le vois, les fonctions ne fonctionnent plus, alors cette question : comment obtenir gracieusement une seule valeur iMA ? J'ai essayé d'utiliser les fonctions ci-dessus pour ce faire:


Je sais que c'est mauvais sans vérification, mais je dois porter un vieux code MT4, je n'ai pas trouvé d'autre moyen de le rendre plus simple (j'ai des dizaines d'assistants, et ils travaillent tous sur des horizons temporels différents). Je ne peux pas initialiser les assistants dans oninit, parce que le code a trois étapes imbriquées et je ne peux pas appeler l'assistant nécessaire sans problèmes. Donc, en bref, mon but est de transformer

Cette :

En quelque chose qui fonctionne sur MT5 sans gestes drastiques.

Consultez les exemples dans kodobase, comme celui-ci: https://www.mql5.com/ru/code/27161.

Fondamentalement : créer un handle d'indicateur dans OnInit()

handle_iMA_High=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                       Inp_MA_ma_method,PRICE_HIGH);
//--- if the handle is not created
   if(handle_iMA_High==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator (\"Price High\") for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }

Ensuite, vous copiez le ou les éléments nécessaires dans le presse-papiers et vous travaillez avec eux.

if(CopyBuffer(ind_handle,0,-shift,amount,values)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());

https://www.mql5.com/ru/docs/series/copybuffer

 
Vitaly Muzichenko:

Cherchez des exemples dans la kodobase, par exemple celui-ci: https://www.mql5.com/ru/code/27161.

Fondamentalement : Créer un handle d'indicateur dans OnInit()

Ensuite, vous copiez le(s) élément(s) nécessaire(s) dans le tampon et vous travaillez avec lui.

https://www.mql5.com/ru/docs/series/copybuffer

Comme je l'ai déjà écrit, l'initialisation dans OnInit ne me convient pas. Je dois travailler avec tous les délais simultanément, je dois initialiser tous les masques dans chaque TF, et ensuite dans le code, où j'utilise une certaine valeur, faire quelque chose comme ceci :

if(timeframe = PERIOD_M5)
        CopyBuffer(handle_ma_m5, ...)
if(timeframe = PERIOD_M15)
        CopyBuffer(handle_ma_m15, ...)
...

Et ainsi à chaque appel de chaque bracelet. Le code va juste se transformer en une diarrhée confuse.

Et chaque nouveau bar devra le mettre à jour d'une manière ou d'une autre ?

Existe-t-il une fonction comme CopyBuffer, mais qui copie non pas un tableau, mais une valeur par index requis ?

 
Olga Miakhovich:

Comme je l'ai déjà écrit, l'initialisation dans OnInit ne me convient pas. Je dois travailler avec tous les délais simultanément, je dois initialiser tous les masques dans chaque TF, et ensuite dans le code, où j'utilise une certaine valeur, faire quelque chose comme ceci :

Et ainsi à chaque appel de chaque bracelet. Le code va juste se transformer en une diarrhée enchevêtrée.

Et chaque nouvelle barre aura besoin d'un moyen de la mettre à jour ?

Existe-t-il une fonction comme CopyBuffer, mais qui copie non pas un tableau, mais une seule valeur par le bon index ?

Créez un tableau de poignées dansOnInit() et travaillez avec elles.

CopyBuffer(...) dans la fonction pour la facilité d'utilisation, alimentez-la avec la poignée de l'indicateur et l'index requis du tableau, et la fonction retournera le prix.

 
Vitaly Muzichenko:

Créez un tableau de poignées dansOnInit() et travaillez avec elles.

CopyBuffer(...) dans une fonction pour plus de facilité, passez le handle de l'indicateur et l'index requis du tableau, et la fonction retournera le prix.

très peu pratique, cependant)

 
Olga Miakhovich:

(c'est quand même maladroit))

Plutôt mal à l'aise ))))

 
Vitaly Muzichenko:

Créez un tableau de poignées dansOnInit() et travaillez avec elles.

CopyBuffer(...) dans la fonction pour la facilité d'utilisation, vous y introduisez le manche de l'indicateur et l'index requis du tableau, et la fonction renverra le prix.

L'autre problème de CopyBuffer est qu'il nécessite un tampon indicateur pour lui-même. J'ai une centaine d'indicateurs au total et ils sont utilisés dans des calculs pour obtenir un seul indicateur. Dois-je créer une centaine de tampons pour stocker ces valeurs ?

 
Olga Miakhovich:

Un autre problème avec CopyBuffer est qu'il nécessite nécessairement un tampon indicateur pour lui-même. J'ai moins d'une centaine d'indicateurs au total et ils sont utilisés dans des calculs pour obtenir un seul indicateur. Dois-je créer une centaine de tampons pour stocker ces valeurs ?

Cherchez des exemples de code dans la CodeBase de Scriptor - tout y est.
En fait, vous pouvez calculer la MA pour n'importe quelle barre.
 
J'ai besoin d'un exemple pour résoudre le problème suivant : il y a un indicateur ¹1 dans le graphique avec une douzaine de tampons graphiques (pas de wavecaps et autres) et l'indicateur de base ¹2 devrait prendre quelques tampons de l'indicateur ¹1 et les afficher comme hixogrammes (peu importe comment) déjà dans la base. Merci d'avance, pour MT5.
Raison: