Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 412

 
Imminence:

Hallo, ich habe ein Anfängerproblem...

Ich kann das System nicht dazu bringen, den letzten Bar-Close-Wert mit den Höchst- und Tiefstwerten eines bestimmten Zeitraums zu vergleichen, z. B.

die letzten 20 Takte. Was mache ich falsch?


Ich habe es mit Alert überprüft, und aus irgendeinem unbekannten Grund zeigt der Tester den Höchstwert aus der Berechnung des letzten Ticks an, aber er gibt diesen Wert an

Sie entspricht der Anzahl der Ticks, so dass der Auftrag nicht eröffnet wird.


Das zweite Problem ist, wie meine EA warten auf die nächste Bar zu öffnen (30m Periode)? In der Checkpoints-Test ist alles in Ordnung, aber wenn ich Ticks verwenden,

dann öffnet sich mein Expert Advisor im selben Balken, direkt nachdem er mit einem Stop-Loss geschlossen wurde...


Wie kann ich einen Handel schließen, ohne davon abhängig zu sein, ob es ein Tick war oder nicht? z.B. für einen Zeitraum von 30m möchte ich den Auftrag 5 Sekunden vor Ende des Balkens (29.55, 59.55) schließen

Auf der Grundlage aller zu diesem Zeitpunkt vorliegenden Daten. In diesem Stadium besteht das Problem darin, dass, wenn ein Tick nicht innerhalb von 5 Sekunden auftritt, also kein

(Theoretisch ist das Blödsinn, aber in der Realität könnte der nächste Tick aus irgendeinem Grund in einigen Kerzenständern erscheinen.

kann aus irgendeinem Grund in einigen Kerzen sein.


Vielen Dank im Voraus!

1. Ich habe in dem Code nichts über die letzten 20 Takte gesehen.

2. So bestimmen Sie den ersten Tick eines neuen Balkens

3) Wie schließe ich einen Auftrag, ohne zu prüfen, ob er ein Tick war oder nicht?

Wir müssen die Arbeit mit OnTick vermeiden und mit OnTimer arbeiten. Setzen Sie den Timer mit einem Intervall von 1 Sekunde und überprüfen Sie die Zeit darin. Der Timer hängt nicht von Ticks ab.

/// Определяет начало нового бара
bool NewBar()
{
    static datetime lastbar = 0;
    datetime curbar = iTime(Symbol(), PERIOD_M30, 0);
    if(lastbar!=curbar)
    {
        lastbar=curbar;
        return (true);
    }
    return(false);
}
 
Leanid Aladzyeu:

o_oops wusste nicht, dass das Terminal auch dort stochert, wo der Fehler ist, beim ersten Mal bin ich auf einen kritischen Fehler gestoßen.

Es spuckt auf sie.

Natürlich wird es spucken, Sie greifen auf das 3. Element eines Arrays mit der Dimension 2 zu - mas[2]++

void Oher(int Mag,string Symb, int &mas[2])
..............
...........

case 1:mas[1]++; mas [2]++;break;// 1 продажа
 

Alexey Volchanskiy:
Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.

Das ist ein Scherz. Jetzt fügt es einen Kommentar am Ende der Zeile hinzu... und der Text läuft nach rechts ab. ;-)

 

Guten Abend. Ich versuche, einen einfachen EA für das Kreuzen von Tenkan und Kinjun zu schreiben. Hier ist der Code:

void OnTick()

void OnTick()

{

TradeSignal_20();

}


int TradeSignal_20()

{

int sig=0;


if(h_ich==INVALID_HANDLE)

{

h_ich=iIchimoku(Symbol(),Zeitraum(),IKHtenkansen,IKHkijunsen,IKHsenkouspanb);

zurück(0);

}

sonst

{

if (CopyBuffer(h_ich,0,0,3,ich1_buffer)<2) return(0); // TENKANSEN_LINE

if (CopyBuffer(h_ich,1,0,3,ich2_buffer)<2) return(0); // KIJUNSEN_LINE

if (!ArraySetAsSeries(ich1_buffer,true)) return(0);

if (!ArraySetAsSeries(ich2_buffer,true)) return(0);

}

//--- Bedingung prüfen und Wert für sig einstellen

if(ich1_buffer[1]>ich2_buffer[1]) sig=1;

else if(ich1_buffer[1]<ich2_buffer[1]) sig=-1;

sonst sig=0;

if (ich1_buffer[1]>ich2_buffer[1])

if (ich1_buffer[2]<ich2_buffer[2])

Alert(Symbol()+": Kauf");

if (ich1_buffer[1]<ich2_buffer[1])

if (ich1_buffer[2]>ich2_buffer[2])

Alert(Symbol()+": sale");

//--- Rückgabe des Handelssignals

zurück (sig);

}

//+------------------------------------------------------------------+

Wie kann ich erreichen, dass der Alarm nur einmal und nicht ständig aufgerufen wird?

 
Alexey Volchanskiy:

1. Ich habe im Code nichts über die letzten 20 Balken gesehen, bitte geben Sie Einzelheiten an.

2. So bestimmen Sie den ersten Tick eines neuen Balkens

3) Wie kann ein Geschäft geschlossen werden, unabhängig davon, ob es angekreuzt wurde oder nicht?

Sie müssen die Arbeit mit OnTick vermeiden und mit OnTimer arbeiten, den Timer mit einem Intervall von 1 Sekunde einstellen und die Zeit darin überprüfen. Der Timer ist nicht vom Eintreffen von Zecken abhängig.

Wie kann ich hier den Schlusskurs mit dem Maximum der letzten 20 Balken vergleichen? Und wenn der letzte Preis gleich oder größer als der Höchstpreis der letzten 20 Balken ist, dann gibt es ein Signal zum Öffnen.
  

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];


   
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
 
first_may:

Guten Abend. Ich versuche, einen einfachen EA auf Tenkan und Kinjun Crossing zu schreiben. Hier ist der Code:

void OnTick()

void OnTick()

{

TradeSignal_20();

Wie kann ich dafür sorgen, dass die Meldung nur einmal und nicht immer wieder aufgerufen wird?
Können Sie nicht die SRC-Taste drücken?
 
Imminence:
Wie kann ich hier den Schlusskurs mit dem Maximum der letzten 20 Balken vergleichen? Und wenn der letzte Preis gleich oder größer ist als das Maximum der letzten 20 Balken, dann gibt es ein Signal zum Öffnen.
Schauen wir uns den Code an
double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
***********

Ich denke, das Problem liegt in der Bezugnahme auf den Null-Balken, d. h. den aktuellen Balken. Sie sollten den Beginn eines neuen Balkens definieren, wie ich es in der vorherigen Antwort angegeben habe, und alle Vergleiche nur beim ersten Tick eines neuen Balkens durchführen. Und ändern Sie die Indizierung. Wir müssen sicherstellen, dass der letzte geschlossene Balken nicht in iHighest steht. Und jetzt haben Sie einen Verweis auf die aktuelle Bar wird auf jedem Tick gebildet, die Ergebnisse werden die seltsamsten sein.

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,2)];

  if(Close[1] > SMMA && Close[1] > BB_UP && Close[1] >= HIGHEST)

  {
***********

 
Alexey Volchanskiy:
Schauen wir uns den Code von

Ich denke, das Problem liegt in der Bezugnahme auf den Null-Balken, d. h. den aktuellen Balken. Sie müssen den Beginn eines neuen Balkens definieren, wie in der vorherigen Antwort erwähnt, und alle Vergleiche nur beim ersten Tick des neuen Balkens durchführen. Und ändern Sie die Indizierung. Wir müssen sicherstellen, dass der letzte geschlossene Balken nicht in iHighest steht. Und jetzt haben Sie einen Verweis auf die aktuelle Bar wird auf jedem Tick gebildet, die Ergebnisse werden die seltsamsten sein.

Danke, scheint geholfen zu haben :) obwohl ich hätte schwören können, dass ich genau das Gleiche gemacht habe und es nicht funktioniert hat...

Sie rieten OnTimer(), aber aus irgendeinem Grund wird es nicht mit mir zusammenarbeiten. Ich habe die gesamte Hilfe studiert und keine klaren Erklärungen oder Beispiele gefunden, so dass ich ratlos war.

Das heißt, dieser triviale Code wird nicht ausgeführt, obwohl alles in der Referenz angegeben ist... Beim Googeln dieses Programms bin ich darauf gestoßen, dass OnTimer() im Test nicht funktioniert

Modus. Dieser Moment scheint jedoch mit mql5 beseitigt worden zu sein. Helfen Sie, es zu verstehen :) Danke!

int OnInit()
  {
//---
  bool  Timer = EventSetTimer(1);
  if(Timer != TRUE)
  Print(GetLastError()); 
//---
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  EventKillTimer();   
  }
  
void OnTimer()
{
Print("It works");
}  
  
 

Imminence:

Beim Googeln dieses Programms bin ich darauf gestoßen, dass OnTimer() im Testmodus angeblich nicht funktioniert. Das Problem wurde mit mql5 gelöst. Hilf mir, es zu verstehen.) Danke!

Richtig, in MT4 im Tester funktioniert der Timer nicht und es ist nicht dokumentiert! Ich habe an servicedesk geschrieben, und sie sagten, sie würden das nie tun. Ich habe das Problem durch den Aufruf von OnTimer in OnTick gelöst. Ich habe den Timer auf eine Sekunde eingestellt.

// Возвращает true, если работает под тестером
bool IsRunOnTester()
{
    if(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_VISUAL_MODE) || MQLInfoInteger(MQL_OPTIMIZATION))
        return true;
    return false;    
}

MqlDateTime     TimeCurrStruct;

void OnTick()
{
    if(IsRunOnTester())
    {
        static datetime dt1 = 0, dt2 = 0;
        static bool tfirst = true;
        if(tfirst)
        {
            tfirst = false;
            dt1 = dt2 = TimeCurrent();
            return;
        }
    
        dt2 = TimeCurrent();
        for(datetime TimeTesterCurrent = dt1+1; TimeTesterCurrent <= dt2; TimeTesterCurrent++)
        {
            TimeToStruct(TimeTesterCurrent, TimeCurrStruct);
            OnTimer();
        }    
        dt1 = dt2;
    }
}

Wenn also im Tester die Ticks öfter als 1 Mal/Sekunde kommen, werden die überzähligen übersprungen; wenn sie seltener kommen, wird das Zeitvielfache von 1 Sekunde erzeugt. Diese Zeit liegt in der TimeCurrStruct-Struktur, und meine Hauptklasse nimmt in jedem Modus die Zeit nur aus dieser Struktur. Meiner Meinung nach ist dies die einzige Möglichkeit, diesen Fehler zu beheben. Hier ist eine Funktion, ich habe unnötige Dinge entfernt, nur Fleisch ))

void OnTimer()
{
    string msg;
    if(!IsRunOnTester())
    {
        TimeToStruct(TimeCurrent(), TimeCurrStruct);
        SmartDsp.ReceiveTick(TimeCurrStruct);    // основной метод робота, в него передается структура со временем
    }
    else
    {
        SmartDsp.ReceiveTick(TimeCurrStruct);    
    }
}




 
Alexey Volchanskiy:
Können Sie nicht die SRC-Taste drücken?
Es ist nicht klar, was Sie damit meinen?