Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1599

 
Nerd Trader:
Perché isCrossing() non restituisce 2? La stessa isCrossing() ha una seconda voce if, ma poi non c'è nessuna voce if in OnTick() quando isCrossing() == 2. Che mucchio di sciocchezze...

Entrambe le condizioni combaciano...quindi si ottiene il primo risultato

 
MakarFX:

Entrambe le condizioni combaciano...quindi si ottiene il primo risultato

Si adatta solo quando Bid == ma. Fisso <= a < (anche per >=), ma non cambia nulla.
 
Nerd Trader:
Perché isCrossing() non restituisce 2? La stessa isCrossing() ha una seconda voce if, ma poi non c'è nessuna voce if in OnTick() quando isCrossing() == 2. Che mucchio di sciocchezze...

Per qualche motivo non credo che restituisca nemmeno 1.

Questa condizione

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

Dice che è stato aperto un nuovo bar. Al primo tick della barra open == high == low == close e == Bid - da qui la condizione

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

o

 && low < ma && Bid >= ma)
non può essere soddisfatta...

Oggi c'era una domanda sulla condizione if(i != i) Queste condizioni sono approssimativamente le stesse.

 
OnTick() come è ora nel mio editor:
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();
    }

   
  }
Se il primo blocco è commentato, il secondo blocco viene eseguito. Non so dove sia l'errore.

P.S.
con la funzione isCrossing() ha lasciato tutto com'è.
 
Alexey Viktorov:

Per qualche motivo non credo che restituisca nemmeno 1.

Questa condizione

racconta dell'apertura di un nuovo bar. Sul primo tick della barra open == high == low == close e == Bid - quindi, la condizione

o

non può essere soddisfatta...

C'era una domanda oggi sulla condizione if(i != i) Queste condizioni sono circa le stesse.

"1" ritorna, ha fatto il debug del codice in MetaEditor.

Inoltre, anche se tutto è uguale, lo è solo al primo tick.

 
Nerd Trader:

"1" ritorna, ha fatto il debug del codice in MetaEditor.

Inoltre, anche se tutto è uguale, lo è solo al primo tick.

Beh, sì, mi sono sbagliato. La nuova barra sarà solo dopo che l'intera condizione sarà soddisfatta.

Prova a sostituire alto e basso con aperto. Forse non influenzerà troppo la strategia.

 
Nerd Trader:

"1" ritorna, ha fatto il debug del codice in MetaEditor.

Inoltre, anche se tutto è uguale, lo è solo al primo tick.

Funziona così

//--- 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:

Funziona così.


Ho fatto questo e funziona tutto, solo i messaggi di isCrossing() sono duplicati, perché il f-e è chiamato due volte per 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;
  }


Così l'ho lasciato com'era, solo che ora tutto da isCrossing() viene restituito alla variabile. Niente è duplicato e tutto funziona. Grazie a tutti :)

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)'
Ho visto ora che hai aggiunto un registro. Anche qui avete messaggi duplicati :)
 

potete spiegare la differenza tra le funzioni?

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

{

se(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))