Bogue MQL5 lors du travail avec l'accès aux séries chronologiques iClose/iOpen, etc. - page 9

 
Vitaly Muzichenko:

Il sera donc possible d'avoir un indicateur très rapide avec une telle construction ?

Plus probablement, OnCalculate ne sera pas appelé à chaque tic, mais après un paquet de tic.


Si c'est le cas, c'est une excellente nouvelle !

 
Renat Fatkhullin:

Nous avons une idée pour les indicateurs, qui ne contiennent pas le flag #property tester_everytick_calculate, d'inclure le mode de calcul sur la base de l'acceptation du paquet de ticks, au lieu de chaque tick.

Cela résoudra radicalement le problème des indicateurs en retard, en préservant la possibilité d'un traitement garanti de chaque tick pour certains indicateurs.

Je propose une autre solution.

SymbolInfoTick

Renvoie les prix actuels d'un symbole spécifié dans une variable de type MqlTick.

bool  SymbolInfoTick( 
   string    symbol,     // символ 
   MqlTick&  tick        // ссылка на структуру
   bool      IndicatorMode = true; // индикаторный или реальный (текущий) тик
   );

Paramètres

symbole

[Nom du symbole.

tique .

[out] Une référence de structure de typeMqlTick, les prix actuels et l'heure de la dernière mise à jour des prix y sont placés.

IndicatorMode

[out] true - les indicateurs retournent le tick qui a déclenché le NewCalculate actuel, false - le tick actuel (temps réel) d'un symbole.

Valeur retournée

Renvoie la valeur true (vrai) en cas de succès, false (faux) dans le cas contraire.


Ensuite, dans OnCalculate, il suffira d'écrire seulement cette construction

// Возвращает true, если текущий и индикаторный тики совпадают
bool IsRealTick( void )
{
  MqlTick Tick1, Tick2;
  
  return(SymbolInfoTick(_Symbol, Tick1) && SymbolInfoTick(_Symbol, Tick2, false) && (Tick1.time_msc == Time2.time_msc));
}

int OnCalculate( ... )
{
  if (prev_calculated && !IsRealTick())
    return(prev_calculated); // Если тик устарел, идем к следующему
    
  // Body
  
  return(rates_total);
}

Cette solution serait plus souple et plus pratique à utiliser et à mettre en œuvre.


SZY Il serait préférable d'avoir une numérotation des ticks, avec la possibilité d'obtenir le numéro du tick actuel et du tick indicateur. Mais cette variante est plus difficile pour les développeurs. C'est pourquoi, probablement, ce n'est pas nécessaire.

 
fxsaber:

Je propose une autre solution.

Si les développeurs ne font rien (ce qui est une très bonne option, d'ailleurs), il est toujours possible de contourner tous les freins de cette manière

int OnCalculate( ... )
{
  static ulong MinTimeMsc = 0
  const ulong StartTime = GetMicrosecondCount();
  
  MqlTick Tick;
  const bool Res = prev_calculated && SymbolInfoTick(_Symbol, Tick);
  
  if (Res && (Tick.timeMsc < MinTimeMsc))
    return(prev_calculated); // Если тик устарел, идем к следующему
    
  // Body
  
  if (Res)
    MinTimeMsc = Tick.time_msc + (GetMicrosecondCount - StartTime) / 2000;
  
  return(rates_total);
}
 
fxsaber:

Si les développeurs ne font rien (ce qui est une très bonne option, d'ailleurs), il est possible de contourner tous les freins maintenant de la manière suivante

Nous n'avons pas besoin de ticks au milieu d'une barre, ils sont de toute façon forcés de sauter. Attendons la mise en œuvre par mql.

 
Unicornis:

Nous n'avons pas besoin de ticks au milieu d'une barre, ils sont de toute façon forcés de sauter. Attendons l'implémentation de mql.

Honnêtement, je ne comprends pas, qu'est-ce qui a empêché les malades d'écrire eux-mêmes une solution à leur problème ?

Et pourquoi les développeurs devraient-ils changer quelque chose ici ?


La solution peut être implémentée comme un fichier mqh et connectée à n'importe quel indicateur, comme elle est implémentée dans Init_Sync. Mais cela nécessite beaucoup de code qui n'est pas très évident. Et ici, c'est juste quelques lignes.

Init_Sync
Init_Sync
  • www.mql5.com
Если в MT изменить таймфрейм или имя символа чарта, то все индикаторы на чарте выгрузятся с чарта и загрузятся на него снова. При этом, в отличие от MT4, в MT5 последовательность выгрузиться/загрузиться не определена из-за особенности внутренней архитектуры. Данное обстоятельство иногда вызывает не сразу очевидные проблемы, связанные с тем, что...
 
Renat Fatkhullin:

La mise à jour figée du délai invisible d'une autre personne après la communication de reconnexion a été résolue et corrigée. La raison en était des statuts de cache incorrects après la reconnexion.

La version bêta 1946 est disponible via Aide -> Vérifier les mises à jour du bureau -> Dernière version bêta.

Rinat, 3 jours de tests sans problèmes, merci !

 
fxsaber:

Honnêtement, je ne comprends pas ce qui a empêché les malades d'écrire eux-mêmes une solution à leur problème ?

Et pourquoi les développeurs devraient-ils changer quelque chose ici ?

Les personnes atteintes ne peuvent en aucun cas modifier le nombre de ticks entrants dans l'indicateur, elles les sautent dans l'indicateur jusqu'à une nouvelle barre, si l'indicateur compte pendant une longue période, les ticks sont de toute façon sautés. D'une manière ou d'une autre, nous devons nous adapter à la réalité.

Si pour un symbole la valeur maximale est de ~800 ticks par minute, alors pour le synthétique de plusieurs symboles déjà 2300 ticks par minute. L'ouverture d'un synthétique et d'un symbole de celui-ci culmine à ~3000 ticks par minute. Ajoutez un autre cadre temporel du même synthétique et du même symbole, et nous obtenons... Ok, les écrans d'Elder étaient au nombre de trois, on obtient ~9000 ticks par minute ou 150 ticks par seconde. Rinat a déjà écrit sur les questions de performance. Pourquoi faire passer 150 ticks par seconde dans un indicateur multi-symboles-mtf alors que vous avez besoin de 1-n tick par minute pour tous les symboles tf ? De même, les avantages de l'hébergement mql incluent l'absence de frais généraux du système hôte, le terminal est le même hôte uniquement pour les indicateurs et les EA. Si le calcul de l'indicateur consiste en RSI(3) + EMA(5) + EMA(7), alors bien sûr aucun problème dans les 10 prochaines années.

Dans le synthétique (en fait, il s'agit d'un indicateur multi-symboles du terminal), les développeurs ont eu l'idée de coller quelques symboles, pourquoi devrions-nous reproduire les éléments de ce système (supposons qu'il ne soit même pas parfait) au niveau du savoir-faire du programmeur dans l'indicateur ? Si le système peut être simplifié, pourquoi ne pas le faire ? Quand la Terre tenait encore sur trois éléphants, ils ont inventé le temps de 5 secondes pour une raison.

Mises à jour. Vous pouvez introduire le cadre temporel 5 secondes sans historique et les ticks seront seulement une fois en 5 secondes, et pour tester toutes sortes de solutions (compiler un indicateur avec un certain préfixe pour travailler seulement sur 5S, d'autres indicateurs ne fonctionneront pas dessus) - l'idéologie existante du terminal ne changera pas, donc nous pouvons changer et modifier les solutions, et la meilleure/optimale solution sera formée pendant le test.

(LMS à vos bibliothèques de développement, synthétiques, fenêtres détachées, etc. Développeurs).

 
Unicornis:

Même s'il y a un million de tics par minute, cela ne rend pas la solution inapplicable.

 
fxsaber:

Un million de tics par minute ne rend pas la solution inapplicable.

La question ne porte pas sur l'applicabilité de la solution. Le bien-fondé d'appeler l'indicateur à chaque tick atteint avant lequel un nombre inconnu de ticks a été manqué, de plus, une certaine obsolescence d'un tick est considérée ? Si quelque chose est sauté (avec une charge croissante) et que la pertinence de la coche n'est pas connue, alors cette situation ne résout pas le problème analytique - sinon, pourquoi s'en préoccuper. En général, interdisez le flux de ticks dans les indicateurs, laissez les ticks à l'indicateur depuis la plateforme une fois toutes les 5 secondes - 12 ticks par minute, c'est suffisant.

 
Unicornis:

La question ne porte pas sur l'applicabilité de la solution. Le bien-fondé de l'appel de l'indicateur à chaque tick atteint avant lequel un nombre inconnu de ticks a été manqué, en plus de l'obsolescence d'un tick est considéré comme ? ??? Si quelque chose est sauté (avec une charge croissante) et que nous ne connaissons pas la pertinence de la coche, alors cette situation ne résout pas le problème analytique - sinon, pourquoi s'en préoccuper. En général, le flux de ticks dans les indicateurs doit être interdit, il faut laisser les ticks provenant de la plateforme toutes les 5 secondes - 12 ticks par minute, c'est suffisant.

Stupidité.