MQL4 Ajouter un indicateur au graphique depuis l'EA - page 3

 
Georgiy Liashchenko:
la mise en sommeil a fonctionné, merci

J'utilise le code d'Alain et cela fonctionne dans le sens où le formulaire classique de l'indicateur apparaît en me demandant de remplir le paramètre puis de cliquer sur Ok pour activer l'indicateur et c'est similaire à attacher manuellement l'indicateur. Est-il possible d'automatiser complètement toute l'opération même les réglages des paramètres nécessaires ? Merci

 
alessandrovb:

J'utilise le code d'Alain et cela fonctionne dans le sens où le formulaire classique de l'indicateur apparaît en me demandant de remplir le paramètre puis de cliquer sur Ok pour activer l'indicateur et c'est similaire à attacher manuellement l'indicateur. Est-il possible d'automatiser complètement toute l'opération même les réglages des paramètres nécessaires ? Merci

Il suffit d'ajouter du code pour simuler la frappe des touches, comme vous le faites manuellement.
 
Alain Verleyen:

Je n'ai pas ce problème (avec le code que j'ai posté).

Vérifiez que hWnd est différent de 0.

Vous pouvez également essayer d'augmenter la valeur de sleep à 50 ou 100.

Bonjour,

Ce commentaire à beaucoup d'aide, j'ai besoin d'autres questions,

Puis-je contourner le popup de saisie et utiliser l'indicateur par défaut ? Comment coder ?

Puis-je supprimer l'indicateur du graphique ?

 
Alain Verleyen:

Merci, c'est ce que je recherche, je peux ajouter mon indicateur personnalisé, juste une question supplémentaire, comment le décharger ?

 
Alain Verleyen:

Félicitations, ça marche bien.

 
Alain Verleyen:

Je n'ai pas ce problème (avec le code que j'ai posté).

Vérifiez que hWnd est différent de 0.

Vous pouvez également essayer d'augmenter la valeur de sleep à 50 ou 100.


J'utilise votre code, mais j'ai un problème avec son nom.

2018.01.11 12:06:15.864 ne peut pas ouvrir le fichier 'C:\............\MQL4\indicators\MACDèõšp.ex4' [123]

2018.01.11 12:04:00.518 ne peut pas ouvrir le fichier 'C:\.............\MQL4\indicators\MACD. ex4' [123]

La première ligne est soulevée lorsque

   uchar name2[4];

   name2[0]='M'; name2[1]='A'; name2[2]='C'; name2[3]='D';

   // StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));

La deuxième ligne est affichée lorsque

   uchar name2[];

   StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));


J'ai changé le premier code et ça marche maintenant !

   uchar name2[5];

   name2[0]='M'; name2[1]='A'; name2[2]='C'; name2[3]='D'; name2[4]=0;

   // StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));

Je pense que mon problème est la détection de la fin du tableau !
 

Bonjour à tous,

Je voudrais remercier Georgiy Liashchenko, et je voudrais partager ma version améliorée de son code qui ajoute l'indicateur directement dans le graphique avecAutomaticallyAcceptDefaults (quand il est sur "true").

#import "user32.dll"
   int  RegisterWindowMessageW(string MessageName);
   int  PostMessageW(int hwnd,int msg,int wparam,uchar &Name[]);
   int  FindWindowW(string lpszClass,string lpszWindow);
#import

#define VK_RETURN 13 //ENTER key

void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=false)
{
   Sleep(100);
   uchar name2[];
   StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));
   int MessageNumber=RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int r=PostMessageW(hWnd,MessageNumber,15,name2);
   Sleep(100);
   if(AutomaticallyAcceptDefaults) {
      int ind_settings = FindWindowW(NULL, "Custom Indicator - "+IndicatorName);
      PostMessageW(ind_settings,0x100,VK_RETURN,name2);
   }
}

int OnInit()
{
   int hWnd = WindowHandle(Symbol(), 0);
   StartCustomIndicator(hWnd, "Indicator_name");
   return(INIT_SUCCEEDED);
}

J'espère que cela aidera certaines personnes qui ont besoin d'insérer des indicateurs à partir de l'expert.

Note : Cela fonctionne pour les indicateurs personnalisés, sinon changez le nom de la fenêtre.

Note2 : N'utilisez pas d'indicateurs avec plus de 15 caractères (avant le ".ex4").

 
Kray:

Bonjour à tous,

Je voudrais remercier Georgiy Liashchenko, et je voudrais partager ma version améliorée de son code qui ajoute l'indicateur directement dans le graphique avecAutomaticallyAcceptDefaults (quand il est sur "true").

J'espère que cela aidera certaines personnes qui ont besoin d'insérer des indicateurs à partir de l'expert.

Note : Cela fonctionne pour les indicateurs personnalisés, sinon changez le nom de la fenêtre.

Note2 : N'utilisez pas d'indicateurs avec plus de 15 caractères (avant le ".ex4").

Très bien.


J'ai découvert que l'utilisation de :

int r=PostMessageW(hWnd,MessageNumber,13,name2);

au lieu d'utiliser :

int r=PostMessageW(hWnd,MessageNumber,15,name2);

vous permettra d'utiliser les indicateurs standards aussi, en utilisant le nom de l'indicateur standard.

 

Je reçois un

'name2' - parameter conversion not allowed
message d'erreur lorsque j'essaie de le compiler !

 

Kray:

Bonjour à tous,

Je voudrais remercier Georgiy Liashchenko, et je voudrais partager ma version améliorée de son code qui ajoute l'indicateur directement dans le graphique avecAutomaticallyAcceptDefaults (quand il est sur "true").

......

if(AutomaticallyAcceptDefaults) {
      int ind_settings = FindWindowW(NULL, "Custom Indicator - "+IndicatorName);
      PostMessageW(ind_settings,0x100,VK_RETURN,name2);


J'exécute MT4 v4.00 Build 1090 (19 mai 2017).

La fonction PostMessageW provoque le crash de mon terminal MT4 lorsque je l'utilise depuis un script pour placer un indicateur.

J'ai utilisé SendMessageW comme alternative pour placer l'indicateur, mais malheureusement, cela signifie qu'il n'y a aucun moyen de fermer la boîte de dialogue de configuration en simulant un événement clavier et en appuyant sur la touche Entrée. Je pense que cela peut être dû au fait que la fonction SendMessageW ne revient pas tant que la procédure de fenêtre n'a pas traité le message, ce qui signifie que l'événement clavier ne peut pas être traité tant que la boîte de dialogue n'a pas disparu. Cela signifie à son tour que FindWindowW ne fonctionnera pas tant que la boîte de dialogue sera affichée, puisque SendMessageW ne reviendra pas tant que la boîte de dialogue n'aura pas disparu.

Toute cette histoire a été un grand exercice de frustration pour moi. PostMessageW fonctionne-t-il toujours avec la dernière version de MT4 ? Quelqu'un sait-il comment fermer la boîte de dialogue de configuration de l'indicateur de manière programmatique ? J'ai consulté deux autres fils de discussion, j'ai essayé leurs recommandations et je n'ai pas réussi :

https://www.mql5.com/en/forum/155334

https://www.mql5.com/en/forum/115967

Quelqu'un peut-il m'éclairer ? Existe-t-il un moyen de faire fonctionner PostMessageW, ou de fermer la boîte de dialogue de configuration d'une autre manière ?