Skripte: sSyncScroll - Seite 2

 
Wenn ich nämlich versuche, das Diagramm zurückzublättern und die Historie zu betrachten, kehrt das Diagramm beim Eintreffen eines neuen Ticks an den Anfang zurück. Warum brauche ich das in diesem Fall? Ich weiß bereits, dass die letzte Kerze auf M1 auch die letzte Kerze für alle anderen TFs ist. Und ohne diesen Indikator werden in allen Fenstern die letzten Candlesticks automatisch neu gezeichnet.
 
Дима Джумок #:
Wenn ich nämlich versuche, das Diagramm zurückzublättern und die Historie zu betrachten, kehrt das Diagramm beim Eintreffen eines neuen Ticks an den Anfang zurück. Warum brauche ich das in diesem Fall? Ich weiß bereits, dass die letzte Kerze auf M1 auch die letzte Kerze für alle anderen TFs ist. Und ohne diesen Indikator werden die letzten Candlesticks automatisch in allen Fenstern neu gezeichnet.

Er ging nach den nächsten Änderungen in der Sprache kaputt, ich habe hier noch einen anderen, der auch kaputt ist. Suchen Sie nach mehr, es gibt funktionierende hier.

 
Dmitry Fedoseev #:

Sie ging nach einer weiteren Änderung der Sprache kaputt, ich habe hier eine andere, die auch kaputt ist. Suchen Sie nach mehr, es gibt einige funktionierende hier.

Dmitry, ich danke dir für deine Antwort. Zu meinem Bedauern gibt Google nur Links zu Ihren Entwicklungen. Das Forum hat mir auch keine Alternative geboten. Admiral Market bietet eine solche Funktion aber nur auf ihrer Plattform und es ist nicht MT5. Der liebe fxsaber hat 2017 seine Variante Simultanes Autoscrolling von Charts für ein Instrument in verschiedenen Zeitrahmen für MT5 angeboten - Technische Indikatoren und Forex-Marktanalyse - MQL5 Algo-Traders Forum (es gibt den Indikator-Text im letzten Kommentar), aber ich weiß nicht, wie man es für MT5-Terminal konvertieren, so kann ich nicht feststellen, ob es eine funktionierende Variante ist. Wenn es Ihnen nichts ausmacht, konvertieren Sie ihn bitte, vielleicht funktioniert er ja.

// MQL4&5-Code
// Synchronisierung aller Karten nach der richtigen Zeit

sinput int TimerInterval = 1; // Aktualisierungsintervall in Millisekunden

// Deaktiviert Auto-Scroll und Shift auf allen Diagrammen
bool AutoShiftOff( void )
{
  long handle = ChartFirst();

  while (handle != INVALID_HANDLE)
  {
    ChartSetInteger(handle, CHART_SHIFT, false);
    ChartSetInteger(handle, CHART_AUTOSCROLL, false);

    handle = ChartNext(handle);
  }

  return(true);
}

const bool Init = EventSetMillisecondTimer(TimerInterval) && AutoShiftOff();

void OnTimer()
{
  SyncCharts();
}

// Gibt true zurück, wenn es zu dieser Zeit keinen Takt gibt ("Loch")
bool IsHole( const string Symb, const ENUM_TIMEFRAMES TimeFrame, const datetime time )
{
  return(Bars(Symb, TimeFrame, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_FIRSTDATE), time) +
         Bars(Symb, TimeFrame, time, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_LASTBAR_DATE)) ==
         SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_BARS_COUNT));
}

// Gibt den Zeitbalken zurück
int iBarShift( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time )
{
  int Res = -1;
  datetime LastBar;

  time -= time % PeriodSeconds(TimeFrame);

  if (SeriesInfoInteger(Symb, TimeFrame, SERIES_LASTBAR_DATE, LastBar))
  {
    if (time > LastBar)
      Res = (int)((LastBar - time) / PeriodSeconds(TimeFrame));
    else
    {
      const int Shift = Bars(Symb, TimeFrame, time, LastBar);

      if (Shift > 0)
      {
        Res = Shift - 1;

        if (IsHole(Symb, TimeFrame, time))
          Res++;
      }
    }
  }

  return(Res);
}

// Gibt die Taktzeit zurück
datetime iBarShift( const string Symb, const ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT, const int Pos = 0 )
{
  datetime Tmp[1];

  CopyTime(Symb, TimeFrame, (Pos < 0) ? 0 : Pos, 1, Tmp);

  return(Tmp[0] - ((Pos < 0) ? Pos * PeriodSeconds(TimeFrame) : 0));
}

// Gibt den rechten Balken des Diagramms zurück
int ChartBarRight( const long chartID = 0 )
{
  return((int)(ChartGetInteger(chartID, CHART_FIRST_VISIBLE_BAR) - ChartGetInteger(chartID, CHART_WIDTH_IN_BARS) + 1));
}

// Gibt die richtige Diagrammzeit zurück
datetime GetChartTimeRight( const long chartID = 0 )
{
  return(iBarShift(ChartSymbol(chartID), ChartPeriod(chartID), ChartBarRight(chartID)));
}

// Setzt die rechte Diagrammzeit, gibt die gesetzte Zeit zurück
datetime SetChartTimeRight( datetime time, const long chartID = 0, const ulong MaxTime = 1 e5 )
{
  const string Symb = ChartSymbol(chartID);
  const ENUM_TIMEFRAMES period = ChartPeriod(chartID);

  const int Pos = iBarShift(Symb, period, time);
  const int PrevPos = ChartBarRight(chartID);

  if ((Pos != PrevPos) && ChartNavigate(chartID, CHART_END, -1 - Pos))
  {
    const ulong StartTime = GetMicrosecondCount();
    int NewPos = ChartBarRight(chartID);

    while (((NewPos != Pos)|| (NewPos == PrevPos)) && (GetMicrosecondCount() - StartTime < MaxTime) && !IsStopped())
    {
      Sleep(0);
      
      NewPos = ChartBarRight(chartID);
    }
  }

  return(GetChartTimeRight(chartID));
}

// Hinzufügen eines Elements an das Ende eines beliebigen Arrays
template <typename T>
void AddArrayElement( T &Array[], const T Value, const int Reserve = 0 )
{
  const int Size = ArraySize(Array);

  ArrayResize(Array, Size + 1, Reserve);

  Array[Size] = Value;
}

// Ermittelt die Zeit des rechten Balkens eines jeden Diagramms
int GetChartsTimeRight( datetime &RightTime[], long &Handles[] )
{
  ArrayFree(RightTime);
  ArrayFree(Handles);

  long handle = ChartFirst();

  while (handle != INVALID_HANDLE)
  {
    AddArrayElement(RightTime, GetChartTimeRight(handle));
    AddArrayElement(Handles, handle);

    handle = ChartNext(handle);
  }

  return(ArraySize(RightTime));
}

// Legt die richtige Zeit für alle Diagramme fest
int SetChartsTimeRight( const datetime time, datetime &RightTime[], const long ExcludeHandle = 0 )
{
  ArrayFree(RightTime);

  long handle = ChartFirst();

  while (handle != INVALID_HANDLE)
  {
    AddArrayElement(RightTime, (ExcludeHandle == handle) ? GetChartTimeRight(handle) : SetChartTimeRight(time, handle));

    handle = ChartNext(handle);
  }

  return(ArraySize(RightTime));
}

// Gibt das Diagramm zurück, dass sich die Zeit des rechten Balkens geändert hat
long GetChangeChart( const datetime &PrevRightTime[])
{
  datetime Handles[];
  datetime RightTime[];

  long Res = ArraySize(PrevRightTime) ? 0 : ChartID();

  for (int i = MathMin(ArraySize(PrevRightTime), GetChartsTimeRight(RightTime, Handles)) - 1; i >= 0; i--)
    if (RightTime[i] != PrevRightTime[i])
    {
      Res = Handles[i];

      break;
    }

  return(Res);
}

// Synchronisiert alle Charts nach der richtigen Zeit, gibt die Anzahl der synchronisierten Charts zurück
int SyncCharts()
{
  static datetime PrevRightTime[];

  const long handle = GetChangeChart(PrevRightTime);

  return(handle ? SetChartsTimeRight(GetChartTimeRight(handle), PrevRightTime, handle) : 0);
}
fxsaber
fxsaber
  • 2023.01.17
  • www.mql5.com
Профиль трейдера
 
Дима Джумок #:

Dmitry, ich danke Ihnen für Ihre Antwort. Zu meinem Bedauern gibt Google nur Links zu Ihren Entwicklungen. Das Forum hat mir auch keine Alternative geboten. Admiral Market bietet eine solche Funktion aber nur auf ihrer Plattform und es ist nicht MT5. Der liebe fxsaber hat 2017 seine Variante Simultanes Autoscrolling von Charts für ein Instrument in verschiedenen Zeitrahmen für MT5 angeboten - Technische Indikatoren und Forex-Marktanalyse - MQL5 Algo-Traders Forum (den Indikatortext gibt es im letzten Kommentar), aber ich weiß nicht, wie ich ihn für das MT5-Terminal konvertieren kann, daher kann ich nicht feststellen, ob es eine funktionierende Variante ist. Wenn es Ihnen nichts ausmacht, konvertieren Sie ihn bitte, vielleicht funktioniert er ja.

Dann ist es besser, Ihre eigene zu reparieren.

Ich habe meine jetzt heruntergeladen, sie funktioniert. Eine Unannehmlichkeit - wenn die Einrückungen nicht aktiviert sind, geht der erforderliche Balken auf dem Rolldiagramm über den Rand hinaus und die Linie ist nicht sichtbar. Das muss noch korrigiert werden.

Was ist in Ihrem Skript los, warum funktioniert es nicht? Das Skript deaktiviert den automatischen Bildlauf bei Erreichen eines neuen Ticks.

Diese Schaltfläche in der Symbolleiste sollte bei allen Charts automatisch gedrückt werden, wenn das Skript angehängt ist:

 
Bombe! Es funktioniert! Ich danke euch vielmals!