Questions des débutants MQL5 MT5 MetaTrader 5 - page 763

 
Vitaly Muzichenko:

Il semble que ce soit le cas dans les cycles, et vous pouvez vous dispenser de la fonction

Merci.

Cependant, en supprimant la fonction - les freins restent.... Bon sang.

 
Aleksey Vyazmikin:

Merci.

Cependant, en supprimant la fonction - les freins restent.... Merde.

J'ai une fois commencé à réécrire le programme de 4=>5, puis en 4, j'ai remplacé toutes les constructions comme Low[1], Time[0] et autres par des constructions modernes, c'est-à-direCopyLow,CopyTime, le programme est devenu plus rapide même en 4. Je n'utilise plus les anciennes constructions, seulement les nouvelles. Le code est donc facilement transférable à la 5ème plateforme, il suffit de modifier les fonctions de trading.

 
Vitaly Muzichenko:

Une fois que j'ai commencé à réécrire le programme de 4=>5 et que j'ai remplacé toutes les constructions comme Low[1], Time[0] et autres par des constructions modernes, c'est-à-direCopyLow,CopyTime, le programme est devenu plus rapide même en 4. Je n'utilise plus les anciennes constructions, seulement les nouvelles. Le code est donc facilement transférable à la 5ème plateforme, il suffit de modifier les fonctions de trading.

Remplir le tableau à chaque éternuement n'est-il pas une consommation de ressources ?

Peut-être serait-il judicieux de copier les informations dans le tableau à l'ouverture de la barre, puis de les reprendre au fur et à mesure du déroulement du code ? Je négocie à l'ouverture des barres.


 
Aleksey Vyazmikin:

Le fait deremplir un tableau à chaque éternuement ne consomme-t-il pas des ressources ?

Peut-être serait-il judicieux de copier les informations dans un tableau lorsqu'une barre s'ouvre, puis de les reprendre au fur et à mesure que le code progresse ? Je négocie à l'ouverture des barres.

Le tableau peut être rempli sur une nouvelle barre, cela consommera moins de ressources. Si vous travaillez avec iLow[1] à plusieurs endroits, vous devriez le stocker dans une variable une fois et le lire à la place du tableau.

Supposons que

// Инициализация TIME[0] TIME[1]
  ArraySetAsSeries(TM,true);
  if(CopyTime(dSymbol,Period(),0,2,TM)<0) return;
  TIME_0=TM[0];
  TIME_1=TM[1];
Nous travaillons alors avec les variablesTIME_0 etTIME_1 au lieu deTM[0] etTM[1].
 
Vitaly Muzichenko:

Le tableau peut être rempli sur une nouvelle barre, cela prendra moins de ressources. Si vous travaillez avec iLow[1] à plusieurs endroits, par exemple, il est souhaitable de l'écrire une fois dans une variable, et de lire la variable au lieu du tableau.

Supposons que

Mais quand même, MT4 est beaucoup plus rapide - je suis déçu.

 

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

Bugs, bugs, questions

Aleksey Vyazmikin, 2017.07.21 15:07

Pourquoi fantasmes-tu ? J'ai compris votre idée, et j'ai confirmé qu'elle fonctionne, et qu'elle aura un effet si la demande est faite une fois et si l'on sait combien de barres sont nécessaires pour que l'EA fonctionne.

Ou peut-être avez-vous suggéré d'utiliser la structure d'une manière différente ? Dans ce cas, veuillez expliquer, mais ne soyez pas offensé !


Pas de fantasmes. Si vous avez besoin d'obtenir 2 ou plusieurs paramètres d'un chandelier, alors en utilisant les fonctions de vos messages/questions nous devrons appeler ces fonctions séparément pour chaque paramètre du chandelier. Cela fait 2 fois ou plus pour produire Copy***(), mais en utilisant CopyRates() vous n'avez besoin que d'un seul appel de Copy.

Quant au nombre à copier, c'est une autre question. Peut-être devrions-nous d'abord calculer la barre contenant la valeur de l'indicateur requis, puis la copier. Si je me souviens bien, il a été question d'une quantité inconnue à copier. De quel genre de fantaisie parlons-nous ?

Dans des cas extrêmes, nous pouvons copier, disons, 10 barres et chercher parmi elles. Si nous ne trouvons pas, nous copions 10 autres barres. La copie est une opération qui prend du temps, il est plus économique de copier un tableau.

En général, il y a beaucoup de variations. Vous ne pouvez pas écrire tout cela dans la documentation et ce ne sera pas du tout de la documentation. Ils enseignent cela aux cours de programmation. Mais, malheureusement, tous les enseignants ne sont pas capables de le faire et tous les élèves ne veulent pas le comprendre pendant les cours. Et le tout début, c'est lors des leçons d'arithmétique des classes 2 à 5, lorsque l'enseignant exige une explication détaillée du problème. Mais ici, les problèmes sont les mêmes.

 
Alexey Viktorov:

Pas de trucs fantaisistes. Si vous avez besoin d'obtenir 2 ou plusieurs paramètres d'un chandelier, alors en utilisant les fonctions de vos messages/questions vous devez appeler ces fonctions séparément pour chaque paramètre du chandelier. Cela revient à exécuter Copy***() 2 fois ou plus, mais en utilisant CopyRates() vous n'aurez besoin que d'un seul appel de Copy.

Quant au nombre à copier, c'est une autre question. Peut-être devrions-nous d'abord calculer sur quelle barre la valeur correcte de l'indicateur est disponible, et ensuite la copier. Si je me souviens bien, il a été question d'une quantité inconnue à copier. De quel genre de fantaisie parlons-nous ?

Et, en dernier recours, nous pouvons copier, disons, 10 mesures et les parcourir et, si nous ne trouvons pas, nous copions 10 autres mesures. La copie est une opération assez coûteuse ; il serait plus économique de chercher dans le tableau.

Il y a beaucoup de variantes dans ce cas. Tout cela ne peut pas être inscrit dans la documentation ; en fait, il n'y aura plus de documentation. Ils enseignent cela aux cours de programmation. Mais, malheureusement, tous les enseignants ne savent pas comment le faire et tous les élèves ne veulent pas le comprendre pendant les cours. Et le tout début, c'est lors des leçons d'arithmétique des classes 2 à 5, lorsque l'enseignant exige une explication détaillée du problème. Mais ici, les problèmes sont les mêmes.

À propos de la fantaisie - était une réponse à votre déclaration "Au lieu d'essayer de comprendre ce qui a été dit, de comprendre ce que vous obtenez, vous faites des objections incroyables", et non au fait que la version que vous avez proposée est issue du domaine de la fantaisie.

Je comprends parfaitement votre concept, et il était intégré dans la réponse que je vous ai adressée.

Cependant, je ne comprends pas bien comment vous proposez de travailler avec une quantité inconnue de données - pouvez-vous me donner un exemple sous forme de code ?


 

Veuillez m'aider à vérifier et à optimiser l'indicateur en utilisant ce lien https://www.mql5.com/ru/code/16805 - le problème est que l'indicateur commence à ralentir beaucoup lorsqu'un grand nombre de barres apparaissent - cela apparaît lors des tests.

Je voudrais savoir comment le faire fonctionner pour qu'il ne soit pas calculé à chaque tick, mais seulement à l'ouverture de la barre ? La méthode de l'Expert Advisor ne convient pas - après le premier tick, toutes les valeurs disparaissent et n'apparaissent que sur la barre suivante...

Donchian Channel MTF
Donchian Channel MTF
  • votes : 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin:

À propos de la fantaisie - c'était une réponse à votre déclaration "Au lieu d'essayer de comprendre ce qui est dit, de comprendre ce qui va marcher, on lance des objections incroyables", et non pas que l'option que vous proposez soit du domaine de la fantaisie.

Je comprends parfaitement votre concept, et il était intégré dans la réponse que je vous ai adressée.

Cependant, je ne comprends pas bien comment vous proposez de gérer une quantité inconnue de données - pouvez-vous me donner un exemple sous forme de code ?


La réponse a été donnée avant...

Alexey Viktorov:

En dernier recours, vous pouvez copier, disons, 10 barres à la fois et chercher parmi elles ; si vous ne trouvez pas, vous en copiez 10 autres. La copie est une opération coûteuse, il est plus économique de chercher dans le tableau.

Mais il vaut mieux ne pas essayer de tirer le maximum de barres du tableau, mais essayer de faire avec une copie.

Je ne vais pas écrire un exemple de code. Un programmeur normal a juste besoin d'un indice. Voici un exemple d'algorithme :

  1. Déterminez le nombre approximatif de barres auxquelles le canal est traversé. Que ce soit 15.
  2. Copiez les deux tampons de l'indicateur.
  3. Copier les valeurs des barres en utilisant CopyRates()
  4. Dans la boucle, nous commençons à comparer les valeurs de la limite supérieure du canal et des barres hautes simultanément à la comparaison des barres basses avec la limite inférieure du canal. Si l'un de ces croisements est trouvé, l'indice de la barre est stocké dans une variable, et nous continuons à chercher le deuxième croisement. Nous sortons de la boucle lorsque les deux variables des barres d'intersection ont des valeurs.

Ainsi, il est possible de trouver deux intersections en une copie et un cycle, si nécessaire. Il n'est même pas nécessaire d'utiliser ArraySetAsSeries() car pour trouver le croisement, il est possible et, à mon avis, préférable de se souvenir de l'heure de la barre et non de son numéro. Bien que, connaissant l'heure de la barre, il n'y a aucune difficulté à déterminer son nombre.

Question : Qu'est-ce qui est le plus rapide, un cycle avec copie du tampon indicateur par 1 valeur et copie de la barre haute par 1 et comparaison de ces valeurs ou une seule copie d'une certaine quantité et comparaison des valeurs des deux tableaux entre eux ?

 

J'ai écrit ça hier :

Tâche :

à chaque tick, obtenir les éléments "InpCountCopy" : open, high, low, close et time.

Mise en œuvre :

  1. boucle de "0" à "InpCountCopy-1" - la boucle récupère une ouverture, un haut, un bas, une fermeture et un temps à la fois.
  2. A un moment donné, nous récupérons les éléments "InpCountCopy" dans la structure MqlRates et nous bouclons ensuite dans la structure.

Caractéristiques :

Vous pouvez choisir le mode de vérification : en OnTick ou en OnTimer (1 seconde).

//+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameter
input int InpCountCopy=1000;
input bool OnTickOnTimer=false; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(OnTickOnTimer)
      EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start=GetMicrosecondCount();
   for(int i=0;i<InpCountCopy;i++) // in one operation we get one element.
     {
      double open=iOpen(i);
      double high=iHigh(i);
      double low=iLow(i);
      double close=iClose(i);
      datetime time=iTime(i);
     }
   ulong end=GetMicrosecondCount()-start;
   string text=(OnTickOnTimer)?"OnTimer":"OnTick";
   text=text+"\n"+"OHLC: "+IntegerToString(end);

//--- for one operation we get "InpCountCopy" elements.
   start=GetMicrosecondCount();
   MqlRates Rates[];
   if(!iRates(Rates,0,InpCountCopy))
      return;
   for(int i=0;i<InpCountCopy;i++)
     {
      double open=Rates[i].open;
      double high=Rates[i].high;
      double low=Rates[i].low;
      double close=Rates[i].close;
      datetime time=Rates[i].time;
     }
   end=GetMicrosecondCount()-start;
   text=text+"\n"+"Rates: "+IntegerToString(end);

   Comment(text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied==1)
      open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied==1)
      high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied==1)
      low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied==1)
      close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied==1)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates(MqlRates  &Rates[],const int index,int count,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   int copied=CopyRates(symbol,timeframe,index,count,Rates);
   if(copied!=count)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


Dossiers :