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

 
neverness:

Je vous ai dit directement que vous ne devriez pas enseigner aux autres quand vous n'avez aucune idée vous-même.

L'aide doit être "qualifiée", pas "de la rue" !

Décrivez à nouveau le problème, ce qui est nécessaire.

 
Vitaly Muzichenko:

Décrivez à nouveau la tâche, exactement ce qui est nécessaire.

Je suis intéressé par la possibilité de transférer des données dans MT4/MT5 entre différents modules.

Par exemple :

Comment transférer les données d'un indicateur à un autre ?

Comment transférer les données d'un indicateur vers un script ?

Comment transférer les données de l'indicateur vers le Conseiller Expert? etc... ... et ainsi de suite.

Le simple fait d'ajouter les données transférées à un fichier séparé, puis de lire ces données à partir du fichier dans d'autres modules, est une façon évidente et courante de les transférer.

Mais dans ce cas, il y a un problème de synchronisation des données transférées/lues.

Intuitivement, je suppose que le terminal MT4/MT5 doit disposer d'une certaine zone de mémoire tampon partagée et qu'il doit exister des procédures qui régissent l'échange de données dans cette zone.

Mais je n'ai rien trouvé de tel dans la description.

 
neverness:

Je suis intéressé par la procédure de transfert MT4/MT5 entre différents modules.

Par exemple :

Comment transférer les données d'un indicateur à un autre ?

Comment transférer les données d'un indicateur vers un script ?

Comment transférer les données de l'indicateur vers le Conseiller Expert ? etc... ... et ainsi de suite.

Le simple fait d'ajouter les données transférées à un fichier séparé, puis de lire ces données à partir du fichier dans d'autres modules, est une façon évidente et courante de les transférer.

Mais dans ce cas, il y a un problème de synchronisation des données transférées/lues.

Intuitivement, je suppose que le terminal MT4/MT5 doit disposer d'une certaine zone de mémoire tampon partagée et qu'il doit exister des procédures qui régissent l'échange de données dans cette zone.

Mais je n'ai rien trouvé de tel dans la description.

Eh bien, le transfert de données peut être effectué par le biais d'un fichier ou d'une variable globale du terminal.

Si c'est une variable globale :

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

C'est le moyen le plus simple d'échanger entre tous les programmes d'un même terminal.

 
Vitaly Muzichenko:

Eh bien, le transfert de données comme écrit précédemment peut être via un fichier, ou une variable globale du terminal.

Si c'est une variable globale :

C'est le moyen le plus simple d'échanger entre tous les programmes d'un même terminal.

Ok. Écrivons dans l'indicateur une expression :

GlobalVariableSet("Sname", 123.25) ; Cet événement se produit, par exemple, onTick().

Mais les scripts ne fonctionnent pas avec les tableaux de données et n'ont pas d'événement OnTick(). Comment le script sait que l'événement OnTick() s'est produit et qu'il doit appliquer la procédure pour obtenir de nouvelles données.

GlobalVariableGet("Sname") ;

Vous pouvez utiliser l'événement OnTimer() au lieu de OnTick(). Mais le script a son propre OnTimer(), alors que l'indicateur a le sien, donc ils ne sont pas liés l'un à l'autre.

Voici le problème :

Comment s'assurer que les événementsGlobalVariableSet("Sname", 123.25) ; et GlobalVariableGet("Sname") ; sont synchrones?

Ou existe-t-il une procédure qui contrôle le changement de la valeur "Sname" ? Comme OnChange.

C'est-à-dire, comment le script sait-il que l'indicateur a changé la valeur de "Sname", et que cette valeur est devenue 125,35 ?

Où est le pont entreGlobalVariableSet("Sname", 123.25) ; et GlobalVariableGet("Sname") ; ?

Ils sont dans des programmes différents.


 
neverness:

OK. Écrivons une expression dans l'indicateur :

GlobalVariableSet("Sname", 123.25) ; Cet événement se produit, par exemple, lorsque OnTick().

Mais les scripts ne fonctionnent pas avec les tableaux de données, et ils ne disposent pas de l'événement OnTick(). Comment le script sait que l'événement OnTick() s'est produit et qu'il doit appliquer la procédure pour obtenir de nouvelles données.

GlobalVariableGet("Sname") ;

Vous pouvez utiliser l'événement OnTimer() au lieu de OnTick(). Mais le script a son propre OnTimer(), tandis que l'indicateur a le sien et ils ne sont pas liés.

Voici le problème :

Comment s'assurer que les événementsGlobalVariableSet("Sname", 123.25) ; et GlobalVariableGet("Sname") ; sont synchrones?

Ou existe-t-il une procédure qui contrôle le changement de la valeur "Sname" ? Comme OnChange.

C'est-à-dire, comment le script sait-il que l'indicateur a changé la valeur de "Sname", et que cette valeur est devenue 125,35 ?

Où est le pont entreGlobalVariableSet("Sname", 123.25) ; et GlobalVariableGet("Sname") ; ?

Ils sont dans des programmes différents.

Le lien de connexion est un disque dur d'ordinateur. Record Je pense que le problème n'est pas, et vous pouvez l'obtenir dans tous les cas, même dans le script, il ne diffère pas de la façon dont vous obtenez la valeur actuelle ASK et BID


P.S. Je joins un indicateur et un script par exemple, dans l'indicateur on enregistre les volumes en tick

Indicateur

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
  ArraySetAsSeries(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Script

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
Dossiers :
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

Le lien de connexion est le disque dur de l'ordinateur. Je pense que ce ne sera pas un problème de l'écrire, mais vous pouvez l'obtenir à partir de n'importe quel événement, même dans un script, ce n'est pas différent de la façon dont vous obtenez les valeurs ASK et BID actuelles.

Cool !

Et comment le faire ?

Donnez-moi un exemple.

Par exemple, comment simuler un tel cas.

L'indicateur reçoit des données, calcule la variance des données et prépare les coordonnées du point d'ellipse pour le script (4 variables globales Q1,Q2,T1,T2 à passer au script).

Maintenant l'indicateur doit donner une commande au script qui dessine l'ellipse en utilisant ces variables globales.

Comment l'indicateur peut-il le faire ?

 
Vitaly Muzichenko:

Le lien de connexion est le disque dur de l'ordinateur. Je pense que ce ne sera pas un problème à enregistrer, mais vous pouvez l'obtenir à partir de n'importe quel événement, même dans le script, il ne diffère pas de la façon dont vous obtenez les valeurs actuelles de ASK et BID.


P.S. Je joins un indicateur et un script par exemple, dans l'indicateur on enregistre les volumes en tick

Indicateur

Script

Dans votre exemple, le script ne fonctionne qu'une seule fois - au démarrage, c'est-à-dire lorsque l'événement OnStart() se produit.

Et puis comment ?

Où est la synchronisation ?

Comment faire pour que le script fonctionne de manière synchrone avec l'indicateur ?

Par exemple, comment activer le script lorsque les volumes dépassent une certaine valeur ?

 
neverness:

Ainsi, dans votre exemple, le script ne fonctionne qu'une seule fois - au démarrage, c'est-à-dire lorsque l'événement OnStart() se produit.

Et puis comment ?

Où est la synchronisation ?

Comment faire pour que le script fonctionne de manière synchrone avec l'indicateur ?

Par exemple, comment activer le script lorsque les volumes dépassent une certaine valeur ?

C'est à vous de décider comment travailler avec le script. Ne serait-il pas plus facile de créer un conseiller expert plutôt qu'un script ?

Un indicateur qui donne des valeurs :

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
  ArraySetAsSeries(time,true);
  ArraySetAsSeries(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Un exemple simple de script en boucle :

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.S. J'ai corrigé le code.

 
Vitaly Muzichenko:

C'est à vous de décider comment travailler avec le script. Ne serait-il pas plus facile pour vous de créer une EA plutôt qu'un script ?

Un indicateur qui donne des valeurs :


Un exemple simple de script en boucle :

J'ai compris que dans MQL il n'y a pas de possibilité de synchroniser différents modules.

Ok. Alors voici une question. Et si je place le bouton sur le champ et que j'envoie le script à ce bouton ?

Cette possibilité existe-t-elle dans MQL ou n'existe-t-elle pas non plus ?

Après tout, le script doit être lancé d'une manière ou d'une autre !

 
neverness:

Je comprends que dans MQL il n'y a pas de possibilité de synchroniser différents modules.

Ok. Alors voici une question. Et si je place le bouton sur le champ et que je place le script sur ce bouton.

Existe-t-il une telle possibilité dans MQL ? Ou bien cette possibilité n'existe-t-elle pas non plus ?

Le script doit être lancé d'une manière ou d'une autre !

Lesujet est ancien, mais on peut toujours le lire, ou peut-être que quelqu'un suggérera quelque chose de nouveau. Je n'exécute pas de scripts, et ne travaille pas du tout avec eux)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...