Discussion de l'article "L’implémentation d'un mode multi-devises dans MetaTrader 5" - page 5
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
Dites-moi,
1. si je n'ai besoin que du Bid et du Ask des autres devises, est-il juste d'utiliser des "espions" ?
2. c'est juste une idée, n'y a-t-il pas la possibilité dans la fonction onChartEvent de vérifier les événements d'autres devises et pas seulement de la devise actuelle ?
3. est-il possible de fixer la valeur du timer à moins de un dans l'événement onTimer, de sorte que la valeur des cotations soit téléchargée beaucoup plus souvent et que l'heure du dernier tick soit retardée d'un temps minimum ?
4. ou est-il possible d'utiliser "CHARTEVENT_CUSTOM+n" pour vérifier, dans mon cas, le croisement des mashes sur d'autres graphiques ?
1. Utilisation.
2. Il existe une option. L'événement d'une autre devise doit être envoyé au graphique où l'EA avec OnChartEvent() est défini.
3. non. un est le minimum.
4. Peut.
J'ai créé un simple "indicateur espion" SendEvent.mq5, qui envoie un événement lorsqu'une nouvelle cotation arrive :
J'ai créé un conseiller expert simple qui reçoit des événements de cet indicateur et tente d'effectuer une opération de trading (voici une partie, le texte complet se trouve dans le fichier joint) :
Le conseiller expert reçoit des événements de l'indicateur, mais dans le testeur (à la fois avec et sans visualisation) ne peut pas effectuer une opération commerciale - l'erreur "Invalid Request" est renvoyée, code de retour 10013. En temps réel, il fonctionne normalement. Si l'opération commerciale dans le conseiller expert est effectuée à partir de OnTick() au lieu de OnChartEvent(), elle fonctionne également correctement.
J'ai inséré l'envoi d'une demande de transaction dans le modèle de conseiller expert proposé par l'auteur de l'article dans CodeBase - les opérations de transaction ne fonctionnent pas non plus (même erreur).
Quelqu'un peut-il me dire quelle en est la raison ? J'ai lu dans ce fil que OnChartEvent() n' est pas traité dans le testeur, mais dans ce cas les événements envoyés par l'indicateur sont traités dans le testeur, mais il est impossible d'exécuter une opération commerciale à partir de OnChartEvent() dans le testeur.
J'ai créé un simple "indicateur-espion" SendEvent.mq5, qui envoie un événement lorsqu'une nouvelle cotation arrive :
J'ai créé un Conseiller Expert simple qui reçoit des événements de cet indicateur et essaie de faire une opération de trading (je donne une partie du texte, le texte complet est dans le fichier joint) :
Le conseiller expert reçoit des événements de l'indicateur, mais dans le testeur (avec et sans visualisation) ne peut pas effectuer une opération commerciale - l'erreur "Invalid Request" est renvoyée, code de retour 10013. En temps réel, il fonctionne normalement. Si une opération commerciale dans le conseiller expert est effectuée à partir de OnTick() au lieu de OnChartEvent() - cela fonctionne également bien.
J'ai inséré l'envoi d'une demande d'opération dans le modèle de conseiller expert proposé par l'auteur de l'article dans CodeBase - les opérations commerciales ne fonctionnent pas non plus (même erreur).
Quelqu'un peut-il me dire quelle en est la raison ? J'ai lu dans ce fil que OnChartEvent() n' est pas traité dans le testeur, mais dans ce cas les événements envoyés par l'indicateur sont traités dans le testeur, mais il est impossible d'exécuter une opération commerciale à partir de OnChartEvent() dans le testeur.
Essayez de ramener mon poisson à mon esprit. Bien sûr, la logique n'est pas complète et très bête, mais elle semble être très similaire à ce dont vous avez besoin.
Au moins les positions du marché s'ouvrent à la fois dans le testeur et sur la démo.
Je ne sais pas pourquoi (je suis trop paresseux pour le découvrir), mais votre exemple m'a donné 10013 dans n'importe quelle situation.
PS
Il est préférable de lier des objets standards (tels que CAccountInfo et CTrade). Mais si vous avez la patience de tout écrire vous-même, j'en serai ravi.
D'ailleurs, pour l'implémentation de l'espion lui-même, il vaut mieux s'inspirer de l'article, ou en faire une copie modifiable (je suggère par exemple de remplacer cette année "(long)_Period" par la date d'envoi de l'événement ou d'autres informations utiles). Votre variante est en quelque sorte assez "brute".
Essayez de faire fonctionner mon poisson. La logique est incomplète et très obtuse, mais elle semble très proche de ce dont vous avez besoin.
J'essaie d'obtenir les prix pour trois paires EURUSD, EURGBP, GBPUSD. Tout fonctionne bien lorsque je sélectionne "Tous les ticks" ou "Prix ouverts uniquement" dans le testeur de stratégie. Mais si je choisis "Every tick based on real ticks", alors pour une raison quelconque, plusieurs événements "New Bar" peuvent se produire en une minute pour un instrument.
Pour répéter, vous pouvez sélectionner un intervalle, par exemple de 2016.07.15 à 2016.07.19. Voici un exemple de journal, observez la 7ème minute, la 9ème minute :
2016.07.15 00:05:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333
2016.07.15 00:05:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119
2016.07.15 00:05:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399
2016.07.15 00:06:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334
2016.07.15 00:06:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119
2016.07.15 00:06:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381
2016.07.15 00:07:19 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001
2016.07.15 00:07:19 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174
2016.07.15 00:07:19 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384
2016.07.15 00:08:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329
2016.07.15 00:08:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167
2016.07.15 00:08:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394
2016.07.15 00:09:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327
2016.07.15 00:09:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166
2016.07.15 00:09:00 > -> id=1: GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396
2016.07.15 00:09:00 > -> id=2: EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327
2016.07.15 00:09:00 > -> id=0: EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166
J'essaie d'obtenir les prix pour trois paires EURUSD, EURGBP, GBPUSD. Tout fonctionne bien lorsque je sélectionne "Tous les ticks" ou "Prix ouverts uniquement" dans le testeur de stratégie. Mais si je choisis "Every tick based on real ticks", alors pour une raison quelconque, plusieurs événements "New Bar" peuvent se produire en une minute pour un instrument.
Pour répéter, vous pouvez sélectionner un intervalle, par exemple de 2016.07.15 à 2016.07.19. Voici un exemple de journal, observez la 7ème minute, la 9ème minute :
Quelle est la raison de ce comportement lorsque l'on sélectionne le mode "All ticks based on real ticks" ?Comment attraper l'événement "New bar" ? Dans la version 1375, la précision de l'arrivée des ticks a été améliorée en millisecondes :
Testeur : Ajout d'un support pour le temps à la précision de la milliseconde. Auparavant, dans le testeur de stratégie, le quantum de temps était d'une seconde.
Lors des tests sur des ticks réels, les millisecondes sont extraites des données du tick original. Lors de la génération de ticks, les millisecondes sont épelées en fonction du volume du tick. Par exemple, s'il y a 3 ticks en une seconde, les temps 000, 333 et 666 millisecondes leur seront attribués.
J'attrape unenouvelle barre de la manière décrite dans l'article. C'est à dire que l'indicateur envoie l'évènement "New Bar" de cette manière (par rapport au temps précédent minutes, heures, jours, mois) :
double price_current=price[rates_total-1];
TimeCurrent(time);
if(prev_calculated==0)
{
EventCustom(CHARTEVENT_INIT,price_current);
prev_time=time;
return(rates_total);
}
//--- new tick
if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);
//--- check change time
if(time.min==prev_time.min &&
time.hour==prev_time.hour &&
time.day==prev_time.day &&
time.mon==prev_time.mon) return(rates_total);
//--- new minute
if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current);
MISE A JOUR : Le problème a disparu lors de l'installation de la build 1375.
Merci pour cet article très complet. Je n'avais jamais entendu parler de EventChartCustom. J'ai essayé d'autres événements graphiques, mais ils ne prenaient en compte que les événements causés par l'action humaine. Cela résout beaucoup de choses.
D'ailleurs, je travaille sur MQL4, c'était à 98% la même chose.
Merci beaucoup.
Merci beaucoup, c'est très utile. C'est un excellent travail !