Discussion de l'article "Présentation de MQL5 : Comment écrire un simple Expert Advisor et un indicateur personnalisé" - page 2

 
Rosh:

Pour les tampons d'indicateurs, il est indiqué SetIndexBuffer:

Pour les Expert Advisors, il devrait en être de même.

Pas encore d'analogie. Lors de la vérification de ce code

//+------------------------------------------------------------------+
//|Test002.mq5 |
//+------------------------------------------------------------------+
double high[];
int bars;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   return;
  }
//+------------------------------------------------------------------+

j'ai placé un point d'arrêt en face de l'opérateur return. Le débogueur produit le résultat suivant : high "dynamic array[8563], S". Je comprends que S est l'abréviation de "Series".

 
Yedelkin:

L'analogie ne fonctionne pas encore. Lorsque l'on vérifie ce code

j'ai placé un point d'arrêt en face de l'opérateur return. Le débogueur génère le résultat suivant : high "dynamic array[8563], S". Je comprends que S signifie "Series".

Alors pourquoi cela ne fonctionne-t-il pas ? Si vous avez des doutes, vérifiez explicitement la présence de séries à l'aide de la fonction ArrayGetAsSeries:

//+------------------------------------------------------------------+
//|Test_ArraySetAsSeries.mq5 |
//| Copyright Copyright 2010, MetaQuotes Software Corp.
//| http ://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
double high[];
int bars;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   bool IsSeries=ArrayGetAsSeries(high);
   return;
  }
//+------------------------------------------------------------------+

Résultat


 
Rosh писал(а) :

Pourquoi cela ne fonctionne pas. En cas de doute, vérifiez explicitement la sérialité à l'aide de la fonction ArrayGetAsSeries:

Permettez-moi de vous rappeler de quoi je parle. Je demandais si les tableaux devaient toujours être indexés après avoir été copiés. Vous avez fait référence à la note de la fonction SetIndexBuffer et avez dit qu'il devrait en être de même pour les EA. Cette note de fonction SetIndexBuffer implique que"après la liaison, le tableau dynamique buffer[] sera indexé comme les tableaux ordinaires, même si le tableau lié est prédéfini pour être indexé comme les séries temporelles".

Par conséquent, j'ai vu une analogie pour les AE en ce sens qu'après avoir utilisé les fonctions CopyTime, CopyHigh et CopyLow, les tableaux récepteurs devront également être indexés comme des tableaux normaux. Pour tester cette analogie, j'ai placé la fonction ArraySetAsSeries avant la fonction CopyHigh, dans la fonction OnInit(). Mais mon exemple et la vérification explicite de la sérialisation par la fonction ArrayGetAsSeries que vous avez suggérée montrent qu'après l'utilisation de la fonction CopyHigh, l'indexation prédéfinie (comme dans timeseries) du tableau récepteur high[] n'a pas changé. Cela indique à son tour que l'analogie avec la fonction SetIndexBuffer que vous avez mentionnée n'est pas encore observée, car sinon la vérification explicite de la sérialisation aurait dû montrer que IsSeries=false.

 

Yedelkin:

Pour tester cette analogie, j'ai placé la fonction ArraySetAsSeries avant la fonction CopyHigh, dans la fonction OnInit(). Mais mon exemple et la vérification explicite de la sérialisation par la fonction ArrayGetAsSeries que vous avez suggérée montrent qu'après l'utilisation de la fonction CopyHigh, l'indexation prédéfinie (comme dans timeseries) du tableau récepteur high[] n'a pas changé.

En fait, je voulais dire qu'après avoir défini la sérialisation du tableau global dans OnInit() ou dans une autre fonction, cette sérialisation ne changera nulle part ailleurs. La seule exception est liée à la fonction SetIndexBuffer().

Je pense que nous sommes parvenus à un accord sur cette question et que nous pouvons la considérer comme épuisée.

 

Oui, la question a reçu une réponse. Merci pour cette clarification !

 

Quelques questions.

1.

   if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)
     {
      Print("Échec de la copie de la série temporelle !);
      return;
     }

Il est dit que "Dans l'opérateur if..., l'opérateur return est utilisé pour terminer l'exécution de la fonction OnTick".

Est-ce que OnTick? et non pas if (....) {...} ?

2.

   for(i=0;i<PositionsTotal();i++) {…}

Dans MQL4, la recherche inverse était recommandée.

for(i= PositionsTotal();i>0;i--) {…}
Qu'est-ce qui est mieux ?

3. Téléchargement de l'Expert Advisor et de l'indicateur (pour les modérateurs d'Opera 10.54, problèmes de téléchargement des fichiers attachés). Le tout compilé. Commencé dans le testeur sur M5 en sélectionnant le mois dernier.

Journal

2010.05.15 13:16:02 Core 1 Déconnecté

2010.05.15 13:16:01 Core 1 Fichier journal "D:\NMetaTrader 5\NTester\Agent-127.0.0.0.1-3000\s20100515.log" écrit

2010.05.15 13:16:01 Core 1 EURUSD,M5 : 553908 ticks (2580 barres) générés en 1431016 ms (total des barres dans l'historique 100352)

2010.05.15 13:16:01 Core 1 OnTester result 0

2010.05.15 12:52:13 Core 1 EURUSD,Daily : l'historique commence à 2009.01.02 00:00

2010.05.15 12:52:13 Core 1 EURUSD,Daily : le cache de l'historique est réservé à une estimation de 355 barres.

2010.05.15 12:52:13 Core 1 EURUSD : contient 484483 enregistrements M1 de données de début de 2009.01.02 06:01 à 2010.05.03 00:00

2010.05.15 12:52:10 Core 1 Lots=0.100000

2010.05.15 12:52:10 Core 1 MAper=240

2010.05.15 12:52:10 Core 1 EndHour=19

2010.05.15 12:52:10 Core 1 StartHour=7

2010.05.15 12:52:10 Core 1 EURUSD,M5 : le test de Experts\expert.ex5 de 2010.05.01 00:00 à 2010.05.14 00:00 a commencé avec les entrées :

Le temps d'exécution a été très long et aucune transaction n'a été ouverte. Le trading automatique est autorisé. Il n'y a pas de messages dans le journal ((( (edit probablement je ne sais pas encore comment les trouver). L'indicateur et le conseiller expert se trouvent là où ils devraient être. Windows XP, MT (build 274).

4. J'ai essayé le mode débogage, mais il ne fonctionne pas. Probablement à cause du samedi. Pas de guillemets. J'ai fait le point d'arrêt de la même manière que dans l'article. Si j'ai raison, c'est dommage, il s'avère que l'on ne peut déboguer que les jours ouvrables. Ce serait bien pour le débogage de pouvoir télécharger son propre fichier avec les données nécessaires et (ou) avec quelques données typiques (que ce soit un morceau d'histoire pour un jour), ce sera suffisant pour le débogage.

5) Si quelqu'un a fait des recherches sur la fonction Copy... merci de partager des informations sur la façon dont elle fonctionne s'il manque des barres. Bien qu'il serait probablement préférable de commander un article.

 
Prival:

Quelques questions.

1. Il est dit que "Dans l'opérateur if..., l'opérateur return est utilisé pour terminer l'exécution de la fonction OnTick".

S'agit-il de OnTick? et non de if (....) {...} ?

D'après la description de l'opérateur de retour return :

Оператор return прекращает выполнение текущей функции и возвращает управление 
вызвавшей программе. Результат вычисления выражения возвращается вызываемой 
функции. Выражение может содержать оператор присваивания.

La fonction courante pour l'instruction return dans cet exemple est la fonction OnTick().

Prival:

4. J'ai essayé le mode débogage, mais il ne fonctionne pas. Probablement à cause du samedi. Pas de guillemets. J'ai fait le point d'arrêt de la même manière que dans l'article. Si j'ai raison, c'est dommage, il s'avère que l'on ne peut déboguer que les jours ouvrables. Ce serait bien pour le débogage de pouvoir télécharger son propre fichier avec les données nécessaires et (ou) avec quelques données typiques (que ce soit un morceau d'histoire pour un jour), ce sera suffisant pour le débogage.

Le site a déjà abordé des questions similaires sur le débogage. Si vous êtes intéressé, utilisez la fonction de recherche et cherchez le mot "Débogage".

 

Après avoir chargé la mise à jour automatique (build 275), le compilateur a commencé à générer des avertissements sur les lignes où des conditions du type suivant sont vérifiées

if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
Les avertissements sont du même type :
implicit enum conversion Perito02-04 temp3.mq5 1233 45
Questions : le bon fonctionnement du compilateur implique-t-il l'apparition de ces avertissements dans la situation spécifiée ? De quelle "conversion" parle-t-on ?
 
Yedelkin :

Après avoir chargé la mise à jour automatique (build 275), le compilateur a commencé à générer des avertissements sur les lignes où des conditions du type sont vérifiées

Les avertissements sont du même type : Questions : le travail correct du compilateur implique-t-il l'apparition de ces avertissements dans la situation spécifiée ? De quelle "conversion" parle-t-on ?

L'avertissement a été introduit pour inciter les programmeurs à faire attention et à revérifier leur code.

Vous pouvez vous débarrasser des avertissements en convertissant explicitement le résultat de la fonction en un énumérateur ou un énumérateur en int.

 
Prival:

Quelques questions.

1. Il est dit que "Dans l'opérateur if..., l'opérateur return est utilisé pour terminer l'exécution de la fonction OnTick".

S'agit-il de OnTick? et non de if (....) {...} ?

Si au moins une des conditions de l'opérateur

if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)

au moins une des conditions est remplie, c'est-à-dire qu'au moins un des tableaux n'a pas pu être copié complètement (il n'y a pas assez de données historiques ou une erreur s'est produite) - la fonction OnTick est interrompue, car les calculs ultérieurs sont impossibles sans ces données.

2. dans MQL4, l'énumération inverse était recommandée.

Qu'est-ce qui est mieux ?

Variantes

for(i=0;i<PositionsTotal();i++)

и

for(i=PositionsTotal()-1;i>=0;i--)

sont équivalentes, mais la première variante est plus courte dans le texte, c'est pourquoi elle a été utilisée.

3. Téléchargement de l'Expert Advisor et de l'indicateur (pour les modérateurs, Opera 10.54 a des problèmes avec le téléchargement des fichiers attachés). Tout a été compilé. Je l'ai exécuté dans le testeur sur M5, en sélectionnant le dernier mois.

Le temps d'exécution a été très long et aucun trade n'a été ouvert. Le trading automatique est autorisé. Il n'y a pas de messages dans le journal ((( (je ne sais probablement pas encore comment les trouver). L'indicateur et le conseiller expert se trouvent là où ils devraient être. Windows XP, MT (build 274).

4. J'ai essayé le mode débogage, mais il ne fonctionne pas. Probablement à cause du samedi. Pas de guillemets. J'ai fait le point d'arrêt de la même manière que dans l'article. Si j'ai raison, c'est dommage, il s'avère que l'on ne peut déboguer que les jours ouvrables. Ce serait bien pour le débogage de pouvoir télécharger son propre fichier avec les données nécessaires et (ou) avec quelques données typiques (que ce soit un morceau d'histoire pour un jour), ce sera suffisant pour le débogage.

5) Si quelqu'un a fait des recherches sur la fonction Copy... merci de partager des informations sur la façon dont elle fonctionne s'il manque des barres. Bien qu'il serait probablement préférable de commander un article.

Pour être honnête, mon testeur ne fonctionne pas très bien non plus : les tests prennent beaucoup plus de temps que les tests d'un EA similaire dans MQL4 ; les transactions ne sont ouvertes que pendant le premier ou les deux premiers jours de l'intervalle de test (ceci est observé lorsque l'on teste différents Expert Advisors).

Les fonctions OnTick et OnCalculate sont lancées lorsqu'une nouvelle cotation est reçue, donc pour leur débogage, il est nécessaire de recevoir des cotations (cela ne fonctionnera pas le week-end). Sinon, le débogueur fonctionne normalement (essayez-le, demandez-moi si vous avez besoin de quelque chose).

En ce qui concerne les tableaux-séries temporelles : - le sens des tableaux peut être modifié à tout moment dans les deux sens, l'emplacement des tableaux en mémoire ne change pas, seul l'indexation change (de 0,1,2,...,dernier à dernier ,...,2,1,0).