Symboles personnalisés. Erreurs, bogues, questions, suggestions. - page 18

 

Bug 24.

Les bases de données des tiques sondées et importées ne coexistent pas correctement.

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  MathSrand((int)TimeLocal());
  EventSetMillisecondTimer(20); // С такой частотой будем пробрасывать тики
}

void OnTimer()
{
  static bool FirstRun = true;
  static const string Name = _Symbol + (string)MathRand();
    
  static MqlTick Ticks[];
  static int Pos = 0;
    
  if (FirstRun)
  {    
    if (CustomSymbolCreate(Name, NULL, _Symbol) && SymbolSelect(Name, true)) // Создали символ
      PRINT(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2019.06.20' * 1000, 5)); // Взяли 5 тиков для проброса
      
    FirstRun = false;
  }
  else if (Pos < ArraySize(Ticks))
  {
    MqlTick Tick[1];
    
    Tick[0] = Ticks[Pos++];
    
    PRINT(CustomTicksAdd(Name, Tick)); // Пробросили тик.
    PRINT(CustomTicksReplace(Name, Tick[0].time_msc, Tick[0].time_msc, Tick)); // Заменили его же через импорт.
  }
  else
  {
    PRINT(CopyTicksRange(Name, Ticks)); // Взяли всю тиковую историю
    ArrayPrint(Ticks);                  // Распечатали ее.
    
    ExpertRemove();
  }
}


Résultat

CopyTicks(_Symbol,Ticks,COPY_TICKS_ALL,(ulong)D'2019.06.20'*1000,5) = 5
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CopyTicksRange(Name,Ticks) = 10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[1] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       2       0.00000
[2] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       4       0.00000
[3] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       2       0.00000
[4] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000
[5] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[6] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       6       0.00000
[7] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       6       0.00000
[8] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       6       0.00000
[9] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000


Cinq tiques ont été rééchantillonnées/importées successivement, mais 10 tiques sont trouvées dans l'historique. Au même moment, cinq ticks partent en premier, puis les mêmes cinq ticks. C'est-à-dire que même l'heure des entrées dans la base de données des tics n'est pas consécutive.

Faites attention aux drapeaux de la deuxième moitié des ticks, ils sont différents de la première.

 
Slava:

Non reproductible. Le graphique vide est mis à jour immédiatement après l'importation des barres.

Que se passe-t-il si le graphique n'est pas ouvert ? Ouvrir un graphique après avoir importé des barres.

Ou fermer et ouvrir le graphique.

Vous pouvez également mettre à jour le graphique à partir du menu contextuel du graphique.

Question tendancieuse :))

J'ai importé des barres et fermé toutes les fenêtres.

J'ai ensuite rouvert les symboles, puis je suis allé dans l'onglet Barres et j'y ai sélectionné mon symbole.

Les barres doivent-elles être visibles ? C'est vide.

Lorsque j'ai appuyé sur le bouton Charger (avec présélection de la période de couverture), ils n'apparaissent pas non plus.

J'ai essayé la version 1970 - même situation.

Ouvrir/fermer le graphique et le programme n'aide pas.

Je ne me suis pas encore attelé à la programmation.

Eh bien, il doit en être ainsi...


Si vous en avez la possibilité, connectez-vous à distance et voyez ce dont elle a besoin, s'il vous plaît.

 

https://www.mql5.com/ru/forum/147666/page2#comment_3720399

Ça pourrait aider quelqu'un.
Mais j'avais un autre problème
1) En plus du fichier 2019.hcc, le fichier 1970.hcc a été généré.
Après l'avoir supprimé, il a semblé revenir à la vie.
2. il y avait des lignes rouges où o ou h était à l'extérieur de l h

on ne sait pas très bien d'où vient l'année 1970.
il n'y avait pas de telles dates, pas de lignes vides
peut-être beaucoup de bougies, moins de 50k

il est possible de regarder, mais comment élargir le graphique plus visible l'amplitude ?
J'ai besoin de cibler précisément les extrémités des chandeliers lorsque je dessine des objets.
il n'est pas pratique de saisir les propriétés et de définir les valeurs manuellement
ça déplace le graphique à la fin et je dois le rembobiner.
Comment je fais pour qu'il ne saute pas à la dernière mesure ?

Тестер не работает
Тестер не работает
  • 2013.11.04
  • www.mql5.com
2013.11.03 17:25:58 TestGenerator: no history data 'EURUSD1' Вот такое сообщение появляется в журнале после нажатия кнопки "Старт"...
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

Stanislav Korotky, 2019.08.22 17:34

Quelqu'un a-t-il rencontré le problème suivant avec les caractères personnalisés ? La fonction CustomRatesUpdate passe des cotations normales, mais en fait le graphique et la fenêtre de données obtiennent quelque chose d'étrange (dans ce cas, les valeurs de clôture et de bas sont 100 fois inférieures à celles passées) :

Aussi, en parallèle, les ticks simples sont émulés avec CustomTicksAdd avec les mêmes valeurs de prix de clôture que dans le journal (immédiatement avant CustomRatesUpdate), c'est-à-dire qu'il n'est pas clair d'où proviennent les valeurs réduites dans les cotations.

UPD :

J'ai une situation "inverse" sur USDCAD - les cotations augmentent 10 fois après l'écriture. Voici le journal que je reçois :

2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32987 1.32987 1.32980 1.32987           457       48             0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32980 13.29730 1.32980 13.29730           457       52             0

Le premier ArrayPrint est ce qui a été écrit dans CustomRatesUpdate, et le second ArrayPrint est ce qui a été lu en utilisant CopyRates à partir de la dernière barre la plus récente immédiatement après l'écriture. Tout d'abord, la différence est le dernier chiffre de l'ouverture, mais plus important encore, le sommet et la clôture sont augmentés d'un facteur 10.

PS. En ticks, tout est OK :

 

Stanislav Korotky:

PS. Tout va bien dans les tics :

Bug 22.

 
fxsaber:

Bug 22.

Ce problème a-t-il été corrigé dans l'une des dernières versions ?

 

Qu'est-ce que l'erreur 4022 ? Ça a à voir avec le fait d'essayer d'écrire une barre à un personnage personnalisé. Mais à en juger par le code, c'est un générique.

Au début, c'était ça :

KI      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Alert: Error on writing custom record: 3082, err: 4401
HS      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Failed to add:
LE      0       16:24:20.957    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close] [tick_volume] [spread] [real_volume]
KG      0       16:24:20.957    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:06:00 1542.500 1542.500 1542.400 1542.400            15      170             0
GF      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Last known 10 M1:
JN      0       16:24:20.973    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close]       [tick_volume] [spread]       [real_volume]
JJ      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:00:00 1543.100 1543.100 1543.000 1543.000                   4      180                   0
DE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [1] 2019.08.28 00:01:00 1543.000 1543.000 1542.900 1542.900                   2      180                   0
EP      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [2] 2019.08.28 00:02:00 1542.900 1542.900 1542.800 1542.800                   1      180                   0
ES      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [3] 2019.08.28 00:03:00 1542.800 1542.800 1542.700 1542.700                   1      180                   0
EN      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [4] 2019.08.28 00:04:00 1542.700 1542.700 1542.600 1542.600                   1      180                   0
QH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [5] 2019.08.28 00:05:00 1542.600 1542.700 1542.500 1542.500                  30      170                   0
RE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [6] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000          5365435195        1 1827299883397152768
FF      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [7] 2106.02.07 06:28:16    0.078   +0.000   +0.000   +0.000 4597373804417646592        1                9481
KR      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [8] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000           136454688        1 1827300776750350336
KL      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [9] 0000.00.00 00:00:00   +0.000    2.150   +0.000   +0.000 1287860306076237824        0          4294967300
CH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) Timeout before retry...

4401 lors de l'appel deCustomRatesUpdate. Puis une lecture des 10 dernières barres pour le symbole personnalisé avec CopyRates (on peut voir quelques absurdités dans la base). Puis, à travers les timeouts, plusieurs tentatives d'écrire à nouveau une barre, jusqu'à ce que 4022 apparaisse. Puis, l'EA s'est arrêtée de manière anormale, après quoi elle a redémarré elle-même.

 

La question est la suivante.

J'ai besoin de changer dynamiquement les niveaux de stop et de gel dans un symbole personnalisé.

Il y a le code suivant pour l'EA de test :

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

En mode de débogage normal, j'obtiens une erreur uniquement dans le corps du gestionnaire OnTick(). L'erreur a le code 0.

2019.09.09 23:25:05.010 TestingLevels (EURUSD,M1)       Error code while setting a new value for the stop level: 0


En mode débogage sur l'historique, j'obtiens une erreur lors de l'initialisation. L'erreur est la suivante :

2019.09.09 23:29:43.005 2019.09.02 00:00:00   Error code: 4014

C'est-à-dire qu'il est interdit d'appeler la fonction système.

ERR_FONCTION_NON_AUTORISÉE

4014

La fonction système n'est pas autorisée à être appelée


En général, est-il possible de modifier les valeurs de stop-levelling et de free-levelling lorsque l'EA fonctionne sur un symbole personnalisé ?

 
Denis Kirichenko:

La question est la suivante.

J'ai besoin de changer dynamiquement les niveaux de stop et de gel dans un symbole personnalisé.

Il y a le code suivant pour l'EA de test :

En mode de débogage normal, j'obtiens une erreur uniquement dans le corps du gestionnaire OnTick(). L'erreur a le code 0.


En mode débogage sur l'historique, j'obtiens une erreur lors de l'initialisation. L'erreur est la suivante :

C'est-à-dire qu'il est interdit d'appeler la fonction système.

ERR_FONCTION_NON_AUTORISÉE

4014

La fonction système n'est pas autorisée à être appelée


En général, est-il possible de modifier les valeurs des levées d'arrêt et de gel lorsque l'EA fonctionne sur un symbole personnalisé ?

Et pourquoi dans les lignes OnTick()

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))

и

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))

entrer dans le corps du bloc de traitement des erreurs en cas de changement réussi de la propriété du caractère ? (sans signe " !")

 
Artyom Trishkin:

Pourquoi les lignes dans OnTick()

и

entrer dans le corps du bloc de traitement des erreurs en cas de changement réussi de la propriété du caractère ? (sans signe " !").

Artyom, merci ! Mon oubli.

Version mise à jour :

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

Tout fonctionne maintenant en mode de débogage normal. Mais pas dans le Testeur. Il continue à écrire là :

2019.09.10 07:16:49.867 2019.09.03 00:00:00   Error code: 4014