Comment coder ? - page 298

 
mladen:
Terrance

Avez-vous vu cette section de TSD : Lessons?

Je pense que beaucoup de questions y ont déjà trouvé une réponse et que vous pouvez y trouver de très bons exemples pour l'écriture générale d'EA. Quant à votre question : je n'ai pas testé votre 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

Bonjour Mladen, désolé de vous déranger à nouveau. J'ai parcouru mes codes et j'ai remarqué que non seulement mon TP et SL, mais parfois même mes ordres d'achat et de vente ne sont pas corrects. J'ai parcouru les liens sur la leçon que vous m'avez donnée par codersgurus et c'est le même ensemble de tutoriels que j'avais et sur lequel j'ai basé mes codes. Je n'arrive vraiment pas à trouver la cause de mon erreur dans les codes.

Les croisements de la MA fonctionnent comme il se doit avec l'ordre Long et Short, mais parfois l'entrée et la sortie semblent se détraquer, même lorsque j'ai fait une fonction ASK de base pour la tester. Veuillez m'éclairer sur ce point.

Merci et salutations

Terrance

 

...

Terrance

Premièrement : Votre courtier est-il de type ECN/STP ? Si oui, alors vous ne pouvez pas placer un stop loss et un take profit lors de l'ouverture d'un ordre, mais vous devez d'abord ouvrir un ordre avec ceux-ci à 0 et ensuite utiliser OrderModify() pour placer un stop loss et/ou un take profit sur un ordre déjà ouvert.

Deuxièmement : Vérifiez toujours si quelque chose est écrit dans l'onglet des experts de la fenêtre du terminal (vérifiez si des erreurs y sont écrites : vous découvrirez probablement alors ce qui se passe et pourquoi).

Troisièmement : Ce serait une bonne idée de placer une ligne comme ceci :

int err=GetLastError(); Print(err);

Après chaque fonction de gestion des ordres. Les descriptions d'erreurs que vous pouvez trouver dans le fichier experts/include/stderror.mqh (il y a beaucoup d'erreurs qui peuvent se produire (voir la liste des codes d'erreurs possibles et leurs descriptions) avec les ordres et vous devez surveiller chaque erreur possible) Avec des codes d'erreurs connus (la ligne de code ci-dessus), vous pouvez vous concentrer sur la correction des erreurs spécifiques au lieu de deviner ce qui se passe.

tkuan77:
Bonjour Mladen, désolé de vous déranger à nouveau. J'ai parcouru mes codes et j'ai remarqué que non seulement mes TP et SL, mais parfois même mes ordres d'achat et de vente ne sont pas corrects. J'ai parcouru les liens sur la leçon que vous m'avez donnée par codersgurus et c'est le même ensemble de tutoriels que j'avais et sur lequel j'ai basé mes codes. Je n'arrive vraiment pas à trouver la cause de mon erreur dans les codes.

Les croisements de la MA fonctionnent comme il se doit avec l'ordre Long et Short, mais parfois l'entrée et la sortie semblent se détraquer, même lorsque j'ai fait une fonction ASK de base pour la tester. Veuillez m'éclairer.

Merci et salutations

Terrance
Dossiers :
terminal_1.gif  62 kb
 
mladen:
Terrance

Premièrement : Votre courtier est-il de type ECN/STP ? Si oui, vous ne pouvez pas placer un stop loss et un take profit lors de l'ouverture d'un ordre, mais vous devez d'abord ouvrir un ordre avec ceux-ci à 0 et ensuite utiliser OrderModify() pour placer un stop loss et/ou un take profit sur un ordre déjà ouvert.

Deuxièmement : Vérifiez toujours si quelque chose est écrit dans l'onglet des experts de la fenêtre du terminal (vérifiez si des erreurs y sont écrites : vous découvrirez probablement alors ce qui se passe et pourquoi).

Troisièmement : Ce serait une bonne idée de placer une ligne comme celle-ci :

int err=GetLastError(); Print(err);
Après chaque fonction de gestion des ordres. Les descriptions d'erreurs que vous pouvez trouver dans le fichier experts/include/stderror.mqh (il y a beaucoup d'erreurs qui peuvent se produire (voir la liste des codes d'erreurs possibles et leurs descriptions) avec les ordres et vous devez surveiller chaque erreur possible). Avec des codes d'erreurs connus (la ligne de code ci-dessus), vous pouvez vous concentrer sur la correction des erreurs spécifiques au lieu de deviner ce qui se passe.

Salut Mladen,

Merci de m'avoir signalé le truc ECN/STP. Je n'en savais rien jusqu'à ce que vous le mentionniez. J'ai fait les changements comme vous l'avez suggéré, mais maintenant ça ne fait qu'empirer pour moi. Non seulement le problème d'entrée et de sortie persiste, mais mon SL est maintenant absent. C'est plus difficile que je ne le pensais.

//--- 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,0,Ask+TakeProfit*Point,

"My EA",12345,0,Green) ;

si(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,0,Bid-TakeProfit*Point,

"My EA",12345,0,Red) ;

si(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre VENTE ouvert : ",OrderOpenPrice()) ;

}

else Print("Erreur lors de l'ouverture de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())

{

si(OrderType()==OP_BUY) // une position longue est ouverte

{

OrderClose(OrderTicket(),OrderLots(),Ask-StopLoss*Point,3,Violet) ;

// fermeture de la position

return(0) ; // sortie

}

else // passe en position courte

{

OrderClose(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet) ;

// fermer la position

return(0) ; // sortie

}

}

}

return(0) ;

}

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

 
mladen:
Terrance

Premièrement : Votre courtier est-il de type ECN/STP ? Si oui, vous ne pouvez pas placer un stop loss et un take profit lors de l'ouverture d'un ordre, mais vous devez d'abord ouvrir un ordre avec ceux-ci à 0 et ensuite utiliser OrderModify() pour placer un stop loss et/ou un take profit sur un ordre déjà ouvert.

Deuxièmement : Vérifiez toujours si quelque chose est écrit dans l'onglet des experts de la fenêtre du terminal (vérifiez si des erreurs y sont écrites : vous découvrirez probablement alors ce qui se passe et pourquoi).

Troisièmement : Ce pourrait être une bonne idée de placer une ligne comme celle-ci :

int err=GetLastError(); Print(err);
Après chaque fonction de gestion des ordres. Les descriptions d'erreurs que vous pouvez trouver dans le fichier experts/include/stderror.mqh (il y a beaucoup d'erreurs qui peuvent se produire (voir la liste des codes d'erreurs possibles et leurs descriptions) avec les ordres et vous devez surveiller chaque erreur possible). Avec des codes d'erreurs connus (la ligne de code ci-dessus), vous pouvez vous concentrer sur la correction des erreurs spécifiques au lieu de deviner ce qui se passe.

Hey Mladen, je voudrais te remercier pour ton aide ces derniers jours. J'ai réussi à trouver l'erreur dans mon code qui cause l'erreur d'entrée et de sortie.

Salutations

Terrance

 

Ouvrir plus d'une transaction

Bonjour à tous, J'ai essayé de faire en sorte que mon EA soit capable d'ouvrir plusieurs transactions, mais jusqu'à présent, je n'ai réussi à le limiter qu'à une seule transaction.

Mon objectif est simple :

Lorsque la LWMA 10 passe en dessous de la LWMA 20, le système sera short à condition que les LWMA 10 et 20 passent en dessous de la SMA 50 et vice versa pour les trades longs.

Je veux limiter mon EA à l'ouverture de deux transactions au maximum, mais lorsque je modifie les codes, il ouvre deux transactions à la fois au lieu d'une par critère.

Dois-je mettre en place un système de compteur ou autre ou comment puis-je configurer mon compteur pour qu'il réagisse lorsqu'un de mes trades a déjà un TP ou un SL ?

Quelqu'un peut-il m'éclairer sur ce qui ne va pas dans mes codes ?

Merci beaucoup et salutations

Terrance

//--- paramètres d'entrée

extern double TakeProfit=500.0 ;

extern double Lots=0.1 ;

extern double StopLoss=500.0 ;

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

//| fonction d'initialisation de l'expert

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

int init()

{

//----

//----

return(0) ;

}

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

//| fonction de désinitialisation experte |

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0) ;

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0) ;

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,50,0,MODE_SMA,PRICE_CLOSE,0) ;

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1 ;

sinon isCrossed = 2 ;

}

total = OrdersTotal() ;

si(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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 de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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 de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

return(0) ;

}

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

 

Questions

Mladen,

J'essaie de chercher les leçons sous le lien que vous m'avez montré, mais ce sont des leçons génériques, je cherche des informations pour spécifiquement l'indicateur d'Henderson...

En outre, j'ai parcouru les fils de discussion affichés et après cela, je veux trouver les choses suivantes.

-Dans un langage simple et facile à comprendre, je veux demander est qu'environ après combien de barres passe, et la couleur change.

En d'autres termes, combien de barres au maximum faut-il avant que la couleur de la ligne passe du bleu au rose ? Malheureusement, je ne comprends pas les termes compliqués et j'apprécierais une réponse très simple qui me permettrait d'avancer et de lancer la stratégie. Tout graphique est le bienvenu . Mon adresse électronique est premalmunshaw@yahoo.com.

J'essaie de payer 39 $ pour que ce paquet soit activé.

J'ATTENDS UNE RÉPONSE POSITIVE !

Salutations,

Premal Munshaw

mladen:
Franchement, je ne comprends pas ce que vous demandez.

Si vous demandez quand la couleur change, alors la réponse est : quand la pente change.

Si vous demandez comment il est codé pour changer de couleur, alors la réponse que vous devriez chercher dans cette section : Leçons.
 

...

Malheureusement, je ne comprends pas vos questions, donc tout ce que je vais faire, c'est me répéter (la longueur de calcul se réfère à la longueur de calcul du filtre d'Henderson) :

Si votre longueur de calcul est de 5, les 2 dernières barres peuvent changer.

si votre longueur de calcul est de 7 alors les 3 dernières mesures peuvent changer

Si votre longueur de calcul est de 9, les 4 dernières mesures peuvent changer.

Il est impossible de répondre à une question plus simple que celle-là. Et il n'y a pas d'explication plus simple du calcul du filtre d'Henderson : ce serait comme si j'essayais d'expliquer la transformée de Fourier en termes de "1+1 = 2". Veuillez examiner les liens qui vous ont été fournis

Pour le reste : vous avez des liens vers les mathématiques derrière le filtre, vous avez des informations sur le nombre de barres recalculées, vous avez même des exemples tirés du fil d'actualité de la section élite. Quant à la stratégie utilisant ce filtre : j'ai dit 1000 fois dans des milliers de messages que les indicateurs de recalcul (SSA, filtre d'Henderson, TMA centrée, transformées de Fourier, analyse de régression, ...) ne doivent pas être utilisés en "mode signal" mais en "mode estimation". Si vous recherchez des signaux à partir du filtre d'Henderson, alors vous êtes sur une mauvaise piste et si c'est la seule raison pour laquelle vous envisagez de vous abonner à la section Elite, alors il vaut mieux que vous ne vous abonniez pas.

PS : c'est une mauvaise pratique de rendre votre email public. De cette façon, tout ce que vous obtiendrez sera une tonne de messages de spam dans votre boîte aux lettres électronique.

______________________________________

Je vous souhaite bonne chance dans votre recherche d'un système de trading.

Salutations

Mladen

premalmunshaw:
Mladen,

J'essaie de chercher les leçons sous le lien que vous m'avez montré, mais ce sont des leçons génériques, je cherche des informations spécifiques pour l'indicateur d'Henderson...

De plus, j'ai parcouru les fils de discussion affichés et je veux trouver les choses suivantes.

-Dans un langage simple et facile à comprendre, je veux demander est qu'environ après combien de barres passe, et la couleur change.

En d'autres termes, combien de barres au maximum faut-il avant que la couleur de la ligne passe du bleu au rose ? Malheureusement, je ne comprends pas les termes compliqués et j'apprécierais une réponse très simple qui me permettrait d'avancer et de lancer la stratégie. Tout graphique est le bienvenu . Mon adresse électronique est premalmunshaw@yahoo.com.

J'essaie de payer 39 $ pour que ce paquet soit activé.

J'ATTENDS UNE RÉPONSE POSITIVE !

Merci,

Premal Munshaw
 

Mladen,

Y a-t-il un moyen pour moi de définir un compteur pour ma transaction de telle sorte que lorsque ma transaction a un TP ou un SL, je puisse déclencher le saut du compteur ?

Salutations

Terrance

tkuan77:
Bonjour à tous, j'ai essayé de faire en sorte que mon EA puisse ouvrir plusieurs transactions, mais jusqu'à présent, je n'ai réussi à le limiter qu'à une seule transaction.

Mon objectif est simple :

Lorsque la LWMA 10 passe sous la LWMA 20, le système sera court à condition que les LWMA 10 et 20 passent sous la SMA 50 et vice versa pour les trades longs.

Je veux limiter mon EA à l'ouverture de deux transactions au maximum, mais lorsque je modifie les codes, il ouvre deux transactions à la fois au lieu d'une par critère.

Dois-je mettre en place un système de compteur ou autre ou comment puis-je configurer mon compteur pour qu'il réagisse lorsqu'un de mes trades a déjà un TP ou un SL ?

Quelqu'un peut-il m'éclairer sur ce qui ne va pas dans mes codes ?

Merci beaucoup et salutations

Terrance

//--- paramètres d'entrée

extern double TakeProfit=500.0 ;

extern double Lots=0.1 ;

extern double StopLoss=500.0 ;

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

//| fonction d'initialisation de l'expert

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

int init()

{

//----

//----

return(0) ;

}

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

//| fonction de désinitialisation experte |

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0) ;

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0) ;

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,50,0,MODE_SMA,PRICE_CLOSE,0) ;

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1 ;

sinon isCrossed = 2 ;

}

total = OrdersTotal() ;

si(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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 de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,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 de l'ordre VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

return(0) ;

}

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

...

Essayez cette fonction:

int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
et ensuite vous pouvez vérifier
:if openedBuys==0 open buy

if openedSells==0 open sell

tkuan77:
Mladen,

Existe-t-il un moyen pour moi de définir un compteur pour ma transaction de sorte que lorsque ma transaction a un TP ou un SL, je puisse déclencher le saut du compteur ?

Salutations

Terrance
 

Bonjour Mladen,

J'ai trouvé une autre solution en utilisant la fonction "Bars". Lorsqu'une transaction est déclenchée, je fixe un nombre entier avec la fonction bars (par exemple, une transaction d'achat est déclenchée à la barre 122, donc le nombre sera 122) et lorsque mon critère est à nouveau déclenché, j'appelle à nouveau la fonction bars et je la compare avec le nombre et la transaction ne sera déclenchée que si le nouveau nombre est supérieur au précédent, qui est 122 dans ce cas.

Cependant, je déclenche toujours 2 transactions ensemble au lieu d'une par critère. Pourquoi en est-il ainsi ?

Merci de m'aider.

Merci et salutations

Terrance

//--- paramètres d'entrée

extern double TakeProfit=530.0 ;

extern double Lots=0.1 ;

extern double StopLoss=520.0 ;

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

//| fonction d'initialisation de l'expert

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

int init()

{

//----

//----

return(0) ;

}

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

//| fonction de désinitialisation experte |

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0) ;

longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0) ;

int isCrossed = 0 ;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1) ;

double longEma1 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,1) ;

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2) ;

double longEma2 = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,2) ;

double diff1 = shortEma1-longEma1 ;

double diff2 = shortEma2-longEma2 ;

mainshortEma = iMA(NULL,0,113,0,MODE_EMA,PRICE_CLOSE,0) ;

si ((diff1*diff2)<0)

{

si (shortEma1>longEma1)

isCrossed = 1 ;

sinon isCrossed = 2 ;

}

int BarCounter, BarCounter2 ;

total = OrdersTotal() ;

si(total < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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()) ;

BarCounter = Bars ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;

return(0) ;

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"My EA",12345,0,Red) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre SELL ouvert : ",OrderOpenPrice()) ;

BarCounter = Bars ;

}

else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

if(total == 1)

{

BarCounter2 = Bars ;

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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()) ;

BarCounter = BarCounter2 ;

}

else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;

return(0) ;

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"My EA",12345,0,Red) ;

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordre SELL ouvert : ",OrderOpenPrice()) ;

BarCounter = BarCounter2 ;

}

else Print("Erreur lors de l'ouverture de l'ordre SELL : ",GetLastError()) ;

return(0) ;

}

return(0) ;

}

return(0) ;

}

mladen:
Essayez cette fonction :
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
et ensuite vous pouvez vérifier
:if openedBuys==0 open buy

if openedSells==0 open sell