[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 842

 
Die Auftragsänderung befindet sich im selben Block wie die Eröffnung, und ihre Bedingung ist "keine Aufträge". Es stellt sich heraus, dass Sie gerade eine Order eröffnet haben und sofort versuchen, sie zu ändern - aber woher soll der Gewinn von 5 Pips kommen?
 

Hallo zusammen, seit kurzem interessiere ich mich für gleitende Durchschnitte. Ich habe eine Kombination aus gleitenden Durchschnitten und Handelsbedingungen gefunden und beschlossen, meinen TS zu überprüfen, ob er profitabel ist oder nicht, und ihn gegebenenfalls zu optimieren. Aber mein Expert Advisor hat während des Tests keine Geschäfte eröffnet. Ich habe den ganzen Abend damit verbracht, die Lösung herauszufinden, und beschlossen, Sie, liebe Programmierer, zu fragen. Um zu verstehen, wie der EA funktioniert, erkläre ich kurz meinen TS: auf dem Chart mit EMA(13) und EMA(55), wenn ein Balken EMA(13) gekreuzt hat und alle folgenden Balken über/unter EMA(13) waren, dann bei Berührung des Preises mit MA(13) öffnen wir eine Position in Richtung der vorherigen Balken (nach Kreuzung + mindestens 9 und nicht mehr als 23). Take Profit 60 Punkte, Stop Loss = EMA(55) plus minus fünf Punkte. Das ist eigentlich die ganze Strategie. Zur besseren Veranschaulichung habe ich ein Beispiel veröffentlicht:

Und hier ist der Code des Expert Advisors:

//+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot=0.1;
extern int FastMA=13;         //Быстрая МА
extern int SlowMA=54;         //МедленнаяМА
extern int TP=60;             //Тейк профит
extern int MinBars=8;         //Минимальное кол-во баров вне МА
extern int MaxBars=25;        //Максимальное кол-во баров вне МА
extern int slippage=3;        //Слипадж
extern int Magic=347586;      //Магическое число
extern int Space=10;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return (0);
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA(0);
   double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
   for (int x=1;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen(0,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen(1,SMA);                             //...или на продажу
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for(int i=1;i<=OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true);
         }
      else
         Print("OrderSelect() вернул ошибку - ",GetLastError());
          
      }
    return(false);
   }

void OrdOpen(int type,double SO)                               //Функция открытия позиций
   {
   if (type==0) 
      {
      if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   else 
      {
      if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   return;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if (OrderSelect(Magic,SELECT_BY_TICKET)==true)
      {
      double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
      if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point;
      else SL=SL-Space*Point;
      if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return;
      else Print("OrderModify() вернул ошибку - ",GetLastError());
      }
   return;
   }
double MA(int m)                                                  //Функция возвращающая значение МА
   {
   return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0));
   }

Wenn jemand helfen kann, bitte. Ich werde Ihnen auch den EA selbst geben

Dateien:
dwm.mq4  5 kb
 

Viele Funktionen können in einem For-Zyklus zusammengefasst werden, um Positionen zu öffnen, zu ändern, zu schließen usw.

Hier ist ein einfaches Beispiel:

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- Frage: Ist es richtig, hier "Pause" statt "Return" zu verwenden? Gibt es einen Unterschied?

 
chief2000:

Viele Funktionen können in einem For-Zyklus zusammengefasst werden, um Positionen zu öffnen, zu ändern, zu schließen usw.

Hier ist ein einfaches Beispiel:

- Frage: Ist es richtig, hier "break" statt "return" zu verwenden? Gibt es einen Unterschied?

Von https://docs.mql4.com/ru/basis/operators/break:
"Die break-Anweisung stoppt die Ausführung der nächstgelegenen verschachtelten externen switch-, while- oder for-Anweisung. Die Kontrolle wird demjenigen übertragen, der auf denjenigen folgt, der endet".

Von https://docs.mql4.com/ru/basis/operators/return:
"Die Return-Anweisung beendet die aktuelle Funktion und gibt die Kontrolle an das aufrufende Programm zurück."

Antwort: Es ist richtig, hier "Pause" zu verwenden.

 
abolk:

Von https://docs.mql4.com/ru/basis/operators/break:
"Der break-Operator beendet die Ausführung des nächstgelegenen verschachtelten externen switch-, while- oder for-Operators. Die Kontrolle wird demjenigen übertragen, der auf denjenigen folgt, der endet".

Von https://docs.mql4.com/ru/basis/operators/return:
"Der Return-Operator beendet die aktuelle Funktion und gibt die Kontrolle an das aufrufende Programm zurück."

Antwort: Es ist richtig, hier "Pause" zu verwenden.

Ich selbst verwende break, dachte aber, return bedeute einen Tickwechsel (und break nicht).

In der Realität gibt es bis zur Änderung der Reihenfolge einen Tickwechsel, so dass der Prüfer die Situation korrekt simulieren kann

müssen Sie Return verwenden. Richtig?

Vielleicht irre ich mich, aber ich würde es gerne verstehen.

 
chief2000:

Ich selbst verwende break, aber ich dachte, return bedeutet einen Tickwechsel (während break das nicht tut).

In der Realität wird der Tickwechsel erst dann stattfinden, wenn sich die Reihenfolge ändert, und daher muss der Prüfer return verwenden, um die Situation korrekt zu simulieren

müssen Sie Return verwenden. Oder?

Vielleicht täusche ich mich, aber ich möchte es verstehen.

Lesen wir in der Dokumentation nach: "Der Return-Operator beendet die Ausführung der aktuellen Funktion und gibt die Kontrolle an das aufrufende Programm zurück."

Wenn die aktuelle start()-Funktion, wieder lesen Sie die Dokumentation:

https://docs.mql4.com/ru/runtime/start
"Wenn ein neuer Kurs kommt, wird die Funktion start() von angehängten Expert Advisors und benutzerdefinierten Indikatoren ausgeführt. Wenn beim Eintreffen eines neuen Kurses die Funktion start(), die auf dem vorherigen Kurs läuft, ausgeführt wird, dann wird der eingehende Kurs vom Expert Advisor ignoriert. Alle neuen Anführungszeichen, die während der Programmausführung kommen, werden ignoriert, bis die nächste Ausführung der start()-Funktion beendet ist. Danach wird die Funktion start() erst nach dem Eintreffen des nächsten neuen Kurses gestartet.

 
abolk:

Lesen Sie in der Dokumentation: "Die Return-Anweisung beendet die aktuelle Funktion und gibt die Kontrolle an das aufrufende Programm zurück."

Wenn die aktuelle Funktion start() ist, lesen Sie erneut in der Dokumentation nach:

https://docs.mql4.com/ru/runtime/start
"Wenn neue Kurse kommen, wird die Funktion start() für angehängte Expert Advisors und benutzerdefinierte Indikatoren ausgeführt. Wenn beim Eintreffen eines neuen Kurses die Funktion start(), die auf dem vorherigen Kurs läuft, ausgeführt wird, dann wird der eingehende Kurs vom Expert Advisor ignoriert. Alle neuen Anführungszeichen, die während der Programmausführung kommen, werden ignoriert, bis die nächste Ausführung der start()-Funktion beendet ist. Danach wird die Funktion start() erst nach dem Eintreffen des nächsten neuen Kurses gestartet.

Ich wünschte, du würdest es mit deinen eigenen Worten sagen. Ich verstehe nicht, was Sie meinen.

Wenn for im Tester mit break beendet wird und eine andere Funktion folgt, wird sie im selben Tick ausgeführt. In der Realität können sich jedoch in dieser Zeit (während der Änderung des Auftrags) mehrere Ticks ändern. Deshalb halte ich eine Rückkehr für realistischer. Nicht wahr?

 
chief2000:

Ich wünschte, Sie hätten es in Ihren eigenen Worten ausgedrückt. Ich verstehe nicht, was Sie meinen.

Wenn for mit break beendet wird und eine andere Funktion folgt, wird sie im selben Tick ausgeführt. In der Realität können sich jedoch in dieser Zeit (während der Änderung des Auftrags) mehrere Ticks ändern. Deshalb halte ich eine Rückkehr für realistischer. Oder etwa nicht?


start() beginnt zu Beginn eines Ticks und darf zu Beginn des nächsten Ticks noch nicht beendet sein.

break beendet for, und return beendet die Funktion. Wenn es keine Operatoren nach for gibt, gibt es keinen Unterschied zwischen for und return für diesen Algorithmus.

Aber jeder Betreiber hat seinen Zweck. Und der unbeabsichtigte Einsatz eines Bedieners ist wie eine ungeladene Schrotflinte.

Auch hier, in der for-Schleife Algorithmus, aus irgendeinem Grund gibt es keine Notwendigkeit, die Ausführung der Funktion fortzusetzen, können wir return verwenden.

Mit anderen Worten: Wenn der Algorithmus eine Unterbrechung in der Schleife erfordert, wird break verwendet, auch wenn die Funktion nach der Schleife noch beendet ist.

 
abolk:


start() beginnt mit der Arbeit zu Beginn eines Ticks und darf bis zum Beginn des nächsten Ticks nicht beendet sein.

break beendet for, return beendet die Funktion. Wenn nach for keine Operatoren stehen, gibt es keinen Unterschied zwischen for und return für diesen Algorithmus.

Aber jeder Betreiber hat seinen Zweck. Und der unbeabsichtigte Einsatz eines Bedieners ist wie eine ungeladene Schrotflinte.

Auch hier, in der for-Schleife Algorithmus, aus irgendeinem Grund gibt es keine Notwendigkeit, die Ausführung der Funktion fortzusetzen, können wir return verwenden.

Mit anderen Worten: Wenn der Algorithmus verlangt, dass wir die Schleife unterbrechen, setzen wir break ein, auch wenn die Funktion nach der Schleife ohnehin beendet wird.

Mir kam ein Gedanke: Da dies alles nur für den Tester gedacht war, können wir (wo nötig) Folgendes tun:

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

Ich danke Ihnen!

 
chief2000:

Eine Idee ist aufgetaucht - da dies nur für einen Prüfer gestartet wurde, könnten Sie (gegebenenfalls) Folgendes tun:

Ich danke Ihnen!


können Sie