Emulation von Ticks aus einem EA/Indikator - Seite 8

 
expertboss, brauchen Sie überhaupt einen 2008er Server? Meiner Meinung nach sind die Fähigkeiten von 2003 ausreichend, und es ist weniger anspruchsvoll auf Ressourcen, was bedeutet, dass Sie billigere Hardware wählen können.
 
Meat:

Wenn es sich bei Ihrer Uhr um einen Experten (und nicht um einen Indikator) handelt, ist sie höchstwahrscheinlich mit einer Schleife versehen, so dass sie keine Probleme hat, Informationen über mehrere Symbole zu erhalten. Das ist das, worüber ich schon früher geschrieben habe, dass es wirklich kein großes Problem mit Ticks in Expert Advisor gibt, weil es in einer Schleife ausgeführt werden kann. Aber mit einem Indikator wird diese Zahl nicht funktionieren.

Was die unterschiedlichen Betriebssysteme angeht, so ist mir das immer noch ein Rätsel. Wie ich oben geschrieben habe, funktioniert es bei mir unter 7, aber bei anderen Leuten funktioniert es aus irgendeinem Grund nicht. Wahrscheinlich hat das etwas mit den Zugriffsrechten zu tun...

Übrigens, was die "Ersatzbibliotheken" betrifft, versuchen Sie, die Dateien user32 und kernel32 von WinXP(2003) zu nehmen und sie in den Ordner Experts\libraries auf dem Computer zu stecken, auf dem Vista(2008) installiert ist. Und wenn es funktioniert? :) ...obwohl ich das bezweifle...

Ich werde direkt auf die Ticks sagen, ich bin auf "Ihrer Seite", sondern als für die Uhr, durch Ihre Antwort zu beurteilen, haben Sie nicht verstanden, mein Gedanke, ich werde mit dem Code zu versuchen:

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);

Rückkehr;

}

int start()

{

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

...

Rückkehr;

}

Befindet sich nur ein Symbol im "Market Watch"-Fenster, für das ein Chart erstellt wird, stimmt die Zeit und die Aktualisierung dieser Zeit auch mit dem Tick im Chart und damit mit der Arbeit des Expert Advisors überein. Wenn es mehrere Symbole im "Market Watch"-Fenster gibt, dann ticken die kleinen Uhren, die in der "Market Watch : 22:59:58"-Überschrift angezeigt werden, mit allen Kursen für alle Symbole, sie ticken irgendwo, und da sich der Kurs auf meinem Währungspaar geändert hat, werden meine Uhren mit diesen abgeglichen. Das ist mein Gedanke """", wenn diese Uhren hinzugefügt und auf meinen EA oder ein Fenster, in dem der Expert Advisor arbeitet, angewendet werden können". und haben am Ende viel mehr Zecken als nur ein Paar.

Alexander.

Ich will keine Ressourcen schleifen ... Das heißt, alle Ticks aus allen Notierungen in einem Diagramm zu kombinieren?

 

Wie kommen die Herren darauf, dass es sich hier um Aggression handelt? Es ist lediglich eine Erinnerung an die Grundsätze der Höflichkeit. Bevor man etwas anbietet, muss man eine Gegenleistung erbringen. Wenn Sie nichts haben, können Sie nur fragen, und das ist die Wahrheit.

Ich habe nicht viel Erfahrung mit 64-Bit-Systemen, aber ich bin sehr an diesem Thema interessiert, aber da ich hier nicht helfen kann, muss ich Leute fragen, die sich auskennen. Ich sehe darin nichts Beschämendes.

 
FAQ:

Wie kommen Sie, meine Herren, darauf, dass es sich hier um Aggression handelt? Es ist lediglich eine Erinnerung an die Grundsätze der Höflichkeit. Bevor man etwas anbietet, muss man eine Gegenleistung erbringen. Wenn Sie nichts haben, können Sie nur fragen, und das ist die Wahrheit.

Ich habe nicht viel Erfahrung mit 64-Bit-Systemen, aber ich bin sehr an diesem Thema interessiert, aber da ich hier nicht helfen kann, muss ich Leute fragen, die sich auskennen. Ich kann darin nichts Falsches erkennen.


Ich schätze, ich habe mich von meinen Emotionen mitreißen lassen, aber Sie sind ein Moderator und passen auf, was Sie sagen, danke für die Bemerkung, und ich werde versuchen, meinen Eifer zu zügeln.

Auf Wiedersehen. Alexander.

 
expertboss:

Hier ist der Gedanke """", ob diese alle Ticks aufaddiert und auf meinen Expert Advisor oder das Fenster, in dem der Expert Advisor arbeitet, angewendet werden können""" und haben am Ende viel mehr Häkchen als ein Angebot für nur ein Paar.

Alexander.

Ich will keine Ressourcen schleifen ... Das heißt, Sie wollen alle Ticks von allen Kursen in einem Diagramm zusammenfassen?

Ein EA reagiert nur auf seine eigenen Ticks, Sie können also nichts "hinzufügen". Es gibt nur zwei Möglichkeiten: Entweder Sie stellen einen Timer ein (wie ich vorgeschlagen habe), oder Sie lassen parallel einen EA in einer Schleife auf einem anderen Chart laufen, der Ihren EA "tickt". Und in diesem EA mit Schleife können Sie die Bedingungen festlegen, unter denen er "tickt". Zum Beispiel, wenn sich der Wert von TimeCurrent() geändert hat, wie in Ihrem Fall. Aber auch hier sehe ich keinen Sinn darin, zusätzliche EA zu haben, wenn der ursprüngliche EA (d. h. Ihre Uhr) das Gleiche tun kann.

 
Eigentlich wäre die Lösung aller Probleme imho, die Adresse der Start-Funktion im Speicher zu finden :) Dann kann man an vieles denken, bis hin zur Multi-Thread-Programmausführung.
 
Ich konfrontiert ein Problem mit dem folgenden Plan, wenn das Terminal nicht erhalten regelmäßige Ticks und der Timer läuft bzw. EA arbeitet durch den Code und an einem gewissen Punkt der EA beginnt das Senden von falschen Anfragen zum Beispiel die Bestellung zu schließen, es stellt sich heraus, am Ende der Server sendet einen allgemeinen Fehler "2" dann Fehler "3" und kann auch durch die Auftragsnummer, etc. geben. Ich bin folgendermaßen aus der Situation herausgekommen """""""""""" if (OrdersTotal()==0){Alert ("Nothing to delete");Sleep(1000);break;} // Wenn es keine Aufträge gibt, wird die Schleife durch Schließen von """"""""""""" (exit while) beendet, aber das ist nicht ganz korrekt. Frage: ist es möglich, eine Art von Befehl oder Operator (ich weiß nicht einmal, wie man es nennen) zu machen, um Ticks zu unterbrechen, bis wir eine Antwort vom Server wahr (zum Beispiel true=OrderClose (OrderTicket(),....) und dann wie gewohnt erhalten. Natürlich ist dies eine Bitte, soweit es möglich ist. Eine weitere Beobachtung (ich habe es am Wochenende bemerkt) - wenn ich das Diagramm verschiebe, geht es zurück zur Position des Generators oder eines regulären Ticks, die Schaltfläche "EAs" wird freigegeben und es gibt keine Ticks, aber das Diagramm geht trotzdem zurück, ich habe den EA aus dem Diagramm entfernt, all dies hat aufgehört. Sv. Alexander.
 
Meat:

Wie auch immer, hier ist die endgültige Version der Funktion:

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

Soweit ich das verstehe, verwenden Sie den Befehl PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1). Dieser Befehl emuliert Ticks für den Expert Advisor (gemäß der Beschreibung in WinUser32.h). Bei Indikatoren werden die Ticks nicht emuliert, und folglich wird der Indikator nicht aktualisiert. Leider habe ich kein WinXP zum Testen, aber wenn die Ticks für den Indikator in XP emuliert werden, bin ich überrascht.

Ich habe auch Ihren Algorithmus überprüft

  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);

unter dem Debugger VisualStudio und das Ergebnis, das ich im TimerCode-Array erhielt, entsprach überhaupt nicht den erwarteten Ergebnissen. Sind Sie sicher, dass dieser Algorithmus keine Fehler enthält? Ich kann Ihnen den Code und ein Bildschirmfoto des Ergebnisses zur Verfügung stellen. Wenn Sie möchten, können wir das im Detail besprechen.

 

Obwohl dieses Thema jetzt nicht sehr aktuell ist, denke ich, dass es immer noch Leute gibt, die es nicht eilig haben, zu neuen Builds zu wechseln :) Wenn also jemand keinen Tick-Timer in Win7/Win8 hat, müssen Sie entweder das DEP-Tool deaktivieren oder diese Funktion hinzufügen:

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

Und am Ende diese 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);
}