[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 589

 
ilunga:
Denn das sind lokale Variablen, die schon beim zweiten Ticken Müll statt Ticket speichern

Herzlichen Dank! Ehrlich gesagt habe ich die ganze Zeit daran gedacht!
 
Roman.:


Siehe Trailer. Legen Sie den Inhalt in den Ordner Experts des Terminals. Wählen Sie den Zeitrahmen des Instruments, das Sie interessiert, und platzieren Sie ihn im Chart des Expert Advisors,

Legen Sie die Parameter für die Eröffnung eines Auftrags in den externen Variablen des MetaTrader fest:

Dann warten Sie auf die Bildung eines neuen Balkens auf dem Zeitrahmen des von Ihnen gewählten Instruments.

Wenn der Expert Advisor eine Order vom Markt öffnet, vergleichen Sie den Zeitpunkt der Öffnung mit dem Zeitpunkt der Öffnung eines neuen Taktes.

Roman, wie versprochen, möchte ich Ihnen zeigen, was in der Praxis passiert, wenn Sie mit dem Expert Advisor auf dem "open at the opening" arbeiten. Zunächst wird der EA beim nächsten Tick ausgelöst, nachdem er auf dem 1-Stunden-Chart platziert wurde, und eröffnet einen zweiten Handel bei der Eröffnung der nächsten Kerze. Warum, kann ich noch nicht verstehen. Zweitens: Der Eröffnungskurs des Geschäfts fällt nicht mit dem Eröffnungskurs einer neuen Kerze zusammen:

24.02.2012,12:00,1.3392,1.3405,1.3383,1.3387,768 - die Kerze wird bei 1.3392 eröffnet und die Order wird bei 1.3390 ausgelöst. Ich habe in den Einstellungen einen Schlupf von 1 Punkt angegeben. Wenn ich 0 Pips eingeben würde, würde der EA überhaupt nicht auslösen.

Ich habe das Protokoll beigefügt. Wichtig ist für mich nach wie vor, dass der Eröffnungsauftrag mit dem Eröffnungskurs der Kerze zusammenfiel.

 

Guten Tag, meine Herren. Ich würde eine Klarstellung begrüßen.

Bin ich richtig zu verstehen, dass , wenn in den Code die OrderDelete und OrderSend Befehle sequenziell geschrieben werden und wenn der EA ein Signal erhält, um beide Befehle (Rückzug + Einstellung) auf Tick #1 auszuführen, dann:

- diese beiden Befehle nicht zum selben Tick #1 ausgeführt werden können und ihre Ausführung um mindestens 3 Ticks gestreckt wird, und

- bei Tick #1 wird der Befehl OrderDelete erteilt;

- nachdem OrderDelete abgeschickt wurde, wird erst mit dem nächsten Tick #2 das Ergebnis zurückgegeben, und erst jetzt, mit demselben Tick #2, kann der Befehl OrderSend abgeschickt werden;

- das Ergebnis des OrderSend-Befehls wird erst bei Tick #3 bekannt sein.

Ist dies der Fall?


Und stimmt es, dass es keine Möglichkeit gibt, zwei Befehle an MT auf demselben Tick zu senden?

Ich schreibe einen EA in MT4.

Ich danke Ihnen.

 
Les:

Guten Tag, meine Herren. Ich würde eine Klarstellung begrüßen.

Bin ich richtig zu verstehen, dass , wenn in den Code die OrderDelete und OrderSend Befehle sequenziell geschrieben werden und wenn der EA ein Signal erhält, um beide Befehle (Rückzug + Einstellung) auf Tick #1 auszuführen, dann:

- diese beiden Befehle nicht zum selben Tick #1 ausgeführt werden können und ihre Ausführung um mindestens 3 Ticks gestreckt wird, und

- bei Tick #1 wird der Befehl OrderDelete erteilt;

- nachdem OrderDelete abgeschickt wurde, wird erst mit dem nächsten Tick #2 das Ergebnis zurückgegeben, und erst jetzt, mit demselben Tick #2, kann der Befehl OrderSend abgeschickt werden;

- das Ergebnis des OrderSend-Befehls wird erst bei Tick #3 bekannt sein.

Ist dies der Fall?


Und stimmt es, dass es keine Möglichkeit gibt, zwei Befehle an MT auf demselben Tick zu senden?

Ich schreibe einen EA in MT4.

Ich danke Ihnen.

Ein Häkchen ist ein neues Zitat. Und es gibt keine Verbindung zwischen den Befehlen OrderDelete und OrderSend

Wenn es Nachrichtenaktualisierungen und Slippage gibt, werden bis zur Ausführung eines einfachen OrderSend ein Dutzend Ticks vergangen sein. Und wenn sich der Markt in einem nächtlichen Flat befindet, können beide Befehle innerhalb eines Ticks ausgeführt werden

 
Les:

Es hängt alles davon ab, wie schnell die Zecken sind. Im Allgemeinen werden Funktionen, die einen Wert zurückgeben (OrderDelete, OrderSend usw.), nicht asynchron ausgeführt, d. h. bis der gesamte Vorgang abgeschlossen ist und ein Fehlercode ausgegeben wird (oder NO_ERROR im Falle eines Erfolgs), wird der nächste Operator nicht ausgeführt. Außerdem können in dieser Zeit mehrere Ticks ablaufen, die aber von der Funktion start() nicht verarbeitet werden.


Es kann auch zu einer Kollision kommen, wenn z. B. ein Auftrag einen Stoploss auslöst und Sie versuchen, einen anderen Auftrag zum selben Tick zu öffnen/zu schließen. In diesem Fall kann es vorkommen, dass der Server die Ausführung des Vorgangs nicht zulässt.


D.h. die Antwort auf Ihre Fragen lautet: Nein, das ist es nicht))

 
ilunga:

Ein Häkchen ist ein neues Zitat. Und es gibt keinen Zusammenhang mit der Ausführungszeit der Befehle OrderDelete und OrderSend

Wenn es Nachrichten-Updates und Slippage gibt, sind zu dem Zeitpunkt, an dem ein einfacher OrderSend ausgeführt wird, bereits ein Dutzend Ticks vergangen. Und wenn sich der Markt in einem Nachtflat befindet, können beide Befehle innerhalb eines Ticks ausgeführt werden.

Soweit ich das verstehe, bezieht MT die Informationen vom Server über Ticks (und der Server gibt seinerseits Antworten auf Befehle, während er gleichzeitig neue Ticks sendet; er optimiert die Kosten nach Zeit). Und bevor eine neue Zecke auftaucht, ist nichts bekannt. Das ist es, was ich meinte. Aber vielleicht liege ich mit dieser Annahme falsch? Die Frage bezieht sich eher auf die zweite von Ihnen erwähnte Möglichkeit, nämlich wenn der Tick langsam ist, als auf ein Dutzend Ticks.

Habe ich Sie richtig verstanden, dass eine Antwort auf Befehl Nr. 1 keine Voraussetzung ist, um zu Befehl Nr. 2 überzugehen und ihn vollständig zu verarbeiten?

Die Befehlsantwort ist der "unwesentliche" Teil des Befehls? Ist seine Anwesenheit nicht entscheidend, um zum nächsten Befehl überzugehen?

Wir hatten unten eine Diskussion mit alsu, und ich glaube, ich habe das Gleiche angenommen wie er: dass es wichtig ist, eine Antwort zu haben. Sie schreiben jedoch, dass zwei Befehle in einem einzigen Tick ausgeführt werden können. Die Informationen vom Server kommen also ohne jegliche Verbindung zum Kursfluss?


Ich danke Ihnen.

 
alsu:
Es hängt alles davon ab, wie schnell die Zecken sind. Generell werden Funktionen, die einen Wert zurückgeben, OrderDelete, OrderSend etc. nicht asynchron ausgeführt, d.h. solange die gesamte Operation nicht abgeschlossen ist und ein Fehlercode zurückgegeben wird (oder NO_ERROR im Erfolgsfall), wird der nächste Operator nicht ausgeführt. Außerdem können in dieser Zeit mehrere Ticks ablaufen, die aber von der Funktion start() nicht verarbeitet werden.


Es kann auch zu einer Kollision kommen, wenn z. B. ein Auftrag einen Stoploss auslöst und Sie versuchen, einen anderen Auftrag zum selben Tick zu öffnen/zu schließen. In diesem Fall kann es vorkommen, dass der Server die Ausführung des Vorgangs nicht zulässt.


D.h. die Antwort auf Ihre Fragen lautet: Nein, ist es nicht))

Warum ist es nicht so, wenn es nach Ihren eigenen Worten genau "so" ist? )) Oder habe ich wieder etwas falsch verstanden? In Ihrer Antwort schreiben Sie, dass Funktionen so ausgeführt werden, dass der nächste Operator erst ausgeführt wird, wenn der Fehlercode des vorherigen Operators abgearbeitet ist. Ich denke, das ist es, was ich meinte: dass "zwei Befehle nicht auf demselben Tick #1 ausgeführt werden können ", weil die Antwort - die Antwort oder der Fehlercode - frühestens mit dem neuen Tick erscheint. Oder etwa nicht? Oder werden die Befehlsantworten in einem separaten zeitgesteuerten Datenstrom übertragen, der nicht mit dem Anführungszeichen-Datenstrom verbunden ist? Vielleicht habe ich mich in der Annahme geirrt, dass die Ergebnisse der Befehlsausführung mit einem neuen Anführungszeichen zurückgegeben werden?

Natürlich habe ich mich in erster Linie auf die Situation bezogen, in der die Zecken langsam sind.

 
Bitte sagen Sie mir, ob es möglich ist, dass der Expert Advisor trotz des Signals des Indikators, das Geschäft zu schließen, nur positive Geschäfte abschließt und sie bei den nächsten Signalen des Indikators schließt, wenn sie in die Gewinnzone kommen?
 
Les:

Soweit ich weiß, bezieht MT die Informationen vom Potikovo-Server (und der Server wiederum gibt die Antworten auf die Befehle gleichzeitig mit dem Senden neuer Ticks, wodurch die Zeitkosten optimiert werden). Und bevor eine neue Zecke auftaucht, ist nichts bekannt. Das ist es, was ich meinte. Aber vielleicht liege ich mit dieser Annahme falsch? Die Frage bezieht sich eher auf die zweite von Ihnen erwähnte Möglichkeit, nämlich wenn der Tick langsam ist, als auf ein Dutzend Ticks.

Habe ich Sie richtig verstanden, dass eine Antwort auf Befehl Nr. 1 keine Voraussetzung ist, um zu Befehl Nr. 2 überzugehen und ihn vollständig zu verarbeiten?

Die Befehlsantwort ist der "unwesentliche" Teil des Befehls? Ist seine Anwesenheit nicht entscheidend, um zum nächsten Befehl überzugehen?

Wir hatten unten eine Diskussion mit alsu, und ich glaube, ich habe das Gleiche angenommen wie er: dass es wichtig ist, eine Antwort zu haben. Sie schreiben jedoch, dass zwei Befehle in einem einzigen Tick ausgeführt werden können. Die Informationen vom Server kommen also ohne jegliche Verbindung zum Kursfluss?


Ich danke Ihnen.

Befehlsantworten und Ticks sind getrennt und nicht miteinander verbunden. Wenn es ein Dead Flat gibt, können Sie mehrere Aufträge abfangen, die zum selben Tick geöffnet/geschlossen werden.
 

Hallo. Ich bin überhaupt nicht gut im Programmieren. Ich bin nicht so erfahren in der Kodierung, also helfen Sie mir bitte, Schließpositionen byStopLoss und TrailingStop zu meinem Code hinzuzufügen. Der Expert Advisor ist nicht von mir, aber die Strategie ist nicht schlecht, so Versuch und Irrtum Überarbeitung der EA für mich - und um ehrlich zu sein, I `m schon blasen meinen Geist, und es gibt nicht viel Zeit - Arbeit. Ich habe es bereits ausprobiert und getestet, und ehrlich gesagt, habe ich keine Zeit zu verlieren - ich muss arbeiten. Und so gehe ich damit um:


//+------------------------------------------------------------------+
//|                                             stohastic_system.mq4 |
//|                                                    Анатолий      |                                                                  |
//+------------------------------------------------------------------+

extern double Lots=0.4;
extern int TakeProfit=50;
extern int NWave=2;
extern int K=9;
extern int D=3;
extern int slowing=5;
extern int Average_method=2;
extern int price_field=0;

int K_level=0;
int down=0;
int up=0;


int init()
  {

   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
    int ticket=0;
    double stoch_1=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,1);
    double stoch_2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2);
    double stoch_3=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,3);
    int Hour_curr=TimeHour(TimeCurrent());
    
    if ((stoch_1>90)&&(stoch_2>70)) K_level=90;
    if ((stoch_1<10)&&(stoch_2<30)) K_level=10;  
    if(OrdersTotal()<1)
      {        
        if((Hour_curr>=1)&&(Hour_curr<24))//проверка сигналов только в этот промежуток времени
          {
            if((K_level==10)&&(stoch_1>10))//сигнал на покупку
              {
                RefreshRates();
                Print("Сигнал на покупку. stoch_1=",stoch_1," stoch_2=",stoch_2);
                ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,Ask+TakeProfit*Point,"buy_order1",1,0,Blue);
                
                K_level=10; 
                down=0;               
              }
            if((K_level==90)&&(stoch_1<90))//сигнал на продажу
              {
                RefreshRates();
                Print("Сигнал на продажу. stoch_1=",stoch_1," stoch_2=",stoch_2);
                ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,Ask-TakeProfit*Point,"sell_order1",1,0,Red);
               
                K_level=90;
                up=0; 
              }
          }
      }
    
   
   
    return(0);
  }
   
Dateien: