Avoir le prix ouvert de la bougie à une heure précise.

 

Bonjour à tous,

J'ai une nouvelle question, simple je pense.

Donc quand par exemple il est 15:00, je veux connaître le prix ouvert de la bougie dont l'heure était 9:00.

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
Alors comment écrire le code pour obtenir le prix ouvert de la bougie de l'heure prédéfinie ?
 

Calculez l'heure en tant que variable de temps et utilisez-la avec iBarshift() pour obtenir le numéro de la barre. Lorsque vous avez le numéro de la barre, utilisez-le avec Open[] ou iOpen().

 
RaptorUK:

Travaillez le temps comme une variable datetime et utilisez-le avec iBarshift() pour obtenir le numéro de la barre, quand vous avez le numéro de la barre, utilisez-le avec Open[] ou iOpen().


oui pas mauvaise idée :)

Merci, je vais l'utiliser !

 

Et c'est possible de le faire :

   int Bar;
   double OpenPrice;
   
   int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);


HeureSH est arraysize avec les quatre heures.

Parce que si c'est une heure spécifique, la barre doit être différente, mais il faut créer un interrupteur pour avoir une seule ligne, pas quatre lignes différentes.

Oh c'est correct ? le code est écrit correctement ?

 
Kane59:

Et c'est possible de le faire :


HeureSH est arraysize avec les quatre heures.

Parce que si c'est une heure spécifique, la barre doit être différente, mais il faut créer un interrupteur pour avoir une seule ligne, pas quatre lignes différentes.

Oh, c'est correct ? le code est écrit correctement ?

Je suppose que vous avez une erreur de copier/coller car vous avez le cas 1 deux fois ... donc je suppose que le deuxième cas 1 devrait être le cas 2.

Pour que cela fonctionne, les valeurs stockées dans le tableau HeureSH[] sont 1, 2, 3 ou 4, est-ce correct ? elles ne peuvent être que des valeurs de type int. pas de chaînes ou de doubles. . .

Dans votre appel iOpen(), je suppose que B doit être Bar? ou bien B(int) ? si vous voulez utiliser la fonction dans cet appel, vous devez faire en sorte que la fonction renvoie la valeur correcte.


Vous vous rendrez un grand service, à vous et aux autres, en utilisant des noms de variables et de fonctions significatifs... B, k et Bar ne sont pas très descriptifs.

 

Oh, c'est une erreur de ma part, j'ai copié mon code mais je ne sais pas ce que j'ai écrit. ....... Je l'ai résolu.

Dans mon iopen, j'ai écrit B qui est "Bar" parce que le temps est différent, donc Bar est différent aussi.


Ah oui, les valeurs de chaînes peuvent poser des problèmes, je pense que c'est le problème, donc je vais essayer de changer.

 
  int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);
Cela ne fonctionnera pas. 1) iBarShift est assigné à Bar mais iOpen utilise B. 2) StrToTime("23:00") retournera la date d'aujourd'hui à 23:00 qui sera toujours dans le futur (ou la barre H1 actuelle).
#define HR2400      86400           // 24 * 3600
datetime TimeOfDay(datetime when){  return( when % HR2400          );       }
datetime DateOfDay(datetime when){  return( when - TimeOfDay(when) );       }
  int B(k);
   {
    #define HR0900 23400    // 9*3600
    #define HR1500 54000
    #define HR1900 68400
    #define HR2300 59800
    int times[]={ HR2300, HR0900, HR1500, HR1900 };
    datetime    now = TimeCurrent(),
                Bod = DateOfDay(now),
                want= Bod + times[HeureSH[k]];
    if (want > now){    // Yesterdays?
        datetime prevTradingDate = iTime(Symbol(), PERIOD_D1, 1);
        want = prevTradingDate + times[HeureSH[k]];
    }
   int iBar= iBarShift(Symbol(), PERIOD_H1, want);
   OpenPrice= iOpen(Symbol(), PERIOD_H1, iBar);
   }
 

Bonjour WHRoeder,

Je pense que votre code est plus efficace que le mien et permet d'obtenir si la valeur du temps est hier ou aujourd'hui. Je suis d'accord : 23:00, avec mon code, est toujours le futur ou le courant quand il est trop tard...


Merci beaucoup ! C'est exactement ce que je cherchais.

 

Bonjour WHRoeader,

pour information :

vous avez dit que ibarshift était assigné à Bar, iOpen à B. Ok

Mais la fonction B(k), c'est quoi cette fonction ? pourquoi elle est là ?

Dans mon code, je l'ai placée parce que je voulais une relation entre le tableau des heures des chaînes de caractères (HeuresSH) et les différentes StrToTime. C'était faux donc.


Vous l'avez utilisé à nouveau, pourquoi ?

Salutations :)

 

Oui, j'ai oublié de dire, HeureSH[] est un arraySize de quatre heures différentes en valeurs de chaîne.

 

Ok, j'ai inséré votre code dans mon EA et cela fonctionne parfaitement ! J'ai souri quand j'ai vu l'EA s'exécuter comme je le voulais ! !!

Très merci très très ......

C'est en backtest car le marché est fermé...

Mais il y a un problème :

L'EA ouvre correctement les positions, mais les achats ne sont jamais fermés et les ventes sont immédiatement fermées lorsqu'elles sont ouvertes.

Ma stratégie est la suivante :

Dans le même temps, l'EA doit ouvrir une vente ou un achat si les paramètres sont vrais. Il n'y a pas de SL ou TP.

Et dans le même temps, il doit boucler et fermer toutes les transactions si les fonctions suivantes sont vraies :

if(OrdersTotal()>0)
            { 
               for(int i=OrdersTotal()-1; i>=0; i--)
               {
                  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  {
                     if(OrderMagicNumber() == MagicSH && OrderOpenTime() > iTime(Symbol(), PERIOD_H1, 1))
                     {
                        if(OrderType() == OP_BUY)
                        {
                           OrderClose(OrderTicket(),LotsSH, bid, 300, CLR_NONE);
                        }
                        if(OrderType() == OP_SELL)
                        {
                           OrderClose(OrderTicket(),LotsSH, ask, 300, CLR_NONE);
Je dois ajouter un filtre de profit, mais je vais travailler sur ce point. Sans cela, il doit fermer l'achat, mais il n'est jamais fermé, et il doit laisser la vente se dérouler, mais les ventes sont fermées immédiatement. Y a-t-il une erreur dans le dernier code ?