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

 
lil_lil:

Je ferme 4 positions en même temps, comment puis-je les compter comme une seule à la suite dans la fonction de comptage des pertes ?

Ils peuvent fermer, à cause du slippage, pas au même prix et l'heure peut être différente.

Procès :

Si le courtier permet la contre-clôture, nous devons ouvrir un contre-ordre avec un volume égal au volume des ordres fermés cumulés pour fixer le prix de clôture. Après cela, le prix de clôture est fixé et vous pouvez tranquillement exécuter 4 transactions de contre-ordres de clôture.

 

Pouvez-vous me dire comment déterminer le mode de calcul de la marge ?

Certains courtiers facturent une marge sur chaque position. Et certains courtiers, uniquement sur la différence des volumes à l'achat et à la vente. (Par exemple, si le compte est entièrement verrouillé, la marge est nulle).


Comment déterminer la méthode de calcul de la marge de manière programmatique ?

 

Bonjour. Je cherche une fractale au-dessus de la MA.

Pour chercher une fractale au-dessus de la MA, je mémorise une barre, puis je cherche une fractale à partir de cette barre et si elle est inférieure à la première que j'ai trouvée, alors c'est vrai.

Constamment faux dans les commentaires

Comment(f_ma(Symbol(),0,i));
//+----------------------------------------------------------------------------+

bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
 
Ghabo:

Bonjour. Je cherche une fractale au-dessus de la MA.

En cherchant une fractale au-dessus de la MA, je mémorise une barre, puis je cherche une fractale à partir de cette barre et si elle est inférieure à la première que j'ai trouvée, alors c'est vrai.

Constamment faux dans les commentaires

Le problème se situe dans cette ligne

         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}


Si une fractale est trouvée et qu'elle est au-dessus de la MA, nous devons interrompre le cycle au lieu de le poursuivre. Après avoir trouvé la première fractale, il y en aura une autre, puis une troisième et ainsi de suite jusqu'à ...

 
Alexey Viktorov:

Le problème se situe dans cette ligne


Si une fractale est trouvée et qu'elle est au-dessus de la MA, nous devons interrompre le cycle au lieu de le poursuivre. Après avoir trouvé la première fractale, il y en aura une autre, puis une troisième et ainsi de suite jusqu'à ...

Merci. Remplacé par break;Maintenant c'est toujours vrai. mais la conditionif(fr2<fr1) n'est pas remplie.
 
Ghabo:
Merci. Remplacé par break;Maintenant c'est toujours vrai. mais la conditionif(fr2<fr1) n'est pas remplie.

Nous devons donc ajouter cette condition avant d'afficher le résultat de la fonction. Qu'est-ce qui est si difficile ?

 
Alexey Viktorov:

Vous devez donc ajouter cette condition avant que la fonction ne produise le résultat. Qu'est-ce qu'il y a de si difficile ?

La fonction ne devrait-elle pas retourner false si la condition n'est pas remplie ?

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
if(rates_total<100) return(0);
int limit=rates_total-prev_calculated;
if(limit>200)limit=200;
   for(int i=limit; i>0; i--)
     {
     
     
     Comment(f_ma(Symbol(),0,i));
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  //-------------------
  bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
  
 
Ghabo:

La fonction ne devrait-elle pas retourner false si la condition n'est pas remplie ?

Vérifiez que iFractals renvoie zéro ou une valeur vide.

 
Alexey Viktorov:

Vérifiez que iFractals renvoie zéro ou une valeur vide.

Il y a une valeur vide dans la fenêtre de données. Remplacéif(f!=0) par if(f!=EMPTY_VALUE), aucun changement dans le résultat.
 
Ghabo:
Il y a une valeur vide dans la fenêtre de données. Remplacéif(f!=0) par if(f!=EMPTY_VALUE), le résultat est inchangé.

1. J'ai dit vérifier, pas remplacer. iFractals renvoie 0 s'il n'y a pas de fractale. Je ne l'utilise pas régulièrement et, naturellement, je ne veux pas encombrer les restes non séchés de ma mémoire avec de telles futilités.

2. La fonction, bien que terriblement écrite, fonctionne toujours bien.

3. La dernière valeur est affichée dans Commentaire. Remplacez-la par

     Print("************ ", f_ma(Symbol(), 0, 0));
Et voir combien de fois il s'imprime
2018.07.30 21:02:43.656 00 EURUSD.e,H1: ************ true