Mt4 Fin de l'assistance. - page 34

 

Pour en revenir au sujet du fil de discussion. Les résultats de l'enquête "Quelle plateforme utilisez-vous ? " ont été publiés il y a une heure ou deux sur http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/ :

"Ainsi, selon les résultats du vote, la plateforme MetaTrader 4 du fournisseur de logiciels de trading MetaQuotes l'emporte avec un avantage significatif, la préférence de 63% des participants. Le produit phare de la même société, MetaTrader 5, a reçu 19 % des voix. Dans le même temps, 21% des votants utilisent d'"autres" plateformes de négociation, non répertoriées dans la liste."

Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
Результаты опроса «Какой платформой вы пользуетесь?» | Forex Magnates
  • Vadim Sviderski
  • ru.forexmagnates.com
В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
 
Dmitry Fedoseev:

Peut-être ne savez-vous pas ce que signifie "rapide" ?

Je pense que je le sais cependant))
Je n'ai pas le temps de le prouver pour le moment.
Je n'ai pas étudié le code de Peter en détail, mais je l'ai soumis au profilage. L'ensemble du cycle de génération des données a duré environ 1 microseconde. C'est le meilleur résultat obtenu jusqu'à présent, en supposant qu'aucune correction globale ne sera nécessaire dans le code pour le rendre pleinement opérationnel.
 
Реter Konow:

Votre solution fonctionne-t-elle bien ? Si c'est bon, c'est génial.

Et des centaines d'outils - n'y aura-t-il pas une superposition ?

Comme je l'ai dit tout de suite, "ce n'est pas un chef-d'œuvre", c'est juste un effort autodidacte pour apprendre la POO. Mais il fonctionne sans aucun problème. Avant celui-ci, mon programme mql4 fonctionnait bien dans mql5, mais il ne fonctionnait pas correctement. J'ai un sujet quelque part - j'ai eu une longue discussion de haut niveau avec un batteur...

Vous devrez peut-être ajouter une autre variante à la fonction pour des centaines d'instruments, mais le nom restera le même. Et c'est, à mon avis, le plus agréable des avantages de la POO. Si vous maîtrisez la POO plus profondément, vous pourriez trouver des avantages encore plus agréables mais... pas de mon vivant...

 
Nikolai Semko:
Je pense que je le sais cependant))
Je n'ai pas le temps de le prouver pour le moment.
Je n'ai pas étudié le code de Peter en détail, mais je l'ai soumis au profilage. L'ensemble du cycle de génération des données a duré environ 1 microseconde. C'est le meilleur résultat obtenu jusqu'à présent, en supposant qu'aucune correction globale ne sera nécessaire dans le code pour le rendre pleinement opérationnel.

Tout de même, vous avez prouvé que vous ne savez pas.

 
Dmitry Fedoseev:

Pourtant, vous avez prouvé que vous ne savez pas.

Très bien, comme vous voulez. Je ne sais pas. Je suis vaincu et ton pied est sur ma poitrine. Félicitations ! !! Profitez-en !
 
Dmitry Fedoseev:

Vous n'avez aucune idée de l'idiotie dont vous faites preuve, c'est tout simplement une anomalie totale. Mais je ne vous montrerai pas exactement où, car vous n'êtes pas intéressés par mon opinion))).

Une opinion n'est intéressante que si elle s'appuie sur des arguments valables.

L'argument "vous devez le faire parce que je le fais" n'intéresse personne.

Dans ce cas particulier, les noms des variables ne correspondent pas à ce qui est accepté est un argument faible. Ceci n'a pas été écrit pour CodeBase.

 

C'est drôle de voir comment vous êtes tous assis sur le tisonnier de la croix ici. Continue à t'asseoir, ça rend le monde autour de toi plus drôle.

 
Dmitry Fedoseev:

C'est drôle de voir comment vous êtes tous assis sur le tisonnier de la croix ici. Continue à t'asseoir, ça rend le monde autour de toi plus drôle.


Bien joué, Dimitri !
Si Peter est un maître pour attiser les feux, alors vous êtes un maître pour les éteindre ))))

 
Alexey Volchanskiy:

Jusqu'à présent, même MOFT ne prend pas en charge MT5, ce qui est frustrant pour moi, car je me suis attaqué aux spreads sur ce site. Et que signifie le soutien ? Publication de nouvelles versions ? Si aucun bogue critique n'est trouvé, il n'y en aura peut-être pas de nouveaux.

J'ai en partie rampé vers MT5, mais comme l'a souligné à juste titre Dmitiry, les conditions sont meilleures sur MT4 pour le moment.

Ce n'est pas le cas. La vitesse et la qualité d'exécution des ordres dans MT5 créent un environnement agréable pour s'habituer au mieux (il y a des spreads sains, et, en fait, très bas pendant les périodes de liquidité, l'exemple est le même Robo(MT5)). Ce qui à son tour donne des avantages à la limite d'ordre à certains niveaux de liquidité. /*<= et cela peut plus que compenser les frais généraux (spread et commission si le compte a une commission).

A partir d'exemples de ceci /*les flèches vertes sont les niveaux limites que j'ai fixés, et les flèches rouges à bleues sont la façon dont l'ordre réel a fonctionné*/ :

 

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.

//+------------------------------------------------------------------+
//|                                                  Новый бар 3.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
datetime Время_последнего_бара;
 
int    Частота_таймера  = 25;
int    Всех_символов;

string Символы[];
int    Таймфреймы[7]    = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int    Всех_таймфреймов = 7;

int    Количество_баров[][7];
bool   События_нового_бара[][7];

//+------------------------------------------------------------------+
#define  M1    0
#define  M5    1
#define  M15   2
#define  M30   3
#define  H1    4
#define  H4    5
#define  D1    6
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(25);
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time[0];
   //-------------------------------------------------------------   
   //Узнаем сколько символов есть в обзоре рынка.
   //---------------------------------------------------------
   Всех_символов = SymbolsTotal(true);
   //---------------------------------------------------------   
   //Устанавливаем размер массива Символы. Внутри него будут записаны
   //имена всех символов, которые есть в окне обзоре рынка.
   //---------------------------------------------------------
   ArrayResize(Символы,Всех_символов);
   //---------------------------------------------------------
   //Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".
   //В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа
   //и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги
   //события нового бара для каждого символа и каждого таймфрейма. 
   //---------------------------------------------------------
   ArrayResize(Количество_баров,Всех_символов);
   ArrayResize(События_нового_бара,Всех_символов);
   //---------------------------------------------------------
   //Записываем наименования символов обзора рынка в массив "Символы[]".
   //---------------------------------------------------------
   for(int a1 = 0; a1 < Всех_символов; a1++)
     {
      Символы[a1] = SymbolName(a1 + 1,true); 
      //Возможно, нумерация символов в обзора рынка идет с нуля.
      //Тогда: Символы[a1] = SymbolName(a1,true);
     }
   //---------------------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
 static bool Начало_отсчета;
 static int  Минута;
 //---------------------------
 //Нам нужен корректный старт отсчета. Это должно быть время начала бара.
 //---------------------------
 if(!Начало_отсчета && Время_последнего_бара != Time[0])Начало_отсчета = true; 
 //--------------------------- 
 if(Начало_отсчета)Минута++;
 //--------------------------- 
 //В следующем цикле, мы будем обращатся к функции iBars для получения количества баров на 
 //каждом из символов и таймфреймов, которые будем проходить в цикле.
 //Далее, будем сравнивать записанное количество баров с текущим и при 
 //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".
 //---------------------------
 if(Минута*Частота_таймера >= 60000)
   {
    for(int a1 = 0; a1 < Всех_символов; a1++)
      {
       string Этот_символ = Символы[a1];
       //---------------------------------
       for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
         {
          int Этот_таймфрейм = Таймфреймы[a2];
          //------------------------------------------
          int Текущее_количество_баров = iBars(Этот_символ,Этот_таймфрейм);
          //------------------------------------------
          if(Текущее_количество_баров > Количество_баров[a1][a2])
            {
             //------------------------------------------------------------
             //Если это не самая первая запись в массив Количества баров,
             //то фиксируем событие нового бара.
             //------------------------------------------------------------
             if(Количество_баров[a1][a2])
               {
                События_нового_бара[a1][a2]  = true;
               } 
             //------------------------------------------------------------
             //Устанавливаем новое значение текущего количества баров.
             //------------------------------------------------------------
             Количество_баров   [a1][a2]  = Текущее_количество_баров;
            }
          //------------------------------------------
         }
      }
    //---------
    Минута = 0;
   }
 //-----------------------------------------------
 //Здесь наш код...
 //Здесь наш код...
 //Здесь наш код...
 //-----------------------------------------------
 //После завершения всех вызовов на этом событии таймера
 //снимаем флаги событий нового бара.
 if(!Минута)Снять_событие_нового_бара();
 //-----------------------------------------------   
}
//+------------------------------------------------------------------+
//Функция снимает флаги событий нового бара.
//Эта процедура осуществляется после выполнения всего пользовательского
//кода один раз в минуту. Вплоть до момента очищения массива флагов 
//новых баров, все функции могут их видеть обращаясь к массиву напрямую.
//+------------------------------------------------------------------+
void Снять_событие_нового_бара()
{
 for(int a1 = 0; a1 < Всех_символов; a1++)
   {
    for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
      {
       События_нового_бара[a1][a2] = false;
      }
   }
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//Пример использования событий нового бара в пользовательском функционал.
//Просто обращаемся к глобальному массиву "События_нового_бара[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_M15)
         {
          //Купить();
         }
       //---------------------------------- 
       if(Новый_бар && Этот_символ == "AUDUSD" && Этот_таймфрейм == PERIOD_M30)
         {
          //Продать();
         }
       //----------------------------------        
      }
   }
}
//+------------------------------------------------------------------+