Comment coder ? - page 297

 

...

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

diff1 est la différence entre 2 moyennes sur la mesure 1

diff2 est la différence entre 2 moyennes sur la barre 2

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

tkuan77:
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

Terrance
 

Comment 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.

Dossiers :
 

...

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) :

michaelB:
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.

 
mladen:
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

diff1 est la différence entre 2 moyennes sur la barre 1

diff2 est la différence entre 2 moyennes sur la barre 2

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

Merci 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) ;

}

//+------------------------------------------------------------------+

Dossiers :
ps.jpg  16 kb
 

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.

tkuan77:
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.

michaelB:
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.
 
mladen:
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

tkuan77:
Salut Mladen,

Vous voulez dire que la façon dont je règle mon TP et mon SL n'est pas la bonne ?

Salutations

Terrance
 

Fil de discussion sur les leçons de MQL

mladen-- merci pour le lien ! !!