Komut dosyaları: sSyncScroll - sayfa 2

 
Gerçekten de, grafiği geri kaydırmaya ve geçmişi görüntülemeye çalışırken, yeni bir tik geldiğinde, grafik en başa döner. Bu durumda neden buna ihtiyacım var? M1'de son mumu çizerken, bunun aynı zamanda diğer tüm TF'ler için son mum olduğunu zaten biliyorum. Ve tüm pencerelerde bu gösterge olmadan son mum çubukları otomatik olarak yeniden çizilir.
 
Дима Джумок #:
Gerçekten de, grafiği geri kaydırmaya ve geçmişi görüntülemeye çalışırken, yeni bir tik geldiğinde, grafik en başa döner. Bu durumda neden buna ihtiyacım var? M1'de son mumu çizerken, bunun aynı zamanda diğer tüm TF'ler için son mum olduğunu zaten biliyorum. Ve bu gösterge olmadan, son mum çubukları tüm pencerelerde otomatik olarak yeniden çizilir.

Dildeki bir sonraki değişikliklerden sonra kırıldı, burada başka bir tane daha var, o da kırıldı. Daha fazlasını arayın, burada çalışan olanlar var.

 
Dmitry Fedoseev #:

Dildeki başka bir değişiklikten sonra bozuldu, burada başka bir tane var, o da bozuk. Daha fazlasını arayın, burada çalışan birkaç tane var.

Dmitry, cevabın için teşekkür ederim. Üzülerek söylüyorum ki google sadece sizin gelişmelerinize bağlantı veriyor. Forum da bana alternatif bir şey sunmadı. Admiral Market böyle bir işlev sunuyor, ancak yalnızca kendi platformlarında ve MT5 değil. Sevgili fxsaber 2017'de varyantını sundu MT5 için farklı zaman dilimlerinde bir enstrüman için grafiklerin eşzamanlı otomatik kaydırılması - Teknik Göstergeler ve Forex Piyasa Analizi - MQL5 Algo-Traders Forum (son yorumda gösterge metni var), ancak MT5 terminali için nasıl dönüştüreceğimi bilmiyorum, bu yüzden çalışan bir varyant olup olmadığını belirleyemiyorum. Sakıncası yoksa, lütfen dönüştürün, belki çalışıyor olabilir.

// MQL4&5-kodu
// Tüm grafiklerin doğru zamana göre senkronizasyonu

sinput int TimerInterval = 1; // Milisaniye cinsinden güncelleme aralığı

// Tüm grafiklerde otomatik kaydırmayı ve kaydırmayı devre dışı bırakır
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();
}

// Bu zamana sahip bir çubuk yoksa true döndürür ("hole")
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));
}

// Zaman çubuğunu döndürür
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);
}

// Bar süresini döndürür
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));
}

// Sağ grafik çubuğunu döndürür
int ChartBarRight( const long chartID = 0 )
{
  return((int)(ChartGetInteger(chartID, CHART_FIRST_VISIBLE_BAR) - ChartGetInteger(chartID, CHART_WIDTH_IN_BARS) + 1));
}

// Doğru grafik zamanını döndürür
datetime GetChartTimeRight( const long chartID = 0 )
{
  return(iBarShift(ChartSymbol(chartID), ChartPeriod(chartID), ChartBarRight(chartID)));
}

// Doğru grafik zamanını ayarlar, ayarlanan zamanı döndürür
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));
}

// Rastgele bir dizinin sonuna bir eleman ekleyin
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;
}

// Her grafiğin sağ çubuğunun zamanını döndürür
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));
}

// Tüm grafikler için doğru zamanı ayarlar
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));
}

// Sağ çubuğun zamanının değiştiği grafiği döndürür
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);
}

// Tüm grafikleri doğru zamana göre senkronize et, senkronize edilen grafik sayısını döndürür
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, cevabın için teşekkür ederim. Ne yazık ki google sadece sizin gelişmelerinize bağlantı veriyor. Forum da bana alternatif bir şey sunmadı. Admiral Market böyle bir işlev sunuyor, ancak yalnızca kendi platformlarında ve MT5 değil. Sevgili fxsaber 2017'de varyantını sundu MT5 için farklı zaman dilimlerinde bir enstrüman için grafiklerin eşzamanlı otomatik kaydırılması - Teknik Göstergeler ve Forex Piyasa Analizi - MQL5 Algo-Traders Forumu (son yorumda gösterge metni var), ancak MT5 terminali için nasıl dönüştüreceğimi bilmiyorum, bu yüzden çalışan bir varyant olup olmadığını belirleyemiyorum. Sakıncası yoksa lütfen dönüştürün, belki işe yarıyordur.

O zaman kendiniz tamir etseniz daha iyi olur.

Benimkini şimdi indirdim, çalışıyor. Bir rahatsızlık - girintiler etkinleştirilmezse, kaydırma grafiğindeki gerekli çubuk kenarın üzerine çıkıyor ve çizgi görünmüyor. Bunun düzeltilmesi gerekecek.

Neler oluyor, nasıl çalışmıyor? Kod, yeni bir tik geldiğinde otomatik kaydırmayı devre dışı bırakır.

Araç çubuğundaki bu düğme, komut dosyası eklendiğinde tüm grafiklerde otomatik olarak basılmalıdır:

 
Bomba! İşe yarıyor! Çok teşekkür ederim!