Répondre

obtenir la valeur la plus élevée et la valeur la plus basse dans l'intervalle

3 réponses

mikeyc

Client, bbp_participant, communauté, 877 réponses.

Visiter le profil

Il y a 8 ans #114474

Bonjour Mark et l'équipe,

 

J'ai trouvé quelques stratégies intéressantes qui s'appuient toutes sur les fonctions HighestInRange et LowestInRange de SQ. En regardant le code MQ4 généré, nous avons deux fonctions pour cela qui prennent l'heure et les minutes de début et de fin pour retourner le prix le plus élevé dans cette plage de temps et le prix le plus bas dans cette plage de temps.

 

Toutefois, la logique semble plutôt étrange. Pourquoi 100 barres ? Si je suis sur l'échelle de temps M1, cela fait moins de 2 heures pour trouver une barre qui couvre une période possible de 24 heures ?

 

En outre, cette méthode est très lente. Pourquoi ne pas utiliser une combinaison de iBarShift, iHighest et iLowest pour trouver le plus haut et le plus bas entre deux moments ?

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

   // recherche de l'indice de la barre pour timeTo
   for(i=1 ; i<=100 ; i++) {
      if(timeIsBiggerOrEqual(Time[i], toHour, toMinute) && timeIsLower(Time[i+1], toHour, toMinute)) {
         indexTo = i ;
         break ;
      }
   }

   if(indexTo == -1) {
      Log("IndexTo non trouvé") ;
      return(-1) ;
   }

   // recherche de l'indice de la barre pour timeFrom
   for(i=1 ; i<=100 ; i++) {
      if(i <= indexTo) continue ;

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

   if(indexFrom == -1) {
      Log("IndexFrom introuvable") ;
      return(0) ;
   }

   double value = -10000.0 ;

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

   return(valeur) ;
}

J'ai essayé de placer ces fonctions et les autres fonctions requises dans un indicateur, mais les résultats n'avaient aucun sens.

 

Je ne sais pas très bien si et comment ils fonctionnent.

 

Merci,

 

Mike

0

mikeyc

Client, bbp_participant, communauté, 877 réponses.

Visiter le profil

Il y a 8 ans #134210

En creusant un peu, je constate les problèmes suivants :

 

  1. Dans la SQ, si la stratégie utilise le HighestInRange/LowestInRange, il faut 10 fois plus de temps pour traiter la stratégie qu'une stratégie qui n'utilise pas cet élément de base.
  2. La stratégie exportée dans MQL (pour MetaTrader) ne fonctionne pas dans les échelles de temps inférieures (par exemple M5) parce qu'elle ne recherche que 100 barres dans le temps.
  3. Si vous modifiez le code pour avoir un nombre plus grand que 100, c'est très lent dans MT4, dans le backtester ça rampe même sur une machine très rapide.

Je comprends pourquoi le code recherche comme il le fait (pour tenir compte des trous dans les week-ends par exemple), mais c'est très inefficace.

 

Je suis en train de voir si je peux écrire une version plus rapide.

0

mikeyc

Client, bbp_participant, communauté, 877 réponses.

Visiter le profil

Il y a 7 ans #138963

Personne d'autre n'a remarqué la lenteur de SQ lorsque l'on sélectionne HighestInRange et/ou LowestInRange ?

 

Pour SQ4, je suggérerais que la sortie de ces blocs de construction soit calculée une fois au début de la première exécution, les résultats étant conservés en mémoire pour chaque heure et minute possible pour chaque barre. Les calculer à chaque itération est très lent et la mémoire vive est bon marché et rapide.

0

tomas262

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 7 ans #138972

Bonjour, je pense que Marks a retravaillé la façon dont le code des blocs est implémenté pour avoir la fonctionnalité "plugin" disponible dans la nouvelle version. Je vérifierai les performances avec SQ4 lorsqu'il sortira.

0

Affichage de 3 réponses de 1 à 3 (sur un total de 3)