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

 
-Aleks-:

Bitte um Hilfe! (MQL4)

Ich muss die Eröffnungszeit des Tages auf dem M15-Diagramm unter Berücksichtigung jedes Balkens für den Indikator ermitteln.

Ich beschloss, in Sekunden zu berechnen, unter Berücksichtigung der aktuellen Bar (0), aber ich muss falsch sein.

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

Wenn für den Indikator, dann:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

//--- done
   return(rates_total);
  }

Aber: dieser Code wird jedes Mal ausgeführt, wenn OnCalculate() aufgerufen wird - je nach Bedarf können Sie ein bool-Flag hinzufügen oder den Code in einer separaten Funktion unterbringen.

 
Karputov Vladimir:

Wenn für Indikator, dann:

Aber: dieser Code wird jedes Mal bei OnCalculate() ausgeführt - je nach Bedarf, oder fügen Sie ein bool-Flag hinzu oder platzieren Sie den Code in einer separaten Funktion.

Vielen Dank, aber bei jedem Tick zu tun Neuberechnung ist nicht gut - ich brauche, um Ihren Code zu analysieren, aber während ich will verstehen, warum mein Code nicht funktioniert, im Protokoll zurückgegeben werden seltsame Zahlen

Offen_ZeitTF 1454715900
Offene_Zeit 1454284800
Delta_1S 431100
Delta_M15 479

Es stellt sich heraus, dass zwischen dem ersten Balken des Tages und dem aktuellen Balken ein Unterschied von 479 Balken besteht - woran liegt das?

 
-Aleks-:

Danke, aber die Neuberechnung bei jedem Tick ist nicht gut - ich muss über Ihren Code nachdenken, aber während ich verstehen möchte, warum mein Code nicht funktioniert, gibt das Protokoll seltsame Zahlen zurück

Offen_ZeitTF 1454715900
Offene_Zeit 1454284800
Delta_1S 431100
Delta_M15 479

Es stellt sich heraus, dass zwischen dem ersten Balken des Tages und dem aktuellen Balken ein Unterschied von 479 Balken besteht - woran liegt das?

Ich habe darauf hingewiesen, dass ich kein Hellseher bin, und das ist der Grund:

Aber: dieser Code wird jedes Mal ausgeführt, wenn OnCalculate() aufgerufen wird- fügen Sie hier je nach Bedarf entweder einbool-Flag hinzuoder fügen Sie den Code in eine separate Funktion ein.

 
Karputov Vladimir:

Ich habe darauf hingewiesen, dass ich kein Hellseher bin, und das ist der Grund:

Warum sind hier übersinnliche Fähigkeiten erforderlich? In dem obigen Code gibt es Variablen, ich habe gezeigt, was diese Variablen an Zahlen zurückgeben, und gefragt, warum dies der Fall ist und nicht anders - laut Code.
 
Karputov Vladimir, Ich verstehe nicht, Ihren Code - weil ich ein Anfänger in diesem Geschäft bin,habe ichnicht verwendet OnCalculate Funktion vor,so kann ich nicht verstehen, wasrates_totaldort berechnet wird, und vor allem, wo es zurück? Ich verstehe auch nicht, wie man das alles in eine separate Funktion verwandeln kann... ohne Kommentare ist das schwer zu verstehen.
 
-Aleks-:
Karputov Vladimir, ich verstehe Ihren Code nicht - ich bin ein Anfänger in diesem Geschäft undhabe die FunktionOnCalculate noch nieverwendet, daher kann ich nicht verstehen, wasrates_totaldort berechnet wird und, was noch wichtiger ist, wohin es zurückgegeben werden sollte? Ich verstehe auch nicht, wie man das alles in eine separate Funktion verwandeln kann... ohne Kommentare ist das schwer zu verstehen.

Hier ist der vollständige Code des MQL4-Indikators:

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

Algorithmus seiner Arbeit: Wenn Sie den Indikator starten, stellen Sie das Zeitintervall für den Timer ein (z.B. 10 Sekunden) - das bedeutet, dass alle 10 Sekunden der Timer ausgelöst wird:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

und der VariablenIsDefineTime wird der Wert true zugewiesen. Wozu dient es? Wenn IsDefineTime=true ist, können wir in OnCalculate() eine Schleife starten, um die Startzeit des Tages zu bestimmen:

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

In dieser Schleife beginnen wir mit dem Durchlaufen des time[] -Arrays (in diesem Array werden die Werte für die Eröffnungszeit gespeichert), beginnend mit dem Balken ganz rechts (sein Index ist "0"). Wenn der Tagesanfang gefunden ist, heben wir seinen Wert auf und weisen der VariablenIsDefineTime den Wertfalse zu - auf diese Weise schützen wir uns davor, weiter in den Zyklus der Bestimmung der Anfangszeit des Tages einzutreten, bis der Timer erneut läuft.

Dateien:
Start_day.mq4  3 kb
 

Karputov Vladimir , danke für die Klarstellung, aber wie wird das Problem dadurch gelöst?

Grob gesagt müssen wir den Balken des aktuellen Zeitrahmens kennen, der dem Balken zu Beginn des Tages entspricht. Wir müssen jeden einzelnen Balken kennen und den Indikator entsprechend berechnen und zeichnen.

 
-Aleks-:

Karputov Vladimir , danke für die Klarstellung, aber wie wird das Problem dadurch gelöst?

Grob gesagt müssen wir den Balken des aktuellen Zeitrahmens kennen, der dem Balken zu Beginn des Tages entspricht. Sie müssen ihn für jeden Balken kennen und den Indikator entsprechend berechnen und zeichnen.

So haben Sie gefragt und so wurde Ihnen geantwortet :) . Und wenn Sie nicht die Zeit des ersten Balkens dieses Tages, sondern den Index dieses Balkens haben wollen, finden Sie ihn hier, wenn Sie den Tagesanfang drucken:

.
.
.
Print("Start day ",time[i-1]);
.
.
.

Sie verwenden den Index [i-1] - dies ist die Nummer des ersten Balkens des Tages.

 
Karputov Vladimir:

Wie du gefragt hast, hast du deine Antwort bekommen :) . Und wenn Sie nicht die Zeit des ersten Balkens des Tages, sondern den Index dieses Balkens benötigen, finden Sie ihn hier, wenn Sie den Tagesanfang drucken:

Sie verwenden den Index [i-1] - dies ist die Nummer des ersten Balkens des Tages.

Ich stimme zu - ich habe verwirrend gefragt.

Es gibt einen Indikator in der App, den ich erstellt habe, aber er zählt nicht richtig. Ich bin furchtbar dumm und verstehe auch nach Ihren Erklärungen nicht, wie man es schafft, den Index für den ersten Balken zu Beginn des Tages korrekt zu bestimmen.

Ich entschuldige mich für die Anmaßung, aber vielleicht können Sie mir zeigen, wie ich Ihren und meinen Code kombinieren kann?

 

-Aleks-:

Wie kann ich erreichen, dass der Index für den ersten Balken zu Beginn des Tages korrekt erkannt wird?

Es ist ein ziemliches Durcheinander:

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня
Grund der Beschwerde: