Mt4 Fin de l'assistance. - page 26

 

Si vous aimez ma solution, écrivez-moi en personne. Je vais l'affiner et le donner.

Bonne chance à tous.

 
Реter Konow:

Un cycle de symboles, la vérification de l'ouverture d'une nouvelle barre lorsqu'une cotation arrive, etc. peuvent facilement être ajoutés à ma solution. Et qu'est-ce que la POO a à voir avec ça ?

Vous avez choisi un mauvais exemple. Pensez à autre chose à votre guise.

Et vous le faites. Étant donné que les personnages peuvent changer - après tout, c'est vrai quand on lit des personnages.

 
Artyom Trishkin:

Faites-le. Étant donné que les personnages peuvent changer - parce que lorsque vous lisez les personnages est vrai.


Et si je le fais ? Que dites-vous alors ? Je vais vous dire un secret : pour moi, ce genre de tâche est un véritable jeu d'enfant. Tu penses vraiment que je ne peux pas le faire ? C'est juste naïf...

 
Реter Konow:

Et si je le fais ? Que dites-vous alors ? Je vais vous dire un secret : pour moi, ce genre de tâche est un véritable jeu d'enfant. Tu penses vraiment que je ne peux pas le faire ? C'est juste naïf...

Eh bien, faites-le déjà.

 
Vitaly Muzichenko:

Artyom n'a pas répondu à la question, mais la question est la suivante : écrivez dans un style procédural, de façon à ce que cela fonctionne correctement.

Sans aucun doute. Couverture pour économiser la comparaison des opérations sur les chaînes de caractères, enfin, si le client est un maniaque et qu'il négocie sur tous les symboles simultanément.

Mais il semble qu'il n'y ait pas d'autre endroit pour sauvegarder les opérations et la mémoire - tout est minimal.

void OnTimer(){

   Alert(Fn_new_bar("EURUSD", PERIOD_D1)); }

//+------------------------------------------------------------------+

uint Sp_Adler32(string line){

   ulong s1 = 1;

   ulong s2 = 0;

   uint buflength=StringLen(line);

   uchar char_array[];

   ArrayResize(char_array, buflength,0);

   StringToCharArray(line, char_array, 0, -1, CP_ACP);

   for (uint n=0; n<buflength; n++){

      s1 = (s1 + char_array[n]) % 65521;

      s2 = (s2 + s1)     % 65521;}

   return ((s2 << 16) + s1);}

//+------------------------------------------------------------------+

bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf){

   static datetime st_time[]; 

   static uint     st_id[];

   

   //---- set

   datetime new_time = iTime(symb, tf, 0);     if(new_time==0) return(false); 

   uint     new_id   = Sp_Adler32(StringConcatenate(symb,EnumToString(tf))); 

   datetime old_time = 0; 

   uint     old_id   = 0;

   

   //---- find

   int size = ArraySize(st_time); 

   for(int i=0; i<size; i++){

      if(st_id[i]!=new_id) continue; 

      old_id   = st_id  [i]; 

      old_time = st_time[i];

      break;}

   

   //----add new element

   if(old_time==0){

      ArrayResize(st_time, size+1); st_time[size]=new_time;

      ArrayResize(st_id,   size+1); st_id  [size]=new_id; }

   

   //----

   return(old_time>0 && old_time<new_time);}


 
Реter Konow:

Je m'excuse pour ce léger retard.

Voici la première version de la fonction. Vous pouvez l'affiner et le développer davantage. Si vous remarquez une erreur, veuillez nous faire part de vos commentaires.


L'intérêt n'est pas dans la POO mais dans le fait que votre code est linéaire, même si vous ne l'apprendrez probablement jamais...

 
Galina Bobro:

Pas de problème. Couverture pour sauver la comparaison des opérations sur les chaînes de caractères, enfin, si le client est un maniaque et qu'il négocie sur tous les caractères simultanément.

Mais il semble qu'il n'y ait pas d'autre endroit pour sauvegarder les opérations et la mémoire - tout est minimum.


Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Mt4 Fin du support.

Artyom Trishkin, 2017.09.10 23:21

J'avais pour objectif que le résultat final de son code de style procédural fonctionne dans une telle boucle :

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Artyom Trishkin:


Mal nommée par habitude -bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf) est la bonne fonction.

 
Artyom Trishkin:

Eh bien, faites-le maintenant.


OK. Votre solution ne fonctionne que sur les tiques. Le mien est sur minuterie. Pensez-vous que ma méthode de chronométrage des apparitions dans les bars présente un inconvénient ? Ok. Que ce soit comme ça. Je vais ajouter une vérification de l'arrivée d'un devis avant de mettre un nouveau drapeau de barre. Je vais ajouter un autre paramètre à la fonction - un symbole. L'utilisateur choisira le symbole par lequel il veut recevoir le nouvel événement de barre et l'envoyer à la fonction. La fonction vérifiera l'heure de la dernière citation de ce symbole. Ensuite, nous comparerons l'heure de l'apparition formelle du bar et l'heure de la cotation et nous mettrons le drapeau d'événement.

Je viens seulement de commencer à étudier ce sujet, mais je ne vois pas de difficultés.

 
Galina Bobro:

Il ne s'agit pas de POO, il s'agit de la linéarité de votre code, même si vous ne le saurez jamais...

Linéaire, non-linéaire... Vous parlez encore de l'opéra en programmation ?