Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 175

 

L'EA sort sur 33 barres après une transaction :

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (Time[33]>t) 
          {                                      
          Cls_B=true;              
          }

Dans le réel et dans le testeur, il est sorti sur 43 barres. J'ai essayé de définir les paramètres de sortie sur la cinquième barre, tout est normal. À votre avis, quel peut être le problème ?

 
Forexman77:

L'EA sort sur 33 barres après une transaction :

Dans le réel et dans le testeur, il est sorti sur 43 barres. J'ai essayé de définir les paramètres de sortie sur la cinquième barre, tout est normal. À votre avis, quel peut être le problème ?


Peut-être que si (condition) a été exécuté plusieurs fois (une fois de plus à 10 barres, par exemple) et que cette exécution a retardé le temps de vie ?

 
ALXIMIKS:


Peut-être que si (condition) a été exécutée plusieurs fois (une fois de plus à 10 barres par exemple) ? et que cette exécution a retardé la durée de vie.

Une transaction : entrée 15:37, sortie 16:19. Sortie sur la mesure 41, pour être plus correct.
 
Forexman77:
Une transaction : entrée 15:37, sortie 16:19. Sortie à 41 barres, pour être plus correct.


Et si nous le remplaçons par iBarShift, je me demande si l'erreur restera ? ?? Peut-être des barres manquantes dans l'histoire (il n'y a sûrement pas de trous ?) ?

Entrez après que la condition soit remplie, comptez les barres ouvertes, voyez combien d'entre elles se sont réellement ouvertes, car se référer au temps n'est pas très correct.

 
ALXIMIKS:


Si nous le remplaçons par iBarShift, je me demande si l'erreur restera ? Peut-être que les barres sont manquantes dans l'histoire (il n'y a sûrement pas de trous ?) ?

Une fois que la condition est remplie, entrez un compte de barres ouvertes et voyez combien de barres sont réellement ouvertes, car se référer au temps ne semble pas correct.

Le code devrait-il être comme ceci ?

static datetime t;
datetime s=Time[33]>t;

if (условие)
    {
      Opn_B = true; 
      t=Time[0];
      int shif= iBarShift(Symbol(),PERIOD_M1,t,false);
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),PERIOD_M1,s,false)) 
    {                                      
     Cls_B=true;              
    }

Ce type de code verrouille le conseiller expert.

 

Bonjour, pouvez-vous m'aider à faire passer l'alerte une fois par barre sur chaque ligne, et pas seulement sur la première,

J'ai limité le nombre d'alertes par temps, mais je ne comprends pas comment faire un tampon pour une barre.

 datetime LastAlertTime = 0;
int start()
  {

  string namesymb=Symbol();
  string tf=Period();

       for(int i = ObjectsTotal()-1; i >= 0; i--)
      {
         string name = ObjectName(i);
         
         if(ObjectType(name) == OBJ_TREND)
         {
            double value = ObjectGetValueByShift(name, 0);                    
             if(Bid <= value + Point && Bid >= value - Point)          
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(namesymb,"  M",tf,"   ",name);
             }
                Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",tf,"   ",name); 
            } 
         }      
}
 
Forexman77:

L'EA sort sur 33 barres après une transaction :

Dans le réel et dans le testeur, il est sorti sur 43 barres. J'ai essayé de définir les paramètres de sortie sur la cinquième barre, tout est normal. A votre avis, quel est le problème ?


Commençons par avoir les idées claires.

Le moment où le drapeau Opn_B = vrai ne signifie rien, car l'ordre peut ne pas s'ouvrir à la même seconde.

Vous pouvez utiliser l'heure d'ouverture de l'ordre OrderOpenTime, ou vous pouvez affecter à la variable t la valeur du temps après l'ouverture réussie.

Suivant : vous avez utilisé

minimum = iLow(Symbol(),Period(),0);

1) Avez-vous besoin de iLow, ou serait-il préférable d'utiliser seulement Low, si vous utilisez la même devise et la même période de temps ?

2) Il est préférable de mettre les valeurs Symbol() et Period() dans des variables lorsqu'elles sont utilisées de manière répétée. Tout affecte les performances - il faut s'y habituer.

Le graphique minute - si pendant une minute il n'y a pas eu un seul tick - une nouvelle barre n'est pas dessinée (c'est peut-être une astuce).

Et qu'en est-il de l'iBarShift ?

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),1,t,false)>33) 
          {                                      
          Cls_B=true;              
          }

La plus adéquate pour le moment semble être

if ((TimeCurrent-t)/60)>33) Cls_B=true;
 
oleksaz:

Bonjour, pouvez-vous m'aider à faire passer l'alerte une fois par barre sur chaque ligne, et pas seulement sur la première,

J'ai limité le nombre d'alertes par temps, mais je ne comprends pas comment mettre en mémoire tampon pour une seule barre

string namesymb=Symbol();
string tf=Period();

Est-il utile de réévaluer les variables à chaque tick ?

Est-ce que string tf = Period() affecte les performances dans 1000000 boucles ou est-ce que int tf = Period() est plus correct? Je ne le sais pas moi-même.

 if(Bid <= value + Point && Bid >= value - Point)  

Cette condition est-elle correcte ? Et si la boucle a 4 pics ?

if (LastAlertTime < Time[0])
LastAlertTime = Time[0];
          

Nous avons ici un autre problème. En d'autres termes, si la condition de la première ligne se vérifie, elle sera évidemment fausse pour la seconde et l'alerte n'apparaîtra pas,

Il n'apparaîtra même pas au prochain tick, car l'heure d'ouverture de la bougie ne changera qu'avec l'arrivée d'une nouvelle bougie.

 
ALXIMIKS:


L'option la plus appropriée pour le moment semble être


Désolé, mais essayer de calculer le nombre de barres par temps est une approche très inadéquate.
 
ALXIMIKS:

Les variables doivent-elles être recalculées à chaque tick ?

Est-ce que string tf = Period() affecte les performances dans 1000000 boucles, ou est-ce que int tf = Period() est plus correct? Je ne le sais pas moi-même.

Cette condition est-elle correcte ? Et si la boucle a 4 pics ?

Nous avons ici un autre problème. En d'autres termes, si la condition de la première ligne se vérifie, elle sera évidemment fausse pour la seconde et l'alerte n'apparaîtra pas,

Elle n'apparaîtra même pas sur le tick suivant, car l'heure d'ouverture de la bougie ne changera qu'avec l'arrivée d'une nouvelle bougie.


int start()
  {
string scrdate,nametf;

        if (Period()==PERIOD_M1)  nametf="9_M1";
        if (Period()==PERIOD_M5)  nametf="8_M5";
        if (Period()==PERIOD_M15) nametf="7_M15";
        if (Period()==PERIOD_M30) nametf="6_M30";
        if (Period()==PERIOD_H1)  nametf="5_H1";
        if (Period()==PERIOD_H4)  nametf="4_H4";
        if (Period()==PERIOD_D1)  nametf="3_D1";
        if (Period()==PERIOD_W1)  nametf="2_W1";
        if (Period()==PERIOD_MN1) nametf="1_Monthly";
/////////////////  
       for(int i = ObjectsTotal()-1; i >= 0; i--)//мониторим все объекты
      {
         string name = ObjectName(i);//имя объектов берем из i переменной
         
         scrdate=StringConcatenate(Symbol()," ",TimeToStr(TimeCurrent(), TIME_DATE),"_",Hour(),".",Minute()," ",nametf," ",".jpg");//,name

         if(ObjectType(name) == OBJ_TREND)//отбираем тип по имени 
         {
            double value = ObjectGetValueByShift(name, 0);//функция для объектов
            
            Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",Period(),"   ",name);           
            
             if(Bid <= value + Point && Bid >= value - Point)
             
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(Symbol(),"  M",Period(),"   ",name);
               /////////////////////////////////////////////////
               WindowScreenShot(scrdate,1920,1200,0,-1,-1);
               ////////////////////////////////////////////////////////
             }               
            }
         }
}
   return(0);
  }

1. retiré

2. je suis d'accord si le gap n'est pas un signal (il devrait l'être) pas de signal -> pas de prix -> pas de trade

3. C'est ce que j'ai dit plus haut, mais que faire ?

PS : merci pour la réponse

Raison: