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

 

Hallo, können Sie mir sagen, warum es nicht funktioniert? Keine Fehler, aber die Aufträge öffnen sich nicht im Testgerät. Ich versuche, einen EA für den Ausbruch des Hochs und des Tiefs einer Tageskerze als Trainingstool zu schreiben.


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

Hallo, können Sie mir sagen, warum es nicht funktioniert? Keine Fehler, aber die Aufträge öffnen sich nicht im Testgerät. Ich versuche, einen EA für den Ausbruch des Hochs und des Tiefs einer Tageskerze als Trainingstool zu schreiben.


Sie lässt sich nicht öffnen, d. h. sie versucht es nicht, oder sie versucht es, schlägt aber fehl? Was steht im Protokoll?

 
nelenaby:

Hallo, können Sie mir sagen, warum es nicht funktioniert? Keine Fehler, aber die Aufträge öffnen sich nicht im Testgerät. Ich versuche, einen EA für die Aufschlüsselung von Hoch und Tief einer Tageskerze als Trainingswerkzeug zu schreiben.


Analysieren Sie diesen Ausdruck von Ihnen

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

Ich verstehe die Bedeutung dieses Ausdrucks nicht und vielleicht liege ich falsch, aber Sie sollten zumindest "(TimeCurrent()==HourStart)" durch "(TimeCurrent() - HourStart)" ersetzen.

 

Wenn ich Sie richtig verstehe, versuchen Sie, eine BuyLimit-Order zu platzieren, wenn es keine BuyLimitOrder UND BuyPosition gibt. Beachten Sie das genaue "UND". Das heißt, dass das Vorhandensein von jedem von ihnen separat zu Ihnen passt, so dass Sie an einer gewünschten Position des aktuellen Preises eine unendliche Anzahl von ByLimits erhalten, eine auf jedem Tick, bis mindestens einer von ihnen auslöst und die erste Position öffnet. Außerdem ist es Ihnen egal, wo der Preis jetzt steht. Sobald die seltsame Bedingung bezüglich der Zeit erfüllt ist (direkt über dem Beitrag), denke ich, dass es einen Fehler gibt, aber egal. Wie auch immer, wenn Sie das nicht beachten, wird der EA beim ersten Tick falsche Orders platzieren, bis der Preis das gestrige Hoch erreicht, weil Sie das gestrige Hoch als Preis für die Platzierung der Order verwenden. Das Kauflimit wird unter dem aktuellen Kurs gesetzt, was bedeutet, dass der aktuelle Kurs über dem gestrigen Höchststand liegen sollte, aber bis dahin wird der Auftrag fehlschlagen.

Die einzige Situation, die für Sie in Frage kommt, ist also, wenn der Kurs über das gestrige Hoch gestiegen ist, es kein BuyLimit gibt und keine offenen Trades bestehen. Dies ist eine seltene Kombination. Außerdem wird er den Ausbruch nicht beeinflussen, sondern nach dem Ausbruch abprallen (weil es eine Begrenzung gibt), und er wird Ihnen viele Fehler liefern, beginnend mit dem ersten Tick über dem gestrigen Maximum (das ist ein weiterer Fehler). Die Bedingung ist bereits erfüllt, der Expert Advisor gibt die Order aus, aber es gibt auch einen Spread, den zulässigen Mindestabstand zum Markt usw.

 
Sergey Voytsekhovsky:

Ich habe Schwierigkeiten, die Bedeutung dieses Ausdrucks zu verstehen, vielleicht liege ich falsch, aber ersetzen Sie zumindest "(TimeCurrent()==HourStart)" durch "(TimeCurrent() - HourStart)".

Das ist richtig, hier liegt ein Fehler vor. Sie benötigen if (TimeHour(TimeCurrent())==HourStart)

Jetzt wird die Bestellung manchmal geöffnet, aber es werden mehr Fehler erzeugt (OrderSend error 130).

Der Irrtum über Limitaufträge ist hier nicht korrekt.

 
nelenaby:

Das ist richtig, hier liegt ein Fehler vor. Er benötigt if (TimeHour(TimeCurrent())==HourStart)

Jetzt werden manchmal Transaktionen geöffnet, aber es treten mehr Fehler auf (OrderSend error 130).

Bei Limitaufträgen ist das nicht richtig.

Hier ist ein Skript zur Arbeit mit der Zeit.

Er ist zwar alt, funktioniert aber einwandfrei.

Dateien:
 

Hallo.

Bitte helfen Sie mir zu verstehen, wie man mit Dateien arbeitet.

Wenn das Programm läuft, speichere ich die empfangenen Daten in einer Datei und lese die CSV-Datei.

Die Datei wird größer, die Geschwindigkeit sinkt. Ich habe versucht, einige der Elemente in den Zeilen zu aktualisieren (zu überschreiben). Niemals!

Sie können eine markierte Zeile nicht löschen! Ich kann nicht ein neues Element zu einer alten Zeile hinzufügen!

Das ist sehr seltsam! Sie können eine Datei oder ein grafisches Objekt usw. einfach löschen. Aber wenn es darum geht, mit einer erstellten Datei zu arbeiten, ist es eine absolute Sackgasse!

In Foren gibt es nur eine Empfehlung: "Lesen Sie die Datei in den Speicher ein, ändern oder löschen Sie die Zeile und speichern Sie die neue Datei unter dem alten Namen".

Dies scheint mir nicht die richtige Lösung zu sein. Ich muss etwas übersehen haben. Bitte helfen Sie mir, es herauszufinden.

 
im-zvv:

Das scheint mir nicht die richtige Entscheidung zu sein. Wahrscheinlich übersehe ich etwas. Bitte helfen Sie mir, es herauszufinden.

Sie sollten dringend von Microsoft eingestellt werden, um diese"falsche Lösung" für die Dateiverarbeitung endlich zu korrigieren.


Dateibearbeitung ist nicht wie das Bearbeiten einer Datei in einem Dateieditor, sondern eher wie das Würfeln eines Wortes mit einzelnen Buchstaben.
Wenn Sie einen neuen Buchstaben einfügen wollen, müssen alle darauf folgenden Würfel nach rechts verschoben werden.
Wenn Sie einen alten Buchstaben entfernen wollen, müssen alle Würfel, die auf ihn folgen, nach links verschoben werden.
Wenn die Datei also nicht groß ist und die Arbeit keinen Zugriff auf die Datei erfordert, ist es in der Tat einfacher, die Daten in eine neue Datei zu schreiben, die alte zu löschen und die neue Datei in den Namen der alten umzubenennen.

Wenn ich mich nicht irre, ist das Einzige, was in MQL bei der Arbeit mit Dateien fehlt, die Möglichkeit, die Dateilänge auf die gewünschte Größe zu kürzen.


 
Alekseu Fedotov:

Hier ist ein Skript für die Arbeit mit der Zeit.

Es ist alt, aber es funktioniert einwandfrei.

Früher habe ich auch Kims Funktion verwendet, dann fand ich Zeit, meine eigene zu schreiben:

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
Laufzeit deaktivieren - Sie müssen bei der Initialisierung des Konstruktors ungültige Daten eingeben, z. B. 25 Stunden oder 70 Minuten
 
Sergey Dzyublik:

Sie sollten dringend von Microsoft eingestellt werden, damit sie diese"falsche Lösung" für die Dateiverwaltung endlich korrigieren.


Das Arbeiten mit Dateien ist nicht wie das Bearbeiten einer Datei in einem Dateieditor, sondern eher wie das Würfeln eines Wortes mit einzelnen Buchstaben.
Wenn Sie einen neuen Buchstaben einfügen wollen, müssen alle darauf folgenden Würfel nach rechts verschoben werden.
Wenn Sie einen alten Buchstaben entfernen wollen, müssen alle Würfel, die auf ihn folgen, nach links verschoben werden.
Wenn die Datei also nicht groß ist und die Arbeit keinen Zugriff auf die Datei erfordert, ist es in der Tat einfacher, die Daten in eine neue Datei zu schreiben, die alte zu löschen und die neue Datei in den Namen der alten umzubenennen.

Wenn ich mich nicht irre, ist das Einzige, was in MQL bei der Arbeit mit Dateien fehlt, die Möglichkeit, die Dateilänge auf die gewünschte Größe zu kürzen.


Ich danke Ihnen. Eine gute Klarstellung. Leider ist meine Datei sehr groß, so dass ich mit "Würfeln" arbeiten muss.