Erreurs, bugs, questions - page 1699

 
fxsaber:
Ça ne marche pas.

Voici le code complet :

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
//if(handle!=INVALID_HANDLE)
   if(prev_calculated!=0)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
         Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

et une impression :

2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.318 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 18992.0
2016.09.23 12:34:03.319 2 (SBRF-12.16,M1)       
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       BufferCopy[0] = 265.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 12498.0
2016.09.23 12:34:03.502 2 (SBRF-12.16,M1)       
... экономия бумаги :)
2016.09.23 12:34:31.804 2 (SBRF-12.16,M1)       
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 5343.0
2016.09.23 12:34:33.159 2 (SBRF-12.16,M1)       
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       BufferCopy[0] = 614.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       Buffer[rates_total-1] = 17815.0
2016.09.23 12:34:36.870 2 (SBRF-12.16,M1)       
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:34:38.445 2 (SBRF-12.16,M1)       #4 OnDeinit
Dossiers :
2.mq5  3 kb
 
Karputov Vladimir:

Voici le code complet :

et une impression :

Ça ne marche pas pour moi - ça ne va même pas jusqu'à OnDeinit.

Et remarquez que mes chiffres correspondent dans le journal, mais pas les vôtres. Mon journal

PP      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
FE      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 13573.0
IQ      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 13573.0
CF      0       12:41:08.169    Test3 (RTS-12.16,H1)    
JO      0       12:41:08.169    Test3 (RTS-12.16,H1)    OnCalculate
QI      0       12:41:08.169    Test3 (RTS-12.16,H1)    BufferCopy[0] = 25434.0
NM      0       12:41:08.169    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 25434.0
MJ      0       12:41:08.169    Test3 (RTS-12.16,H1)    
DJ      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
QO      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 9469.0
HK      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 9469.0
CM      0       12:41:08.187    Test3 (RTS-12.16,H1)    
JF      0       12:41:08.187    Test3 (RTS-12.16,H1)    OnCalculate
OS      0       12:41:08.187    Test3 (RTS-12.16,H1)    BufferCopy[0] = 1887.0
NG      0       12:41:08.187    Test3 (RTS-12.16,H1)    Buffer[rates_total-1] = 1887.0
Je n'ai pas un seul indicateur ou EA en cours d'exécution dans mon terminal.
 
fxsaber:

Ça ne marche pas pour moi - ça ne va même pas jusqu'à OnDeinit.

Et remarquez que mes chiffres correspondent dans le journal, mais pas les vôtres. Mon journal

Je n'ai pas d'indicateur ou de conseiller expert en cours d'exécution dans mon terminal.

J'ai cette configuration :

2016.09.23 12:25:34.874 Terminal        MetaTrader 5 x64 build 1430 started (MetaQuotes Software Corp.)
2016.09.23 12:25:34.876 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M  @ 2.50 GHz, RAM: 2446 / 8077 Mb, HDD: 40118 / 233310 Mb, GMT+02:00
2016.09.23 12:25:34.876 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

(Après avoir redémarré le thermique, onglet journal, trois premières lignes)

 
Karputov Vladimir:

J'ai cette configuration :

(Après avoir redémarré le thermal, onglet Journal, trois premières lignes)

2016.09.23 12:42:22.405 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.09.23 12:42:22.405 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700 K  @ 3.50 GHz, RAM: 8098 / 16301 Mb, HDD: 6387 / 30000 Mb, GMT+02:00
2016.09.23 12:42:22.405 Terminal        BCS Broker MetaTrader 5 Terminal x64 build 1430 started (BCS Broker)
 
fxsaber:

Ambiguës. Sur une machine x32 :

2016.09.23 13:23:55.052 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
2016.09.23 13:23:55.052 Terminal        Windows 10 Home (X86 based PC), IE 11.00, UAC, Intel Atom  Z3740 @ 1.33 GHz, RAM: 607 / 1931 Mb, HDD: 20500 / 49784 Mb, GMT+02:00
2016.09.23 13:23:55.049 Terminal        MetaTrader 5 build 1430 started (MetaQuotes Software Corp.)


Ça ne marche pas.

 
Andrey Barinov:
Ils "décrochent", mais il y aura une erreur de compilation lorsqu'on essaiera de les appeler.

Je n'en ai pas besoin de cette façon, j'essaie de faire beaucoup de travail pour me faciliter la vie à l'avenir.

J'ai résolu mon problème de cette façon : dans le parent, tous les protecd et l'héritage vont sous protecd puis override.

 
Karputov Vladimir:

Ambiguës. Sur une machine x32 :


Ça ne marche pas.

La demande a été faite, même si j'en ai assez de le faire si souvent.
 
fxsaber:

Comment connaître ma poignée sur un graphique dans un indicateur ?ChartIndicatorName ne convient pas, car il renvoie un nom court. Et avec le même nom, il se peut que le même indicateur fonctionne déjà avec des paramètres d'entrée différents.

J'ai besoin qu'il soit capable de supprimer l'indicateur du graphique et des calculs.

Vous l'avez peut-être déjà compris, mais je vais le préciser, au cas où. Le handle de l'indicateur n'est en fait que la référence à la description de l'indicateur dans le programme qui l'a créé (c'est-à-dire Expert Advisor, indicateur, script), nous pouvons le considérer comme une sorte de "numéro". Cela signifie que ce "nombre" n'a aucune signification en dehors du programme qui a créé l'indicateur (qui a obtenu son handle). Même le programme qui appelle la fonction ChartIndicatorGet() n'obtient pas un handle global d'indicateur, il crée seulement la description de cet indicateur et alloue son "numéro" pour l'adressage. Il n'existe pas de poignée indicatrice globale, unique dans tout le terminal.

L'utilisation du nom court est visible dans les exemples. Vous pouvez le faire :

   string short_name="unknown ma";
   switch(InpMAMethod)
     {
      case MODE_EMA :  short_name="EMA";  break;
      case MODE_LWMA : short_name="LWMA"; break;
      case MODE_SMA :  short_name="SMA";  break;
      case MODE_SMMA : short_name="SMMA"; break;
     }
   IndicatorSetString(INDICATOR_SHORTNAME,short_name+"("+string(InpMAPeriod)+")");

Cela résout le problème du " mêmeindicateura déjà été exécuté avec des paramètres d'entrée différents".

Et visuellement, il est plus clair quel indicateur fonctionne :


 
Anton:

Vous l'avez peut-être déjà compris, mais je vais le préciser, au cas où. Le handle de l'indicateur n'est en fait qu'une adresse vers la description de l'indicateur à l'intérieur du programme qui l'a créé (i.e., Expert Advisor, indicateur, script), nous pouvons le considérer comme une sorte de "numéro". Cela signifie que ce "nombre" n'a aucune signification en dehors du programme qui a créé l'indicateur (qui a obtenu son handle). Même le programme qui appelle la fonction ChartIndicatorGet() n'obtient pas un handle global d'indicateur, il crée seulement la description de cet indicateur et alloue son "numéro" pour l'adressage. Il n'existe pas de poignée indicatrice globale, unique dans tout le terminal.

Vous pouvez voir l'utilisation de ShortName dans les exemples. Vous pouvez le faire comme ça :

Cela résout le problème du " mêmeindicateura déjà été exécuté avec des paramètres d'entrée différents".

Et visuellement, il est plus facile de comprendre quel indicateur fonctionne :

Merci, c'est à peu près comme ça que Stringo me l'a expliqué il y a quelque temps. J'ai trouvé plusieurs façons de déterminer que la poignée appartient à "moi" :

  1. Je modifie la valeur extrême du tampon de l'indicateur et la compare avec la valeur correspondante du CopyBuffer. Si ça correspond, c'est "moi". C'est l'idée derrière l'indicateur indélébile.
  2. Je change ShortName et je compare avec ChartIndicatorName.

 
fxsaber:

C'est l'idée derrière l'indicateur inamovible.

S'agit-il d'organiser un lien avec "lui-même" ? Donc ce n'est pas "j'ai", c'est vous qui avez écrit l'indicateur de façon si exotique.

Si vous êtes dérouté par ce comportement de l'indicateur, ne le faites pas.

Où l'ajouter et comment il pourrait au moins théoriquement aider. C'est un bug dans le terminal. Il s'agit d'un bogue grave. J'ai eu de la chance - je vois dans le journal que l'indicateur fonctionne. Cependant, il y a beaucoup d'indicateurs qui fonctionnent dans le terminal sans aucune information à leur sujet. Mais le sujet se pose, et pourquoi mon CPU est si chargé sur un terminal vide ?

Il existe de nombreuses façons de se "tirer une balle dans le pied". L'indicateur peut être banalisé. Et il est beaucoup plus facile de le faire par accident que d'écrire accidentellement votre conception. S'agit-il également d'un "bug terminal" ?

Raison: