Script: sSyncScroll - pagina 2

 
Infatti, quando si cerca di scorrere il grafico all'indietro e di visualizzare la cronologia, quando arriva un nuovo tick, il grafico torna all'inizio. In questo caso, perché ne ho bisogno? So già che quando si disegna l'ultima candela su M1, questa è anche l'ultima candela per tutti gli altri TF. E senza questo indicatore in tutte le finestre le ultime candele vengono ridisegnate automaticamente.
 
Дима Джумок #:
Infatti, quando si cerca di scorrere il grafico all'indietro e di visualizzare la cronologia, quando arriva un nuovo tick, il grafico torna all'inizio. In questo caso, perché ne ho bisogno? So già che quando si disegna l'ultima candela su M1, questa è anche l'ultima candela per tutti gli altri TF. E senza questo indicatore in tutte le finestre le ultime candele vengono ridisegnate automaticamente.

Si è rotto dopo le successive modifiche alla lingua, ne ho un altro qui, anch'esso rotto. Cercatene altri, ce ne sono di funzionanti qui.

 
Dmitry Fedoseev #:

Si è rotto dopo un'altra modifica della lingua, ne ho un altro qui, anch'esso rotto. Cercatene altri, qui ce ne sono alcuni funzionanti.

Dmitry, grazie per la tua risposta. Con mio grande rammarico, google fornisce solo link ai tuoi sviluppi. Anche il forum non mi ha offerto nulla di alternativo. Admiral Market offre tale funzione ma solo sulla loro piattaforma e non è MT5. Il caro fxsaber ha offerto nel 2017 la sua variante Scorrimento automatico simultaneo dei grafici per uno strumento in diversi timeframe per MT5 - Indicatori tecnici e analisi del mercato Forex - MQL5 Algo-Traders Forum (c'è il testo dell'indicatore nell'ultimo commento), ma non so come convertirlo per il terminale MT5, quindi non posso determinare se è una variante funzionante. Se non vi dispiace, per favore convertitelo, forse funziona.

// Codice MQL4&5
// Sincronizzazione di tutti i grafici in base all'ora giusta

sinput int TimerInterval = 1; // Intervallo di aggiornamento in millisecondi

// Disabilita lo scorrimento automatico e lo spostamento su tutti i grafici.
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();
}

// Restituisce true se non c'è nessuna barra con questo tempo ("buco")
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));
}

// Restituisce la barra del tempo
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);
}

// Restituisce l'ora del 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));
}

// Restituisce la barra destra del grafico
int ChartBarRight( const long chartID = 0 )
{
  return((int)(ChartGetInteger(chartID, CHART_FIRST_VISIBLE_BAR) - ChartGetInteger(chartID, CHART_WIDTH_IN_BARS) + 1));
}

// Restituisce l'ora giusta del grafico
datetime GetChartTimeRight( const long chartID = 0 )
{
  return(iBarShift(ChartSymbol(chartID), ChartPeriod(chartID), ChartBarRight(chartID)));
}

// Imposta l'ora del grafico destro, restituisce l'ora impostata
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));
}

// Aggiungere un elemento alla fine di un array arbitrario
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;
}

// Ottiene l'ora della barra destra di ogni grafico
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));
}

// Imposta l'ora giusta per tutti i grafici
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));
}

// Restituisce il grafico in cui l'ora della barra di destra è cambiata
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);
}

// Sincronizza tutti i grafici in base all'orario giusto, restituisce il numero di grafici sincronizzati
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, grazie per la tua risposta. Con mio grande rammarico, google fornisce solo link ai vostri sviluppi. Anche il forum non mi ha offerto nulla di alternativo. Admiral Market offre tale funzione ma solo sulla loro piattaforma e non è MT5. Il caro fxsaber ha offerto nel 2017 la sua variante Scorrimento automatico simultaneo dei grafici per uno strumento in diversi timeframe per MT5 - Indicatori tecnici e analisi del mercato Forex - MQL5 Algo-Traders Forum (c'è il testo dell'indicatore nell'ultimo commento), ma non so come convertirlo per il terminale MT5, quindi non posso determinare se è una variante funzionante. Se non vi dispiace, per favore convertitelo, forse funziona.

Allora è meglio che lo corregga da solo.

Ho scaricato il mio ora, funziona. Un inconveniente: se i rientri non sono abilitati, la barra richiesta sul grafico a scorrimento supera il bordo e la linea non è visibile. Questo dovrà essere corretto.

Cosa succede nel vostro script, come mai non funziona? Lo script disattiva lo scorrimento automatico all'arrivo di un nuovo tick.

Questo pulsante della barra degli strumenti dovrebbe essere premuto automaticamente su tutti i grafici quando lo script è collegato:

 
Una bomba! Funziona! Grazie mille!