Comment exécuter une EA pour plusieurs paires ? - page 3

 

Jacques, j'apprécie l'intérêt que vous portez à ce sujet. Je suis toujours en train de déboguer mon EA pour sa première devise, mais j'ai l'intention de l'utiliser sur plusieurs devises s'il s'avère qu'il convient. En partant de ce principe, j'ai réfléchi à une stratégie pour mettre en œuvre cette idée. D'où mon intérêt pour ce fil de discussion.


Conformément à votre demande, j'ai préparé des graphiques pour trois autres paires, et ce faisant, j'ai découvert que deux des paires avaient plus de 32 000 ticks sur une période de 24 heures (la limite des données graphiques dans Excel). Par conséquent, j'ai dû diviser le graphique en deux périodes (1ère 12 heures et 2ème 12 heures). Pour garder les choses relativement cohérentes, j'ai divisé les trois paires en périodes de 12 heures.


Une chose à garder à l'esprit, l'échelle verticale de ces graphiques est proportionnelle entre les lignes horizontales, mais l'échelle horizontale n'est PAS proportionnelle au temps (c'est-à-dire que vous ne pouvez pas supposer que 1/12 des ticks représente une heure).


Je pense que ce qu'il faut retenir de ces graphiques, c'est que toutes les paires ont des périodes de 24 heures où les intervalles entre les ticks sont importants. Par conséquent, si vous combinez plusieurs paires dans un EA, je pense qu'il serait sage d'utiliser une boucle "While". La référence de StraightTrader à https://book.mql4.com/special/index intitulée "General Characteristics of Complex Programs" contient une bonne discussion de cette technique et un graphique dans la section d'ouverture de cet article.


GBPJPY 44,834 ticks en 24 heures

EURJPY 37 140 ticks en 24 heures

GBPUSD 29,313 ticks en 24 heures

EURUSD 22,627 ticks en 24 heures













A votre santé !

 
FXtrader2008:

Par conséquent, si vous combinez plusieurs paires dans un EA, je pense qu'il serait sage d'employer une boucle "While". La référence de StraightTrader à https://book.mql4.com/special/index intitulée "General Characteristics of Complex Programs" contient une bonne discussion de cette technique et un graphique dans la section d'ouverture de cet article.

C'est exactement le cas. Plusieurs paires dans un même EA -> utiliser l'approche de la boucle while au lieu de démarrer l'activation de la fonction par des ticks incommensurables.


J'aimerais être en opposition avec une seule paire de devises pour un EA.

Mon approche à long terme est UN EA MULTISTRATEGIE MULTICURRENCY. J'ai préparé il y a quelque temps le schéma Universal Expert Advisor, qui met en œuvre certaines de ces idées.

Plus tard, non inclus dans mon post j'ai suivi en développant ce code et j'ai commencé le projet Google code appelé Universaltrader. Ce projet pourrait répondre à vos attentes. La seule chose qui n'y est pas implémentée est l'approche "While cycle" (facile à implémenter).


Certains des avantages de l'EA MULTICURRENCY MULTISTRATEGY :

  • toutes les stratégies ensemble
  • Possibilité de régler/configurer toutes les stratégies ensemble et indépendamment.
  • Possibilité d'activer/désactiver différentes stratégies/paires de devises.
  • Je suis sûr qu'il y a beaucoup d'autres avantages.

désavantages :

  • possibilité de backtester une seule paire de devises à la fois - vous devez exécuter le backtest autant de fois que de paires de devises que vous négociez, avec les autres paires désactivées.
  • problème de performance - j'ai remarqué un problème de performance seulement dans le backtest, mais je suis sûr que dans le trading réel il est également pertinent - dépend de la complexité des stratégies mises en œuvre et de leur nombre.

Ce projet doit encore être amélioré, donc si quelqu'un est intéressé, je peux l'inviter à participer à ce projet de code Google.


Le script actuel est joint ici :

 
FXtrader2008 wrote >>

Jacques, j'apprécie l'intérêt que vous portez à ce sujet. Je suis toujours en train de déboguer mon EA pour sa première devise, mais j'ai l'intention de l'utiliser sur plusieurs devises si cela s'avère approprié. En partant de ce principe, j'ai réfléchi à une stratégie pour mettre en œuvre cette idée. D'où mon intérêt pour ce fil de discussion.

Conformément à votre demande, j'ai préparé des graphiques pour trois autres paires, et ce faisant, j'ai découvert que deux des paires avaient plus de 32 000 ticks sur une période de 24 heures (la limite des données graphiques dans Excel). Par conséquent, j'ai dû diviser le graphique en deux périodes (1ère 12 heures et 2ème 12 heures). Pour garder les choses relativement cohérentes, j'ai divisé les trois paires en périodes de 12 heures.

Une chose à garder à l'esprit, l'échelle verticale de ces graphiques est proportionnelle entre les lignes horizontales, mais l'échelle horizontale n'est PAS proportionnelle au temps (c'est-à-dire que vous ne pouvez pas supposer que 1/12 des ticks représente une heure).

Je pense que ce qu'il faut retenir de ces graphiques, c'est que toutes les paires ont des périodes de 24 heures où les intervalles entre les ticks sont importants. Par conséquent, si vous combinez plusieurs paires dans un EA, je pense qu'il serait sage d'utiliser une boucle "While". La référence de StraightTrader à https://book.mql4.com/special/index intitulée "General Characteristics of Complex Programs" contient une bonne discussion de cette technique et un graphique dans la section d'ouverture de cet article.

GBPJPY 44,834 ticks en 24 heures

EURJPY 37 140 ticks en 24 heures

GBPUSD 29,313 ticks en 24 heures

EURUSD 22,627 ticks en 24 heures

A la vôtre !

Merci beaucoup pour vos graphiques.

Nous allons opter pour une boucle au lieu d'une activation de tick run, ce sera plus scientifique pour ceux qui ont besoin d'une précision à la minute près et ce n'est pas un gros problème à mettre en œuvre. Un autre avantage est que vous pouvez attacher l'EA à n'importe quelle paire de devises que vous voulez (c'est utile quand il dessine un objet sur le graphique).

Merci

 
cloudbreaker wrote >>

Et vous pouvez récupérer les cours acheteur et vendeur les plus récents pour les symboles en dehors du graphique actuel en utilisant la fonction MarketInfo().

Vous avez donc les options suivantes.

- Avoir le même EA attaché à plusieurs graphiques et fonctionnant pour le symbole natif de chaque graphique (en utilisant les variables intégrées Ask et Bid).

- Avoir un EA attaché à un graphique spécifique qui s'exécute pour tous les symboles choisis (avec la fonction MarketInfo() pour les symboles non-natifs) - en utilisant simplement les ticks du symbole natif comme dispositif de déclenchement.

- Avoir des EA maître et esclave attachés à des graphiques différents où l'un est déclenché par l'autre (par exemple, l'un écrit une valeur dans un fichier, l'autre lit constamment le fichier jusqu'à ce qu'il trouve cette donnée et effectue alors une transaction).

Pour l'instant, j'utilise la plus simple de ces stratégies - j'ai un EA sur trois horizons temporels de quatre devises, soit douze en tout. Elles sont toutes configurées pour être exécutées au premier tick de l'échelle de temps. Cependant, j'ai un problème dans la mesure où MT4 n'exécute pas toujours toutes les EA. J'ai placé une instruction d'impression juste après la fonction de démarrage pour voir ce qui se passait, et elle n'arrivait qu'à trois des quatre EA de H1 par exemple, mais elle manquait différentes paires à différents moments, et l'EA était identique à l'exception des paramètres d'optimisation pour chaque paire.

Question - MT4 n'exécute-t-il qu'un seul EA à la fois lorsque plusieurs EA sont configurés pour fonctionner simultanément ? L'exécution d'un EA dépend-elle d'une manière ou d'une autre de celle d'un autre EA (à part le fait que le contexte commercial soit occupé), ou sont-ils complètement indépendants ?

Si c'est le cas, je pourrais utiliser la deuxième option, j'essaie simplement de garder l'EA aussi simple que possible, parce que pour moi, au moins, plus j'écris de manière complexe, plus je fais d'erreurs.

 
joetrader:

En ce moment, j'utilise la plus simple de ces stratégies - j'ai un EA sur trois horizons temporels de quatre devises, donc douze en tout. Ils sont tous configurés pour s'exécuter au premier tick de l'intervalle de temps. Cependant, j'ai un problème dans la mesure où MT4 n'exécute pas toujours toutes les EA. J'ai placé une instruction d'impression juste après la fonction de démarrage pour voir ce qui se passait, et elle n'arrivait qu'à trois des quatre EA de H1 par exemple, mais elle manquait différentes paires à différents moments, et l'EA était identique à l'exception des paramètres d'optimisation pour chaque paire.

Question - MT4 n'exécute-t-il qu'un seul EA à la fois lorsque plusieurs EA sont configurés pour fonctionner simultanément ? L'exécution d'un EA dépend-elle d'une manière ou d'une autre de celle d'un autre EA (à part le fait que le contexte commercial soit occupé), ou sont-ils complètement indépendants ?

Si c'est le cas, je pourrais utiliser la deuxième option, j'essaie juste de garder l'EA aussi simple que possible, parce que pour moi, au moins, plus j'écris de manière complexe, plus je fais d'erreurs.

J'ai plusieurs EA qui fonctionnent sur des graphiques sans aucun problème de ce genre. Pour autant que je puisse dire, ils fonctionnent simultanément, le seul moment où ils se remarquent est lorsque le contexte de transaction est utilisé par l'un d'entre eux. Quant à l'EA lui-même, il est complètement indépendant - chacun a sa propre copie des variables, etc. Si je comprends bien, vous exécutez 12 EA attachés à 12 graphiques ? Peut-être avez-vous des problèmes de mémoire ?

 
gordon wrote >>

J'ai plusieurs EA qui fonctionnent sur des graphiques sans aucun problème de ce genre. Pour autant que je puisse dire, ils fonctionnent simultanément, le seul moment où ils se remarquent est lorsque le contexte de transaction est utilisé par l'un d'entre eux. Quant à l'EA lui-même, il est complètement indépendant - chacun a sa propre copie des variables, etc. Si je comprends bien, vous exécutez 12 EA attachés à 12 graphiques ? Peut-être avez-vous des problèmes de mémoire ?

C'est ça. 12 EA sur 12 graphiques. Un ordinateur plutôt récent avec 6 Go de mémoire, donc je ne pense pas que ce soit la mémoire, mais cela vaut la peine d'être considéré, et je ne l'exclurai pas. Mais vous avez répondu à ma question - Si les EA sont censés pouvoir fonctionner simultanément, alors peut-être que je fais simplement quelque chose de mal. Ce n'est pas la première fois ! Je vais vérifier le code et étudier un peu plus. Merci pour votre aide.

 
Exécutez-vous les graphiques dans des instances distinctes du client MT4 ? Si vous ouvrez tous les graphiques dans une seule instance, ils partageront un seul contexte de trading et vous devrez coder la logique pour partager ce contexte - si le comportement de vos EAs signifie que plus d'un est susceptible d'effectuer une opération de trading en même temps. CB
 
cloudbreaker wrote >>
Exécutez-vous les graphiques dans des instances distinctes du client MT4 ? Si vous ouvrez tous les graphiques dans une seule instance, ils partageront un seul contexte de trading et vous devrez coder la logique pour partager ce contexte - si le comportement de vos EAs signifie que plus d'un est susceptible d'effectuer une opération de trading en même temps. CB

Oui, je les exécute sur le même client MT4. Mais j'utilise l'une des solutions de contexte de transaction occupé de cet article https://www.mql5.com/en/articles/1412 et je ne reçois aucune erreur de contexte de transaction occupé.

Il ne semble même pas arriver au point où il tente d'ouvrir une position. Pour certains, l'EA ne semble pas démarrer du tout. Je dis cela parce que j'ai placé une instruction d'impression au début de ma fonction de démarrage.

Voici ma fonction de démarrage :

void start()
{
//---- trading seulement pour les premiers ticks de la nouvelle barre
if(Volume[0]>1) return ;
Print("Tick Check") ;

if(CalculateCurrentOrders(Symbol())==0) CheckForOpen() ;
else CheckForClose() ;
}

J'effectue des transactions sur CADJPY, EURCHF, GBPUSD et USDJPY.

Et j'obtiens ceci

2010.01.22 8:59:45 [EAName]USDJPY,H1 : Tick Check

2010.01.22 8:59:45 [EAName]CADJPY,H1 : Tick Check

2010.01.22 8:59:45 [EAName]GBPUSD,H1 : Tick Check

22.01.2010 9:59:45 [EAName]EURCHF,H1 : Tick Check

22.01.2010 9:59:46 [EAName]GBPUSD,H1 : Tick Check

2010.01.22 9:59:46 [EAName]CADJPY,H1 : Tick Check

Certaines heures, les quatre positions sont négociées, d'autres seulement trois. S'il faut une heure pour que les H4 s'échangent, trois d'entre eux peuvent s'échanger, mais généralement pas les quatre, ainsi que trois ou quatre des H1.

J'ai créé une solution de rechange qui consiste à augmenter le volume à 3 ou 4 ticks pour être sûr que tout se négocie, mais j'essaie de mieux comprendre MetaTrader pour pouvoir résoudre le problème à la racine.

Ma question est donc la suivante : étant donné que mon EA n'a qu'un seul tick à exécuter, est-ce qu'il exécute chaque EA simultanément, et c'est peut-être pour cela qu'ils ne fonctionnent pas tous ? J'ai une boucle dans mon EA qui compare jusqu'à 1500 des fractales passées pour trouver un stoploss, donc cela pourrait prendre un certain temps.

Encore une fois, il se peut qu'il y ait simplement un problème dans mon code quelque part.

 
Je suppose que vous avez un problème avec votre code et cela n'a rien à voir avec le sujet des EA multiples. Vous devez localiser le problème pour ceux qui ne démarrent pas en utilisant les méthodes standard Print()/Alert() pour voir ce qui ne fonctionne pas.
 
tigersoft:
Voici un code simple pour ouvrir EURUSD et USDCHF sur un graphique. Même si l'application est ajoutée sur un autre graphique, elle ouvrira l'EURUSD et l'USDCHF.

//+------------------------------------------------------------------+
//|                                                          jkh.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

bool wannaBuy = true;
bool wannaBuy1 = true;
extern double LotSize = 0.01;
extern string symbol1 = "EURUSD";
extern string symbol2 = "USDCHF";
extern int MaxDifference = 6;
extern int Slippage = 3;
extern int Magicnumber1 = 786;
extern int Magicnumber2 = 123;
int sendticket = 3;
string pairs[18];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
pairs[0] = symbol1;
pairs[1] = symbol2;
wannaBuy = true;
wannaBuy1 = true;

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   // Send order for EURUSD & USDCHF
   if (wannaBuy) {   
   int ticket1;
   RefreshRates();
   ticket1 = OrderSend(symbol1, OP_BUY, LotSize, MarketInfo(symbol1,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber1,0) & OrderSend(symbol2, OP_BUY, LotSize, MarketInfo(symbol2,MODE_ASK), Slippage, 0, 0, 0,0,Magicnumber2,0);
   if (ticket1 <0 )
   {
   Print ("OrderSend failed with error #", GetLastError());
   return(0);
   }
   wannaBuy = false;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

ne fonctionne pas ?

pour un test en arrière plan
J'ai reçu l'erreur ordersend 4106

Nom de symbole inconnu pour USDCHF pour la fonction ordersend

La fonction Ordersend fonctionne pour l'EURUSD si je choisis le symbole EURUSD pour le paramètre ou le graphique EURUSD.

Si je passe à un autre graphique, j'obtiendrai un symbole inconnu pour l'EURUSD et l'USDCHF.

Merci d'avance.

Raison: