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

 

Donc, avec un peu de chance, la forme finale de la fonction.

double ATR_Max() {
int i;
double m;
datetime tim;
iATR_H1_PER = 15;// период
if ( tim != Time[0] ) {  
while( i < WindowBarsPerChart() ) {
double a = iATR( NULL, 0, iATR_H1_PER, i );
   if ( m < a ) {
   m = a;
   }
   i++;
   tim = Time[0];
  }
}
Alert( " Максимальное значение ATR для видимого количества баров равно - ", m );
return(m);
} 
 
dr.Vasgenich :

Donc, avec un peu de chance, la forme finale de la fonction.

Dr.Vasgenich :

Donc, avec un peu de chance, la forme finale de la fonction.

Je pense que tim = Time[0] serait mieux placé après la boucle ...parce que demander Time[0] est fait sur toutes les barres visibles - ce n'est pas rationnel.
 
Boeing747 :
Je pense que tim = Time[0] serait mieux placé après la boucle ...parce que demander Time[0] est fait sur tout le nombre de barres visibles - ce n'est pas rationnel.
Merci pour la correction. Le nombre d'erreurs croît de manière exponentielle à la nuit)))).
 
dr.Vasgenich :
Merci pour la correction. Le nombre d'erreurs croît de manière exponentielle à la nuit)))).
exponentiellement;)). cependant, je dois aussi aller me coucher. si vous avez besoin de quelque chose, faites-le moi savoir ;))
 
Bon après-midi. Savez-vous s'il est possible de modifier les paramètres des indicateurs à la volée dans mql4 ?
L'idée est simple : l'indicateur ZigZag est installé sur le graphique. Le script doit être écrit et la touche de raccourci doit y être attachée. En appuyant sur cette touche, les paramètres du zigzag seront modifiés sur le graphique.
 

Poursuivre le sujet actuel de la recherche d'un filtre à haute volatilité. Voici le code d'un filtre existant de WSR

extern string ____ = "Фильтр волатильности";
extern bool VolatilityFilter              = FALSE;
extern int VolaFilter                     = 25; //--- (15 1 30)
double pp;
double pd;

int init()

   if (Digits < 4) {
      pp = 0.01;
      pd = 2;
   } else {
      pp = 0.0001;
      pd = 4;
   }

Voici la fonction elle-même :

bool CheckVolatility() {
   double HeightFilter_a = NormalizeDouble(VolaFilter * pp, pd);
   bool restrict = false;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M5, 1) - iLow(NULL, PERIOD_M5, 1), pd) > HeightFilter_a) restrict = true;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M5, 2) - iLow(NULL, PERIOD_M5, 2), pd) > HeightFilter_a) restrict = true;
   return (restrict);
}

Ainsi, la fonction vérifie les valeurs des deux barres précédentes et si elles sont trop grandes, elle renvoie VRAI. La question est de savoir comment l'améliorer joliment : faire en sorte que cette fonction recherche les grandes bougies sur un plus grand nombre de bougies. Par exemple 24.

 
satorifx :
Bon après-midi. Savez-vous s'il est possible de modifier les paramètres des indicateurs à la volée dans mql4 ?
L'idée est simple : l'indicateur ZigZag est installé sur le graphique. Le script doit être écrit et la touche de raccourci doit y être attachée. Dès que j'appuie sur cette touche, les paramètres ZigZag changent sur le graphique.
Il y a une telle possibilité.
 

J'ai créé un conseiller expert maison pour tester le trading, mais je n'arrive pas à comprendre une chose...

La vente est ouverte en utilisant les MA maximales et minimales

// Condition pour l'ouverture de la position BUY
if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)

// Condition pour ouvrir une position SELL
if(MA_H1>MA_H0&&Bid>=MA_H0&MA_0<MA_1&HA_up<HA_dw)

#include <b-Lots.mqh>
extern double TrailingStop = 30;
extern double Sploss = 15;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double HA_up,HA_dw;
   double MA_H0,MA_H1,MA_L0,MA_L1,MA_0,MA_1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   MA_H0=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,0);
   MA_H1=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,1);
   MA_0=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,0);
   MA_1=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,1);
   MA_L0=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,0);
   MA_L1=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,1);
   HA_up=iCustom(0,0,"Heiken Ashi",3,0);
   HA_dw=iCustom(0,0,"Heiken Ashi",2,0);

//задали все данные 

   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(MA_L1<MA_L0&&Ask<=MA_L0&&MA_0>MA_1&&HA_up>HA_dw)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Bid-Sploss*Point,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(MA_H1>MA_H0&&Bid>=MA_H0&&MA_0<MA_1&&HA_up<HA_dw)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Ask+Sploss*Point,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
           if(NormalizeDouble (MathAbs(MA_H0-Bid),Digits)<Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            // трейлинг-стоп для длинной позиции
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
           if(NormalizeDouble (MathAbs(MA_L0-Ask),Digits)<Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            // трейлинг-стоп для короткой позиции
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Question : Si la position sur la bougie actuelle n'est pas fermée (les conditions ne sont pas réunies), comment la fermer sur la bougie suivante, lorsqu'elle correspond à MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 ) ;

Nous avons une condition de fermeture : franchissement du haut ou du bas de la bougie actuelle, mais nous avons besoin que la position soit fermée sur la bougie suivante après son ouverture.

Nous pouvons écrire if ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), mais comment remplir la condition de la deuxième bougie ouverte.


Si vous pouvez répondre par un code, l'exemple est plus clair.
 
Zhunko :
Il y a une telle possibilité.

Merci pour cette réponse incroyablement détaillée.

Faut-il vraiment être un petit malin pour comprendre que si une nouvelle personne vient sur le forum avec une question, elle a besoin d'une solution spécifique ou d'un lien vers quelque chose de similaire, et non d'une excuse débile du type "tout est possible" ?

 
satorifx :

Merci pour cette réponse incroyablement détaillée.

Faut-il vraiment être un petit malin pour comprendre que si une nouvelle personne vient sur le forum avec une question, elle a besoin d'une solution spécifique ou d'un lien vers quelque chose de similaire, et non d'une excuse débile du type "tout est possible" ?

Les personnes qui essaient de faire quelque chose par elles-mêmes sont aidées ici. Ils vous guident dans la bonne direction, vous expliquent, etc ...

Vous avez posé une question et vous avez obtenu une réponse. Avez-vous essayé de commencer à écrire quelque chose vous-même ?

Lorsque vous posez une question dans un certain format, pensez d'abord au type de réponse que vous obtiendrez au format de la question...