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

 
Alexey Viktorov:

Nun, ich werde versuchen, meinen Teil zur Aufklärung beizutragen.

Ich werde Sie mit "Sie" ansprechen, wenn ich ihn abschicke. Ich habe einen Schnappschuss des Zeigers...

Bitte sagen Sie mir, ob es nicht falsch ist, dieselbe Funktion 5 Mal auf demselben Tick aufzurufen? Aber das ist nur die Hälfte des Problems. Diese Funktion geht durch alle Aufträge. Und das alles 5 Mal in einem Tick... Und ich zähle 4 solcher Funktionen. Wir können gar nicht genug darüber nachdenken, wie wir 3 weitere Funktionen in die Schleife einbauen können, um alle Aufträge in einem Zyklus zu durchsuchen.

Hier sind zwei von ihnen.

Dies ist

Es ist nicht einmal annähernd ein Rückstand.

Um dies zu verstehen, müssen wir uns über die Definition des Begriffs Trailing im Klaren sein. Ich kann mich nicht mehr wortwörtlich erinnern, aber es ist ungefähr "Moving StopLoss level following the price in order to decrease possible losses or increase "guaranteed" profit.

Und dies

wie sieht es aus, wenn Sie den Expert Advisor ausführen? Wahrscheinlich vier Zeilen... werden sie benötigt?

Und der letzte Punkt für heute: Sie müssen keine Bibliothek im Kopf haben. Es reicht aus, wenn man die Dokumentation hat und weiß, wie man sie benutzt. Ich kann mich immer noch nicht an alle Parameter von iMA(_Symbol, _Period, ,,,,,) erinnern und ich kann nicht weitergehen, ohne die Dokumentation zu studieren. Und damit fast alle Funktionen. Glücklicherweise wurden vor nicht allzu langer Zeit Tooltips eingeführt, die nicht sehr hilfreich sind. Ich versuche nicht, auswendig zu lernen, wie man diese oder jene Enums schreibt. Sie müssen also jedes Mal einen Blick in die Dokumentation werfen.


Alexey, ich danke dir für die Informationen. Ja, ich gebe zu, dass der Code nicht optimal ist, aber ich bin kein Programmierer und kenne die Feinheiten, die Sie beschrieben haben, nicht. Ich verstehe solche Feinheiten einfach nicht, ich verstehe nicht, wie man das alles optimieren kann, vielleicht werde ich es später tun, wenn ich weitermache. Jetzt weiß ich genau, dass ich, wenn ich anfange zu optimieren, nur alles kaputt mache. Ich habe Codes von anderen EAs auf meiner Website gesehen - es gibt so viel Material dort! - Sicherlich, wenn Sie ein professioneller Programmierer sind, ist sein Code vielleicht weniger anspruchsvoll für das Terminal als meiner, aber im Moment kann ich Ihre Kommentare nicht berücksichtigen, da ich diese Nuancen der Programmieroptimierung wirklich nicht verstehe. Und wenn Sie einige Funktionsaufrufe aus dem Code entfernen, würde der Expert Advisor mit Sicherheit ein Chaos auslösen und Orders eröffnen, wenn dies nicht notwendig ist. Ich programmierte dort, testete - nichts ging schief oder ging schief, ich korrigierte und als Ergebnis der endgültige Code stellte sich heraus, wie diese, ich hatte keine Zeit für die Optimierung, wie Sie verstehen, mit meinem Gepäck von Wissen.

Was das Trailing betrifft - das Wichtigste ist, dass es dem Gewinn hinterherläuft, in diesem Stadium der Entwicklung bin ich damit zufrieden)))) Für sicher die alten und neuen Trailing-Code Trails gleich und Menge der Geschäfte ist die gleiche - natürlich habe ich festgestellt, dass Trailing gearbeitet hat, aber wie man es richtig in dieser Umgebung, wo Trailing funktioniert niemand sagte mir, und ich habe keine Gedanken auf sie - alle meine Code ist Lego Konstruktor - das heißt, ich baute es von Video-Tutorials Materialien. Natürlich gibt es auch ein wenig Eigenes - es ist der Algorithmus des Expert Advisors selbst, während der gesamte Code und die Funktionen nicht meine eigene Erfindung sind, sondern aus den Video-Tutorials von TradeLikeaPro stammen und ich sie in Analogie und für meine eigenen Bedürfnisse "bearbeitet" habe - für meinen eigenen Algorithmus. Am Ende habe ich bekommen, was ich hatte.

 
geratdc:   Mein gesamter Code ist ein Lego-Konstruktor - d.h. ich habe ihn aus dem Material der Video-Tutorials von TradeLikeaPro zusammengebaut, außerdem habe ich den Code genau in Analogie und für meine Bedürfnisse "bearbeitet" - für meinen eigenen Algorithmus. Letztendlich habe ich, was ich habe.

Ich sah mir die Einzahlungsgrafik an, wurde neugierig und lud die erste Version herunter. Ich habe es in MetaEdit kopiert. Ich habe zwei Warnungen. Erstens habe ich es beseitigt, indem ich int timeprev=0; durch datetime timeprev=0; ersetzt habe, da diese Variable ein Datum enthält. Der zweite zeigt an

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

Ich habe die letzten drei Saiten entfernt. Es ist eine saubere Übersetzung. Ich bin noch weiter gegangen...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

geändert hat (zur Verdeutlichung habe ich das Skript beigefügt - führen Sie es aus, es wird alles erklären), so

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
Hier ist das Ergebnis


Diese Funktion wird entfernt - es gibt keine Aufrufe von ihr und ihr Körper ist leer.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Ich habe versucht, es zu starten und sah:

Es war

Ich habe ihn nur geändert, als ich den Expert Advisor auf zwei Charts mit demselben Symbol und Slippage laufen ließ - warum sollte ich diesen Parameter ändern? Dann habe ich darüber nachgedacht und die Parameter um das 10-fache erhöht. Und ich habe die Funktion OnInit entfernt . Schließlich verwende ich nur den fünfstelligen Code. Warum? Weil die vierstellige Spanne 3 Punkte beträgt, also 30. Und die fünfstellige Spanne beträgt nur 12.

wurde es klarer.

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

Ich habe den oberen Teil der Kopfzeile abgeschnitten. Das ist es, was ich verlassen habe:

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

diese Zeile genau hier.

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

in den Antrag verschoben. Es ist folgendermaßen.

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

Dann habe ich die Beschreibung der Op-Variable am Anfang weggelassen und durch folgende ersetzt

   if (CalculateProfit()>=tp) CloseAll();

Am Anfang der Funktion OnTick befinden sich einige Zeilen. Damit wird sichergestellt, dass die Verarbeitung nur einmal pro Balken und nicht bei jedem Tick durchgeführt wird.

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

Dann wird der MA berechnet. Dies muss im Detail untersucht werden. Zu diesem Zweck habe ich ein Skript erstellt und das Ergebnis angezeigt

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

Wir sehen, dass der vierte und der letzte MaShift-Parameter addiert werden, d. h. die Taktnummer ist ihre Summe. Er nimmt MA ab Takt 2, dem dritten vom Ende.

Ich werde mir das genauer ansehen. Interessiert?

 
STARIJ:
...

Ich werde weiter suchen. Interessiert?

Erwähnen Sie es immer wieder?

Genug jetzt - die Leute verfolgen das Thema für diejenigen, die es interessiert, und es ist verschwendet.

Wenn Sie wollen, dass Ihnen jemand antwortet, rufen Sie ihn in das Thema. Zum Beispiel so: @STARIJ. Aber Sie müssen das Thema nicht immer wieder aufgreifen, indem Sie Ihren letzten Beitrag bearbeiten.


 
Victor Nikolaev:

Es bedeutet, dass jemand Pech hat. Noch einmal. Dies ist ein Skript, kein Expert Advisor oder Indikator

Ich habe es herausgefunden - anscheinend hatte das Terminal nicht genug Speicherplatz - ich habe ein paar Diagramme geschlossen und es hat funktioniert.

Vielen Dank - die Berechnungen finden tatsächlich statt.

Und wenn die Variablen nicht vom Typ int, sondern bool sind, was ist dann zu tun?

 

Hallo, könnten Sie mir bitte sagen:

1 - ist die Eintragung nur als natürliche Person oder kann sie auch als juristische Person erfolgen und gibt es irgendwelche Einschränkungen und Bedingungen

2 - Gibt es eine Synchronisierung mit den sozialen Netzwerken, um ein einziges Konto zu haben (Benutzername und Passwort)

3 - Ich habe auch eine Funktion gesehen "setze ein Widget auf deine Seite, teile das Signal" - sprechen wir über die Website oder etwas anderes


 
Hallo, ich habe erst vor kurzem begonnen, Mql4 zu lernen. Sollte ich Ihnen eine Frage an der falschen Stelle gestellt haben, verweisen Sie mich bitte auf das richtige Thema. Meine Frage lautet: Wie kann ich mit Indikatoren arbeiten, die verschiedene Zonen, Rechtecke usw. bilden? Ich kann ein Kreuz von Linien oder Preis höher oder niedriger, z. B. MA Programm.) Ich habe einen Indikator an der Unterseite, Puffer ist vier und es gibt acht Arten von Zonen. Ich kann also nicht herausfinden, wie man einen Durchbruch oder Ausbruch aus diesen Zonen kodiert.
 
STARIJ:

Ich sah mir die Einzahlungsgrafik an, wurde neugierig und lud die erste Version herunter. Ich habe es in MetaEdit kopiert. Ich habe zwei Warnungen. Erstens habe ich es beseitigt, indem ich int timeprev=0; durch datetime timeprev=0; ersetzt habe, da diese Variable ein Datum enthält. Der zweite verweist auf

*

Antwort

Vielleicht hat es damit zu tun, dass der TP in der Videolektion vom Typ int war, aber ich habe ihn in double umgewandelt und daher bleibt int timeprev, wie es ist. OK, ich werde es korrigieren, aber wie wirkt sich das auf den EA-Betrieb aus? Tatsächlich waren diese Balken und die Zeit für die TrailingStop-Funktion aus dem Video-Tutorial relevant, aber da ich diese Funktion durch meine eigene ersetzt habe, bleibt sie einfach als Relikt des Quellcodes erhalten, und mein Trailing-Stop basiert nicht wirklich auf der Balkenzeit.


Ich habe die letzten drei Zeilen entfernt. Es ist eine saubere Übersetzung. Ich bin noch weiter gegangen...

Ich habe es (zur Verdeutlichung habe ich ein Skript beigefügt - führen Sie es aus, es wird erklären) wie folgt geändert

Hier ist das Ergebnis

*Antwort.

Wo ist dieses Stück Code geblieben?

   return(INIT_SUCCEEDED);
  }

Vielleicht sollte es so sein?


void OnInit()

{

if(Ziffern == 3 || Ziffern == 5)

{

Schritt *= 10;

TrailingStep *= 10;

TrailingStop *= 10;

Schlupf *= 10;

}

return(INIT_SUCCEED);

}

Aber warum haben Sie TakeProfit vom Typ int gemacht? Das bedeutet, dass es sich um einen Gewinn in Punkten handelt, während die Funktion CalculateProfit() vom Typ double ist, also habe ich TakeProfit vom gleichen Typ gemacht, damit sie konsistent sind.


Ich habe diese Funktion gelöscht - es gibt keine Aufrufe von ihr und ihr Körper ist leer

*

Antwort

Im Code gibt es die Funktion void CloseAll(), von der ich dachte, dass sie irgendwie mit dieser Funktion zusammenhängt

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

Antwort

Okay, entfernen wir sie.


Ich habe versucht, es zu starten und sah:

Es war

indem ich Änderungen vornahm - nun, ich fügte nur Kommentare hinzu und löschte extern aus Magic

*

Antwort

Ja, vielleicht ist extern überflüssig, weil ich es nie geändert habe und auch Slippage nicht - es ist alles aus dem Quellcode des Video-Tutorials

- wir ändern ihn nur, wenn wir den EA auf zwei Charts mit demselben Tool und Slippage laufen lassen - warum diesen Parameter ändern? Dann habe ich darüber nachgedacht und die Parameter um das 10-fache erhöht. Und ich habe die Funktion OnInit entfernt . Schließlich verwende ich nur den fünfstelligen Code. Warum? Weil die vierstellige Spanne 3 Punkte beträgt, also 30. Bei einer fünfstelligen Spanne sind es nur 12.

*

Die Antwort lautet.

Dies ist die Standardeinstellung, damit der EA mit allen Währungen funktioniert. Ich werde Oninit () behalten.

wurde es klarer.

Ich habe die Kopfzeile am oberen Rand abgeschnitten. Hier ist, was ich hinterlassen habe:

*

Antwort

Diese Überschrift wird vom Standard-Editor erstellt. Ich lasse es so, wie es war, für den Fall, dass etwas beim Broker oder im Terminal nicht klappt, weil diese Zeilen fehlen.

Ich habe diese Zeile verschoben

auf den Claim hinuntergezogen. Sie verlief folgendermaßen

Dann entfernte ich die Beschreibung der Variablen op am Anfang und ersetzte sie durch

*

Antwort

Das ist ziemlich logisch.



Am Anfang der Funktion OnTick befinden sich einige Zeilen. Damit wird sichergestellt, dass die Verarbeitung nur einmal pro Balken und nicht bei jedem Tick durchgeführt wird.

Dann wird der MA berechnet. Dies muss im Detail untersucht werden. Zu diesem Zweck habe ich ein Skript erstellt und gebe das Ergebnis aus.


Sie sehen, dass der vierte Parameter MaShift und der letzte Parameter summiert werden, d.h. Taktnummer = ihre Summe. Wir nehmen den MA von Takt 2, den dritten vom Ende.

*

Antwort

Aufgrund der Tatsache, dass ich die Nachlaufzeit geändert habe, ist der gleitende Durchschnitt meiner Meinung nach nicht relevant. Es ist ein Relikt des Quellcodes, ich habe versucht, den letzten von 3 (drei) offenen Aufträgen zu finden. Die Sache ist, dass, wenn der Markt geht in eine falsche Richtung durch den Wert von STep, der EA öffnet eine Gegen-Order und dann, wenn der Markt weiterhin in die entgegengesetzte Richtung zu gehen, eine dritte Ordnung der Art der zweiten Position hinzugefügt wird, Oder umgekehrt, wenn der Preis die Richtung geändert hat, wird die dritte Order mit dem ersten Ordertyp (Kauf oder Verkauf) eröffnet. In diesem Fall wird das Trailing für drei Orders mit der Funktion CalculateProfit() durchgeführt; wenn jedoch die erste Order erfolgreich eröffnet wird und der Preis sich so bewegt, wie er sollte, würde in dieser Situation das Trailing auf dem Balken mit datetime wie im Video-Tutorial durchgeführt werden - ich wiederhole, auch für eine Order wird das Trailing mit der Funktion CalculateProfit() durchgeführt

Ich werde weiter suchen. Interessiert?

*

Antwort

Ja, ich habe einige Probleme mit der Schleppnetzfischerei. Es scheint zu schleppen, aber ich will nicht, dass jemand versteht, was ich damit gemacht habe. Trailing() funktioniert ohne Balken und Datetime - es funktioniert mit Trailing().

Die MA-Periode beträgt etwa 200, aber der Punkt ist, dass es sich um einen einstellbaren Wert handelt. Und der Schlüsselparameter Value scheint zu fehlen - ich habe seine Bedeutung in der Beschreibung der README-Datei erklärt.



Danke, dass Sie sich die Mühe gemacht haben. In der Tat ist der Expert Advisor nicht wirklich so gut, mechanisch würde ich sagen. Aber im Grunde genommen kann es ganz gut sein, wenn man es einrichtet und gelegentlich seine Arbeit überwacht. Die Zeit wird es zeigen. Wahrscheinlich können sie etwas verdienen, aber sie werden ohne mit der Wimper zu zucken in die Pleite gehen und keine SMS schicken. Ich habe mich noch nicht einmal damit beschäftigt, obwohl meine Idee war, eine SMS zu schicken, wenn der Drawdown mehr als 30% der Einlage betragen hat - das bedeutet, dass bereits 3 Aufträge eröffnet wurden und der Markt eine Gegenbewegung begonnen hat, in dieser Situation riecht es nach Paraffin. Alle anderen Fälle werden vom Expert Advisor gelöst, wenn er an die Verhaltenshistorie des Charts des Handelsinstruments angepasst ist.


Ich habe empfohlene (aber nicht alle) Änderungen am Code in Notepad vorgenommen. Bitte prüfen Sie, ob ich den Code korrigiert habe?

Ich bin für die Optimierung, nur ich habe nicht Momente betrachtet, wenn Sie oninit entfernt haben - ich brauche es in der Lage zu sein, zu testen und arbeiten auf allen Währungen)))

Dateien:
 
Aleksandr Verkhozin:
Hallo, ich habe erst vor kurzem begonnen, Mql4 zu lernen. Sollte ich Ihnen eine Frage an der falschen Stelle gestellt haben, verweisen Sie mich bitte auf das richtige Thema. Meine Frage lautet: Wie kann ich mit Indikatoren arbeiten, die verschiedene Zonen, Rechtecke usw. bilden? Ich kann ein Kreuz von Linien oder Preis höher oder niedriger, z. B. MA Programm.) Ich habe einen Indikator an der Unterseite, Puffer ist vier und es gibt acht Arten von Zonen. Ich kann also nicht herausfinden, wie ich einen Durchbruch oder Ausbruch aus diesen Zonen kodieren kann.

Wenn Sie mehr über den Programmierer wissen wollen, sollten Sie sich die Beispiele ansehen und die farbigen Schaltflächen verwenden. Sie fragen sich vielleicht: Wie verbringt man viel Zeit mit dem mql4-Programmierer, aber man will nicht dumm sein mit dem mql4). Vielleicht machen Sie Fortschritte.
 

geratdc:

...
Ja, ich habe ein paar Fragen zum Schleppnetz. Es scheint zu schleppen, aber niemand will wissen, was ich damit gemacht habe.

...

Wie Sie wissen, habe ich in diesem Thread eine Vorlage für ein Schleppnetz gepostet, das bei seinen Berechnungen einen an es gesendeten Indikatorwert verwendet. Schlagen Sie es nach, seien Sie nicht faul.
 
geratdc:

Möglicherweise müssen Sie mql4 Programmierung Video-Tutorials von TradeLikeApro auf RuTracker herunterladen. Sie haben eine gute Vorstellung davon, wie man die mql4-Indikatoren auf Anhieb bekommt, aber wenn man nicht weiß, wie man es macht, kann man eine Fehlermeldung erhalten). Vielleicht machen Sie Fortschritte.


Ich habe mir das Video über die Arbeit mit dem externen Indikator angesehen und einen kleinen Code geschrieben, um die Werte der Puffer im Tester zu sehen:

void OnTick()

{

double Buf1=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",0,1);

double Buf2=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",1,1);

double Buf3=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",2,1);

double Buf4=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",3,1);

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

Die Zonen erscheinen und verschwinden im Visualisierungsmodus. Aber der Wert der Puffer ist ohnehin immer Null. Gibt es keine Möglichkeit, diese Zonen im Kodex zu formalisieren?

Vielleicht gibt es eine andere Funktion als iCustom, die für solche Indikatoren geeignet wäre? Vielleicht hat jemand Eulen mit solchen Indikatoren geschrieben?

Grund der Beschwerde: