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

 
Vitaly Muzichenko:

La funzione passa attraverso e seleziona il più recente per tempo, cioè l'ultimo

Poi, abbiamo un selezionato, e lo sostituiamo nella funzioneiBarShift(sym, tf, oot ,true);

La funzione restituisce il numero di barra per tempo. Questo è tutto.

Purtroppo non posso verificarlo, ma quando l'ho usato, ha funzionato perfettamente, così come tutte le funzioni pubblicate qui da I. Kim

e se ho un biglietto assegnato quando apro un ordine e la funzione seleziona un numero sequenziale va bene?
 
Вадим Мотеюнас:
Scrive l'errore indicandoif( iOpen[0] != time_open )'iOpen' - identificatore non dichiarato

Ho scritto qualcosa di un po' sbagliato, un po' nell'altra direzione del pensiero. Cambiare iOpen[0] in Open[0]. Corretto. Per dirla in modo semplice. Quando apro un bar, ricordo l'ora di apertura del bar e nessun ordine è già stato preso su questo bar.

 

È anche scritto nella descrizione della funzione che

La selezione delle posizioni da prendere in considerazione è impostata da parametri esterni:

  • sy- Nome dello strumento di mercato. Se impostate questo parametro, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito -NULL significa lo strumento di mercato corrente.
  • tf- Timeframe. Il valore predefinito0 indica l'intervallo di tempo corrente.
  • op- operazione commerciale, tipo di posizione. Valori validi:OP_BUY,OP_SELL o-1. Il valore predefinito-1 significa qualsiasi posizione.
  • mn- Identificatore di posizione, MagicNumber. Il valore predefinito-1 significa qualsiasi identificatore.
Questi valori dovrebbero essere dichiarati prima della prima funzione speciale, cioè il fatto che siano inclusi nella descrizione della funzioneNumberOfBarOpenLastPos() non è sufficiente?

 
Вадим Мотеюнас:

È anche scritto nella descrizione della funzione che

La selezione delle posizioni da prendere in considerazione è impostata da parametri esterni:

  • sy- Nome dello strumento di mercato. Se impostate questo parametro, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito -NULL significa lo strumento di mercato corrente.
  • tf- Timeframe. Il valore predefinito0 indica l'intervallo di tempo corrente.
  • op- operazione commerciale, tipo di posizione. Valori validi:OP_BUY,OP_SELL o-1. Il valore predefinito-1 significa qualsiasi posizione.
  • mn- Identificatore di posizione, MagicNumber. Il valore predefinito-1 significa qualsiasi identificatore.
Per i parametri esterni? È necessario dichiararli prima della prima funzione speciale? Cioè sono nella descrizione della funzioneNumberOfBarOpenLastPos() stessanon è sufficiente?

Abbastanza. Nei parametri esterni puoi inserire i valori di cui hai bisogno: Majik, quali posizioni stai cercando, se vuoi BUY(0) e SELL(1) - allora scrivi "-1".

 
Konstantin Nikitin:

Ho scritto qualcosa di un po' sbagliato, un po' nell'altra direzione del pensiero. Cambiare iOpen[0] in Open[0]. Corretto. Per dirla in modo semplice. Quando apro una barra, ricorderà l'ora di apertura della barra e nessun ordine sarà aperto su questa barra.

vengono aperti molti ordini e sembra che la condizione if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) prima dell'apertura di un non ordine sia soddisfatta poiché NumberOfBarOpenLastPos restituisce -1

 
Вадим Мотеюнас:

vengono aperti molti ordini, e sembra che la condizione if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) sia soddisfatta prima che venga aperto un non ordine, perché NumberOfBarOpenLastPos restituisce -1

Se stai cercando degli ordini, allora devi usare la funzione nella sua versione completa, cioè con la possibilità di cercare per ordini, non solo per posizioni:

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }
 
Vitaly Muzichenko:

Questo è sufficiente. Nei parametri esterni si possono inserire i valori richiesti: Majik, quali posizioni si cercano, forse solo BUY, se BUY(0) e SELL(1) sono necessari - allora si scrive "-1".

quando inizio nel tester, non ci sono ordini aperti, forse è per questo che viene restituito -1, che è il motivo per cui la condizione if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) non tiene?

 
Вадим Мотеюнас:

Quando si avvia nel tester, non ci sono ordini aperti, forse è per questo che viene restituito -1 e quindi la condizione if(NumberOfBarOpenLastPos(Symbol(),0,-1,-1)>0) non è soddisfatta?

Lo controllerò ora.

 
Vitaly Muzichenko:

Se stai cercando degli ordini, allora devi usare la funzione nella sua versione completa, cioè con la possibilità di cercare per ordini, non solo per posizioni:

restituisce ancora -1

 
Вадим Мотеюнас:

restituisce ancora -1

Funziona perfettamente!

Da due posizioni ha scelto l'ultima, che è alla barra 11, come potete vedere nello screenshot:


Controllare il codice:

 void OnTick() 
  {
   ...
   Comment( NumberOfBarOpenLastPos("",0,-1,-1) );
   ...
  }

int NumberOfBarOpenLastPos(string sym="",int tf=0,int op=-1,int mn=-1)
  {
   datetime oot=0; // Инициализируем нулём
   int      i,k=OrdersTotal();

   if(sym=="") sym=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sym)
           {
            if(OrderType()<6) // Ищем и по ордерам
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(oot<OrderOpenTime()) oot=OrderOpenTime(); // Ищем последнее
                    }
                 }
              }
           }
        }
     }
   return(iBarShift(sym, tf, oot, true));
  }