Indicateurs: Grille - page 2

 
Prival:
a posté une nouvelle version 3.09 sur Code Base, vous pouvez la télécharger.

Vous pouvez l'améliorer encore un peu.

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

Dans de telles constructions, ObjectFind() n'est évidemment pas nécessaire. Lors de la création par ObjectCreate(), une recherche similaire sera effectuée dans la liste par nom et permettra soit de créer un nouvel objet, soit de modifier les paramètres des points d'ancrage de l'objet existant.
.

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

Pour les objets créés à partir du programme MQL, cette propriété est forcée à false.

De même, il est inutile de modifier la valeur de OBJPROP_WIDTH, elle sera de toute façon égale à 1.

D'après mes mesures, ces modifications réduisent le temps de construction d'environ 10 %.

 

Merci, je m'en souviendrai. Je travaille sur quelque chose en ce moment, mais il y a un problème.

J'ai 8 graphiques ouverts avec seulement la grille.

Je simule une déconnexion du réseau pendant 5 minutes. Voici l'image après avoir rétabli le réseau. 2 graphiques se bloquent.

Je joins une nouvelle version de la grille version 4.01.

Dossiers :
setka__1.mq5  15 kb
 
Prival:

Merci, je m'en souviendrai. Je travaille sur quelque chose en ce moment, mais il y a un problème.

J'ai 8 graphiques ouverts avec seulement la grille.

Je simule une déconnexion du réseau pendant 5 minutes. Voici l'image après avoir rétabli le réseau. 2 graphiques se bloquent.

Je joins une nouvelle version de la grille, la version 4.01.

C'est une conséquence de l'architecture du terminal et de l'algorithme de l'indicateur. L'indicateur est exécuté dans le flux de symboles, c'est-à-dire que pendant son calcul, de nombreuses opérations avec l'historique sont impossibles : traitement des ticks, calcul d'autres indicateurs, synchronisation de l'historique avec le serveur, construction ou chargement de l'historique par symboles, etc.

Comme l'indicateur Grid est calculé pendant une longue période et qu'il utilise des données provenant d'autres symboles, il est souhaitable d'interrompre son calcul en cas d'erreur. Si l'on veut sérieusement ne pas réécrire le code, on peut le faire de cette façon :

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

et ainsi de suite :

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

Dossiers :
setka.mq5  15 kb
 
antt:

C'est une conséquence de l'architecture du terminal et de l'algorithme de l'indicateur. L'indicateur est exécuté dans le flux de symboles, c'est-à-dire que dans le processus de son calcul, de nombreuses opérations avec l'historique sont impossibles : traitement des ticks, calcul d'autres indicateurs, synchronisation de l'historique avec le serveur, construction ou chargement de l'historique par période de symbole, etc.

Je n'arrive pas à comprendre cette notion de flux, et j'ai lu 50 fois l'aide sur l'accès aux données (( le script y est donné en exemple. Mais je pense que j'ai commencé à comprendre. Ai-je bien compris que pendant que l'indicateur est en train d'être calculé, c'est-à-dire que la fonction a commencé à s'exécuter ?

int OnCalculate () {
toutes les ressources de l'ordinateur (terminal) sont données à cette tâche, et jusqu'à ce qu'elle soit exécutée (terminée)

return(rates_total) ; }

Vous ne devez pas faire l'une des choses suivantes

- essayer de lire l'histoire par ce symbole s'il est manquant

- demander une autre période

- demander un autre symbole

Je pense avoir compris comment refaire le programme, il faut définir toutes les lignes au premier appel et les oublier jusqu'à ce que if(prev_calculated==0).

C' est bien ça ?

S.Y.

  1. Trader - Personne qui marche sur les râteaux.
  2. Nul - négociant débutant qui n'a jamais marché sur un râteau et qui est donc sûr qu'il n'y a pas de râteau.
  3. suceur - trader qui marche régulièrement sur des râteaux mais qui reste persuadé que les râteaux n'existent pas.
  4. Spécialiste étroit - un trader qui maîtrise parfaitement la technique consistant à marcher sur le même râteau.
  5. Spécialiste large est un trader qui marche sur plus de deux râteaux en parallèle.
  6. Spécialiste des systèmes mécaniques - un trader qui est capable d'automatiser les coups de râteau.

Selon l'évaluation de Renat, j'ai atteint le niveau 5 :-)) https://www.mql5.com/ru/forum/1165/page3 a fait un pas de plus )))

 

Il n'y a pas d'autres délais à respecter.

Si cela ne vous dérange pas. Réglez les barres mac. dans la fenêtre Unlimit et passez par M15, M5 et M1. affichez le résultat dans le journal ici. j'ai quelque chose qui ne va pas sur M1 - j'ai écrit au service. Je veux juste voir si c'est juste moi ou tout le monde.

Voici mon journal.

2010.06.17 11:39:55 Grid (EURUSD,M1) Failure or first run Time= 1.2 sec for 1293476 bars ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Failure or first run Time= 0.0 sec pour 847192 barres ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Grille (EURUSD,M15) Échec ou première exécution Time= 0.0 sec pour 285186 barres ObjectsTotal= 962 _time= 2010.05.04 22:00:00

merci d'avance. grid version 4.11

 
Prival:

Je n'arrive pas à comprendre cette notion de fil, et j'ai lu 50 fois l'aide sur l'accès aux données (( le script y est donné en exemple. Et il met environ une minute à s'exécuter (c'est long), mais je crois que je commence à comprendre. Est-ce que je comprends bien que pendant que le calcul de l'indicateur est en cours, c'est à dire que la fonction a commencé à s'exécuter

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
toutes les ressources de l'ordinateur (du terminal) sont données à cette tâche, et jusqu'à ce qu'elle soit exécutée (terminée)

return(rates_total) ; }

Pas toutes les ressources. Mais la plupart des calculs liés à ce symbole attendront que OnCalculate() soit terminé.


Vous ne devez pas faire l'une des choses suivantes

- essayer de lire l'historique de ce symbole s'il est manquant

Oui. S'il n'y a pas assez d'historique pour le symbole actuel, l'exécution de OnCalculate() ne s'améliorera certainement pas.


- demander une autre période

Vous pouvez le demander, mais si les données sont manquantes ou insuffisantes, cela n'a aucun sens d'attendre dans OnCalculate(). Il en va de même pour les données d'autres indicateurs pour le symbole actuel.

- demander un autre symbole

Vous pouvez demander, théoriquement vous pouvez même attendre dans la boucle que toutes les données nécessaires apparaissent, car le traitement des données d'un autre symbole (historique, indicateurs) se fait dans un autre thread. Mais il vaut mieux ne pas le faire, la boucle d'attente dans OnCalculate() arrêtera le traitement des données du symbole actuel.

.

Je pense avoir compris comment refaire le programme : il faut définir toutes les lignes lors du premier appel et oublier si(prev_calculated==0).

La recommandation générale lors de l'écriture d'indicateurs personnalisés : si une erreur est détectée, un manque de données, arrêtez immédiatement l'exécution de OnCalculate() avec return(0). Au prochain tick, faites une nouvelle tentative de calcul sur if(prev_calculated==0).
 
Prival:

si ce n'est pas trop difficile. Réglez les barres mac. dans la fenêtre Unlimit et passez par M15, M5 et M1. Le résultat qui sera dans le journal, postez-le ici. J'ai quelque chose qui ne va pas sur M1 - j'ai écrit au service. Je veux juste voir si c'est moi ou tout le monde.

2010.06.17 11:58:59 6op0k (EURUSD,M1) Failure or first run Time=0.1sec for 4009008 bars ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Échec ou première exécution Temps=0.0sec pour 847196 barres ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Échec ou première exécution Time=0.0sec pour 285187 barres ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) Échec ou première exécution Temps=0.1sec pour 4009008 barres ObjectsTotal=403Heure=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Échec ou première exécution Temps=0.0sec pour 847196 barres ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Échec ou première exécution Temps=0.0sec pour 285187 barres ObjectsTotal=1108_time=2010.05.04 22:15:00

Merci. cela signifie que j'ai finalement tout écrit correctement et que l'"indicateur" fonctionne vraiment comme je l'avais prévu. l'échec que j'ai eu est un problème du terminal (vous avez tout normal). _time=2010.06.15 07:45:00). c'est dommage que les développeurs soient silencieux dans le service dex. au moins ils écriraient quelques mots (( comme

problème reproduit...nous pensons...merci

 
Prival:

merci. cela signifie que j'ai finalement tout écrit correctement et que l'"indicateur" fonctionne vraiment comme je l'avais prévu. l'échec que j'ai eu est un problème avec le terminal (vous vous débrouillez bien. _time=2010.06.15 07:45:00). il est dommage que les développeurs soient silencieux dans le service dex. au moins ils écriraient quelques mots (( comme

problème reproduit...nous pensons...merci.

et peut être corrigé :

si sur H1 gravfik pour porter une ligne verticale ou horizontale, puis passer à un autre intervalle de temps, les lignes qui ne sont pas liées à l'indicateur sont supprimées.

C'est un indicateur très pratique pour vérifier l'historique afin de déterminer visuellement le pas de prix, mais du fait que les marques (lignes verticales et horizontales) mises sur les anciens intervalles de temps disparaissent lorsqu'on passe à un intervalle de temps plus petit, cela devient inconfortable.

 

L'indicateur a parfaitement résolu le problème de l'affichage utilisable de l'échelle des prix dans les fenêtres du terminal.

La compilation dans les builds jusqu'à 3021 inclus ne montre aucune erreur et tout est dessiné correctement (et même si vous jetez la version précédemment compilée dans un nouveau build du terminal).

La compilation dans les versions suivantes ne montre pas d'erreurs, mais dans le terminal, l'additionneur ne dessine pas de marque verticale et écrit dans les logs : 1 leaked strings left

Après avoir commenté la ligne :

StringConcatenate(line_name,IntegerToString(str.hour,2,'0')," :":",IntegerToString(str.min,2,'0'),"_N",line_counter) ;

l'erreur dans les journaux du terminal disparaît (bien que les lignes ne soient pas tracées).

Comment creuser ? Comment réanimer un outil formidable ?