Erreurs, bugs, questions - page 3031

 
Andrey Dik:

oui, mais pourquoi le kalk prev est remis à zéro sur le TF inférieur ?

parce que le retour est de 0 ;
 
Andrey Dik:

oui, mais pourquoi la remise à zéro du kalc est sur le TF bas ?

il existe de nombreuses variantes, nous ne connaissons pas l'implémentation


il y a eu une discussion similaire à propos de MT4 l'année dernière, l'un des développeurs (je crois que c'est Slava) a dit que chaque accès à l'"ancien TF" initie la synchronisation des données, si elle est requise.....

Je pense que dans MT5, le terminal construit également TF par lui-même, si nécessaire, mais si il y avait des retards de réseau ou ..... mise en œuvre est inconnue ... ensuite le terminal, avant de donner les données à l'indicateur sur un TF senior, synchronise les données historiques avec le serveur, quand cela se produit instantanément, et quand, peut-être, cela prend du temps, c'est quand il sera probablement pre_calculé = 0

 
Igor Makanu:

il y a beaucoup d'options, nous ne connaissons pas la mise en œuvre

Si le téléchargement modifie les données historiques du TF bas, le compteur du TF bas sera forcé à zéro par le terminal, ne faites pas de problèmes à l'improviste.

 
Andrey Dik:

vous prouvez mon point de vue, camarade.

Je ne suis pas... un camarade du codeur. Ce n'est pas une confirmation, c'est un indice, ne renvoyez pas 0. Voilà tous vos problèmes. Vous provoquez vous-même un recalcul complet de l'indicateur.

 


prev_calculé n'augmente pas ; il sera toujours le même qu'à la fin du calcul.

return(rates_total);


c'est-à-dire que ce que l'on récupère à la sortie de OnCalculated() sera retourné au prochain tick dans prev_calculated (sauf prev_calculated == 0, le terminal fait cela lors du lancement de l'indicateur ou de la synchronisation de TF......)


Andrei Trukhanovich:

si le téléchargement modifie les données de l'historique de la TF basse, le compteur de la TF basse sera mis à zéro de manière forcée par le terminal, ne faites pas de problèmes à l'improviste.

Je lui ai écrit depuis le deuxième jour - prenez les indicateurs de Mladen et étudiez-les - ils fonctionnent, et sans aucune synchronisation compliquée entre les TF, et ici ... nous économisons des ressources et ne laissons pas le terminal former les TF appelées

 
Andrei Trukhanovich:

remplacer

à

et le tester.

Ne lui demandez pas... Il ne le croira pas de toute façon.

 
Alexey Viktorov:

Je ... ne suis pas un ami du codeur. Ce n'est pas une confirmation mais une indication, ne renvoyez pas 0. C'est ce qui cause tous vos problèmes. Vous provoquez vous-même un recalcul complet de l'indicateur.

Vous pouvez être un idiot pour donner un indice, mais tout le monde ne peut pas vous aider à comprendre et à expliquer.

 
Andrei Trukhanovich:

remplacer

à

et le tester.

Merci, Andrei. Vous êtes le seul à avoir pleinement pénétré la question.

2021.05.28 21:22:54.394 LitTF (EURUSD,M2) L'indicateur pour la période 3 n'est pas encore calculé

2021.05.28 21:22:54.396 LitTF (EURUSD,M2) L'indicateur sur la période 3 n'a pas encore été calculé.

2021.05.28 21:22:54.397 OldTF (EURUSD,M3) 0.000262 sec, 50046 barres calculées, total 50046 barres

2021.05.28 21:22:55.796 LitTF (EURUSD,M2) 0.007693 sec, 50000 barres calculées, 50000 barres totales

2021.05.28 21:24:02.286 LitTF (EURUSD,M2) Indicateur sur la période 3 pas encore calculé

2021.05.28 21:24:02.286 OldTF (EURUSD,M3) 0.000000 sec, 1 barre calculée, 50047 barres au total

2021.05.28 21:24:03.017 LitTF (EURUSD,M2) 0.000015 sec, calculé 1 barres, total barres 50001

2021.05.28 21:26:03.898 LitTF (EURUSD,M2) 0.000007 sec, calculé 1 barres, total barres 50002

maintenant tout fonctionne comme prévu, les indicateurs ont été entièrement calculés une seule fois lors de la première exécution et ensuite une seule fois pour chaque nouvelle barre.


Le code final du deuxième indicateur, j'espère qu'il sera utile à quelqu'un :

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[])
{
   ulong t = GetMicrosecondCount ();
   if (rates_total == prev_calculated) return rates_total;

   
   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return prev_calculated;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return prev_calculated;
   }

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
 
Andrey Dik:

N'importe quel imbécile peut vous donner un indice, mais tout le monde ne peut pas vous aider à comprendre et vous aider en détail.

Comptez le nombre d'imbéciles qui vous conseillent... Il n'y a qu'un seul homme intelligent qui ne peut entendre personne et qui s'entête................

Vous avez créé votre propre problème et vous essayez de présenter votre ...code comme un bug mql.

 
Andrey Dik:

Merci, Andrew. Vous êtes le seul à avoir bien compris la question.


Maintenant, tout fonctionne comme prévu, les indicateurs n'ont été entièrement calculés qu'une seule fois lors de la première exécution, puis une seule fois à chaque fois sur leur nouvelle barre.


Le code final du deuxième indicateur sera, je l'espère, utile à quelqu'un :

Voici le début de ce à quoi vous auriez dû penser

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

Bugs, bugs, questions

Alexey Viktorov, 2021.05.28 08:36

A quoi sert ce chèque ?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

Il serait plus facile d'écrire return 0 ; sans aucune condition...

A chaque nouvelle barre, la condition sera remplie et toutes les barres seront recalculées, indépendamment de la synchronisation. Vous avez écrit un code irréfléchi et vous prétendez que c'est un bug terminal...


Et Igor Makanu l'a dit encore plus tôt...