Un bug dans la fonction OrderSend() ? - page 10

 
Roger:
Vous ne pouvez pas faire ça. Si vous n'obtenez pas la bonne condition du premier coup, l'heure entière sera perdue.


Sur H1, la condition dure 60 minutes, c'est-à-dire jusqu'à la prochaine barre.

//+------------------------------------------------------------------+
//|                                                     чернoвик.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

static datetime LastTime = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NewBar()==true)
       {
        
           int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-250*Point,Ask+250*Point," ",16384,0,Green);
        
       }
  Comment ("LastTime   ",LastTime,"   NewBar   ",NewBar());  
//----
   return(0);
  }
//+------------------------------------------------------------------+
bool NewBar() 
    {
       
       if (iTime(NULL,0,0) != LastTime) 
       {
          LastTime = iTime(NULL,0,0);      
          return (true);
       } 
       else
          return (false);
     
    }

Cherchez le commentaire dans le testeur.

 
pako:


ne garder qu'une seule position ouverte sur chaque barre

Pako, je suis surprise ! Vous m'avez assailli de "code albanais" tout au long de ce fil, mais qu'avez-vous proposé ? :) La même chose, mais de côté ! Après tout, vous avez la même fonction qu'une nouvelle barre, mais utilisée de manière plus primitive. Et puis il y a la fonction d'envoi d'un ordre, en contournant tous les signaux et ainsi de suite. Et la solution au problème n'était pas là ! Vous avez donc l'Albanais.

Swan:
Taki puis
seulement si l'ordre est ouvert sur la barre courante. i.e. cette ligne dans la fonction OpenBuy/Sell déplace





Swan, merci ! C'est ce qu'il fallait faire ! Si l'heure de la nouvelle barre est affectée dans la fonction d'ouverture de l'ordre, alors pas d'écart. Je l'ai déjà vérifié et je n'en reviens pas de voir à quel point tout fonctionne bien. Mon conseiller expert fonctionne exactement comme il le devrait.

J'ai encore une question. Pourquoi l'exemple précédent n'a-t-il pas fonctionné ? L'exemple précédent présentait également cette condition :

// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);

Je pensais que le code se lisait comme suit... si la fonctionTrade(signal) renvoie faux, alors exit la fonction... et avant que la variablelastBarTime de la ligne ne soit mise à jour :

lastBarTime = iTime(NULL, 0, 0);

ne sera pas mis à jour. Mais il s'avère que ce n'est pas le cas. Puis-je vous demander d'expliquer ce point ? C'est même très intéressant. Je suis intriguée.

 
hoz:

Swan, merci ! C'est ce qu'il fallait faire ! Si le nouveau temps de barre est attribué dans la fonction d'ordre d'ouverture, alors . aucune omission. Je l'ai déjà vérifié et je n'en reviens pas de voir à quel point tout fonctionne bien. Mon conseiller expert fonctionne exactement comme il le devrait.

Une question demeure. Pourquoi la dernière option n'a pas fonctionné ? Il y avait une condition là aussi :

Je pensais que le code se lisait comme ceci... si la fonctionTrade(signal)) retourne faux, alors quittez la fonction... et avant que la variablelastBarTime de la ligne ne soit mise à jour :

ne sera pas mis à jour. Mais il s'avère que ce n'est pas le cas. Puis-je vous demander d'expliquer ce point ? C'est même très intéressant. Je suis intriguée.

Oui, mais si
signal == SIGNAL_NO

au premier tick d'une nouvelle barre, lastBarTime est mis à jour...


peut-être sans...

   if (signal != SIGNAL_NO)
il fonctionnera comme prévu... C'est difficile par le code, vous devez le vérifier)
 
hoz:

Pako, je suis surprise ! Vous m'avez assailli de "code albanais" tout au long de ce fil, mais qu'avez-vous suggéré ? :) La même chose, mais de côté ! Après tout, vous avez la même fonction qu'un nouveau bar, mais avec une utilisation plus primitive. Et puis il y a la fonction d'envoi d'un ordre, en contournant tous les signaux et ainsi de suite. Et la solution au problème n'était pas là ! Donc vous êtes l'Albanais.

pako:
Si cela ne vous dérange pas de formuler à nouveau le cahier des charges, pourquoi avez-vous besoin de contrôler une nouvelle barre ?


hoz:
Formule et facile ! Je n'ai toujours pas pensé à un point, mais je vais expliquer l'ensemble.

Il ne devrait y avoir aucune limitation du nombre de commandes. C'est-à-dire que les commandes peuvent être ouvertes dans n'importe quelle quantité... ... peu importe combien nous en avons, mais nous avons besoin qu'une seule commande soit ouverte dans la barre actuelle. C'est tout.

C'est-à-dire qu'une nouvelle barre s'ouvre, nous pouvons donc ouvrir un ordre pendant cette barre, mais pas plus d'un ordre dans la barre actuelle. L'ordre suivant ne peut être ouvert que sur la barre suivante, pas avant.

Est-ce que c'est clair maintenant ?

J'ai écrit que selon le cahier des charges, une position est ouverte sur une nouvelle barre.

Je ne vois rien d'autre dans le cahier des charges.

Bonne chance à vous

Raison: