Erreurs, bugs, questions - page 590

 
Swan:

Pour toutes les barres, l'indicateur est calculé une fois - c'est-à-dire qu'il peut être un peu lent au démarrage sur l'histoire agromadique.

Ensuite, une paire de valeurs est recalculée - tout doit fonctionner :)

N'oubliez pas que les programmeurs sont des personnes qui aiment sauter manuellement dans les délais pendant leur temps libre de programmation. Et chaque nouvelle période de temps est une autre désinitialisation et initialisation de l'anatomie de l'indicateur, tous les calculs seront effectués à nouveau. Par conséquent, ArrayInitialize() sera déclenché à chaque fois, lors du passage d'un TF à un autre. Si l'indicateur est complexe avec plusieurs buffers qui doivent être réinitialisés, les retards s'accumulent, et je ne parle même pas du dépassement de la mémoire, qui est allouée automatiquement.

Comme je suis naïf ! Je suis toujours persuadé que l'initialisation dans OnInit() est suffisante, et que je peux m'en passer à ce stade, et me consacrer à des tâches plus urgentes dans OnCalculate(). Mais non, je ne le fais pas. A propos, l'écriture plus ou moins réussie d'indicateurs complexes ne m'a pas permis de comprendre clairement pourquoi ArrayInitialize() doit être contenu exactement dans OnCalculate(), en le vérifiant à chaque tick, au lieu de l'initialisation primaire et unique dans OnInit(). Par expérience, je n'ai trouvé que des cas où le refus de cette variante a immédiatement causé des problèmes, mais j'en parlerai plus tard. Pour l'instant, je voudrais noter que du point de vue de la logique humaine simple et évidente (plutôt que de la logique du code), ArrayInitialize() dans OnCalculate() semble très répréhensible, compte tenu du fait que je n'ai jamais rencontré de cas où

if(prev_calculated<7) // или < чего-то там...
La première fois que le programme serait déclenché plus d'une fois - au démarrage initial. C'est-à-dire que de nouvelles fractales apparaissent et que la condition est silencieuse. Alors que diable fait-il dans OnCalculate()?

Je suis encore plus naïf dans ma croyance que

handle=iFractals(_Symbol,_Period);

Je suis supposé être obligé d'hériter automatiquement des tableaux de ces nettoyages et de l'effet de l'algorithme économique de l'original Fractals.mq5, qui est là aussi, mais sous une forme légèrement différente. Mais - encore et toujours non ! !! J'ai dû réfléchir à deux fois et créer mon propre code en copiant l'indicateur, dont j'utilise la poignée. Je me souviens que j'ai analysé le code des indicateurs pour la première fois et que j'ai été surpris en comparant Fractals.mq5 et l'exemple d'iFractals de l'aide, et que j'ai réalisé que le second code était plus grand que le premier (même après la réduction de sa longueur). Je ne sais pas. Jetez tous mes chapeaux, mais les programmeurs s'attendent réellement à pouvoir brancher quelque chose dans leur code en une seule ligne en se référant à une bibliothèque entière, une classe ou quelque chose de volumineux là, mais ici...

Je vais maintenant révéler l'essence du problème que j'ai mentionné plus tôt. Je joins le code de l'indicateur iFractals simplifié aux fractales supérieures. Dans l'exemple initial, le tampon est rempli pour l'ensemble de l'historique. Changeons la situation en ne copiant qu'une partie de l'histoire. Mettons en commentaire l'affectation des valeurs copiées pour le premier calcul, et définissons notre propre valeur plus petite :

values_to_copy=100; // то же, что amount
Maintenant, faisons des bonds dans le temps et soyons horrifiés par les artefacts fractals qui sont apparus. Je n'ai rien trouvé de mieux que de copier automatiquement le bloc de code non hérité clean up arrays de Fractals.mq5 afin de nettoyer cette partie de l'histoire où les fractales ne sont pas nécessaires :
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
Maintenant tout(avec beaucoup de redondance ! !!) est parfaitement nettoyé, et en même temps Print() montre quand et combien de fois la réinitialisation fonctionnera et affiche la taille du tampon. Nous pouvons voir que ce n'est pas 100, mais bien plus. Si j'ai besoin d'essuyer la poussière d'une table, j'essuie la poussière de la table au lieu de nettoyer tout l'appartement. Ou bien l'astuce consiste-t-elle à me rassurer à tout prix en me disant que les dépassements de mémoire et de temps ne sont rien, que l'on peut trouver un moyen de résoudre le problème indirectement et ignorer la dévoration flagrante de ressources hors de mon contrôle ?


Cygne:

Un fx, une certaine taille devra être définie... Pourquoi faire une boucle courbe avec des limites différentes, alors que vous pouvez faire une boucle directe avec les mêmes limites ?)

Sinon, l'indicateur sera basé sur des béquilles.

Honnêtement, je ne voulais pas être un fardeau, mais j'ai compris à l'avance que des sympathisants allaient fouiller dans tout le code. C'est comme dans l'anecdote de Chapay et Petka, quand Vasily Ivanovich est revenu, il a demandé une pelle - elle s'est avérée être cassée - le cheval a été enterré - le village a été attaqué par les Blancs pendant l'absence de Chapay. Sachant que je ne pense pas que quiconque voudra entrer dans les détails du code des autres, je ne peux que me référer à la sortie de l'indicateur, qui (en dehors des freins et autres) fonctionnera comme suit : https://www.mql5.com/ru/forum/1111/page577#comment_119227. Et maintenant, réfléchissez-y et dites-vous qu'il est raisonnable de penser que tout est simple là-bas et de proposer des solutions apparemment évidentes ?

Ce n'est pas pour rien que je simplifie et limite le code avant de demander quoi que ce soit dans une partie particulière. C'est pourquoi je vous demande de vous limiter à cela, et de ne pas exhumer tout le cheval, sauf s'il y a un amateur...

En fait, le quatrième tampon - spécial - est en principe plus long que les trois premiers (de même longueur), et grâce à SetIndexBuffer() il s'étend sur toute l'histoire ! Si nous étendons les limites de la boucle au quatrième tampon et que nous redimensionnons en même temps les trois premiers tableaux en fonction de celui-ci, le nombre d'éléments de la boucle augmentera au moins, ce qui augmentera le temps estimé de lecture du segment d'éléments du tampon complètement à gauche. Ce n'est que la pointe de l'iceberg des problèmes qui apparaîtront avec cette variante de l'algorithme. En outre, la réinitialisation des autres tampons prendra plus de temps car leur taille est désormais plus importante. Le quatrième tableau spécial ne peut pas être rempli explicitement avec EMPTY_VALUE in else, car l'indicateur présente une transposition sévère de fractales d'autres horizons temporels selon un certain algorithme, où il n'y a pas de correspondance entre les indices des trois premiers tampons et du quatrième tampon...

Cygne:

//et les valeurs EMPTY_VALUE sont attribuées aux éléments 0 et 1 des tableaux, mm... et sur les trois dernières barres)

Comment cela ? Pourquoi pas tous ? Je ne comprends pas celle-ci. Pouvez-vous expliquer ? En fait, je ne fais pas référence à l'attribution des seules valeurs réelles (effectives), mais à l'inévitable balayage de l'ensemble du tampon. ArrayInitialize(), ainsi que de nombreuses autres fonctions de tableau, sont basées sur une boucle qui est implicite pour les programmeurs MQL finaux.

La question sur dépassement de mémoire reste valable, et les développeurs devraient penser à introduire un paramètre supplémentaire dansArrayInitialize() qui spécifierait le nombre et encore mieux les limites de la réinitialisation du tampon.

P.S. : Je suppose que je peux deviner pourquoi ArrayInitialize() dans OnInit() n'est pas efficace ici. Les tampons sont dynamiques, ils changent de taille, et dans OnInit() ils s'initialisent avec des valeurs une seule fois et pour la longueur actuelle, sans connaître encore les tailles réelles des tampons dans OnCalculate().

Dossiers :
cleanup.mq5  2 kb
 
papaklass:

L'indicateur du visualiseur ne fonctionne pas :

Dans le terminal en ligne, cela fonctionne bien :

Pouvez-vous donner des détails ? Comment l'indicateur s'est-il retrouvé sur le graphique du visualiseur ?
 
papaklass:

J'insère les lignes suivantes dans le code de l'Expert Advisor

Je place ces trois indicateurs sur un graphique propre et j'enregistre le modèle en tant que conseiller expert. La photo est en ligne dans mon post précédent.

J'exécute le conseiller expert dans le visualiseur.

1. Afficher le modèle sauvegardé

2. Essayez d'exécuter la visualisation sans le modèle (c'est-à-dire supprimez le fichier tpl concerné au préalable). Dans la dernière version, la 555, les indicateurs personnalisés ajoutés automatiquement devraient s'afficher correctement.

 
papaklass:

Tout fonctionne. Merci.

J'ai supprimé le modèle. En expert dans OnInit() prescrit :

Montrez votre modèle. L'indicateur doit également s'afficher normalement avec le modèle (c'est-à-dire qu'il y a un problème et qu'il doit être résolu).
 
papaklass:

Envoi du fichier *.tpl

Maintenant, j'ai réessayé avec le modèle - cela ne fonctionne pas. Suppression du modèle - ça marche.

Merci. Nous allons nous en occuper.
 

x100intraday:

Maintenant, réfléchissez-y et dites-moi, cela vaut-il la peine de croire que tout y est simple et de proposer des solutions apparemment évidentes ?

tous les génies sont simples.

Je n'ai pas pu faire le reste. L'anecdote de la question sur le forum, comment enlever les amygdales me rappelle :)

Je ne suis pas sûr de savoir comment faire... Je ne suis pas sûr de savoir comment faire.

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • votes : 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

tous les génies sont simples.

Je n'ai pas pu faire le reste. L'anecdote de la question sur le forum, comment enlever les amygdales me rappelle :)

L'exemple de l'indicateur orthodoxe imho fractals limité. Peut-être que cela vous aidera...

En fait, j'écris l'indicateur via un handle... Mais j'aime l'idée de refuser ArrayInitialize() au profit d'un remplissage manuel explicite avec des valeurs EMPTY_VALUE. Merci, j'essaierai d'y mettre un nouveau bazar que j'espère ne pas avoir à nettoyer plus tard. Même s'il y aura des subtilités et des inconvénients, je les prévois d'avance... mais peu importe.
 

Code suivant :

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

Sorties :

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) other = {123, 456}

Donc, la liste d'initialisation n'a pas fonctionné, il y a des déchets dans la structure. Est-ce un bug ou non ?

 

J'ai déconnecté deux agents du cloud et ils se connectent toujours aux serveurs du cloud toutes les 30 secondes.

MO 0 Network 00:00:17 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
LK 0 Réseau 00:00:47 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
RG 0 Réseau 00:01:17 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
NS 0 Network 00:01:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
RO 0 Réseau 00:02:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
OK 0 Réseau 00:02:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
MG 0 Réseau 00:03:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
DR 0 Réseau 00:03:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
DN 0 Network 00:04:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
EJ 0 Réseau 00:04:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
GF 0 Réseau 00:05:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
RR 0 Réseau 00:05:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
NN 0 Network 00:06:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
KJ 0 Réseau 00:06:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
QF 0 Réseau 00:07:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
HQ 0 Network 00:07:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
PM 0 Réseau 00:08:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
QI 0 Réseau 00:08:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
KE 0 Réseau 00:09:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
NQ 0 Réseau 00:09:51 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
OM 0 Network 00:10:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
RI 0 Network 00:10:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
LE 0 Network 00:11:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
EP 0 Network 00:11:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
IL 0 Network 00:12:18 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
HH 0 Network 00:12:48 connecté à 2.agents.mql5.com (via un serveur proxy 192.168.0. )
FD 0 Network 00:13:18 connecté à 2.agents.mql5.com (via un serveur proxy)

 
Konstantin83:

J'ai déconnecté deux agents du cloud et ils se connectent toujours aux serveurs du cloud toutes les 30 secondes.

Allons à Servicedesk.

Veuillez préciser comment vous vous êtes exactement déconnecté ? Avez-vous supprimé (gelé) les services ? Veuillez joindre les journaux des agents à problèmes.

Les paramètres du proxy dans vos journaux sont quelque peu étranges. Avez-vous écrit les paramètres du proxy dans la configuration de votre agent ? Veuillez joindre le fichier common.ini de votre gestionnaire d'agents à la demande.