OnDeinit dans les indicateurs - page 7

 

Développeurs, vous avez une erreur quelque part.

void OnDeinit(const int reason)
{
 //Comment("");
 Comment(ArrayInitialize(body_down,EMPTY_VALUE),"  ",body_down[0],"  ",body_down[1],"  ",body_down[2],"  ",body_down[3]);
}

Regardez la capture d'écran de Comment après avoir fermé le terminal et l'avoir ouvert après 1 minute.

Nombre d'éléments initialisés et que le premier, deuxième, troisième et quatrième élément du tampon est vide.

L'indicateur ne compte que le 0e tampon. Alors pourquoi 2 bougies ?


 
Oh, oui. L'aide en anglais indique également queArrayInitialize ne renvoie rien.

 
eevviill:

Développeurs, vous avez une erreur quelque part.

Regardez la capture d'écran de Comment après avoir fermé le terminal et l'avoir ouvert après 1 minute.

Nombre d'éléments initialisés et que le premier, deuxième, troisième et quatrième élément du tampon est vide.

L'indicateur ne compte que le 0e tampon. Alors pourquoi 2 bougies ?


Parce que lorsque vous analysez pour une nouvelle barre, vous ne vérifiez pas le nombre de barres, mais seulement le temps. Lorsque vous démarrez le terminal ou que vous rompez la connexion avec le serveur pendant l'opération, avant que les barres manquantes (à l'historique complet) n'arrivent, un tic arrive. À ce tick, une nouvelle bougie est créée, mais il y a un écart (historique manquant) entre celle-ci et l'historique dans le terminal, qui sera téléchargé du serveur et inséré dans le système, et comme vous n'analysez pas le nombre de barres, vous penserez qu'il n'y a pas de nouvelle barre dans le prochain calcul, et c'est à ce moment-là que la deuxième bougie apparaît. Après l'ouverture d'un nouveau bar, il disparaîtra.
 
mql5:
Car lorsque vous analysez pour une nouvelle barre, vous ne vérifiez pas le nombre de barres, mais vous vous limitez à vérifier le temps. Lorsque vous démarrez le terminal ou que vous rompez la connexion avec le serveur pendant l'opération, un tick vient avant l'arrivée des barres manquantes (à l'historique complet). À ce moment-là, une nouvelle bougie est créée, mais il y a un écart (historique manquant) entre elle et l'historique du terminal, qui sera téléchargé du serveur et inséré à sa place. Après l'ouverture d'un nouveau bar, il disparaîtra.

Et cela n'a pas d'importance que dans deinit la mise à zéro se produise lorsque le terminal est fermé?

 

Vasily, exécutez un indicateur de test qui imprime le nombre de barres.

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

datetime lb;
int      rates_;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   if(NewBar(PERIOD_CURRENT, lb))
    {
     Print("rates_total = ", rates_total);
     rates_ = rates_total;
    }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//if(reason == REASON_CLOSE)
Print("OnDeinit сработал ", rates_);
}

bool NewBar(int tf, datetime &lastbar)
{
   datetime curbar = iTime(_Symbol, tf, 0);
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}//******************************************************************|

Voici ce qu'il imprime dans le journal.

0       22:52:04.765    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:52:04.795    test EURUSD.z,M1: initialized
0       22:52:04.795    test EURUSD.z,M1: rates_total = 75183
0       22:52:11.902    test EURUSD.z,M1: rates_total = 75184
0       22:52:28.712    test EURUSD.z,M1: uninit reason 9
0       22:52:28.712    test EURUSD.z,M1: OnDeinit сработал 75184
0       22:52:28.832    Custom indicator test EURUSD.z,M1: removed
0       22:57:10.366    Custom indicator Test\test EURUSD.z,M1: loaded successfully
0       22:57:10.396    test EURUSD.z,M1: initialized
0       22:57:10.396    test EURUSD.z,M1: rates_total = 75184
0       22:57:14.972    test EURUSD.z,M1: rates_total = 75185
0       22:57:59.167    test EURUSD.z,M1: rates_total = 75190 
// Локальное время наверное отстаёт от серверного на несколько секунд. На сервере было уже 58 минут.
0       22:58:34.237    test EURUSD.z,M1: uninit reason 1
0       22:58:34.237    test EURUSD.z,M1: OnDeinit сработал 75190
0       22:58:34.247    Custom indicator test EURUSD.z,M1: removed


Peut-être que cela vous dira d'où vient le problème...

 
eevviill:

Veuillez demander aux développeurs une réponse simple.

Lorsque le terminal est fermé, la fonction DeInit() est-elle exécutée dans les programmes attachés à la carte ?

A proprement parler, non.

OnDeinit est exécuté. DeInit ne sera exécuté que si vous l'appelez explicitement depuis OnDeinit.

Si vous faites référence à l'ancienne fonction deinit, n'oubliez pas que les noms de fonction sont sensibles à la casse. C'est-à-dire que deInit est une fonction inconnue, deinit est un point d'entrée standard sur la désinitialisation (comme OnDeinit).

 
eevviill:

Et cela n'a pas d'importance que dans deinit la mise à zéro a lieu lorsque le terminal est fermé ?

Qui s'en soucie ? Lorsque vous fermez le terminal, ces tampons ne sont plus nécessaires, car ils sont immédiatement libérés lorsque le programme est déchargé, ce qui se produit immédiatement après OnDeinit.

Essayez simplement de changer la période de temps. OnDeinit fonctionnera, les tampons resteront (car le programme n'est pas déchargé dans ce cas), mais personne ne garantit leur contenu de la "vie antérieure".

Lisez enfin la documentation ! https://docs.mql4.com/ru/runtime/running et https://docs.mql4.com/ru/runtime/event _fire#deinit

 
stringo:

Qui s'en soucie ? Lorsque vous fermez le terminal, ces tampons ne sont plus nécessaires, car ils sont immédiatement libérés lorsque le programme est déchargé, ce qui se produit immédiatement après OnDeinit.

Essayez simplement de changer la période de temps. OnDeinit fonctionnera, les tampons resteront (puisque le déchargement du programme n'a pas lieu dans ce cas), mais personne ne garantit leur contenu de la "vie antérieure".

Lisez enfin la documentation ! https://docs.mql4.com/ru/runtime/running et https://docs.mql4.com/ru/runtime/event _fire#deinit

Donc, dans mon cas, les tampons sont déjà divisés lorsque le graphique est rouvert ?
 
eevviill:
Donc dans mon cas, les tampons sont bifurqués lorsque le graphique est rouvert ?

Vous n'avez pas de bifurcation de tampon.

C'est ainsi que vous remplissez vous-même votre tampon. La première fois, lorsque vous le dessinez ; la deuxième fois, lorsque vous obtenez une partie des données. Les deux fois, vous opérez avec la même valeur Time[0].

 
stringo:

Il n'y a pas de partage de la mémoire tampon.

C'est ainsi que vous remplissez vous-même votre tampon. La première fois au moment du rendu et la seconde à l'arrivée des données. Les deux fois, vous opérez avec la même valeur Time[0].

OK.

Veuillez corriger l'aide en anglais et c'est tout.

L'aide en anglais indique également queArrayInitialize ne renvoie rien.

Raison: