Scripts: sSyncScroll - page 2

 
En effet, lorsque l'on essaie de faire défiler le graphique vers l'arrière et d'afficher l'historique, lorsqu'un nouveau tick arrive, le graphique revient au tout début. Dans ce cas, pourquoi en ai-je besoin ? Je sais déjà que lorsque l'on dessine la dernière bougie sur M1, c'est aussi la dernière bougie pour toutes les autres TF. Et sans cet indicateur dans toutes les fenêtres, les dernières bougies sont redessinées automatiquement.
 
Дима Джумок #:
En effet, lorsque l'on essaie de faire défiler le graphique vers l'arrière et d'afficher l'historique, lorsqu'un nouveau tick arrive, le graphique revient au tout début. Dans ce cas, pourquoi en ai-je besoin ? Je sais déjà que lorsque l'on dessine la dernière bougie sur M1, c'est aussi la dernière bougie pour toutes les autres TF. Et sans cet indicateur dans toutes les fenêtres, les dernières bougies sont redessinées automatiquement.

Il s'est cassé après les changements de langage, j'en ai un autre ici, également cassé. Cherchez-en d'autres, il y en a qui fonctionnent ici.

 
Dmitry Fedoseev #:

Il s'est cassé après un autre changement de langue, j'en ai un autre ici, également cassé. Cherchez-en d'autres, il y en a quelques uns qui fonctionnent ici.

Dmitry, merci pour votre réponse. À mon grand regret, Google ne donne que des liens vers vos développements. Le forum ne m'a pas non plus proposé d'alternative. Admiral Market propose une telle fonction mais uniquement sur leur plateforme et ce n'est pas MT5. Cher fxsaber a offert en 2017 sa variante Simultaneous autoscrolling of charts for one instrument in different timeframes for MT5 - Technical Indicators and Forex Market Analysis - MQL5 Algo-Traders Forum (il y a le texte de l'indicateur dans le dernier commentaire), mais je ne sais pas comment le convertir pour le terminal MT5, donc je ne peux pas déterminer s'il s'agit d'une variante qui fonctionne. Si cela ne vous dérange pas, veuillez le convertir, peut-être qu'il fonctionne.

// Code MQL4&5
// Synchronisation de toutes les cartes à l'heure voulue

sinput int TimerInterval = 1; // Intervalle de mise à jour en millisecondes

// Désactive le défilement automatique et le décalage sur tous les graphiques
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();
}

// Retourne vrai s'il n'y a pas de barre avec cette heure ("trou")
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));
}

// Retourne la barre de temps
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);
}

// Renvoie l'heure du bar
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));
}

// Retourne la barre droite du graphique
int ChartBarRight( const long chartID = 0 )
{
  return((int)(ChartGetInteger(chartID, CHART_FIRST_VISIBLE_BAR) - ChartGetInteger(chartID, CHART_WIDTH_IN_BARS) + 1));
}

// Retourne la bonne heure du graphique
datetime GetChartTimeRight( const long chartID = 0 )
{
  return(iBarShift(ChartSymbol(chartID), ChartPeriod(chartID), ChartBarRight(chartID)));
}

// Règle l'heure du graphique de droite, renvoie l'heure réglée
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));
}

// Ajouter un élément à la fin d'un tableau arbitraire
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;
}

// Obtient l'heure de la barre de droite de chaque graphique
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));
}

// Fixe la bonne heure pour tous les graphiques
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));
}

// Renvoie le graphique indiquant que l'heure de la barre de droite a changé
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);
}

// Synchronise tous les graphiques à l'heure voulue, renvoie le nombre de graphiques synchronisés.
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, merci pour votre réponse. A mon grand regret, Google ne donne que des liens vers vos développements. Le forum ne m'a pas non plus proposé d'alternative. Admiral Market propose une telle fonction mais uniquement sur leur plateforme et ce n'est pas MT5. Cher fxsaber a offert en 2017 sa variante Simultaneous autoscrolling of charts for one instrument in different timeframes for MT5 - Technical Indicators and Forex Market Analysis - MQL5 Algo-Traders Forum (il y a le texte de l'indicateur dans le dernier commentaire), mais je ne sais pas comment le convertir pour le terminal MT5, donc je ne peux pas déterminer s'il s'agit d'une variante qui fonctionne. Si cela ne vous dérange pas, veuillez le convertir, peut-être qu'il fonctionne.

Dans ce cas, il est préférable de réparer le vôtre.

J'ai téléchargé la mienne, elle fonctionne. Un inconvénient - si les indentations ne sont pas activées, la barre requise sur le graphique déroulant dépasse le bord et la ligne n'est pas visible. Il faudra corriger cela.

Que se passe-t-il, comment cela ne fonctionne-t-il pas ? Le script désactive le défilement automatique à l'arrivée d'un nouveau tick.

Ce bouton de la barre d'outils devrait être activé automatiquement sur tous les graphiques lorsque le script est attaché :

 
Une bombe ! Ça marche ! Merci beaucoup !