Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 645

 

Taras, est-il possible de faire une telle normalisation du graphique pour le changement d'image par clic de souris ?

Parfois, par habitude, je clique lorsque le curseur est proche du bouton, mais je n'aime pas le résultat.

Je n'ai rien trouvé de convenable dans la liste de traitement des événements, il n'y a queCHARTEVENT_CHART_CHANGE sans aucune description spécifique. Je peux essayer de lier un clic de souris, mais d'après ce que je comprends, l'utilisateur ne peut pas travailler avec le menu système, seulement s'il crée ses propres boutons. Existe-t-il une solution simple ?

 
psyman:

Taras, est-il possible de faire une telle normalisation du graphique pour le changement d'image par clic de souris ?

Parfois, par habitude, je clique lorsque le curseur est proche du bouton, mais je n'aime pas le résultat.

Je n'ai rien trouvé de convenable dans la liste de traitement des événements, il n'y a queCHARTEVENT_CHART_CHANGE sans aucune description spécifique. Je peux essayer de lier le clic du bouton de la souris, mais d'après ce que j'ai compris, l'utilisateur ne peut pas travailler avec le menu système, seulement s'il crée ses propres boutons. Existe-t-il une solution simple ?

C'est à dire, cliquer sur certaines "zones de robinet" sur le graphique ?
Vous pouvez, vous devez garder la trace des coordonnées du curseur et des clics du bouton de la souris.

CHARTEVENT_MOUSE_MOVE

 

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

Toute question pour les débutants sur MQL4, aide et discussion sur les algorithmes et les codes

Taras Slobodyanik, 2018.10.04 09:37

Vous voulez dire qu'il faut cliquer avec la souris sur certaines "zones de frappe" du graphique ?
Vous pouvez, vous devez garder la trace des coordonnées du curseur et des clics du bouton de la souris.



Le problème est qu'il faut cliquer sur le graphique, et non sur un bouton du menu système. Je ne sais pas comment traiter un tel événement.
 
psyman:

Le problème est qu'il s'agit d'un clic sur un graphique, et non d'un bouton du menu système. Je ne sais pas comment traiter un tel événement.

mémorisez la période de caractères en cours et, à"CHARTEVENT_CHART_CHANGE", vérifiez les modifications et faites ce que vous devez faire.

 
OK, merci encore.
 

Veuillez me dire pourquoi la même fonction du corps de l'EA OnTick() ne fonctionne pas (ou plutôt, elle fonctionne, mais échoue sur tous les graphiques correctement).

Mais à partir de la procédure OnInit(), cela fonctionne bien et à partir d'un script ordinaire également. Le conseiller expert est installé sur 80 graphiques à la fois (20 devises, chaque 4 fenêtres W1 D1 H4 H1) peut juste mon ordinateur ne peut pas faire face ? Veuillez me conseiller. Le but du robot est d'afficher les messages MessageBox à l'écran, si un signal est détecté sur l'un des graphiques. Peut-être que l'ordinateur est lent au moment de l'envoi de ces messages ?
 

J'ai du mal à me souvenir de la période précédant le traitement d'un événement, où dois-je faire cela ?

J'ai décidé de faire un suivi par message, il s'avère que CHARTEVENT_CHART_CHANGE est traité 2 fois en un clic, la variable ctime est réinitialisée.


#propriété stricte

#property indicator_chart_window

int ctime ;


void OnInit()

{

Print(" OnInit------------1 ", ChartPeriod(0)) ;

Print("OnInit ctime = ", ctime) ;

// ctime=ChartPeriod(0) ;

}


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[])

{

ctime=ChartPeriod(0) ;

retour(taux_total) ;

}

void OnChartEvent(const int id,

const long &lparam,

const double &dparam,

const string &sparam)


{


if(id==CHARTEVENT_CHART_CHANGE)

{

Print("CHARTEVENT_CHART_CHANGE est lancé ctime=", ctime) ;

si(ctime!=ChartPeriod(0))

{

Print(ChartPeriod(0), " CHANGED !!!!!!!!!!!!!!! ", ctime) ;

}

}

}



Ajout d'un indicateur sur une base horaire, puis passage à une base quotidienne

2018.10.05 01:04:45.171 _t1 CADJPY,Daily : CHARTEVENT_CHART_CHANGE est démarré ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,Daily : 1440 CHANGED !!!!!!!!!!!!!!! 0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily : CHARTEVENT_CHART_CHANGE est démarré ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily : initialisé

2018.10.05 01:04:45.156 _t1 CADJPY,Daily : OnInit ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,Daily : OnInit------------1 1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1 : raison de désinitialisation 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1 : CHARTEVENT_CHART_CHANGE est démarré ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1 : 60 CHANGED !!!!!!!!!!!!!!! 0

2018.10.05 01:02:02.000 _t1 CADJPY,H1 : CHARTEVENT_CHART_CHANGE est lancé ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1 : initialisé

2018.10.05 01:02:02.000 _t1 CADJPY,H1 : OnInit ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1 : OnInit------------1 60

2018.10.05 01:02:01.078 Indicateur personnalisé _t1 CADJPY,H1 : chargé avec succès





 
psyman:

J'ai du mal à me souvenir de la période précédant le traitement de l'événement, où cela doit-il être fait ?

J'ai décidé de faire un suivi par message, il s'avère que CHARTEVENT_CHART_CHANGE est traité 2 fois en un clic, la variable ctime est réinitialisée.

Mettez le code dans le message correctement ! C'est très difficile à lire sous cette forme. Ça doit ressembler à ça.

#property strict
#property indicator_chart_window
int ctime;
void OnInit()
   {
     Print("  OnInit------------1  ", ChartPeriod(0));
     Print("OnInit ctime = ", ctime);
   //  ctime=ChartPeriod(0);   
   }
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[])
  {
   ctime=ChartPeriod(0);         
   return(rates_total);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id==CHARTEVENT_CHART_CHANGE)
      {
      Print("CHARTEVENT_CHART_CHANGE     is started  ctime=", ctime);
      if(ctime!=ChartPeriod(0))
      {
      Print(ChartPeriod(0), "  CHANGED!!!!!!!!!!!!!!!   ", ctime);
      }
      } 
}

Quand vous changez les paramètres d'un graphique, l'indicateur est rechargé de force, lisez la doc pour la raison de la désinitialisation et sa variable de raison.

Vous pouvez utiliser les variables globales du terminal pour enregistrer les paramètres requis.

 
Vitaly Gorbunov:

Insérez le code correctement dans le message ! C'est très difficile de le lire comme ça. Ça devrait être comme ça.

L'indicateur est obligé de redémarrer lorsque vous modifiez les paramètres du graphique ; lisez la doc pour la raison de la désinitialisation et sa variable de raison.

Vous pouvez utiliser les variables globales du terminal pour enregistrer les paramètres requis.

Oui, vous devez enregistrer les valeurs dans GlobalVariable, puis, au démarrage, vérifier leur existence.

C'est-à-dire que le numéro du graphique, le symbole, la période doivent être sauvegardés.
Et ensuite, supprimez les variables inutiles, ou faites-les initialement comme des variables globales temporaires.

ps. vous pouvez également stocker des informations dans des objets sur le graphique - tant que le graphique existe, les objets existent.

 

Je pensais que ce serait beaucoup plus facile :-)

Ensuite, une question assez enfantine - mon code n'implique pas de trading ou de graphiques, quel type de programme dois-je utiliser ?

Les scripts sont uniques, mais peuvent-ils être exécutés en boucle ? J'ai déclaré un indicateur personnalisé par pure inertie, car je n'ai jamais utilisé d'Expert Advisors. Je ne les ai jamais utilisés auparavant, mais ils redémarrent automatiquement, ce dont je n'ai pas besoin. J'aurai besoin de vos conseils.

ps

Les objets peuvent être de taille zéro, de sorte que visuellement ils ne gênent pas ?