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

 
Mikhail Mishanin:

Das ist lustig) sollte es nicht sein)

Wenn der Kampf vorbei ist - handeln Sie mit einem normalen Spread, nehmen Sie einfach das "Limit" bei der Eingabe heraus und ignorieren Sie den Handel, wenn der Spread über dem Limit liegt.

Spreads können durch Dillings ohne Rollover gedehnt werden.

Ich habe eine ganze Reihe von Schwankungen, von 10 bis 45 Einheiten.

Ich muss warten, bis ich die 45.

Gleichzeitig zählt die Funktion einen Durchschnitt von 17, was recht zufriedenstellend ist.

Er steigt nach dem Rollover für 1 Stunde auf 100-140, ich werde den Code ausführen und sehen, wie er sich verhält.

 
Vitaly Muzichenko:

Sie können es aber auch so verschreiben:

Sie sollte ordnungsgemäß funktionieren.

Diese Logik gefällt mir nicht.

Die erste Eingabe für die Funktion:

res = 0;

Daher ist die Bedingung

if(dt.hour==22 && res<_sp)

nicht erfüllt ist.

Und ich möchte nicht weiter ins Detail gehen. Wozu ist dieser Zustand plötzlich gut?

   if(tc>LONG_MAX-1)
Ich verstehe die Logik des Ganzen nicht.
 
Alexey Viktorov:

Diese Logik gefällt mir nicht.

Die erste Eingabe für die Funktion:

res = 0;

Folglich ist die Bedingung

if(dt.hour==22 && res<_sp)

nicht erfüllt ist.

Und ich möchte nicht weiter darauf eingehen. Wozu ist dieser Zustand plötzlich gut?

   if(tc>LONG_MAX-1)
Ich verstehe die Logik des Ganzen nicht.

(1) Diese Bedingung gilt nur für 1 Stunde nach der Umstellung, wenn die Zeit 22 Stunden beträgt. Dies ist jedoch nur beim ersten Start der Fall, während das Terminal immer mit dem Expert Advisor arbeitet, was bedeutet, dass es nur einmal leer ist.

Vielleicht sollte sie auch als statisch deklariert werden, falls sich der Zeitrahmen ändert

2. if(tc>LONG_MAX-1) = wir setzen die Variable tc auf Null, wenn wir die zulässigen Grenzen von long überschritten haben. Dies ist unwahrscheinlich, da das Terminal manchmal überlastet ist, zum Beispiel am Wochenende.

---

Geänderter Code, dieser muss endgültig sein:

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. Stellen Sie es auf die Probe

P.S. Überarbeitung des Codes

----

P.S.S.S. Ich habe 1 Stunde mehr Zeit nach dem Rollover hinzugefügt, sonst habe ich sehr hohe Spreads bei einigen Händlern.

Die endgültige Variante hat 20 Stunden gearbeitet und das Ergebnis ist erstaunlich

Der durchschnittliche tägliche Spread liegt zwischen 10 und 45 pps, meistens jedoch zwischen 10 und 17 pps. Der durchschnittliche Spread wurde mit 19 berechnet.

Vielen Dank für Ihre Teilnahme. Wenn Sie etwas hinzufügen möchten, schreiben Sie uns!

 
Vitaly Muzichenko:

Vielleicht sollte sie auch als statisch deklariert werden, falls sich der Zeitrahmen ändert

Ich habe es verstanden, es scheint zu funktionieren, ich nehme zurück "es sollte nicht"), jetzt muss ich nur noch die Momente der Nullstellung/Zuweisung herausfinden.

 

Ich habe eine Diskussion im Forum gesehen, kann sie aber nicht finden.

Sie müssen auf eine Position auf einem Balken beschränkt sein, der jederzeit geöffnet werden kann. Das ist jetzt die Option, aber sie ist meiner Meinung nach "schwer".

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

Wie kann diese ersetzt werden, um sie leichter zu machen?

 
Vitaly Muzichenko:

Ich habe eine Diskussion im Forum gesehen, kann sie aber nicht finden.

Sie müssen auf eine Position auf einer Leiste beschränkt sein, die jederzeit geöffnet werden kann. Das ist jetzt eine Option, aber sie ist meiner Meinung nach "schwer".

Wie kann dies ersetzt werden, um es einfacher zu machen?

"Du musst dich auf eine Position an der Stange beschränken, die jederzeit offen sein kann..."

zu allgemeine Formulierung, meinen Sie, dass einmal auf der Bar in diesem Symbol können Sie OrderSend senden?

 
Mikhail Mishanin:

"Man muss sich auf eine Position auf der Stange beschränken, die jeden Moment geöffnet werden kann..."

die Formulierung ist zu allgemein, meinen Sie, dass Sie einmal pro Takt in diesem Symbol OrderSend senden können?

Ja. Der Expert Advisor arbeitet auf dem H1-Zeitrahmen und kann eine Position um 10:17 Uhr eröffnen, er muss jedoch keine weitere vor 11:00 Uhr, d.h. auf dem aktuellen Balken, eröffnen.

 
Vitaly Muzichenko:

Ja. Der EA arbeitet auf dem H1-Zeitrahmen und kann eine Position um 10:17 Uhr eröffnen, Sie müssen sicherstellen, dass er vor 11:00 Uhr, d. h. auf dem aktuellen Balken, nicht mehr eröffnet.

Ja, ich denke, der Teufel steckt auch hier im Detail.

Öffnen Sie eine Position - setzen Sie eine "Verbotsflagge" und/oder speichern Sie die "Zeit" (es spielt keine Rolle, welche, solange es die gleiche (Quelle) zum Vergleich ist)

eine neue Bar wird geöffnet - die "Verbotsflagge" wird gesetzt...

Frage: Was ist, wenn sich die Position irgendwie verändert hat?

Beispiel, wie ich einen neuen Balken definiere - doTB-Divisor in Sekunden, für H1 ist es 3600.0

BARii[].time - Zeit der Takte mit M1, aber sie kann beliebig sein und beliebig geteilt werden, wenn sie größer oder gleich 1 ist, bedeutet das die "Zeit" von verschiedenen "Takten

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

Ja, wieder unvollständige Bedingungen meiner Meinung nach, "der Teufel steckt im Detail", in einfachen Worten, wenn der Text

eine Position eröffnet - eine "Verbotsflagge" gesetzt und/oder die "Zeit" gespeichert (egal welche, Hauptsache es ist die gleiche (Quelle) zum Vergleich)

eine neue Bar wird geöffnet - die "Verbotsflagge" wird gesetzt...

Frage: Was ist, wenn sich die Position irgendwie verändert hat?

Beispiel, wie ich einen neuen Balken definiere - doTB-Divisor in Sekunden, für H1 ist es 3600.0

BARii[].time - Zeit der Takte mit M1, aber sie kann beliebig sein und beliebig geteilt werden, wenn sie größer oder gleich 1 ist, bedeutet das die "Zeit" von verschiedenen "Takten".

Zu diesem Zeitpunkt war ich mit der Option, Flaggen zu verwenden, nicht zufrieden; ich weiß nicht mehr, warum, aber ich ersetzte sie durch

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

OK, ich werde über eine andere Umsetzung nachdenken

 
Vitaly Muzichenko:

Damals war ich mit der Option "Flaggen" nicht zufrieden, ich weiß nicht mehr warum, aber ich habe sie ersetzt durch

Okay, ich werde über eine andere Umsetzung nachdenken.

Und was bleibt bei dieser Umsetzung auf der Strecke? Ähnlich wie mein Code bestimmt zweimal in einem "Takt" oder in verschiedenen. Nur in meiner Variante "wahr", wenn in verschiedenen "Bars", in Ihrer Variante "wahr", wenn in einem Bar, nur Bypass-Vergleich == mit "0" besonders Integer, wo, und ich kann wahrscheinlich ändern Bedingung zu >0,0 oder >0,9, müssen denken...

Grund der Beschwerde: