Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1245

 
Denis Diakonov:

nicht z. B. zuerst Fall 1, dann Fall 2 usw.

Die Fälle führen eine Auftragseröffnung durch

Der Auftrag wird an mehr als einem Ort eröffnet. Man muss genau so denken, wie man in diesem Code denkt, und das ist schwer.

 
Wenn es einen Zyklus innerhalb eines EA's OnTick, die eine anständige Menge an Zeit dauert, wird es vollständig ausgeführt oder wird die Ankunft eines neuen Tick unterbrechen es alle?
 
Alexey Viktorov:

Es gibt mehr als eine Öffnung. In einem solchen Code muss man genau so denken, wie man denkt, und das ist schwierig.

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
Wenn es eine Schleife innerhalb der EA OnTick, die eine anständige Menge an Zeit dauert, wird es vollständig ausgeführt werden oder wird die Ankunft eines neuen Ticks all das unterbrechen?

Ich verstehe auch nicht, in meinem Fall wird die Schleife geöffnet und nicht alle Aufträge werden geöffnet, einige werden zweimal geöffnet und einige werden übersprungen, ich verstehe, dass ein neuer Tick den Start auslöst und der Code seine Ausführung unterbricht und wieder zu arbeiten beginnt

 
Denis Diakonov:

Ich verstehe, dass ein neuer Tick sowohl einen Start auslöst, als auch der Code seine Ausführung unterbricht und erneut mit der Ausführung beginnt

Erfinde das nicht.

Lesen Sie die Hilfe, dort steht eindeutig geschrieben, dass bei komplexen Berechnungen in EA der neue Tick übersprungen wird.

irgendwo in dem Artikel über Ereignisbehandlungsfunktionen oder vielleicht in Handelsoperationen oder in RefreshRates

Suchen Sie nach logischen Fehlern in Ihrem Code


HH: switch() - case wird nicht für komplexe logische Bedingungen verwendet, bessere Kombinationen von if() else - so erhält man eindeutigere logische Verzweigungen

 
Igor Makanu:

erfinden Sie es nicht.

lesen Sie die Hilfe, es sagt eindeutig, dass, wenn es komplexe Berechnungen in EA, die neue tick wird übersprungen werden

irgendwo in dem Artikel über Ereignisbehandlungsfunktionen oder vielleicht in Handelsoperationen oder in RefreshRates

Suchen Sie nach logischen Fehlern in Ihrem Code


SZY: switch() - case wird nicht für komplexe logische Bedingungen verwendet, bessere Kombinationen von if() else - so erhält man eindeutigere logische Verzweigungen

Ja, danke, ich habe bereits beschlossen, alles auch durch if-else zu schreiben

 
Denis Diakonov:

Warum haben Sie hier überhaupt einen Schalter eingebaut? Es ist einfacher, die Richtung des Geschäfts und die Anzahl der erforderlichen Öffnungen in die Funktion einzugeben und so viele Öffnungen wie angegeben in der Schleife zu öffnen.

Deshalb sage ich, dass ich Ihre Logik nicht verstehen kann. Warum so ein Durcheinander?

 
Alexey Viktorov:

Warum haben Sie hier überhaupt einen Schalter eingebaut? Es ist einfacher, die Richtung des Geschäfts und die Anzahl der erforderlichen Öffnungen in die Funktion einzugeben und so viele Öffnungen wie angegeben in der Schleife zu öffnen.

Deshalb sage ich, dass ich Ihre Logik nicht verstehen kann. Warum so ein Durcheinander?

Nun, mein Code hat sich gerade vergrößert, und ich dachte, es wäre viel einfacher.

Eigentlich wäre es einfacher und kompakter, wenn wir die Möglichkeit hätten, case während der Ausführung einer Funktion so oft aufzurufen, wie wir wollen.

Ich brauche keine ähnlichen Geschäfte in einer Schleife zu öffnen, und sie werden für verschiedene Symbole gleichzeitig (so weit wie möglich) bei Auftreten eines Signals geöffnet.

fall 1 - audusd-kauf

fall 5 - gbpusd-kauf

fall 9 - eurusd-kauf

usw.

Im ersten Fall habe ich ein Blatt mit dem Fall und das zweite mit der Analyse, wenn sie zusammenwirken würden, wären es 500 Zeilen.

Bei der zweiten Variante wird eine bestimmte Reihenfolge für die Eröffnung der Funktion mit der Analyse vorgeschrieben, und die Gesamtzahl der Zeilen würde 1200+ betragen, was schließlich die Ausführungsgeschwindigkeit des Programms beeinträchtigen würde

 

Können Sie mir bitte helfen! Der Expert Advisor verwendet den Hüllkurven-Indikator mit dynamischer Berechnung der Abweichung. Aber wenn es auf dem Diagramm angezeigt wird, zeigt es die gesamte Dynamik der Indikatorabweichung auf allen vorherigen Balken.

dynamische Hüllkurven

1. Gibt es eine Möglichkeit, den Indikator richtig zu zeichnen? D.h. er würde den Indikator mit seiner Abweichung nur auf seinem eigenen Balken zeichnen.

2. Wie kann ich das Zeichnen des Indikators in einem Expert Advisor deaktivieren, so dass nur seine Berechnungen übrig bleiben? Ich möchte das Zeichnen des Indikators in den Experteneinstellungen aktivieren oder deaktivieren.)

 
Denis Diakonov:

Nun, am Ende wurde mein Code immer größer, obwohl ich dachte, er wäre einfacher.

Wenn es jedoch möglich wäre, case während der Ausführung einer Funktion so oft wie nötig aufzurufen, wäre es einfacher und der Code wäre kompakter.

Ich brauche keine ähnlichen Geschäfte in einer Schleife zu öffnen, und sie werden für verschiedene Symbole gleichzeitig (so weit wie möglich) bei Auftreten eines Signals geöffnet.

fall 1 - audusd-kauf

fall 5 - gbpusd-kauf

fall 9 - eurusd-kauf

usw.

Im ersten Fall habe ich ein Blatt mit dem Fall und das zweite mit der Analyse, wenn sie zusammenwirken würden, wären es 500 Zeilen.

Die zweite Variante impliziert die Vorgabe einer bestimmten Reihenfolge der Öffnung innerhalb der Funktion mit Analyse, die in eine Windel gestreckt würde und die Gesamtzeilen würden 1200+ betragen, was schließlich die Geschwindigkeit der Programmausführung beeinträchtigen würde

Womit tippen Sie so viele Codezeilen ein? Hier ist eine meiner letzten EA, es funktioniert mit einer Reihe von Wertpapieren auf FORTS

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

So viele Wertpapiere werden notiert werden, so viele werden auch gehandelt werden. Und dieser EA mit Kontrolle von zwei Handelszeitrahmen, mit Trailing und natürlich mit Analyse, nur 326 Zeilen.

Wenn Sie Switch verwenden möchten, müssen Sie nicht in jeder Variante eine Positionseröffnung hinzufügen. Es reicht aus, den Namen des Symbols, die Art der Handelsoperation und den

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

Meiner Meinung nach wäre es aber besser, das Ganze in eine benutzerdefinierte Funktion zu packen.

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }
Grund der Beschwerde: