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
...
Terrance
Tu voulais tester une croix sur une barre fermée. Le décalage 1 signifie la première barre fermée et le décalage 2 signifie la première barre avant. Et si vous souhaitez tester une croix sur une barre fermée, ce sont les barres que vous devez tester.
A partir de (diff1*diff2)<0) c'est assez simple en fait
Tout peut être positif ou négatif. Ce qui nous intéresse c'est quand l'une est positive et l'autre négative car cela signifie que les moyennes se sont croisées. Les multiplier nous donne une réponse rapide s'il y a un croisement (si les signes sont différents, alors le résultat est inférieur à 0, si les signes sont égaux, le résultat de cette multiplication est supérieur à 0).
J'espère que cela a clarifié ce que fait ce code
Bonjour Mladen, j'ai essayé ce que vous m'avez dit et cela fonctionne à merveille. Cependant, je ne comprends pas bien la logique derrière les codes. Pourquoi définissez-vous le décalage des iMA à 1 et 2 et pourquoi codez-vous ceci : (diff1*diff2)<0) également ? Désolé mais je suis actuellement toujours en phase d'apprentissage.
Merci et salutations
TerranceComment ajouter des flèches
Vous trouverez ci-joint une version abrégée de l'EA de croisement de MA discuté dans les derniers messages.
Lorsqu'un croisement se produit sur une bougie fermée, cette version imprime un message dans le fichier journal.
Serait-il possible de remplacer la logique d'impression par un code permettant d'afficher des flèches haut/bas sur le graphique ?
Merci pour votre aide.
...
Essayez de cette façon ...
Il dessinera une flèche et affichera un commentaire dans le coin inférieur droit du graphique - comme ceci (j'ai ajouté les moyennes sur le graphique juste pour rendre évident ce qu'il fait) :
Vous trouverez ci-joint une version abrégée de l'EA de croisement de MA discuté dans les derniers messages.
Lorsqu'un crossover se produit sur une bougie fermée, cette version imprime un message dans le fichier journal.
Serait-il possible de remplacer la logique d'impression par un code permettant d'afficher des flèches haut/bas sur le graphique ?
Merci pour votre aide.Flèches MA
Le "2MAcrossover avec commentaires" fonctionne très bien.
Juste une question : une fois qu'une flèche apparaît, elle disparaît lorsqu'une nouvelle bougie s'ouvre, était-ce intentionnel ?
J'aime bien le commentaire dans le coin inférieur droit du graphique.
Merci encore.
Terrance
Vous vouliez tester la présence d'une croix sur une barre fermée. Le décalage 1 signifie la première barre fermée et le décalage 2 signifie la première barre avant celle-ci. Et si vous souhaitez tester une croix sur une barre fermée, ce sont les barres que vous devez tester.
A partir de (diff1*diff2)<0) c'est assez simple en fait
Tout peut être positif ou négatif. Ce qui nous intéresse c'est quand l'une est positive et l'autre négative car cela signifie que les moyennes se sont croisées. Les multiplier nous donne une réponse rapide s'il y a un croisement (si les signes sont différents, alors le résultat est inférieur à 0, si les signes sont égaux, le résultat de cette multiplication est supérieur à 0).
J'espère que cela a clarifié ce que fait ce codeMerci Mladen pour votre aide ! Mais quand j'ai ajouté ce code, mon EA semble se dérégler un peu. De temps en temps, il auto SL ou TP sur son propre avant même que le SL ou TP réel est atteint comme celui montré dans ma capture d'écran. pourquoi est-ce ainsi ?
Merci et salutations
Terrance
//--- paramètres d'entrée
extern double TakeProfit=1000.0 ;
extern double Lots=0.1 ;
extern double StopLoss=1500.0 ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation experte |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0) ;
}
int mainCrossed (double mainline1 , double mainline2)
{
static int mainlast_direction = 0 ;
static int maincurrent_dirction = 0 ;
if(mainline1>mainline2)maincurrent_dirction = 1 ; //main up
if(mainline1<mainline2)maincurrent_dirction = 2 ; //maintenir vers le bas
if(maincurrent_dirction != mainlast_direction) //main changée
{
mainlast_dirction = maincurrent_dirction ;
return (mainlast_dirction) ;
}
else
{
return (0) ;
}
}
//+------------------------------------------------------------------+
//| fonction de démarrage expert |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total ;
double shortEma, longEma, mainshortEma, mainlongEma ;
if(Bars<100)
{
Print("barres inférieures à 100") ;
return(0) ;
}
if(TakeProfit<10)
{
Print("TakeProfit inférieur à 10") ;
return(0) ; // vérifier TakeProfit
}
int isCrossed = 0 ;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1) ;
double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1) ;
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2) ;
double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2) ;
double diff1 = shortEma1-longEma1 ;
double diff2 = shortEma2-longEma2 ;
mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0) ;
mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0) ;
int mainisCrossed = mainCrossed (mainshortEma,mainlongEma) ;
si ((diff1*diff2)<0)
{
si (shortEma1>longEma1)
isCrossed = 1 ;
sinon isCrossed = 2 ;
}
total = OrdersTotal() ;
si(total < 1)
{
si(isCrossed == 1 && mainshortEma > mainlongEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"My EA",12345,0,Green) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
return(0) ;
}
if(isCrossed == 2 && mainshortEma < mainlongEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "My EA",12345,0,Red) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre de vente ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre VENTE : ",GetLastError()) ;
return(0) ;
}
return(0) ;
}
return(0) ;
}
//+------------------------------------------------------------------+
Terrance
Ce code n'a rien à voir avec SL ou TP. Il teste simplement 2 moyennes pour les croisements (voir comment MichaelB a utilisé ce même code dans son 2MACrosses, puisque c'est aussi un nan EA). Le reste de votre code doit être révisé pour ces erreurs de SL et TP.
Merci Mladen pour votre aide ! Mais lorsque j'ai ajouté ce code, mon EA semble se dérégler un peu. Il arrive que le SL ou le TP s'auto-déclenche avant même que le SL ou le TP ne soit atteint, comme dans la capture d'écran. Pourquoi ?
Merci et salutations
Terrance
//--- paramètres d'entrée
extern double TakeProfit=1000.0 ;
extern double Lots=0.1 ;
extern double StopLoss=1500.0 ;
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation experte |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0) ;
}
int mainCrossed (double mainline1 , double mainline2)
{
static int mainlast_direction = 0 ;
static int maincurrent_dirction = 0 ;
if(mainline1>mainline2)maincurrent_dirction = 1 ; //main up
if(mainline1<mainline2)maincurrent_dirction = 2 ; //maintien vers le bas
if(maincurrent_dirction != mainlast_direction) //main changée
{
mainlast_dirction = maincurrent_dirction ;
return (mainlast_dirction) ;
}
else
{
return (0) ;
}
}
//+------------------------------------------------------------------+
//| fonction de démarrage expert |
//+------------------------------------------------------------------+
int start()
{
//----
int cnt, ticket, total ;
double shortEma, longEma, mainshortEma, mainlongEma ;
if(Bars<100)
{
Print("barres inférieures à 100") ;
return(0) ;
}
if(TakeProfit<10)
{
Print("TakeProfit inférieur à 10") ;
return(0) ; // vérifier TakeProfit
}
int isCrossed = 0 ;
double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1) ;
double longEma1 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,1) ;
double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2) ;
double longEma2 = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,2) ;
double diff1 = shortEma1-longEma1 ;
double diff2 = shortEma2-longEma2 ;
mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0) ;
mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0) ;
int mainisCrossed = mainCrossed (mainshortEma,mainlongEma) ;
si ((diff1*diff2)<0)
{
si (shortEma1>longEma1)
isCrossed = 1 ;
sinon isCrossed = 2 ;
}
total = OrdersTotal() ;
si(total < 1)
{
si(isCrossed == 1 && mainshortEma > mainlongEma)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,
"My EA",12345,0,Green) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
return(0) ;
}
if(isCrossed == 2 && mainshortEma < mainlongEma)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,
Bid-TakeProfit*Point, "My EA",12345,0,Red) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
return(0) ;
}
return(0) ;
}
return(0) ;
}
//+------------------------------------------------------------------+...
Oui, c'est intentionnel
Puisque vous avez fait un EA et non un indicateur, l'ajout était de montrer seulement le dernier croisement actif et quand il n'y a pas de croisement actif, de ne pas montrer une flèche. Pour qu'il soit capable d'afficher plusieurs flèches, il faudrait d'abord le convertir en indicateur et ensuite tout réécrire, mais je pense qu'il y a déjà beaucoup d'indicateurs qui affichent les croisements de moyennes sur le graphique.
Le "2MAcrossover avec commentaires" fonctionne vraiment bien.
Juste une question - une fois qu'une flèche apparaît, elle disparaît lorsqu'une nouvelle bougie s'ouvre, était-ce intentionnel ?
J'aime le commentaire dans le coin inférieur droit du graphique.
Merci encore.Terrance Ce code n'a rien à voir avec le SL ou le TP. Il teste simplement 2 moyennes pour les crosses (voir comment MichaelB a utilisé ce même code dans son 2MACrosses, puisque c'est aussi un nan EA). Le reste de votre code doit être révisé pour ces erreurs de SL et TP.
Salut Mladen,
Vous voulez dire que la façon dont j'ai réglé mon TP et mon SL n'est pas la bonne ?
Salutations
Terrance
...
Terrance
Avez-vous vu cette section de TSD : Lessons?
Je pense que beaucoup de questions y sont déjà répondues et que vous pouvez y trouver de très bons exemples pour l'écriture générale d'EA. Pour ce qui est de ta question : je n'ai pas testé ton EA donc je ne sais pas. Le problème lorsqu'on teste l'EA de quelqu'un d'autre, c'est qu'il faut en connaître l'idée et la logique et qu'il est souvent impossible de les "lire" dans le code lui-même. L'extrait de code dont nous parlions concernait la manière de détecter 2 croisements de moyennes sur une barre fermée et ce code ne fait que cela et rien d'autre. C'est pourquoi j'ai dit que "cela n'a rien à voir avec SL ou TP".
Salutations
Mladen
Salut Mladen,
Vous voulez dire que la façon dont je règle mon TP et mon SL n'est pas la bonne ?
Salutations
TerranceFil de discussion sur les leçons de MQL
mladen-- merci pour le lien ! !!