Au lieu de regarder des émissions de télévision comme deuxième fonction, vous devriez envisager de lire et de comprendre le livre;-)
Ce que vous essayez de réaliser est simple et utilisé dans de nombreuses stratégies, mais votre code - et vos histoires - sont confus et partiellement faux - au moins le code.... pas sûr pour les histoires.
//Pseudo codeif(NewBar) ResetSignals(); //Set all SignalxExecuted to falseif(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
SignalBuy1Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
SignalBuy2Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
SignalBuy1=CheckForOpenBull42(); //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62(); //Check for Signal2 condition is true
if(OpenOrders()>0)CheckForClose(); //Check any order needs to be closed
//and so on.....
Pourquoi ne pas essayer d'implémenter un seul signal pour le moment et vous concentrer sur le codage des fonctions nécessaires ? Si vous avez un bon code pour un signal, il est probablement facile d'implémenter les autres signaux et beaucoup de fonctions sont déjà présentes.
Plus tard, vous pourrez utiliser des tableaux et d'autres fonctions pour le simplifier, mais la simplification de votre code ci-dessus ne devrait pas être votre plus grand problème pour le moment.
KroninOui !vous me comprenez:),plusieurs des stratégiesdans unEA. Je doisécrire150stratégies etellesdoiventmarcheren même tempssur le même graphique, etexécutertoutes les stratégiesen même temps. Quand j'exécuterai 150 EA en même temps ,monPCexplosera-je lepense.
Après cela,c'estinutilecar vousnepouvezavoir qu'une seulestratégie EAet plusieursdéjà dedans.
Bien sûr,lesstratégiesne peuvent pasinterférer les unes avec les autres et quand une stratégie est lancée, la seconde peut l'être aussi, et je peux avoir la stratégie 1, 3 et 5 et la stratégie (1,3,5) en même temps.
Je ne vais pasécrired'autreshistoires:)
Moncode estfaux - c'est connu, j'ai essayé demettre lesdeux stratégiesdans un seulEA, le codefonctionnebienmais latotaliténefonctionnepasbien.
Votrecode est trèsintéressant,je vaisl'étudier,donnez-moidu temps s'il vous plaît.
Salutles amis,après un longtravaildans le code etgrâce auxinformationsdeKroninle code eststructuré etfonctionne. Lecodeprésentedeux stratégiesdans un seulEA
1.pour une petitebougiescénario d'achatest marqué avec uneflèche bleue,sontdeux options pourBUY 2. pour la bougiemoyennebougiescénario d'achatest marqué avecune flèche rouge,sonttrois options pour BUY
J' ai une situation aussioù 1point=1 pipest pratique(pour résoudre le problème estpour plus tard) Ne pasutiliser les optionsif (NewBar)ResetSignals()parce que je pense qu'ils ne sont pasla cause de l'erreur
Si vous supprimezune fonctionPART 2 dans start()bleuune stratégie va travailler, etilfonctionne bien Si vous exécutez lecodePART1etPART2contenantdeuxstratégies delancement,mais ils vontse chevaucher. c'est l'erreur
Pourriez-vous jeter un coup d'oeilKronin
//+------------------------------------------------------------------+//+------------------------------------------------------------------+#define MAGICMA 20050610//+------------------------------------------------------------------+//| Check NEW BAR WORK AT BARS M15 |//+------------------------------------------------------------------+/*
bool New_Bar = false;
bool Fun_New_Bar()
{
static datetime New_Time=0;
New_Bar=false;
if(New_Time!=Time[0])
{
New_Time=Time[0];
New_Bar=true;
}
}
*///+------------------------------------------------------------------+//| Calculate open positions HOW MEANY OF THIS |//+------------------------------------------------------------------+int OpenOrders(string symbol)
{
int buys=0,sells=0;
//----for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
}
}
//---- return orders volumereturn(buys);
}
//+------------------------------------------------------------------+//| Calculate candle These is condidion |//+------------------------------------------------------------------+// scenario 1 / EA 1 / startegy 1 / bluebool BULL4()
{
if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
return(true);
}
// scenario 2 / EA 2 / startegy 2 / redbool BULL6()
{
if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
return(true);
}
//+------------------------------------------------------------------+//| Check for open order conditions |//+------------------------------------------------------------------+// Check for open for scenario 1 / EA 1 / startegy 1 bool OpenBULL41()
{
int res;
if(Bid==Close[1]+3*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return (true);
}
return (false);
}
//----------------------------------- bool OpenBULL42()
{
int res;
if(Ask>OrderOpenPrice()+4*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return;
}
}
// Check for open for scenario 2 / EA 2 / startegy 2void OpenBULL61()
{
int res;
if(Bid==Close[1]+4*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//----------------------------------- void OpenBULL62()
{
int res;
if(Ask>OrderOpenPrice()+2*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//----------------------------------- void OpenBULL63()
{
int res;
if(Ask>OrderOpenPrice()+2*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//+------------------------------------------------------------------+//| Check for close order conditions |//+------------------------------------------------------------------+void CheckForClose()
{
RefreshRates();
if(OrderOpenPrice()+4*Point< Ask)
for (int i = OrdersTotal()-1; i >= 0;i--) // I Have do -1 in "OrdersTotal()-1"
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
bool ticket = true;
if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);
}
}
}
/*
void CheckForClose2()
{
RefreshRates();
if(OrderOpenPrice()+6*Point< Ask)
for (int i = OrdersTotal(); i >= 0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
bool ticket = true;
if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);
}
}
}
*///+------------------------------------------------------------------+//| Start function |//+------------------------------------------------------------------+void start()
{
//------------------ PART1 bool SignalBULL41Executed=false;
if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
{
OpenBULL41();//do open buy position
SignalBULL41Executed=true;
}
bool SignalBULL42Executed=false;
if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
{
OpenBULL42();//do open buy position
SignalBULL42Executed=true;
}
if(OpenOrders(Symbol())>0)CheckForClose();
//------------------ PART 2bool SignalBULL61Executed=false;
if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
{
OpenBULL61();//do open buy position
SignalBULL61Executed=true;
}
bool SignalBULL62Executed=false;
if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
{
OpenBULL62();//do open buy position
SignalBULL62Executed=true;
}
bool SignalBULL63Executed=false;
if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
{
OpenBULL63();//do open buy position
SignalBULL63Executed=true;
}
// if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();
}
//+------------------------------------------------------------------+
Ne pasutiliser les optionsif (NewBar)ResetSignals()car je pense qu'elles ne sont pasla cause de l'erreur.
La façon dont la fonction Fun_NewBar() est codée ne vous permet pas de faire cela... vous devez le faire comme ceci afin qu'elle soit de type bool et retourne une valeur bool...
bool Fun_New_Bar()
{
staticdatetime New_Time=0;
if(New_Time!=Time[0])
{
New_Time=Time[0];
return(true); // <---- we have a new bar so the function returns true
}
return(false);
}
Ouivous avez raisonretourneboolet il y aint (déjà fixé)je ne vois pas avant. Merci Maiscette fonction que jen'utilise pas, il est comme untexte
Je ne pense pas quecelas'appliqueauxfonctionsquimeséparent dedeuxstratégiesqui se chevauchent.Je ne vois pasla relation.Ou peut-être queje me trompe?
//Pseudo codeif(NewBar) ResetSignals(); //Set all SignalxExecuted to falseif(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
SignalBuy1Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
Il est bon de voir que vous avez fait quelques progrès, mais il reste encore beaucoup de chemin à parcourir :-)
Vous devez corriger ce que RaptorUK a indiqué ci-dessus. La réinitialisation des signaux est importante, sinon l'EA s'arrête assez rapidement avec l'ouverture de nouvelles transactions. Votre implémentation est erronée. Si vous réinitialisez le SignalExecuted à chaque tick, cela n'a aucun sens. Peut-être que cela n'ouvre pas plus de trades, parce que vous filtrez aussi les OpenOrders. Mais, comme votre stratégie permet d'avoir plusieurs ordres ouverts, je peux imaginer que vous voulez aussi un algorithme pour fermer les ordres, donc vous avez besoin que le drapeau SignalExecuted soit réinitialisé sur une nouvelle barre (avec votre implémentation, il est inutile et vous n'en avez pas besoin).
Si je comprends bien, vous n'exécuterez pas BULL4 si BULL6 est également vrai. Ou en d'autres termes, la stratégie bleue seulement, si la stratégie rouge n'est pas valide, ou la petite bougie seulement si la bougie moyenne n'est pas valide.
if(BULL4()&&!BULL6(){ // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
OpenBULL41();//do open buy position
SignalBULL41Executed=true;
}
if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
OpenBULL42();//do open buy position
SignalBULL42Executed=true;
}
// Check for open for scenario 1 / EA 1 / startegy 1 bool OpenBULL41()
{
int res;
if(Bid==Close[1]+3*Point) // <--- equal makes no sense here and you should not compare doubles for equality.
Read (again): https://www.mql5.com/en/forum/136997
{
res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket
number or -1, aren't you?
return (true); // <--- Even if OrderSend() fails you return true.
}
return (false);
}
//----------------------------------- bool OpenBULL42()
{
int res;
if(Ask>OrderOpenPrice()+4*Point) // <--- OrderOpenPrice() from a somewhere selected order may or may not work here
(may because only one order is open), but it is not nice coded.
{
res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return;
}
}
La fonction CheckForClose() a à peu près les mêmes problèmes et en plus il n'y a pas de filtre pour le nombre magique. Ici aussi, OrderOpenPrice() sélectionné à partir d'un ordre dans le compte d'achat pourrait finir par fermer le mauvais ordre (je ne suis pas sûr que cela fonctionne réellement). Veuillez également relire ce que Raptor a écrit sur la première page de ce fil.
D'après vos posts et les commentaires dans le code, j'ai l'impression que vous voulez savoir quel ordre appartient à quelle stratégie. Pour cela, vous pouvez définir un deuxième numéro magique pour la deuxième stratégie, ce qui facilitera la fermeture des ordres en fonction de la stratégie dans laquelle ils étaient ouverts.
D'après vos posts et les commentaires dans le code, j'ai l'impression que vous voulez savoir quel ordre appartient à quelle stratégie. Pour ce faire, vous pouvez définir un deuxième numéro magique pour la deuxième stratégie. Il sera alors plus facile de fermer les ordres en fonction de la stratégie dans laquelle ils étaient ouverts.
Ne serait-il pas plus simple d'exécuter 2 stratégies différentes dans 2 EAs distincts, chacun sur son propre graphique ?
RaptorUK: Ne serait-il pas plus simple d'exécuter deux stratégies différentes dans deux EA distincts, chacun sur son propre graphique ?
Oui, pour 2, 3, 4, 5... d'accord. Mais selon les histoires et celle-ci :"Je doisécrire150stratégies etellesdoiventmarcheren même tempssur le même graphique, etexécutertoutes les stratégiesen même temps. Quand j'exécuterai 150 EA en même temps,monPCexplosera-jelepense." Je pense qu'il a l'intention d'exécuter plusieurs stratégies dans un seul EA.....
Pour ceux qui ne comprennent toujours pas mon EA, écrivez une histoire: D hehehehe
L'événement est des bougies - dispose de diverses options pour l' achat et la vente ou la fermeture.
Au lieu de regarder des émissions de télévision comme deuxième fonction, vous devriez envisager de lire et de comprendre le livre;-)
Ce que vous essayez de réaliser est simple et utilisé dans de nombreuses stratégies, mais votre code - et vos histoires - sont confus et partiellement faux - au moins le code.... pas sûr pour les histoires.
Pourquoi ne pas essayer d'implémenter un seul signal pour le moment et vous concentrer sur le codage des fonctions nécessaires ? Si vous avez un bon code pour un signal, il est probablement facile d'implémenter les autres signaux et beaucoup de fonctions sont déjà présentes.
Plus tard, vous pourrez utiliser des tableaux et d'autres fonctions pour le simplifier, mais la simplification de votre code ci-dessus ne devrait pas être votre plus grand problème pour le moment.
Kronin Oui ! vous me comprenez :), plusieurs des stratégies dans un EA.
Je dois écrire 150 stratégies et elles doivent marcher en même temps sur le même graphique, et exécuter toutes les stratégies en même temps. Quand j'exécuterai 150 EA en même temps , mon PC explosera - je le pense.
Après cela, c'est inutile car vous ne pouvez avoir qu'une seule stratégie EA et plusieurs déjà dedans.
Bien sûr, les stratégies ne peuvent pas interférer les unes avec les autres et quand une stratégie est lancée, la seconde peut l'être aussi, et je peux avoir la stratégie 1, 3 et 5 et la stratégie (1,3,5) en même temps.
Je ne vais pas écrire d'autres histoires :)
Mon code est faux - c'est connu, j'ai essayé de mettre les deux stratégies dans un seul EA, le code fonctionne bien mais la totalité ne fonctionne pas bien.
Votrecode est très intéressant, je vais l' étudier, donnez-moi du temps s'il vous plaît.
Salut les amis, après un long travail dans le code et grâce aux informations de Kronin le code est structuré et fonctionne.
Lecode présente deux stratégies dans un seul EA
1.pour une petite bougie scénario d' achat est marqué avec une flèche bleue, sont deux options pour BUY
2. pour la bougie moyenne bougie scénario d'achat est marqué avec une flèche rouge, sont trois options pour BUY
J' ai une situation aussi où 1 point = 1 pip est pratique (pour résoudre le problème est pour plus tard)
Ne pas utiliser les options if (NewBar) ResetSignals () parce que je pense qu' ils ne sont pas la cause de l'erreur
Si vous supprimez une fonction PART 2 dans start() bleu une stratégie va travailler, et il fonctionne bien
Si vous exécutez le code PART1 et PART2 contenant deux stratégies de lancement , mais ils vont se chevaucher. c'est l'erreur
Pourriez-vous jeter un coup d'oeil Kronin
Ne pas utiliser les options if (NewBar) ResetSignals () car je pense qu' elles ne sont pas la cause de l' erreur.
La façon dont la fonction Fun_NewBar() est codée ne vous permet pas de faire cela... vous devez le faire comme ceci afin qu'elle soit de type bool et retourne une valeur bool...
Oui vous avez raison retourne bool et il y a int (déjà fixé) je ne vois pas avant. Merci
Mais cette fonction que je n'utilise pas, il est comme un texte
Je ne pense pas que cela s'applique aux fonctions qui me séparent dedeux stratégies qui se chevauchent . Je ne vois pas la relation. Ou peut-être que je me trompe?
Il est bon de voir que vous avez fait quelques progrès, mais il reste encore beaucoup de chemin à parcourir :-)
Vous devez corriger ce que RaptorUK a indiqué ci-dessus. La réinitialisation des signaux est importante, sinon l'EA s'arrête assez rapidement avec l'ouverture de nouvelles transactions.
Votre implémentation est erronée. Si vous réinitialisez le SignalExecuted à chaque tick, cela n'a aucun sens. Peut-être que cela n'ouvre pas plus de trades, parce que vous filtrez aussi les OpenOrders. Mais, comme votre stratégie permet d'avoir plusieurs ordres ouverts, je peux imaginer que vous voulez aussi un algorithme pour fermer les ordres, donc vous avez besoin que le drapeau SignalExecuted soit réinitialisé sur une nouvelle barre (avec votre implémentation, il est inutile et vous n'en avez pas besoin).
Si je comprends bien, vous n'exécuterez pas BULL4 si BULL6 est également vrai. Ou en d'autres termes, la stratégie bleue seulement, si la stratégie rouge n'est pas valide, ou la petite bougie seulement si la bougie moyenne n'est pas valide.
Prochaines étapes :
La fonction CheckForClose() a à peu près les mêmes problèmes et en plus il n'y a pas de filtre pour le nombre magique. Ici aussi, OrderOpenPrice() sélectionné à partir d'un ordre dans le compte d'achat pourrait finir par fermer le mauvais ordre (je ne suis pas sûr que cela fonctionne réellement).
Veuillez également relire ce que Raptor a écrit sur la première page de ce fil.
D'après vos posts et les commentaires dans le code, j'ai l'impression que vous voulez savoir quel ordre appartient à quelle stratégie. Pour cela, vous pouvez définir un deuxième numéro magique pour la deuxième stratégie, ce qui facilitera la fermeture des ordres en fonction de la stratégie dans laquelle ils étaient ouverts.
Prochaines étapes :
D'après vos posts et les commentaires dans le code, j'ai l'impression que vous voulez savoir quel ordre appartient à quelle stratégie. Pour ce faire, vous pouvez définir un deuxième numéro magique pour la deuxième stratégie. Il sera alors plus facile de fermer les ordres en fonction de la stratégie dans laquelle ils étaient ouverts.
Ne serait-il pas plus simple d'exécuter deux stratégies différentes dans deux EA distincts, chacun sur son propre graphique ?
Oui, pour 2, 3, 4, 5... d'accord. Mais selon les histoires et celle-ci :"Je dois écrire 150 stratégies et elles doivent marcher en même temps sur le même graphique, et exécuter toutes les stratégies en même temps. Quand j'exécuterai 150 EA en même temps , mon PC explosera - je le pense."
Je pense qu'il a l'intention d'exécuter plusieurs stratégies dans un seul EA.....