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

 
Valeriy Yastremskiy:

Bei 1440 Aufträgen pro Tag sollte eine Überprüfung zu Beginn der Minute oder einfacher beim Erscheinen des Minutenbalkens erfolgen. Und an dieser Stelle zu öffnen. Sie haben es nicht, also öffnet der EA eine Position bei jedem Tick, was an sich eine strenge Bedingung ist, entsprechend der Bedingung auf unserem Symbol beim aktuellen Kurs. Diese Bedingung kann nicht erfüllt sein, und die Zecken werden übersehen. Und irgendwann wird ein kritischer Fehler auftreten.

Auch die Art der Auftragsausführung (Auftrag, einen Handel durchzuführen, um eine Position zu schaffen) Alles oder nichts.

Das verstehe ich. Vielen Dank für die Hilfe.

Ich dachte auch, dass es für meinen EA schwierig war, so viele Aufträge zu eröffnen. Ich habe versucht, die Anzahl der Aufträge mit diesem Code zu begrenzen

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

Das heißt, öffnen Sie eine Bestellung erst um 10:00 Uhr. Das Ergebnis ist jedoch das gleiche.

2020.10.27 10:25:17.548 Core 1 272 Mb Speicher verwendet, davon 36 Mb History-Daten, 64 Mb Tick-Daten


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

Was mache ich falsch?

Ich habe den von mir hinzugefügten und geänderten Code eingefärbt

Dies steht in der Protokolldatei

FD 0 10:57:05.453 Core 1 agent process started on 127.0.0.1:3000

CS 0 10:57:05.453 Kern 1 Verbindung zu 127.0.0.1:3000

JD 0 10:57:05.953 Kern 1 verbunden

OD 0 10:57:05.975 Core 1 autorisiert (Agent Build 2650)

JL 0 10:57:05.980 Tester EURUSD,M1 (Alpari-MT5-Demo): Test von experts\GRAAL.ex5 von 2020.09.01 00:00 bis 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 Gemeinsame Synchronisierung abgeschlossen

CJ 0 10:57:06.223 Tester Qualität der analysierten Historie ist 100%

LM 0 10:57:06.248 Core 1 MetaTester 5 gestartet auf 127.0.0.1:3000

EJ 0 10:57:06.248 Core 1 Initialisierung beendet

LS 0 10:57:06.248 Core 1 login (build 2650)

KO 0 10:57:06.248 Core 1 4372 Bytes Kontoinformationen geladen

LI 0 10:57:06.248 Core 1 1482 Bytes an Testerparametern geladen

FN 0 10:57:06.248 Core 1 1724 Bytes Eingabeparameter geladen

OK 0 10:57:06.248 Core 1 423 Bytes der Symbolliste geladen (72 Symbole)

HO 0 10:57:06.248 Core 1 Experten-Datei hinzugefügt: Experts\GRAAL.ex5 13680 Bytes geladen

CP 0 10:57:06.248 Core 1 4077 Mb verfügbar, 50 Blöcke für Tickgenerierung eingestellt

DI 0 10:57:06.248 Core 1 Gewinn in Pips berechnen, Ersteinzahlung 10000, Hebelwirkung 1:100

LP 0 10:57:06.248 Core 1 erfolgreich initialisiert

RI 0 10:57:06.248 Core 1 Insgesamt 15 Kb an Initialisierungsdaten empfangen

DN 0 10:57:06.248 Kern 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD: zu synchronisierendes Symbol

RS 0 10:57:06.248 Core 1 EURUSD: Symbol synchronisiert, 3720 Bytes Symbolinformationen erhalten

OL 0 10:57:06.248 Core 1 EURUSD: Laden von 27 Byte Verlaufsdaten zur Synchronisierung in 0:00:00.003

EK 0 10:57:06.248 Core 1 EURUSD: Historie synchronisiert von 2019.01.02 bis 2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1: History Cache für 628432 Bars zugewiesen und enthält 619175 Bars von 2019.01.02 06:00 bis 2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1: Historie beginnt am 2019.01.02 06:00

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC-Balkenzustände werden erzeugt. OnTick-Ausführung nur zu Beginn des Balkens

JM 0 10:57:06.248 Core 1 EURUSD,M1: Test von experts\GRAAL.ex5 von 2020.09.01 00:00 bis 2020.09.10 00:00 mit Eingaben gestartet:

LS 0 10:57:06.248 Kern 1 StopLoss=30

PL 0 10:57:06.248 Kern 1 TakeProfit=100

FJ 0 10:57:06.248 Kern 1 Los=0.1

DP 0 10:57:06.248 Core 1 Endsaldo 10000.00 Pips

EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 Ticks, 10068 Balken erzeugt. Die Umgebung wurde um 0:00:00.031 synchronisiert. Test bestanden in 0:00:00.247 (einschließlich Ticks Vorverarbeitung 0:00:00.016).

DE 0 10:57:06.248 Core 1 EURUSD,M1: Gesamtzeit von der Anmeldung bis zum Stoppen des Tests 0:00:00.278 (einschließlich 0:00:00.031 für die Synchronisierung der historischen Daten)

NQ 0 10:57:06.248 Core 1 272 Mb Speicher verwendet, davon 36 Mb Verlaufsdaten, 64 Mb Tickdaten

KE 0 10:57:06.248 Core 1 Protokolldatei "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" geschrieben

OS 0 10:57:06.260 Core 1 Verbindung geschlossen


 
Denis Diakonov:

Bitte um Rat!

Warum wird die Serverzeit nicht aktualisiert, wenn neue Ticks eintreffen?

In dem Moment, in dem EA startet, funktioniert alles wie es sollte, aber dann geht die Zeit, aber der neue Wert der aktuellen Minute kommt nicht in die Variable.

D.h. der Expert Advisor arbeitet in Abhängigkeit von der in der Variablen int M = TimeMinute(TimeCurrent()) erhaltenen Zahl;

Diese Codezeile stammt aus der Referenz, und sie funktioniert nicht.

Ich starte sie z.B. um 12 Uhr-die vom Server zurückgegebeneaktuelle Uhrzeit entspricht der Uhrzeit in der Variablen, aber dann bleibt die Variable auf 12 Uhr stehen, obwohl es schon 15-20 Minuten auf der Uhr sind

Der Code ist völlig besser, genauer gesagt, wo Sie die Funktion erstellen und in welcher Funktion (OnInit, OnTick, OnTime) den Wert von Minuten erhalten und die Druckfunktion aufrufen. Wenn in OnInit oder außerhalb der Terminal-Funktionsfelder, das ist, wie es sein sollte. Bei OnTick wird bei jedem Tick gedruckt und der Wert mit einer neuen Minute aktualisiert.

 

Anschauliches Beispiel für Serverzeit und Variablenwert

Valeriy Yastremskiy:

Der Code ist völlig besser, genauer gesagt, wo Sie die Funktion erstellen und in welcher Funktion (OnInit, OnTick, OnTime) Sie den Wert von Minuten erhalten und die Druckfunktion aufrufen. Wenn in OnInit oder außerhalb der Terminal-Funktionsfelder, das ist, wie es sein sollte. Bei OnTick wird bei jedem Tick gedruckt und der Wert mit einer neuen Minute aktualisiert.

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

Nun, hier ist der vollständige Code. In der void-Funktion OnTick() wird sie gleich zu Beginn durch die erste auszuführende Zeile ausgelöst.

Sie wird nur zum Zeitpunkt der Neukompilierung oder des Anhängens an den Zeitplan/Löschungsfeld/ ausgelöst. In der übrigen Zeit enthält die Variable M den Wert der Minute, der beim ersten Durchlauf des EA ermittelt wurde.

 
Denis Diakonov:

Nun, der Code hier ist alles, was es zu tun gibt. Die void OnTick() wird ganz am Anfang durch die erste auszuführende Zeile ausgelöst.

Sie wird nur zum Zeitpunkt der Neukompilierung oder des Beitritts zum Graphen/Löschungsfeld/ ausgelöst. In der übrigen Zeit enthält die Variable M den Wert der Minute, der beim ersten Durchlauf des EA ermittelt wurde.

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

Verstanden, danke!

Ich hätte

int M = TimeMinute(TimeCurrent());

in den Hauptteil der Funktion einfügen, anstatt den Wert M vor der Funktion zuzuweisen

 
Denis Diakonov:

Verstanden, danke!

Ich hätte

in den Körper der Funktion einfügen, anstatt den Wert M davor zuzuweisen.

Sie können dies auf unterschiedliche Weise tun. Lesen von globalen und lokalen Variablen und deren Sichtbarkeit.

 

Nachmittags. Versuchen Sie, den Winkel der Trendlinie aus dem Winkel zu ermitteln. Hier ist der Code:

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

Winkel ist immer 0. Unabhängig davon, ob Sie Methoden der Standardbibliothek oder integrierte Funktionen verwenden. Zugleich wird die Grenze gezogen. Was ist los? Wie erhält man den Winkel?

 
leonerd:

Nachmittags. Versuchen Sie, den Winkel der Trendlinie aus dem Winkel zu ermitteln. Hier ist der Code:

Winkel ist immer 0. Unabhängig davon, ob Sie Methoden der Standardbibliothek oder integrierte Funktionen verwenden. Zugleich wird die Grenze gezogen. Was ist los? Wie erhalte ich den Winkel?

https://www.mql5.com/ru/forum/103591

Ich verstehe, aber wie berechnet man den Winkel?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

Ich verstehe, aber wie berechnet man den Winkel?

Du bist ein Komiker.

Wem mache ich etwas vor?

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Alle Fragen von Neulingen auf MQL4 und MQL5, jede Hilfe und Diskussion von Algorithmen und Codes

Nikolai Semko, 2020.10.26 00:34

Sie sollten keine Angst vor Geschwindigkeit haben. Es ist nur eine Bedingung für die Typkonvertierung.
Als eine Variante der Winkeldefinitionsfunktion:

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

Nach MT5 ist das Gefühl von MT4 einfach furchtbar. Der Zugang zur Geschichte ist irgendwie entschärft. Ich spreche nicht einmal von den Zecken.




 

Können Sie mir bitte sagen, ob diese Schriftauswahl im Indikator möglich ist?