Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1534

 
Eugen8519:

Voici comment l'ordre se termine

Faites comme je l'ai écrit ci-dessus...

Ou postez le code OnTick()

 
Eugen8519:

Voici comment l'ordre se termine

Cette structure doit être

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
     {
      if(EMA0...)
        {
         .....
         OPENORDER("Sell");
        }
   
      if(EMA0...)
        {
         .....
         OPENORDER("Buy");
        }
     }
//---
   if(EMA0...)
     {
      .....
      CLOSEORDER("Sell");
     }

   if(EMA0...) 
     {
      .....
      CLOSEORDER("Buy");
     }
  }
//+------------------------------------------------------------------+
void CLOSEORDER(string ord)
  {
   .....
  }
//---
void OPENORDER(string ord)
  {
   .....
  }
 
Merci pour le conseil, j'y jetterai un coup d'œil ce soir et j'en rendrai compte plus tard.
 
MakarFX:

Cette structure doit être

Si je ne me trompe pas, on peut l'écrire comme suit

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeCurrent(str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
 
Eugen8519:
Merci pour le conseil, je vais vérifier ce soir et faire un rapport plus tard.

si UseTimeLimit est défini dans les paramètres lors du démarrage de la chouette, alors

cette fonction est mieux dans OnInit() plutôt que dans OnTick()

 
Vitaly Muzichenko:

Si je ne me trompe pas, vous pouvez l'écrire comme ceci

En fait, je l'écris comme ça.

if(TimeHour(time[i])>=Time_Start&&TimeHour(time[i])<TimeFinish)

ou encore plus simple

if(Hour()>=Time_Start&&Hour()<TimeFinish)
 

Bonjour, pourriez-vous me dire comment faire une moyenne correcte de la ligne de l'indicateur ? La courbe de base avec la période Per_1 est dessinée normalement (Buffer_1[]), jusqu'à ce que j'ajoute un bloc de moyennage simple avec Buffer_2[] avec la période de moyennage Per_2.

int OnCalculate(paramètres par défaut)

{

int i, j, limite ;

if(rates_total <= Per_1)

retour(0) ;

//La dernière barre calculée sera recalculée.

limite = taux_total - prev_calculé - Per_1 ;

si(prev_calculé > 0)

limite++ ;

//calculer et remplir les tampons des indicateurs

for(i=0 ; i < limite ; i++)

{

//Calculer la ligne principale de l'indicateur

Buffer_1[i] = Formule de la courbe

double Sum = 0 ;

for(j = i ; j < Per_2 + i ; j++)

{

//Calculer la ligne de moyenne

Sum += Buffer_1[j] ;

Buffer_2[i] = Somme / Per_2 ;

}

}

retour(taux_total) ;

}

 
Eugen8519:
C'est le problème, il n'ouvre et ne ferme que les ordres starthour->stophour.
Et les ordres ouverts ne sont pas fermés après l'heure limite.

Parce que vous ne pouvez pas négocier après l'heure limite

Cela fait longtemps que j'écris sur la logique de l'ouverture avant la fermeture, le chalutage et autres maintenances de position. Dans la plupart des cas, c'est vrai, avant d'ouvrir quelque chose d'autre, vous devez vérifier ce qui est déjà ouvert.

Votre logique est correcte, vous devez juste intervertir les blocs :

MqlDateTime str;
void OnTick()
 {
 // Close Positions
 TrailingStop();

 if(условие_закрытия)
  {
   ClosePos();
  }

 // Open Positions
 if(UseTimeLimit)
  {
    TimeCurrent(str);
    if(str.hour > startHour && str.hour < stopHour)
     {
      OpesPos(...);
      ...
     }
  }
// end
}