Erreurs, bugs, questions - page 2930

 

Erreur critique pendant le débogage :

struct sA
  {
   int               i;
   string            s;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
public:
   sA                my_array[];
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   cA *ca;
   ca=new cA();
   ArrayResize(ca.my_array,1);
   ZeroMemory(ca.my_array);
   ArrayPrint(ca.my_array);
  }

Résultat :

2020.12.27 17:04:26.966 1 (EURUSD,M1)   Access violation at 0x000001FE5AF10199 read to 0xFFFFFFFFFFFFFFFF in 'D:\Alpari MT5\MQL5\Scripts\Test\1.ex5'
2020.12.27 17:04:26.967 1 (EURUSD,M1)      crash -->  000001FE5AF10199 8B4318            mov        eax, [rbx+0x18]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF1019C 4089442420        mov        [rsp+0x20], eax
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A1 41B910000000      mov        r9d, 0x10
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A7 49B8B807F15AFE01  mov        r8, 0x1fe5af107b8
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B1 488D17            lea        rdx, [rdi]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B4 48B998D45F5FFE01  mov        rcx, 0x1fe5f5fd498
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101BE 49FF96A8120000    call       qword near [r14+0x12a8]  ; #11378 (terminal64.exe)
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
2020.12.27 17:04:26.967 1 (EURUSD,M1)   00: 0x000001FE5AF10199
2020.12.27 17:04:26.967 1 (EURUSD,M1)   01: 0x000001FE633F0010
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
Dernière version bêta pour le moment
Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Quelqu'un a-t-il trouvé un moyen de faire en sorte que la poignée d'un indicateur affiche une propriété dans la fenêtre principale ou dans une sous-fenêtre ? Je parle des indicateurs tiers arbitraires qui sont créés à l'aide d'IndicatorCreate et qui peuvent ensuite être ajoutés au graphique à l'aide deChartIndicatorAdd à la demande de l'utilisateur.
 
Stanislav Korotky:
Quelqu'un a-t-il trouvé un moyen de faire en sorte que la poignée de l'indicateur affiche une propriété dans la fenêtre principale ou dans une sous-fenêtre ? Je parle des indicateurs personnalisés qui sont créés à l'aide d'IndicatorCreate et qui peuvent ensuite être ajoutés au graphique à l'aide de ChartIndicatorAdd.

Vous pourriez probablement glisser l'indicateur dans OBJ_CHART et voir où il est positionné.

 
Stanislav Korotky:
Quelqu'un a-t-il trouvé un moyen d'obtenir une propriété d'affichage à partir d'une poignée d'indicateur dans la fenêtre principale ou secondaire ? Je parle des indicateurs personnalisés qui sont créés en utilisant IndicatorCreate et qui peuvent ensuite être ajoutés au graphique par ChartIndicatorAdd à la demande de l'utilisateur.

a fait quelque chose de similaire.
En voici un que j'ai trouvé. Je ne me souviens pas si ça marche ou pas. Jetez-y un coup d'œil.

bool FindIndicatorByHandle(long handle, string &symbol, ENUM_TIMEFRAMES &timeframe, long &ChartId, int &sub_win, string &Name) {
   long chart_id =ChartFirst();
   while (chart_id!=-1) {
      int total_sub = (int)ChartGetInteger(chart_id,CHART_WINDOWS_TOTAL);
      int total_ind; 
      for(int i=0; i<total_sub; i++) {
         total_ind = ChartIndicatorsTotal(chart_id,i);
         for (int j=0; j<total_ind; j++) {
            string name = ChartIndicatorName(chart_id,i,j);
            if (ChartIndicatorGet(chart_id,i,name)== handle) {
               ChartId=chart_id;
               symbol= ChartSymbol(chart_id);
               timeframe=ChartPeriod(chart_id);
               sub_win=i;
               Name=name;
               return true;
            }
         }
      }
      chart_id=ChartNext(chart_id);
   }
   return false;
}
Le code recherche tous les graphiques ouverts pour un indicateur par son handle. Renvoie le symbole, le cadre temporel, l'identifiant du graphique, la sous-fenêtre et le nom de l'indicateur.
 
fxsaber:

Je suppose que vous pourriez placer l'indicateur dans OBJ_CHART et voir où il se trouve.

Je vais essayer, pour l'instant j'ai dû faire l'option de le spécifier par l'utilisateur.

 
Nikolai Semko:

a fait quelque chose de similaire.
En voici un que j'ai trouvé. Je ne me souviens pas si ça marche ou pas. Jetez-y un coup d'œil.

A en juger par le code, il recherche dans tous les graphiques ouverts un indicateur par son handle. Renvoie le symbole, le cadre temporel, l'identifiant du graphique, la sous-fenêtre et le nom de l'indicateur.

Cela ne correspond pas à votre question : les indicateurs créés par IndicatorCreate ne sont pas placés dans une fenêtre - ils sont "assis" à l'intérieur de celle-ci, et la tâche consiste à placer un tel indicateur par sa poignée dans la fenêtre. Maintenant, MQL5 vous permet d'ajouter un handle arbitraire à la fenêtre principale ou sous-fenêtre en utilisant la fonction ChartIndicatorAdd, indépendamment des "propriétés" de l'indicateur (pas d'erreurs !), et le résultat est très étrange lorsque l'ajout n'est pas effectué comme prévu.

 

Il y a un plus gros problème avec les indicateurs.

Certains d'entre eux mettent en œuvre le gestionnaire OnCalculate selon la version simplifiée avec un seul tableau d'entrée, et pour eux, vous pouvez sélectionner le type de prix pour le calcul. Comment savez-vous, à partir du programme MQL5 tiers, que l'indicateur attend ce type de prix, qui doit être passé après tous les paramètres lors de la création de l'indicateur ? Il semble qu'il n'y ait aucun moyen. Et si vous ne le faites pas, l'indicateur est dessiné par #property indicator_applied_price qui n'est pas accessible de l'extérieur. Voici un conseiller expert simple qui ajoute l'indicateur/AMA au graphique de manière programmatique :

int OnInit()
{
  const int h = iCustom(NULL, 0, "Examples/AMA");
  if(h == INVALID_HANDLE)
  {
    Print("iCustom failed: ", _LastError);
    return INIT_FAILED;
  }

  if(!ChartIndicatorAdd(0, 0, h))
  {
    Print("ChartIndicatorAdd failed: ", _LastError);
    return INIT_FAILED;
  }
  ChartRedraw();
  
  return INIT_SUCCEEDED;
}

Si après cela nous changeons le cadre temporel du graphique, nous obtenons 2 indicateurs AMA : un au prix de clôture (créé programmatiquement) et un au prix d'ouverture (généré en raison du changement de cadre temporel et de la #property indicator_applied_price PRICE_OPEN ; il n'est pas clair pourquoi cette propriété n'est pas prise en compte par iCustom également).

 

Pour continuer le thème des indicateurs, je joins l'Expert Advisor que j'ai utilisé pour découvrir et éviter le problème des paramètres MqlParam.

La tâche de l'Expert Advisor est d'ajouter l'indicateur "Examples/Price_Channel" au graphique, s'il n'y est pas encore, avec les mêmes paramètres.

Pour ce faire, nous créons une instance en utilisant iCustom/IndicatorCreate, nous obtenons un tableau de ses paramètres à travers IndicatorParameters, puis nous appelons dans la boucle IndicatorParameters pour les indicateurs qui existent déjà dans le graphique : s'il n'y a pas de correspondance des paramètres du tableau, l'indicateur est ajouté au graphique, s'il y a une correspondance, le nouveau handle est simplement détruit.

Le problème est que l'égalité des paramètres ne fonctionne pas toujours comme prévu. En particulier, il existe un tel cas de test à sécurité intégrée. Nous plaçons l'Expert Advisor sur un graphique vide et nous cliquons - cela crée la première instance de l'indicateur. Ensuite, nous passons à n'importe quel autre cadre temporel de graphique (l'ancien indicateur reste) et nous cliquons à nouveau. Bizarrement, la deuxième instance de l'indicateur est créée.

D'après l'analyse de l'exécution et du journal, il est clair que cela est dû à une mauvaise égalisation des chaînes de caractères du nom de l'indicateur dans les paramètres. Les chaînes de caractères y sont longues de 260 caractères, mais le terminal 0 est situé beaucoup plus tôt. Ensuite, il y a soit des informations sur le service, soit des déchets. La comparaison de chaînes de caractères "==" ou StringCompare prend donc en compte ces "déchets" et nous obtenons l'inégalité des chaînes de caractères.

Si nous convertissons les chaînes de caractères en un tableau de caractères, les tableaux obtiennent une correspondance complète. Si vous convertissez en un tableau court, vous obtenez des déchets. En somme, un comportement non cohérent non décrit dans la documentation.

Window N: 1
   0, Price Channel(22), 12
    [type] [integer_value] [double_value]                                                                                                                                                                                                                                                         [string_value]
[0]     14               0          0.000 "Indicators\Examples/Price_Channel"                                                                                                                                                                                                                                   
[1]      7              22          0.000 null                                                                                                                                                                                                                                                                  
ind1: 'Indicators\Examples/Price_Channel
ind2: 'Indicators\Examples/Price_Channel
260 0 / 260 0
Char arrays 34 34
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
Short arrays 260 260
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0     0     0     0     0     0     0     0     0     0
[ 48]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 72]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 96]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[120]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0    13  3328 58074    86 13696    54     0     0 35120  3210     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     0     0     0     0 61841 38184 17648 16370     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[240]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0    32    32    77    32    65    32    82    32    75
[ 48]    32    83     0    32    99   111   109   109    97    32   115   101   112    97   114    97   116   101   100    32   108   105   115   116
[ 72]    41     0    32   112   114   111   116   111   116   121   112   101   115    41     0     0   115     0     0     0     0     0     0     0
[ 96]   528     0     0     0     0    45     0     0     3     0     0     0   512     0     0     0  1160    45     0     0  7256 30655     0     0
[120]     0     0     0     0   512     0     0     0     0 65535  2272     0 29648    45     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     3     0     0     0 26341 16284     1     0  1308    16     0     0 49814 30635     0     0     0     0     0     0 32016    37     0     0
[240]     2     0     0     0 50336 16481     1     0     2     0     0     0     3     0     0     0 45520    37     0     0
1 0

Je ne suis pas sûr de la nature exacte du bogue, que ce soit dans le principe du traitement des chaînes de caractères dans MQL ou autre chose.

Si quelqu'un connaît les nuances, donnez-moi un indice.

Dossiers :
 
Stanislav Korotky:

Si quelqu'un est au courant des nuances, veuillez me donner un conseil.

C'est le genre de fonctionnalité qui, même si vous la connaissiez, vous oblige à faire remonter toute la couche dans votre tête.

Voici la définition de l'auto-disponibilité. Ça semblait fonctionner quand on changeait de TF.

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов
 

Sur 10, on constate que la consommation de mémoire du terminal est élevée. Sur Windows Server, c'est beaucoup moins.

Apparemment, le calcul de la consommation de mémoire dépend du système d'exploitation.