Risposta

ottenere il massimo e il minimo nell'intervallo

3 risposte

mikeyc

Cliente, bbp_partecipante, comunità, 877 risposte.

Visita il profilo

8 anni fa #114474

Ciao Mark e Team,

 

Ho trovato alcune strategie che sembrano interessanti e che si basano tutte sulle funzioni HighestInRange e LowestInRange di SQ. Guardando il codice MQ4 generato abbiamo due funzioni che prendono l'ora e i minuti iniziali e finali per restituire il prezzo più alto in questo intervallo di tempo e il prezzo più basso in questo intervallo di tempo.

 

Tuttavia, la logica sembra piuttosto strana. Perché 100 barre? Se sono su timeframe M1, sono meno di 2 ore per trovare una barra che copra un possibile periodo di 24 ore?

 

Inoltre, è molto lento. Perché non utilizzare una combinazione di iBarShift, iHighest e iLowest per trovare il massimo e il minimo tra due tempi?

double getHighestInRange(int fromHour, int fromMinute, int toHour, int toMinute) {
   int indexTo = -1;
   int indexFrom = -1;
   int i;

   // trova l'indice della barra per timeTo
   for(i=1; i<=100; i++) {
      if(timeIsBiggerOrEqual(Time[i], toHour, toMinute) && timeIsLower(Time[i+1], toHour, toMinute)) {
         indexTo = i;
         pausa;
      }
   }

   if(indexTo == -1) {
      Log("IndiceTo non trovato");
      return(-1);
   }

   // trovare l'indice della barra per timeFrom
   for(i=1; i<=100; i++) {
      if(i <= indexTo) continua;

      if(timeIsBiggerOrEqual(Time[i], fromHour, fromMinute) && timeIsLower(Time[i+1], fromHour, fromMinute)) {
         indexFrom = i;
         pausa;
      }
   }

   if(indexFrom == -1) {
      Log("Non trovato indexFrom");
      return(0);
   }

   double value = -10000.0;

   for(i=indexTo; i<=indexFrom; i++) {
      valore = MathMax(valore, iHigh(NULL, 0, i));
   }

   return(valore);
}

Ho provato a inserire queste e le altre funzioni richieste in un indicatore, ma i risultati non hanno alcun senso.

 

Sono un po' confuso su se e come funzionano.

 

Grazie,

 

Mike

0

mikeyc

Cliente, bbp_partecipante, comunità, 877 risposte.

Visita il profilo

8 anni fa #134210

Scavando un po' più a fondo, vedo i seguenti problemi:

 

  1. In SQ, se la strategia utilizza HighestInRange/LowestInRange, l'elaborazione della strategia richiede un tempo 10 volte superiore rispetto a quella che non utilizza questo elemento costitutivo.
  2. La strategia esportata in MQL (per MetaTrader) non funziona nei timeframe inferiori (ad esempio M5) perché cerca solo 100 barre indietro nel tempo.
  3. Se si modifica il codice per avere un numero più grande di 100, è molto lento in MT4, nel backtester striscia anche su una macchina molto veloce.

Posso capire il motivo per cui il codice cerca in questo modo (ad esempio, per far fronte alle lacune del fine settimana), ma è molto inefficiente.

 

Sto vedendo se posso scrivere una versione molto più veloce.

0

mikeyc

Cliente, bbp_partecipante, comunità, 877 risposte.

Visita il profilo

7 anni fa #138963

Nessuno ha notato che SQ è molto lento se si seleziona HighestInRange e/o LowestInRange?

 

Per SQ4, suggerirei che l'output di questi blocchi di costruzione sia calcolato una volta all'inizio della prima esecuzione, con i risultati tenuti in memoria per ogni possibile ora e minuto per ogni barra. Calcolarli a ogni iterazione è molto lento e la RAM è economica e veloce.

0

tomas262

Amministratore, sq-ultimate, 2 risposte.

Visita il profilo

7 anni fa #138972

Ciao, credo che Marks abbia rielaborato il modo in cui il codice dei blocchi è implementato per avere la funzione "plugin" disponibile nella nuova versione. Verificherò le prestazioni con SQ4 quando verrà rilasciata.

0

Stai visualizzando 3 risposte - da 1 a 3 (di 3 totali)