SEULEMENT BOUGIE / BAR - Comment cataloguer ou séparer les bougies ? - VEUILLEZ ME CORRIGER ! - page 2

 
Wodzuuu:

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.

Je comprends mieux en regardant votre code que de lire ce que vous avez écrit ... ;-)
 

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 code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(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.

 

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

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#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 volume
   return(buys);
  }

//+------------------------------------------------------------------+
//| Calculate candle      These is condidion                         |
//+------------------------------------------------------------------+

// scenario 1 / EA 1  /  startegy 1 / blue

bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
   return(true);
   } 

// scenario 2 / EA 2  /  startegy 2 / red

bool 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 2
  
void 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 2
            
            bool 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();                    
            
  }
//+------------------------------------------------------------------+
 
Wodzuuu:

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

bool Fun_New_Bar()                
   {                                
   static datetime 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);
   }
 

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?

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(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;
}
 

Prochaines étapes :

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

 
kronin:

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