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

 
Artyom Trishkin #:

Dobro. Lassen Sie es mich in einfachen russischen Worten ausdrücken.

Du gehst angeln.

  1. Sie öffnen die Speisekammer zu Hause, kratzen sich am Kopf und schließen sie wieder.
  2. Sie gehen angeln und brauchen eine Angel.
  3. Du gehst nach Hause in den Abstellraum, um eine Angelrute zu holen.
  4. Du warst angeln, hast deine Angel ausgeworfen und einen Fisch gefangen, und dann hast du ein Netz gebraucht
  5. Ging nach Hause in den Lagerraum für das Netz
  6. Sie waren angeln, haben den gefangenen Fisch mit dem Netz an den Haken genommen und brauchten einen Behälter, um den gefangenen Fisch aufzubewahren.
  7. Nach Hause gehen für ..... Soll ich fortfahren?

Oder Sie nehmen gleich alles, was Sie brauchen, aus der Speisekammer (OnInit), fischen, ohne herumzulaufen, und räumen, wenn Sie nach Hause kommen, alles in die Speisekammer und den Kühlschrank (OnDeinit).

Vielleicht haben Sie hier im Forum davon erfahren. Man muss nur manchmal zuhören und hören, was einem gesagt wird.

Andernfalls erhalten Sie eine Frage, eine Antwort, sagen "Blödsinn" und machen, was Sie denken.

Sie müssen zunächst über die Frage nachdenken, Fragen stellen und dann mit der Bearbeitung beginnen.

Ist Ihnen bewusst, dass das einfachste am Programmieren das Drucken von Code ist? Und der Löwenanteil der Entwicklung ist das Nachdenken über die Logik.

Das ist eine lächerliche Analogie. In diesem Fall sollten wir alle Variablen, Klassenobjekte usw. global machen und sie nicht bei Bedarf erstellen oder vielleicht ist ein grafisches Objekt etwas anderes (sicherlich keine Angelrute oder ein Netz :)) ? Mein Ansatz ist also durchaus rational und gerechtfertigt, es ist nur so, dass mql oder metatrader versagt.

 
MakarFX #:
Auf diese Weise wird das Signal übersehen.

Entweder bin ich begriffsstutzig, oder es gibt keine Bedingung, wenn es offene Aufträge UND ein Signal gibt und der Balken bereits neu ist.

Wenn die Signale lang sind, d.h. mehr als einen Balken lang, funktioniert es auch beim ersten Tick des Balkens.

Die einzige Frage ist, wann eine Order eröffnet werden soll: wenn das Signal erscheint oder beim ersten Tick des nächsten Balkens.
 
Valeriy Yastremskiy #:

Entweder bin ich begriffsstutzig, oder es gibt keine Bedingung, wenn es offene Aufträge UND ein Signal gibt und der Balken bereits neu ist.

Wenn die Signale lang sind, d.h. mehr als einen Balken lang, funktioniert es auch beim ersten Tick des Balkens.

Die einzige Frage ist, wann die Order eröffnet werden soll: zum Zeitpunkt des Signals oder zum ersten Tick des nächsten Balkens.
Ich bitte Sie, einen Auftrag pro Bar zu eröffnen
 
законопослушный гражданин Sleep() zu lösen, aber Makar meinte, es wäre besser, den Prozess nicht anzuhalten.


Der Code sieht nun wie folgt aus:

Prüfen Sie vor dem Öffnen, ob es eine offene Position auf dieser Kerze gibt. Wenn nicht, öffnen Sie sie.

 
законопослушный гражданин #:

Im Prinzip würde ein offener Auftrag normalerweise auf den Ticks eines bereits offenen Balkens schließen. MakarFX und Artem haben richtig festgestellt. Deshalb wäre es richtig, dies zu tun:

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

Im Prinzip würde ein offener Auftrag normalerweise auf den Ticks eines bereits offenen Balkens schließen. MakarFX und Artem haben richtig festgestellt. Deshalb ist es richtig, Folgendes zu tun:

Artem hat Recht, so sollte es sein

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

Du hast Recht, Artem, so sollte es sein.

Das Ergebnis wird auch hier dasselbe sein. Nur der Code ist etwas komplizierter. Sie schreiben denselben Code in zwei verschiedenen Funktionen, was die Lesbarkeit beeinträchtigt. Aber jeder schreibt so, wie er will oder wie er sich wohlfühlt...

 

Hier ist eine Menge los.

Eine offene Stelle hat eine Öffnungszeit. Die Eröffnungszeit kann mit der Zeit einer Kerze verglichen werden, um herauszufinden, ob der Zeitpunkt der Positionseröffnung innerhalb der Kerze liegt (und dies ist die aktuelle Kerze).

Und warum finden Sie bei allen Beispielen immer die Anzahl der Aufträge heraus? Und wenn es keine Aufträge gibt, dann öffnen Sie sie. Dies schränkt die Möglichkeiten stark ein.

Im Allgemeinen sollten wir uns nur auf die Anzahl der Aufträge/Positionen für eine sehr enge Strategierichtung konzentrieren.

 
Mihail Matkovskij #:

Das Ergebnis wird hier dasselbe sein. Nur der Code ist noch verwirrender. Sie schreiben denselben Code in zwei verschiedenen Funktionen, was die Lesbarkeit beeinträchtigt. Aber jeder schreibt so, wie er will oder wie er sich wohlfühlt...

Ihr Code

  if (time != cTime && nOrders == 0)
    time = cTime;

(Eine Bar ist geöffnet und es wurde keine Bestellung aufgegeben)

auf ein Signal geprüft - kein Signal

... warten wir auf den nächsten Takt.

Sie haben denselben Fehler wie beim letzten Mal wiederholt

P.S.

dies ist

 time = cTime;
muss nach der Eröffnung des Auftrags durchgeführt werden
 
MakarFX #:

Du hast Recht, Artem, es sollte so sein

Wenn in Ihrem Code eine Position geöffnet ist, wird eine andere nicht durch das entgegengesetzte Signal geöffnet. Das heißt, wenn das Signal eintrifft, müssen Sie zunächst prüfen, ob es eine Gegenposition gibt und diese schließen.

Aber auch hier schränkt dies die Möglichkeiten zur Verbesserung der Strategien stark ein.

Es sollte vermieden werden, sich an das Vorhandensein/Fehlen von Aufträgen zu binden (insbesondere bei vier - ausstehenden Aufträgen (was richtig ist) und Positionen (was falsch ist)).

Nein, es ist richtig und notwendig, die Anzahl der Aufträge und Positionen nach ihrer Art zur Verfügung zu haben. Aber es ist falsch, sich nur auf das Fehlen von Aufträgen für die Signale zu verlassen.

Im Allgemeinen ist es richtig, Funktionen zum Zählen von Aufträgen und Positionen (eine Funktion, die die Struktur füllt, wenn sich die Anzahl der Aufträge und Positionen ändert), Funktionen zum Öffnen/Schließen von Positionen, Funktionen zum Setzen von Aufträgen und Alarmfunktionen zu haben. Funktionen der verschiedenen Schleppnetze und Datengewinnung aus Indikatoren. Plus - Möglichkeit, die Daten einer Position (offen oder geschlossen) mit einigen Werten zu vergleichen.

Jede beliebige Strategie kann aus diesem Set aufgebaut werden.