Rückwärts analysierte Balken in EA - Seite 2

 
FMIC:

Es gibt kein OnStart() in EAs, aber ich verstehe, was Sie gemeint haben. Allerdings sagte der OP auch in Reaktion auf Ihre Kommentare und ich zitiere:

Ja, ich meinte OnTick(). Sie messen dem "während EA läuft" immer noch zu viel Bedeutung bei. Es bedeutet nicht notwendigerweise, oder sogar am plausibelsten, "während der EA sein OnTick() ausführt", und nicht "während der EA mit einem Chart verbunden ist, d.h. während seiner gesamten Lebensdauer".

Wir brauchen mehr Informationen von paranoyakX.

 
jjc:

Ja, ich meinte OnTick(). Sie messen "while EA running" immer noch zu viel Bedeutung bei. Es bedeutet nicht notwendigerweise, oder sogar am plausibelsten, "während der EA sein OnTick() ausführt", und nicht "während der EA mit einem Chart verbunden ist, d.h. während seiner gesamten Lebensdauer".

Wir brauchen mehr Informationen von paranoyakX.

Hallo Leute,

lasst mich das klarstellen. Mein Code ist für ein sehr grundlegendes Muster auf früheren Bars suchen und wird entscheiden, ob eine Bestellung geöffnet werden, aber die Eröffnung neuer Auftrag wird nur geprüft werden, wenn ein neuer Balken kommt. was ich meine, ich bin für die letzte Bar zu schließen warten, dann überprüfen Sie das Muster, wenn es ok ist, werde ich die Bestellung zu öffnen. so Öffnen einer Bestellung ist bei der Eröffnung der neuen Bar passiert. wie @jjc sagte, ich halte grundlegende Muster Informationen in globalen Variablen, wie wenn mein Muster begann und endete, was der höchste und niedrigste Wert ist, etc.

Irgendwie, wenn ich EA neu zu starten, möchte ich diese grundlegenden Informationen wieder zu finden (Muster Start und Ende bar, höchste, niedrigste Preise usw.) und füllen meine globalen Variablen wieder, das ist, warum ich dies brauche. Ich werde Start- und Endinformationen verwenden, um zu entscheiden, wann meine Bestellung zu schließen. so ist es genug, wenn eine neue Bar nicht auf OnInit kommen, während EA läuft, es ist kein Problem.

 
jjc:

Ja, ich meinte OnTick(). Sie messen dem Ausdruck "während der EA läuft" immer noch zu viel Bedeutung bei. Es bedeutet nicht notwendigerweise, oder sogar am plausibelsten, "während der EA sein OnTick() ausführt", und nicht "während der EA mit einem Chart verbunden ist, d.h. während seiner gesamten Lebensdauer".

Wir brauchen mehr Informationen von paranoyakX.

Ja, Sie haben Recht! Nach den letzten Informationen des Auftraggebers führt er definitiv alles im OnInit() und nicht im OnTick() aus. Ich bin fälschlicherweise davon ausgegangen, dass der OP die Dinge ein wenig korrekter macht. Es kam mir nie in den Sinn, dass seine gesamte Logik in der OnInit() war.
 
paranoyakX:

Hallo Leute,

lasst mich das klarstellen. Mein Code ist auf der Suche nach einem sehr grundlegenden Muster auf früheren Bars und wird entscheiden, ob eine Bestellung geöffnet werden, aber neue Bestellung öffnen wird nur überprüft werden, wenn ein neuer bar kommt. was ich meine, ich bin für den letzten bar schließen warten, dann überprüfen Sie das Muster, wenn es ok ist, werde ich die Bestellung zu öffnen. so öffnen eine Bestellung geschieht bei neuen bar's Eröffnung. wie @jjc sagte, ich halte grundlegende Muster Informationen bei globalen Variablen, wie wenn mein Muster begann und endete, was der höchste und niedrigste Wert ist, etc.

Irgendwie, wenn ich EA neu zu starten, möchte ich diese grundlegenden Informationen wieder zu finden (Muster Start und Ende bar, höchste, niedrigste Preise usw.) und füllen meine globalen Variablen wieder, das ist, warum ich dies brauche. Ich werde Start- und Endinformationen verwenden, um zu entscheiden, wann meine Bestellung zu schließen. so ist es genug, wenn eine neue Bar nicht auf OnInit kommen, während EA läuft, es ist kein Problem.

Sie sollten das alles NICHT in OnInit() machen. Sie sollten all diese Logik (einschließlich der Wiederherstellung) in OnTick() ausführen. Dies ist sehr wichtig! Wenn Sie dies in OnInit() tun, werden Sie weitere Probleme bekommen, die Sie nicht vorhergesehen haben, und Ihr EA wird sich in einem Zustand der "Initialisierung" befinden, während Sie all diese Logik ausführen. Also, machen Sie es richtig! Führen Sie nur Ihre Initialisierung (wie Variablen, externe Parameterprüfungen usw.) in OnInit() und alles andere in OnTick() durch.
 
FMIC:
Sie sollten das alles NICHT in OnInit() machen. Sie sollten all diese Logik (einschließlich der Wiederherstellung) in OnTick() ausführen. Das ist sehr wichtig! Wenn Sie dies in OnInit() tun, werden Sie weitere Probleme bekommen, die Sie nicht vorhergesehen haben, und Ihr EA wird sich in einem Zustand der "Initialisierung" befinden, während Sie all diese Logik ausführen. Also, machen Sie es richtig! Führen Sie nur Ihre Initialisierung (wie Variablen, externe Parameterprüfungen usw.) in OnInit() und alles andere in OnTick() durch.

Nein nein nein! Ich konnte nicht erklären, meine selft sorry, ich bin alles in der OnTick laufen. aber einfach ich überprüft, ob dieser Tick zu einem neuen bar und tun meine Mitarbeiter gehören. Was ich in OnInit ausführe, ist, die Aufträge und das Muster, das ich vorher berechnet habe, neu zu finden und neu zu berechnen. Ich sagte, dass dies bei OnInit läuft, finden meine Muster, die derzeit geöffnet, um zu gehören.

Ich hoffe, ich kann das erklären.

 
paranoyakX:

Nein nein nein! Ich konnte nicht erklären, meine selft sorry, ich bin alles in der OnTick laufen. aber einfach ich überprüft, ob dieser Tick zu einem neuen bar und tun meine Mitarbeiter gehören. Was ich in OnInit ausführe, ist, die Aufträge und das Muster, das ich vorher berechnet habe, neu zu finden und neu zu berechnen. Ich sagte, dass dies bei OnInit läuft, finden meine Muster, die derzeit geöffnet, um zu gehören.

Ich hoffe, ich kann das erklären.

Ja, das habe ich in Ihrem Beitrag verstanden! Was ich damit sagen will ist, dass Sie das NICHT in OnInit() machen sollen. Sie sollten Ihre Orders und Patterns und all diese Berechnungen in OnTick() finden.

Definieren Sie einfach eine lokale statische Variable in OnTick() und führen Sie alle Ihre Überprüfungen und Musterdefinitionen durch, und setzen Sie die Variable dann auf false.

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

Ja, das habe ich in Ihrem Beitrag verstanden! Was ich damit sagen will, ist, dass Sie das nicht in OnInit() machen sollten. Sie sollten Ihre Aufträge und Muster und all diese Berechnungen in OnTick() finden.

Definieren Sie einfach eine lokale statische Variable in OnTick() und führen Sie alle Ihre Überprüfungen und Musterdefinitionen durch, und setzen Sie die Variable dann auf false.

Entschuldigung, ich habe Sie missverstanden. Warum tue ich das nicht OnInit? Ist es nicht bequemer? Wenn ich das tue, muss ich bei jedem Tick nach dem ersten eine if-Anweisung ausführen, die nicht jedes Mal wahr sein wird. Ich dachte, das wäre eine unnötige Belastung für den Code.

Ist OnInit nicht der Grund, warum es existiert, um etwas wie meine globalen Variablen zu initialisieren?

 
paranoyakX:

Ich hoffe, ich kann das erklären.

Ich denke, dass wir etwas Code sehen müssen, um sicher zu sein, wovon Sie sprechen. Es ist zum Beispiel nicht klar, ob Sie nach dem historischen Muster suchen, das einen bestehenden offenen Handel generiert hat, weil (a) das Ihnen sagt, wie Sie den offenen Handel verwalten sollen, wo/wann er geschlossen werden soll usw., oder (b) nur, um einige Markierungen auf dem Chart zu zeichnen, die Ihnen erklären, warum der bestehende Handel eröffnet wurde.

Generell stimme ich mit FMIC überein, dass Sie versuchen sollten, so viel wie möglich in OnTick() zu tun und so wenig wie möglich in globalen Variablen zu speichern.

 
paranoyakX:

Tut mir leid, dann habe ich missverstanden Sie vor. Warum tue ich das nicht OnInit ? Ist es nicht bequemer? Wenn ich das tue, werde ich für jeden Tick nach dem ersten eine if-Anweisung ausführen, die nicht immer wahr sein wird. Ich dachte, das wäre eine unnötige Belastung für den Code.

Ist OnInit nicht der Grund, warum es existiert, um etwas wie meine globalen Variablen zu initialisieren?

Nein, es ist nicht korrekt, dies in OnInit() zu tun, da Sie die Ausführung der Initialisierung verzögern würden, und nein, die statischen Variablen behalten ihren Zustand bei, so dass Sie die Überprüfungen nur einmal durchführen, nicht bei jedem OnTick(). Das "if( FirstOnTick )" ist sehr schnell und hat sehr wenig Last, vor allem im Vergleich zu all Ihrem anderen Code, der im OnTick() läuft.
 

Danke für den Rat, hier ist eine sehr einfache Version meines Codes, das ist nicht mein richtiger Code, aber ich hoffe, dass dies klarer sein wird.

wie ich sagte, dies ist nicht der echte Code, finden Muster usw. ist nur ein Beispiel. der Grund, warum ich diesen Thread eröffnet istDetectExistingPattern() Funktion

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


bool CheckTrendPattern(){
 
  for(int i=10; i>=1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[10];
  LowestValue  = Low[1];
  
  return true;
};



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};