mql5 - ligne verticale après un certain temps depuis la dernière transaction - page 2

 
Vladimir Karputov:

Je voudrais clarifier le terme "dernier échange".

S'agit-il de la dernière transaction de la journée en cours ? Ou depuis les N derniers jours ?

La dernière transaction dans les 24 heures - il n'est pas nécessaire de remonter plus loin dans l'histoire.

 
renatmt5:

la dernière transaction dans les 24 heures - pas besoin d'aller plus loin dans l'histoire.

Voici comment cela fonctionne :

L'indicateur utilise le code pour créer, déplacer et supprimer une ligne verticale de l'aideOBJ_VLINE. (seule la création de ligne fonctionne dans l'indicateur jusqu'à présent). Le nom de la ligne est défini dans le paramètre d'entrée"Vertical line name".

Dernière transaction Déplacement Ligne verticale

Laligne verticale est créée dans OnOnit() :

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   VLineCreate(0,InpVLineName);
//---
   return(INIT_SUCCEEDED);
  }


Pour minimiser la charge, nous interrogeons l'historique une fois par minute. Pour cela, déclarons la variableExtLastMove dans la zone des variables globales de notre programme (dans ce cas, dans l'indicateur)

//---
datetime ExtLastMove=0;                   // "0" -> D'1970.01.01 00:00';

- cette variable stocke l'heure de la dernière requête à l'historique des transactions.


Ensuite, dans OnCalculate(), nous soustrayons l'heure stockéeExtLastMove de l'heure actuelle (heure de la dernière cotation en utilisant n'importe quel symboleTimeCurrent) et si la différence est inférieure à 60 secondes, nous sortons.

//---
   datetime time_current=TimeCurrent();
   if(time_current-ExtLastMove<60) // 60 seconds
      return(rates_total);
   ExtLastMove=time_current;

si la différence est plus grande, alors nous enregistrons une nouvelle heure dansExtLastMove.


L'historique des transactions est accessible à l'aide de LastProfitForPeriod().

Deux dates sont utilisées ici : de et à. La date "To" est fixée au futur (l'heure actuelle plus un jour), ladate "From" est obtenue en soustrayant 24 heures à l'heure actuelle.

   datetime from_date   = time_current-60*60*24;   // time one day ago
   datetime to_date     = time_current+60*60*24;   // time from the future :)
   double   last_profit = LastProfitForPeriod(from_date,to_date);

   Comment("Last profit: ",DoubleToString(last_profit,2));


C'est tout pour le moment, ça fait beaucoup de texte...

 
Vladimir, merci beaucoup pour votre code et surtout pour les commentaires sur ses fragments !
Je ne comprends pas seulement, pourquoi nous avons besoin de to_date égale au futur ? Peut-être jusqu'au moment présent ? Il semble que nous ne pouvons pas déterminer le résultat de l'accord dans le futur :) Ou avons-nous besoin de ce jour dans le futur pour tracer la ligne dans le temps futur ?
Une autre question sur la boucle.
D'après ce que je comprends, nous chargeons un tableau avec des données sur les transactions et nous parcourons le tableau en boucle de la transaction zéro à la dernière, en comparant l'heure avec la dernière écrite et en écrasant la variable last_time, si l'heure de la transaction est ultérieure. Ou peut-être que l'inverse est vrai - le tableau peut être recherché à partir de la fin ? En fait, le dernier élément du tableau sera la dernière transaction fermée pour laquelle nous avons besoin de données ?
Je fais peut-être quelques erreurs de logique - ne me jugez pas trop sévèrement :)
 
signifiait for(uint i=0;i<total;i++) changer en for(uint i=total;i>=0;i--)
 
En fait, vous n'avez pas besoin non plus d'une boucle - vous adressez simplement l'élément du tableau avec le numéro ordinal i=total
 
Je ne comprends pas pourquoi nous avons besoin de to_date égal à frapper dans le futur ?

C'est ce qu'il nous faut. Pour obtenir la garantie "de" et "à" l'heure actuelle.

Ou peut-être est-il possible d'effectuer une recherche dans le tableau depuis la fin ?

Si la tâche consiste à trouver la dernière offre, alors le tableau doit être parcouru et rechercher précisément l'heure - juste au cas où quelque chose se produirait ou que la logique interne du noyau soit modifiée et que les offres soient remises à zéro de manière aléatoire.

 
Vladimir Karputov:

C'est comme ça qu'il faut faire. Pour avoir la garantie d'obtenir "de" et à l'heure actuelle.

Si la tâche consiste à trouver la dernière offre, alors Array doit passer en revue et rechercher l'heure exacte - juste au cas où quelque chose se produirait ou que la logique interne du noyau change et que les offres soient éliminées de manière aléatoire.

Ok, je l'ai. En principe, étant donné la limitation de l'historique à 24 heures, il est clair qu'il n'y aura pas de charge significative lors de la consultation des données :)

 
renatmt5:

OK, je l'ai. En principe, étant donné la limite de l'historique de 24 heures, il est clair qu'il n'y aura pas de charge de travail importante lors de l'examen des données :)

La touche finale consiste donc à déplacer la ligne en fonction du bénéfice réalisé.

Vous vous rappelez quelles sont les règles de déménagement là-bas ?

 
Je comprends bien que last_time et result sont les variables avec lesquelles nous travaillons. Le résultat détermine de combien de temps la ligne sera décalée (redessinée) dans le futur. Ensuite, le bloc de code "Profit pour la période" doit être placé avant le bloc "Déplacer la ligne verticale" pour déplacer la ligne en tenant compte des données de la dernière transaction.
Est-ce correct ou est-ce que je confonds quelque chose ?
 

Voici une explication de la raison pour laquelle le paramètre "avant" devrait être fait à l'avenir :

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

Erreurs, bugs, questions

Renat Fatkhullin, 2016.11.04 12:43

Ne faites jamais TimeCurrent() comme date de fin, faites TimeCurrent()+86400 pour vous assurer que toutes les transactions de fin sont capturées.

TimeCurrent n'est pas la dernière heure exacte, mais la "dernière heure connue du serveur pendant les mises à jour", qui n'est pas exacte à 100%. Surtout au début.


Raison: