Mt4 Fin de l'assistance. - page 35

 
Реter Konow:

Cette variante de la fonction n'a pas du tout de fonction New_bar() ;

C'est l'option la plus économe en ressources que j'ai proposée. En outre, elle présente un autre avantage : le nouvel événement de barre est sauvegardé chaque fois que le code utilisateur est exécuté sur un événement de type timer ou tick.

Auparavant, vous ne pouviez obtenir cet événement qu'une seule fois et l'indicateur était effacé avec New_bar(). La fonction spéciale efface désormais le tableau "event_new_bar[][]" une fois par minute et n'est appelée qu'après l'exécution du code personnalisé.

Les fonctions personnalisées peuvent accéder directement au tableau et récupérer de nouvelles informations sur les événements de barre à chaque fois que le code est exécuté sur un événement de type timer ou tick.

Cela permet d'économiser encore plus de ressources.

Le dernier code ne fonctionne pas non plus, il a fallu 7 minutes pour que l'impression arrive.

//+------------------------------------------------------------------+
//Пример использования событий нового бара в пользовательском функционал.
//Просто обращаемся к глобальному массиву "События_нового_бара[a1][a2]" напрямую
//и используем событие в наших торговых алгоритмах.
//+------------------------------------------------------------------+
void Моя_стратегия_торговли_на_новых_барах()
{
  for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    string Этот_символ    = Символы[a1];
    //----------------------------------
    for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
      {
       bool   Новый_бар      = События_нового_бара[a1][a2];
       int    Этот_таймфрейм = Таймфреймы[a2];
       //----------------------------------
       if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M5)
         {
          Print("M5");
         }
       //---------------------------------- 
       if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M1)
         {
          Print("M1");
         }
       //----------------------------------        
      }
   }
}
 
Vitaly Muzichenko:

Le dernier code ne fonctionne pas non plus, il a fallu 7 minutes pour que l'impression arrive.

Cette fonction doit être appelée depuis OnTick ou depuis un timer.

Il y a peut-être un petit problème, mais je n'ai pas encore réussi à le localiser. Examinez le code vous-même et recherchez une erreur. C'est aussi simple que 3 kopecks. Et avec des commentaires aussi.

Si vous ne comprenez pas, demandez. J'ai d'autres choses à faire.

 
Реter Konow:

Cette variante de la fonction n'a pas du tout de fonction New_bar() ;

C'est l'option la plus économe en ressources que j'ai proposée. En outre, elle présente un autre avantage : le nouvel événement de barre est sauvegardé chaque fois que le code utilisateur est exécuté sur un événement de type timer ou tick.

Auparavant, vous ne pouviez obtenir cet événement qu'une seule fois et l'indicateur était effacé avec New_bar(). La fonction spéciale efface désormais le tableau "event_new_bar[][]" une fois par minute et n'est appelée qu'après l'exécution du code personnalisé.

Les fonctions personnalisées peuvent accéder directement au tableau et récupérer de nouvelles informations sur les événements de barre à chaque fois que le code est exécuté sur un événement de type timer ou tick.

Les ressources sont encore plus économisées.


Je ne comprends pas l'humour. Pourquoi - le débogueur ne comprend pas le russe ? Ou c'est juste moi qui ai un tel problème ? Voir les variables en latin, mais pas en cyrillique.

Peter, alors comment utilises-tu le débogueur, ou ne l'utilises-tu pas ?

 

Toute personne intéressée peut rechercher un bug dans le code.

L'essentiel du code :

1) Déclarer les tableaux globaux :

  • un tableau unidimensionnel pour les noms de symboles "Symbols[]".
  • un tableau unidimensionnel pour les délais "Timeframes[]".
  • Un tableau à deux dimensions où nous écrivons le nombre actuel de barres "Number_bars[][]".
  • tableau bidimensionnel "New Bar Events[][]" où nous écrirons les drapeaux du nouvel événement de barre de chaque symbole et de chaque timeframe. Ceux qui sont dans les tableaux "Symbols[]" et "Timeframes[]". Ce tableau sera rempli dans la boucle par les symboles et les délais sur l'événement timer, une fois par minute. Après cela, elle sera effacée. Dans l'intervalle entre le remplissage et le vidage, ce tableau sera appelé par la fonctionnalité utilisateur et informé des nouvelles barres.

2. Lors de l'initialisation, définissez la taille du tableau de symboles et écrivez-y les noms des symboles de la revue de marché.

3. Définit la taille de la première dimension du tableau "Number_bars[][]" qui est égale au nombre de symboles, et la deuxième dimension est égale au nombre d'échéances. Ce tableau est comme une table. Il enregistrera le nombre actuel de barres de chaque symbole et de chaque période de temps. Ce nombre est renvoyé par la fonction iBars.

4. Définit la taille de la première dimension du tableau "Events_new_bar[][]", qui est égale au nombre de symboles, et la deuxième dimension est égale au nombre d'images temporelles. Ce tableau est comme une table. Il enregistrera les drapeaux d'événements des nouvelles barres de chaque symbole sur chaque période de temps.

5. Dans le timer, nous décomptons les minutes et faisons une double boucle (imbriquée) sur les symboles (qui sont dans le tableau Symbols[]) et les timeframes (qui sont dans le tableau Timframes[]). Nous appelons la fonction iBars et obtenons le nombre actuel de barres pour chaque symbole et chaque période de temps à partir des tableaux de symboles et de périodes de temps. Tout d'abord, nous comparons le nombre actuel de barres avec le nombre déjà stocké dans le tableau. Si ces valeurs ne sont pas égales, nous définissons l'indicateur du nouvel événement de barre dans le tableau "Event_new_bar[][]". Nous écrivons alors le nombre actuel de barres à la place du précédent.


Le tableau global "events_new_bar[][]" est disponible à tout moment dans le programme et est automatiquement rempli toutes les minutes, et également automatiquement effacé. Pendant la période où le tableau est rempli, la fonctionnalité utilisateur reçoit des données fraîches sur les nouvelles barres. Le tableau est alors automatiquement effacé.


C'est tout.

 
Реter Konow:

Cette fonction doit être appelée depuis OnTick ou depuis un timer.

Il y a peut-être un petit problème, mais je n'ai pas encore réussi à le localiser. Examinez le code vous-même et recherchez une erreur. C'est aussi simple que 3 kopecks. Et avec des commentaires en plus.

Si vous ne comprenez pas, il suffit de demander. J'ai d'autres choses à faire.


réponse professionnelle

 
Nikolai Semko:

Je ne comprends pas l'humour. Quoi - le débogueur ne comprend pas le russe ? Ou est-ce que c'est juste moi qui ai un tel problème ? Il voit les variables en latin, mais pas en cyrillique.

Peter, alors comment utilisez-vous le débogueur, ou vous ne l'utilisez pas ?

Nikolaï, à ma grande honte, je ne sais pas du tout comment utiliser le débogueur. Je ne l'ai jamais utilisé. ((
 
Galina Bobro:

réponse professionnelle

Et c'est du trollage professionnel.
 
Реter Konow:

Cette fonction doit être appelée depuis OnTick ou depuis un timer.

Il y a peut-être un petit problème, mais je n'ai pas encore réussi à le localiser. Examinez le code vous-même et recherchez une erreur. C 'est aussi simple que 3 kopecks. Et avec des commentaires aussi.

Si tu ne comprends pas, demande-moi. J'ai d'autres choses à faire.

C'est tellement compliqué et tordu que tu ne peux pas le comprendre.

Je suis désolé, mais c'est aussi complètement illisible.

 
Vitaly Muzichenko:

C'est tellement compliqué et tordu que c'est un désordre.

Je suis désolé, mais c'est aussi complètement illisible.

Tu sais ce qu'on dit à propos de "tu ne peux pas... ne pas torturer..." ? Je pense que c'est une bonne chose.

 
Реter Konow:

Vous connaissez le dicton "vous ne pouvez pas... ne pas torturer..." ? Je pense que c'est une bonne chose.

C'est ça, c'est comme ça que tu t'es acquitté de la tâche de manière concluante, ou alors je n'ai pas réussi à trouver la bonne solution.

Raison: