Caractéristiques du langage mql5, subtilités et techniques - page 30
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Je ne comprends pas du tout...
Je crée une poignée d'un AO standard dans l'indicateur, mais avec une période de temps définie. Lorsque je reçois des données d'AO avec une période qui ne correspond pas à la période actuelle, j'obtiens ... Je n'obtiens rien - erreur 4806.
Question : Quelle est la bonne façon d'obtenir des données à partir d'indicateurs standards dont les délais ne coïncident pas avec le délai actuel ?
Je ne comprends pas du tout...
Je crée une poignée d'un AO standard dans l'indicateur, mais avec une période de temps définie. Lorsque je reçois des données d'AO avec une période qui ne correspond pas à la période actuelle, j'obtiens ... Je n'obtiens rien - erreur 4806.
La question est la suivante : quelle est la bonne façon d'obtenir les données des indicateurs standard avec des délais qui ne coïncident pas avec le délai actuel ?
A propos de l'obtention des valeurs de l'INDICATEUR dans l'INDICATEUR :
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie
Comment prendre les données d'un autre Indicateur dans un Indicateur
Vladimir Karputov, 2016.12.27 08:41
En gardant à l'esprit que dans les indicateurs MQL5, la barre avec l'index "0" est par défaut la barre de GAUCHE sur le graphique, essayons d'obtenir des données dans notre indicateur à partir de deux autres indicateurs - MA et Alligator(cet exemple dans l'indicateur "IndicatorFromIndicators.mql5").
Essayons de recevoir des données de MA et Alligator sur la barre avec l'index "0", "1" et "2" :
//---
Comment("Проверка: time[0]=",time[0],"\n",
"rates_total-1: ",rates_total,"\n",
"BarsCalculated(iMA): ",BarsCalculated(handle_iMA),"\n",
"BarsCalculated(iAlligator): ",BarsCalculated(handle_iAlligator),"\n",
"MA[",0,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(0)),"\n",
"MA[",1,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(1)),"\n",
"MA[",2,"]=",StringFormat("%."+IntegerToString(Digits()+1)+"f",iMAGet(2)),"\n",
"Jaws[",0,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,0)),"\n",
"Jaws[",1,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,1)),"\n",
"Jaws[",2,"]=",StringFormat("%."+IntegerToString(Digits())+"f",iAlligatorGet(GATORJAW_LINE,2)));
//--- return value of prev_calculated for next call
return(rates_total);
}
Attachons l'indicateur de test"IndicatorFromIndicators.mql5" au graphique et réglons le réticule sur la barre la PLUS DROITE - c'est-à-dire qu'il ne s'agit pas d'une barre zéro. Voilà à quoi ça ressemble :
Bien que le réticule soit réglé sur la barre la plus à droite - c'est-à-dire certainement pas une barre avec un indice "0", lorsque vous utilisezCopyBuffer, vous devez savoir queCopyBuffer copiera les données du présent vers le passé, c'est-à-dire que la barre avec un indice "0" signifie la barre actuelle.
CopyBuffer : Les éléments de données à copier (tampon indicateur avec un index buffer_num) sont comptés à partir de la position de départ du présent vers le passé, c'est-à-dire que la position de départ de 0 signifie la barre actuelle (valeur de l'indicateur pour la barre actuelle).
C'est-à-dire que dans l'indicateur MQL5, s'il utilise l'opération CopyBuffer, vous devez retourner le tableau (ArraySetAsSeries), de sorte que la barre la plus à droite du graphique corresponde à l'indice "0" dans le tampon de l'indicateur (maintenant dans l'exemple "iMTF_AO.mq5", la barre la plus à droite du graphique correspond à rates_total-1).
A propos de l'obtention des valeurs INDICATOR dans INDICATOR :
CopyBuffer : Les éléments des données copiées (tampon indicateur avec un index buffer_num) sont comptés à partir de la position de départ du présent vers le passé, c'est-à-dire que la position de départ égale à 0 signifie la barre actuelle (valeur de l'indicateur pour la barre actuelle).
C'est-à-dire que dans l'indicateur MQL5, s'il utilise l'opération CopyBuffer, vous devez retourner le tableau (ArraySetAsSeries), de sorte que la barre la plus à droite du graphique corresponde à l'indice "0" dans le tampon de l'indicateur (maintenant dans l'exemple "iMTF_AO.mq5", la barre la plus à droite du graphique correspond à rates_total-1).
Je ne reçois qu'une seule barre. Et l'indicateur sur le cadre temporel "natif" affiche les données normalement. Sur le "non-natif" - valeur vierge. J'ai constaté empiriquement qu'une valeur vide sera renvoyée jusqu'à ce que l'historique complet soit chargé pour la période pour laquelle je reçois des données de l'AO.
La question qui se pose alors est la suivante : comment éviter d'entrer dans la boucle pendant que l'historique est chargé pour la période considérée ? C'est juste un test, en général l'indicateur effectue des calculs en fonction de l'historique de la période spécifiée et il n'est pas nécessaire d'essayer de les effectuer lorsque l'historique n'est pas présent.
Je n'ai droit qu'à une barre. Et l'indicateur sur l'horizon temporel "natif" affiche les données normalement. Sur le modèle "non-natif", il affiche une valeur vide. J'ai découvert empiriquement qu'une valeur vide sera renvoyée jusqu'à ce que tout l'historique soit chargé pour la période de temps, à partir de laquelle je reçois des données de l'AO.
La question se posera alors différemment : comment ne pas entrer dans la boucle, alors que l'historique de la période est en train de se charger ? Il s'agit juste d'un test. En général, l'indicateur effectue les calculs en fonction de l'historique d'une période spécifiée et il n'est pas nécessaire d'essayer de les effectuer tant qu'il n'y a pas d'historique.
Le "i" n'est pas "0", mais une valeur exorbitante. En résumé, disons que nous exécutons l'exemple sur M15 - nous avons 5000 barres sur cette période. Nous demandons les données de H4 - nous n'avons que 400 barres dessus. Ensuite, nous essayons de demander "AO(4999)".
C'est-à-dire que pour la période H4, nous essayons de demander la barre avec l'index "4999" - mais il n'y a pas du tout de barre sur H4, il n'y a que 400 barres, mais nous demandons la barre "0", et si l'indicateur utilise l'opération CopyBuffer, nous devons inverser le tableau (ArraySetAsSeries), de sorte que la barre la plus à droite sur le graphique correspond à l'index "0" dans le tampon de l'indicateur (maintenant dans l'exemple "iMTF_AO.mq5" la barre la plus à droite sur le graphique correspond à rates_total-1).
Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading
Bugs, bugs, questions
fxsaber, 2017.04.12 08:38
Un petit coup de chapeau. Contournement de l'opérateur d'affectationRésultat
Ici.. :
Le "i" n'est pas "0", mais une valeur exorbitante. En résumé, disons que nous exécutons l'exemple sur M15 - nous avons 5000 barres sur cette période. Nous demandons les données de H4 - nous n'avons que 400 barres dessus. Ensuite, nous essayons de demander "AO(4999)".
Par exemple, à partir de la période H4, nous essayons de demander la barre avec l'index "4999" - mais il n'y a pas une telle barre sur H4, il y a seulement 400 barres là, mais nous voulons la barre "0", et si l'indicateur utilise l'opération "CopyBuffer", nous devrions inverser le tableau (ArraySetAsSeries), de sorte que la barre la plus à droite dans le graphique correspond à l'index "0" dans le tampon de l'indicateur (par exemple "iMTF_AO.mq5" maintenant la barre la plus à droite dans le graphique correspond à rates_total-1).
Non, bien sûr, j'ai essayé de calculer la limite:
... Mais je vois que j'ai merdé dans la précipitation - elle ne convient qu'à la période actuelle
Non, bien sûr, j'ai essayé de calculer la limite:
... Mais je vois, j'ai merdé dans la précipitation - c'est approprié pour la période actuelle seulement.
As-tu au moins regardé le code que je t'ai montré ? Ou l'avez-vous exécuté ?
Je n'ai pas demandé comment remplir le tampon de l'indicateur, mais pourquoi si je prends des valeurs d'AO qui ne proviennent pas de la barre actuelle, elles renvoient des valeurs vides.
J'ai compris - il n'y a pas d'historique, il est en train d'être chargé et pendant qu'il est chargé, AO d'une période non native renvoie l'erreur "pas de données".
La question qui se pose maintenant est la suivante : comment savoir si l'historique pour l'horizon temporel requis est entièrement chargé, afin de ne pas entrer dans le cycle des indicateurs ?