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

 
Nerd Trader:
Pourquoi isCrossing() ne renvoie pas 2? ?? La fonction isCrossing() elle-même a une deuxième entrée if, mais il n'y a pas d'entrée if dans OnTick() lorsque isCrossing() == 2. Quelle absurdité...

Les deux conditions sont remplies... donc vous obtenez le premier résultat.

 
MakarFX:

Les deux conditions sont remplies... donc vous obtenez le premier résultat.

Ne convient que lorsque Bid == ma. J'ai corrigé <= en < (également pour >=), mais rien ne change.
 
Nerd Trader:
Pourquoi isCrossing() ne renvoie pas 2? ?? La fonction isCrossing() elle-même a une deuxième entrée if, mais il n'y a pas d'entrée if dans OnTick() lorsque isCrossing() == 2. Quelle absurdité...

Pour une raison quelconque, je ne pense pas qu'il renvoie 1 non plus.

Cette condition

if(g_barTime < iTime(NULL,g_timeFrame,0)// и дальше

Indique qu'une nouvelle barre a été ouverte. Au premier tick de la barre, open == high == low == close et == Bid - d'où la condition

 && high > ma && Bid <= ma)

ou

 && low < ma && Bid >= ma)
ne peuvent être remplies...

Une question a été posée aujourd'hui sur la condition if(i != i) Ces conditions sont approximativement les mêmes.

 
OnTick() tel qu'il est maintenant dans mon éditeur :
void OnTick()
  {
/*     if(isCrossing() == 1){          
      Print("enter to '1. if (isCrossing)'");
        if(shouldBars(1))         
          Print("angulation is ", shouldAngulation(1));            
    } */

    if(isCrossing() == 2){
      Print("enter to '2. if (isCrossing)'");
      if(shouldBars(2))
        Print("angulation is ", shouldAngulation(2));
        //if(shouldAngulation(2))
          //OpenSell();
    }

   
  }
Si le premier bloc est commenté, le deuxième bloc est exécuté. Je ne sais pas où se trouve l'erreur.

P.S.
avec la fonction isCrossing() a laissé tout en l'état.
 
Alexey Viktorov:

Pour une raison quelconque, je ne pense pas qu'il renvoie 1 non plus.

Cette condition

raconte l'ouverture d'un nouveau bar. Au premier tick de la barre, open == high == low == close et == Bid - d'où la condition suivante

ou

ne peuvent être remplies...

Il y avait une question aujourd'hui sur la condition if(i != i) Ces conditions sont à peu près les mêmes.

"1" retourne, a fait le débogage du code dans MetaEditor.

De plus, même si tout est égal, ce n'est que sur le premier tick.

 
Nerd Trader:

"1" retourne, a fait le débogage du code dans MetaEditor.

De plus, même si tout est égal, ce n'est que sur le premier tick.

Eh bien, oui, j'avais tort. Le nouveau bar ne sera mis en place qu'après avoir rempli toutes les conditions.

Essayez de remplacer high et low par open. Peut-être que cela n'affectera pas trop la stratégie.

 
Nerd Trader:

"1" retourne, a fait le débogage du code dans MetaEditor.

De plus, même si tout est égal, ce n'est que sur le premier tick.

Cela fonctionne comme suit

//--- input parameters
input int                  g_maPeriod  = 14;
input int                  g_maShift   = 1;
input ENUM_APPLIED_PRICE   g_maPrice   = PRICE_CLOSE;  //Applied price
input ENUM_MA_METHOD       g_maMethod  = MODE_SMA;    //Method Ma
input ENUM_TIMEFRAMES      g_timeFrame = PERIOD_CURRENT;   //Timeframe for calculate
datetime g_barTime=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(g_barTime != iTime(NULL,g_timeFrame,0))
     {
      if(isCrossing()==1)
        {
         Print("enter to '1. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
      if(isCrossing()==2)
        {
         Print("enter to '2. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
     }
  }
//+------------------------------------------------------------------+
int isCrossing()
  {  
   int res=0;
   double low = iLow(Symbol(), g_timeFrame, 1);
   double high = iHigh(Symbol(), g_timeFrame, 1);
   double ma = iMA(_Symbol, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maPrice, 0);

   if(high > ma && Bid <= ma) res=1;
  
   if(low < ma && Bid >= ma) res=2;
   return (res);
  }
//+------------------------------------------------------------------+
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
 
MakarFX:

Cela fonctionne comme suit.


J'ai fait cela et tout fonctionne, seuls les messages de isCrossing() sont dupliqués, car le f-e est appelé deux fois pour un tick.

void OnTick()
  {
   if(BarTime != iTime(NULL,0,0)){

     if(isCrossing == 1){
       ...
     }

     if(isCrossing == 2){
       ...
     }
     BarTime = iTime(NULL,0,0); 
  }

int isCrossing()
  {  
    ...

    if(high > ma && Bid <= ma){
      Print("Crossing down");
      return 1;
    } 
  
    if(low < ma && Bid >= ma){
      Print("Crossing up");
      return 2;
    }
   return 0;
  }


Je l'ai donc laissé tel quel, sauf que maintenant tout ce qui vient de isCrossing() est renvoyé à la variable. Rien ne fait double emploi et tout fonctionne. Merci à tous :)

void OnTick()
  {
    int iCrossing = isCrossing();

    if(iCrossing == 1){
       ...
    }

    if(iCrossing == 2){
       ...
    }   
  }
 
MakarFX:
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
Je vois maintenant que vous avez ajouté un journal. Ici aussi, vous avez des messages en double :)
 

pouvez-vous expliquer la différence entre les fonctions ?

for (int j = OrdersHistoryTotal()-1 ; j >= 0 ; j--)

{

if(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

и

int i=OrdersHistoryTotal() ;

for(int pos=0 ; pos<i ; pos++)

{

if(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))

Raison: