Mt4 Fin de l'assistance. - page 25

 
Artyom Trishkin:

Il suffit d'écrire une fonction où l'utilisateur demande : "Y a-t-il une nouvelle barre sur la M5 ?" et obtient une réponse oui/non.

Par exemple :

Voici votre fonction IsNewBar() et nous la développerons et la ferons tourner avec l'extension de la tâche.


Il me semble que ce n'est pas un bon exemple pour démontrer l'utilité de la POO.
Voici, par exemple, une variante utilisant une seule fonction :

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   IsNewBar(0,false); // режим сбора информации
   if(IsNewBar()) Print("Пришел новый бар текущего ТФ");  // режим считывания информации
   if(IsNewBar(PERIOD_H4)) Print("Пришел новый бар H4");  // режим считывания информации
   if(IsNewBar(PERIOD_D1)) Print("Пришел новый бар D1");  // режим считывания информации
   
  }
bool IsNewBar(ENUM_TIMEFRAMES tf=PERIOD_CURRENT,bool out=true)
  {
   static const ENUM_TIMEFRAMES TF[22]=
     {
      PERIOD_CURRENT,PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
     };
   static bool newbar[22];
   static bool FirstTime=true;
   static int acb[22]; // array of current bars
   if(FirstTime)
     {
      for(int i=0;i<22;i++) acb[i]=Bars(Symbol(),TF[i]);
      FirstTime=false;
      return(false);
     }
   int curtf=0;
   while(TF[curtf]!=tf) curtf++;
   if(out) return (newbar[curtf]);
   for(int i=0;i<22;i++)
     {
      int CurBars=Bars(Symbol(),TF[i]);
      if(acb[i]<CurBars)
        {
         acb[i]=CurBars;
         newbar[i]=true;
        }
      else newbar[i]=false;
     }
   return(false);
  }

vous pouvez bien sûr le retirer deOnTick et l'insérer dansOnTimer

 
Реter Konow:

Sur cette question, je pense que vous avez tort. Veuillez vérifier auprès du Service Desk. Laissez-les répondre à la question suivante : de nouvelles barres se forment-elles dans la plateforme indépendamment de l'arrivée des cotations, ou non ? Si ce n'est pas le cas, vérifiez, lors de l'apparition d'une nouvelle barre, s'il y avait une citation sur celle-ci. Si c'est le cas, le nouveau barreau a été formé. Nous pouvons le faire de cette façon. Vous n'avez pas besoin de changer grand-chose.

Oh mama mia... Lisez déjà l'information. Je suis très surpris que vous ne le sachiez pas, et quand on vous en parle, vous en doutez aussi. Je ne regarderai même pas dans la direction du Service Desk pour des questions aussi puériles - ils en riront. Puis demandez-leur vous-même - vous avez un lien vers servicedesk dans votre profil.
 
Nikolai Semko:

Il me semble que ce n'est pas un bon exemple pour démontrer l'utilité de la POO.
Voici, par exemple, une variante utilisant une seule fonction :

vous pouvez, bien sûr, le retirer deOnTick et l'insérer dansOnTimer

Je n'ai pas regardé la logique, mais supposons qu'hypothétiquement ça fonctionne correctement.

Et par n'importe quel personnage au hasard ?

Imaginons que le programme utilise une liste de symboles provenant de la fenêtre Market Overview, et que l'utilisateur puisse modifier les jeux de symboles à tout moment.

 
Je n'ai personnellement pas vu le code OOP de @Nikolai Semko.


Respectueusement.

 

Artyom est un peu en retard sur sa question, mais la question est la suivante : écrivez-le en style procédural pour qu'il fonctionne correctement

void OnTick()
 {
 
  if(IsNewBar("AUDCAD",PERIOD_H1)) {
   // задача №1
  }
 
  if(IsNewBar("GBPJPY",PERIOD_M15)) {
   // задача №2
  }
 
  if(IsNewBar("EURUSD",PERIOD_H4)) {
   // задача №3
  }

 }

// Функция "Новый бар"
bool IsNewBar(....) {
 здесь код, который нужно написать
}
 
Реter Konow:

Oui, sur une minuterie. Une nouvelle barre apparaît sans citation. Nous nous intéressons exactement à l'événement d'apparition de la barre, alors que nous pouvons fixer la cote dans Optisk() ;

Une barre apparaîtra dans tous les cas.


Nous avons ici l'explication des barres :

L'heure d'ouverture de la barre Time[i] n'est généralement pas la même que l'heure d'arrivée du tick. L'heure d'ouverture d'une barre pour n'importe quelle période est toujours un multiple de la période. Tout premier tick apparaissant dans le cadre temporel est une barre en formation; si aucun tick n'est arrivé dans le cadre temporel, aucune barre ne sera formée dans ce cadre temporel non plus.

 
Vitaly Muzichenko:

Artyom n'a pas vraiment abordé la question, mais la question est la suivante : écrivez-le dans un style procédural, de sorte qu'il fonctionne correctement.

J'ai voulu ajouter progressivement des tâches afin de rendre leur mise en œuvre rapide, pratique, facile et simple pour les gens. Pour montrer plus tard comment le faire facilement en utilisant la POO.

Mais le principal rejetant de la POO s'est lui-même détourné de la solution du problème :)

 
Artyom Trishkin:

J'ai voulu ajouter progressivement des tâches afin de rendre leur mise en œuvre rapide, pratique, facile et simple pour les gens. Pour montrer ensuite combien il est facile de le faire avec la POO.

Mais le principal rejetant de la POO a lui-même rejeté la solution de la tâche :)

Oui, je ne l'ai pas exactement dit moi-même, je vais paraphraser :

Artem n'a pas ouvert un peu la question, et la question est la suivante : pour écrire dans le style procédural qu'il fonctionne correctement

Peut-être qu'il reviendra et prouvera que c'est très facile et simple.

 
Vitaly Muzichenko:

Je ne l'ai pas vraiment dit moi-même, alors je vais le reformuler :

Artyom n'a pas vraiment abordé la question, et la question est la suivante : écrivez dans un style procédural, pour que cela fonctionne correctement...

Peut-être qu'il reviendra et prouvera que c'est très facile et simple.

J'avais pour objectif de faire fonctionner son code de style procédural dans une telle boucle à la fin :

   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:

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

Une boucle de symboles, vérifiant l'ouverture d'une nouvelle barre à l'arrivée d'une cotation et ainsi de suite, pourrait facilement être ajoutée à ma solution. Et qu'est-ce que la POO a à voir avec ça ?

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