Emulation des ticks d'un EA/indicateur - page 8

 
expertboss, avez-vous vraiment besoin d'un serveur 2008 ? À mon avis, les capacités de 2003 sont suffisantes, et il est moins gourmand en ressources, ce qui signifie que vous pouvez choisir un matériel moins cher.
 
Meat:

Si votre horloge est un expert (et non un indicateur), il est fort probable qu'elle soit simplement mise en boucle et qu'elle n'ait aucun problème à transmettre des informations sur plusieurs symboles. C'est ce que j'ai écrit plus tôt, qu'il n'y a pas vraiment de gros problème avec les ticks dans Expert Advisor, parce qu'ils peuvent être bouclés. Mais avec un indicateur, ce chiffre ne fonctionnera pas.

Quant aux différents systèmes d'exploitation, c'est encore un mystère pour moi. Comme je l'ai écrit ci-dessus, cela fonctionne bien pour moi sur 7, mais d'autres personnes ne l'ont pas pour une raison quelconque. Probablement quelque chose à voir avec les droits d'accès...

À propos, en ce qui concerne les "bibliothèques de remplacement", essayez de prendre les fichiers user32 et kernel32 de WinXP(2003) et de les placer dans le dossier Experts\libraries sur l'ordinateur où Vista(2008) est installé. Et si ça marche ? :) ... bien que j'en doute...

Je vous dirai directement sur les tics, je suis de "votre côté" mais pour l'horloge, à en juger par votre réponse, vous n'avez pas compris ma pensée je vais essayer avec le code :

int init()

{

ObjectCreate("ServerTime", OBJ_LABEL, 0,0,0,0,0,0 ;)

ObjectSet("ServerTime", OBJPROP_CORNER, 3) ;

ObjectSet("ServerTime", OBJPROP_XDISTANCE, 10) ;

ObjectSet("ServerTime", OBJPROP_YDISTANCE, 37) ;

ObjectSetText("ServerTime", "", 20, "Arial", Green) ;

retour ;

}

int start()

{

ObjectSetText("ServerTime", TimeToStr( TimeCurrent(), TIME_SECONDS )) ;

...

retour ;

}

S'il n'y a qu'un seul symbole dans la fenêtre "Market Watch", pour lequel un graphique est créé, l'heure et la mise à jour de cette heure coïncident également avec le tick dans le graphique et par conséquent avec le travail de l'Expert Advisor. S'il y a plusieurs symboles dans la fenêtre "Market Watch", alors les petites horloges qui sont affichées dans l'en-tête "Market Watch : 22:59:58", ces horloges tic-tac avec toutes les cotations pour tous les symboles, elles tic-tac quelque part et comme la cotation a changé sur ma paire de devises, alors mes horloges sont alignées avec celles-là. C'est ma pensée """" si ces horloges peuvent être ajoutées et appliquées à mon EA ou à une fenêtre où le Conseiller Expert travaille". et se retrouver avec beaucoup plus de tics qu'un simple devis de paire.

Alexander.

Je ne veux pas boucler les ressources ... C'est-à-dire combiner tous les ticks de toutes les cotations dans un seul graphique ?

 

Qu'est-ce qui vous fait penser, messieurs, que c'est une agression ? Il s'agit simplement d'un rappel des principes de politesse. Avant d'offrir quelque chose, vous devez offrir quelque chose en retour. Si vous n'avez rien, vous ne pouvez que demander et c'est la vérité.

Je ne suis pas très expérimenté en matière de systèmes 64 bits, mais ce sujet m'intéresse beaucoup. Comme je ne peux rien faire pour vous aider, je dois demander aux personnes qui savent. Je n'y vois rien de honteux.

 
FAQ:

Qu'est-ce qui vous fait penser, messieurs, que c'est une agression ? Il s'agit simplement d'un rappel des principes de politesse. Avant d'offrir quelque chose, vous devez offrir quelque chose en retour. Si vous n'avez rien, vous ne pouvez que demander et c'est la vérité.

Je ne suis pas très expérimenté en matière de systèmes 64 bits, mais je suis très intéressé par ce sujet. Comme je ne peux rien faire pour vous aider, je dois demander aux personnes qui savent. Je ne vois rien de mal à cela.


Je suppose que je me suis laissé emporter par mes émotions, mais vous êtes un modérateur et vous surveillez vos paroles, merci pour la remarque et je vais essayer de calmer mes ardeurs.

Au revoir. Alexander.

 
expertboss:

Voici ma réflexion : """". Ces ticks peuvent-ils être additionnés et appliqués à mon conseiller expert ou à la fenêtre dans laquelle le conseiller expert travaille ? et se retrouver avec beaucoup plus de tics qu'un devis pour une seule paire.

Alexander.

Je ne veux pas boucler les ressources ... C'est-à-dire que vous voulez combiner tous les ticks de toutes les cotations dans un seul graphique ?

Un EA ne réagit qu'à ses propres ticks, vous ne pouvez donc rien "ajouter". Il n'y a que deux options : soit vous définissez un timer (comme je l'ai suggéré), soit vous exécutez en parallèle un EA en boucle sur un autre graphique, qui "tiquera" votre EA. Et dans cet EA en boucle, vous pouvez spécifier les conditions dans lesquelles il "tique". Par exemple, si la valeur de TimeCurrent() a changé, comme dans votre cas. Bien que, encore une fois, je ne vois pas l'intérêt d'avoir un EA supplémentaire, si l'EA initial (c'est-à-dire votre horloge) peut faire la même chose.

 
En fait, la solution à tous les problèmes serait de trouver l'adresse de la fonction Start en mémoire :) Ensuite, on peut penser à beaucoup de choses, jusqu'à l'exécution de programmes multithreads.
 
J'ai été confronté à un problème avec le plan suivant lorsque le terminal ne reçoit pas de ticks réguliers et que le timer est en cours d'exécution respectivement l'EA travaille à travers le code et à un moment donné l'EA commence à envoyer de fausses demandes par exemple pour fermer l'ordre, là il s'avère à la fin le serveur envoie une erreur générale "2" puis une erreur "3" et peut aussi donner par le numéro de l'ordre, etc. Je me suis sorti de la situation de cette façon """""""""""" if (OrdersTotal()==0){Alert ("Nothing to delete");Sleep(1000);break;} // S'il n'y a pas d'ordres, sortir de la boucle en fermant """"""""""""" (exit while), mais vous savez, c'est un peu incorrect. Question : est-il possible de faire une sorte de commande ou d'opérateur (je ne sais même pas comment l'appeler) pour suspendre les ticks jusqu'à ce que nous obtenions une réponse du serveur vraie ( par exemple true=OrderClose (OrderTicket(),....) et ensuite comme d'habitude. Bien sûr, il s'agit d'une demande, dans la mesure où cela est possible. Une autre observation (je l'ai remarqué ce week-end) - si je déplace le graphique, il revient à la position du générateur ou à un tick, le bouton "EAs" a été relâché et il n'y a pas de ticks, mais le graphique revient à la position de toute façon, j'ai supprimé l'EA du graphique, tout cela a cessé. Sv. Alexander.
 
Meat:

Quoi qu'il en soit, voici la version finale de la fonction :

// push ebp ; move ebp,esp ; push 01 ; push 02 ; push MT4InternMsg ; push hWnd ; mov eax,PostMsgAddr ; call eax ; pop ebp ; ret 0010;

Si je comprends bien, vous utilisez la commande PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1). Cette commande émule les ticks pour l'Expert Advisor (selon la description dans WinUser32.h). Pour les indicateurs, les ticks ne sont pas émulés, et par conséquent l'indicateur n'est pas mis à jour. Malheureusement, je n'ai pas WinXP pour tester, mais si les ticks de l'indicateur sont émulés dans XP, je suis surpris.

J'ai également vérifié votre algorithme

  for (int i=0;  i<ArraySize(value);  i++)
    for (int j=0;  j<len[i];  j++, byte++)
      TimerCode[byte/4] |= value[i]>>(8*j)&0xFF<<(byte%4*8);

sous le débogueur VisualStudio et le résultat que j'ai obtenu dans le tableau TimerCode ne correspondait pas du tout aux résultats attendus. Êtes-vous sûr que cet algorithme ne contient pas d'erreurs ? Je peux vous donner le code et une capture d'écran du résultat. Si vous le souhaitez, nous pouvons en discuter plus en détail.

 

Bien que ce sujet ne soit pas très actuel maintenant, je pense qu'il y a encore des personnes qui ne sont pas pressées de passer aux nouvelles constructions :) Donc, si quelqu'un n'a pas de minuteur dans Win7/Win8, vous devez soit désactiver l'outil DEP, soit ajouter cette fonction :

#import "kernel32.dll"
  bool  VirtualProtect(int lpAddress[], int dwSize, int flNewProtect, int& lpflOldProtect[]);

Et à la fin, cette variante :

int SetMyTimer(int interval=1000, int timerId=0)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0 || hWnd==0) return(0);
  static int TimerCode[7];  ArrayInitialize(TimerCode,0);
  int oldprotect[1]; 
  VirtualProtect(TimerCode, ArraySize(TimerCode)*4, 0x40, oldprotect);  // PAGE_EXECUTE_READWRITE
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
  int bytes[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1,   2 };
  bytes[8]=MT4InternMsg;  bytes[10]=hWnd;  bytes[12]=PostMsgAddr;
  int nbyte=0;  
  for (int i=0;  i<ArraySize(bytes);  i++)
    for (int j=0;  j<len[i];  j++, nbyte++)
      TimerCode[nbyte/4] |= bytes[i]>>(8*j)&0xFF<<(nbyte%4*8);
  timerId= SetTimer(hWnd, timerId, interval, TimerCode);
  return (timerId);
}