3. İlginç bir analiz anı, CopyClose()'un döndürdüğü şeydir, kendim kontrol ettim, eğer istenen TF için .hst dosyası yoksa, CopyClose() asla 2048'den fazla döndürmez - yani. bu indirilebilecek maksimum değer mi?
Numara. 2048, istemcide bulunmadığında sunucudan indirilen verilerin bir kısmıdır.
Bir sonraki önemli kontrol, fonksiyonun çağrıldığı programın tipidir. Güncellemeye neden olan gösterge ile aynı periyoda sahip bir zaman serisini güncellemek için bir istek göndermenin oldukça istenmeyen bir durum olduğunu hatırlayın. Gösterge ile aynı sembol periyodu için veri talep edilmesinin istenmemesi, geçmiş verilerin göstergenin çalıştığı aynı iş parçacığında güncellenmesinden kaynaklanmaktadır. Bu nedenle, bir perçin olasılığı yüksektir. Kontrol etmek içinMQL5InfoInteger() işlevini MQL5_PROGRAM_TYPE değiştiricisiyle birlikte kullanırız .
MT4 göstergesine geçmiş verileri yüklemek için uygun değildir, ancak hazırlanmış bir .hst dosyası yoksa göstergenin tüm geçmişinin nasıl indirileceği, yani. göstergenin kendisi indirme geçmişini sembolle başlattı
tüm geçmişi iBars(Symbol(),PERIOD_CURRENT);
iBars() da yanlış bir değer mi üretecek? - henüz geçmiş yok, çekirdek iBar yok()
MT5'te tarih sorunsuz bir şekilde sallanıyor gibi görünüyor, sadece beklemeniz ve geçmiş verilerin durumunu kontrol etmeniz gerekiyor, ancak MT4'te?
Not: dün kod tabanında MT4 için doğru çalışan çoklu para birimi göstergeleri arıyordum, ancak kodlar taklit konusu değil, kod tabanının birçok örneğinde, göstergede geçmiş sayfalama yok
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
Скайп-чат поддержки продукта: Последние версии библиотек, скриптов и приложений: Сей скрипт продолжение темы закачек котировок обновлением графика. Решил не обновлять старую версию, а выложить заново. Это принципиально новый скрипт. Удалось добиться максимальной надёжности его работы за счёт переноса функций WinAPI в DLL. Скрипт, как и...
evet bu kodların hepsini biliyorum, daha önce kullandım, birkaç yıldır hiç MQL yapmadım, bu sene bilgilerimi yeniliyorum, geliştiricilerin MT5 ve MT4 arasında maksimum uyumluluğu büyük ölçüde sağlamasına çok şaşırdım. MQL4'ün performansını artırdı - daha önce MT4'ün projenin artık nasıl gelişmeyeceği konusunda bilgi olmasına rağmen, yalnızca hatalar düzeltilecek
ve MT4 göstergesinde tarihin otomatik yüklenmesi hakkında bilgi bulamadığıma dair bir umut vardı.
Prensip olarak, ek kontroller olmadan tüm geçmişi MT4'te indirmek istiyorsanız, xrenfix kodunu kullanmak daha kolaydır - .hst dosyasına datetime t=0 çubuğunu yazın;
MT4'te daha yüksek zaman dilimlerinden veri elde etme konusuna bir kez daha dönmek zorundayım. Bu sefer burada önerilen yöntemlerin işe yaramaması nedeniyle.
İşte kullanılan kod:
#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _weekOpenTime = 0 ;
datetime _hourOpenTime = 0 ;
datetime _dayOpenTime= 0 ;
//--- Вести лог журналаconstbool inpFileLog= true ;
//--- Количество секунд в одном днеconstint SEC_PER_DAY= 86400 ;
//--- Флаг работоспособности индикатораbool _isWorking= true ;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())bool _isConnected= false ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Сбрасываем время открытия текущего часа, дня и недели
_weekOpenTime= 0 ;
_dayOpenTime = 0 ;
_hourOpenTime= 0 ;
//--- Устанавливаем флаг работоспособности
_isWorking= true ;
//--- Сбрасываем флаг установки соединения
_isConnected= false ;
//--- Запускаем таймерif (! EventSetMillisecondTimer ( 20 ))
{
Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": таймер с частотой 20 не установлен!" );
//--- Устанавливаем флаг неработоспособности индикатора
_isWorking= false ;
}
//--- Запрос данныхSeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//--- Выключаем таймерEventKillTimer ();
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTimer ()
{
//---if (!_isWorking)
return ;
//---if (!_isConnected)
return ;
//---Print ( __FUNCTION__ , ": Данные старших ТФ загружены!" );
//--- Отключаем таймерEventKillTimer ();
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверяем связь с серверомif (! IsConnected ()) // Если не удалось установить связь с сервером
{
//--- Сбрасываем флаг соединения с сервером
_isConnected= false ;
//--- Выходимreturn ( 0 );
}
//--- Проверяем первый запуск индикатораif (prev_calculated<= 0 )
{
//--- Проверяем, записано ли время открытия текущей неделиif (!CheckCurrentWeekOpenTime()) // Если время не записаноreturn ( 0 ); // Выходим//--- Проверяем, записано ли время открытия текущего дняif (!CheckCurrentDayOpenTime()) // Если время не записаноreturn ( 0 ); // Выходим//--- Проверяем, записано ли время открытия текущего часаif (!CheckCurrentHourOpenTime()) // Если время не записаноreturn ( 0 ); // Выходим//--- Устанавливаем флаг соединения с сервером для запуска таймера
_isConnected= true ;
}
//---return ( rates_total );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущей недели |//+------------------------------------------------------------------+bool CheckCurrentWeekOpenTime()
{
//--- Проверяем, записано ли времяif (_weekOpenTime== 0 ) // Если время не записано
{
//--- Получаем время открытия недельного бараResetLastError ();
constdatetime weekBarOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
constint err= GetLastError ();
//---if (inpFileLog)
{
Print ( __FILE__ , ": Время открытия недельного бара = " + TimeToString (weekBarOpenTime)+ ". Ошибка #" ,err);
}
//--- Проверяем, получено ли время открытия недельного бараif (weekBarOpenTime== 0 || err!= 0 ) // Если время бара не получено или история обновляетсяreturn ( false ); // Возвращаем ложь//--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
_weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
//---if (inpFileLog)
{
Print ( __FILE__ , ": Актуальное время открытия текущей недели = " + TimeToString (_weekOpenTime)+ ". Ошибка #" ,err);
}
//--- Возвращаем истинуreturn ( true );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn ( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего дня |//+------------------------------------------------------------------+bool CheckCurrentDayOpenTime()
{
//--- Проверяем, записано ли времяif (_dayOpenTime== 0 ) // Если время не записано
{
//--- Получаем время открытия дневного бараResetLastError ();
constdatetime tempDayOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
constint err= GetLastError ();
//---if (inpFileLog)
{
Print ( __FILE__ , ": Время открытия текущего дня = " + TimeToString (tempDayOpenTime)+ ". Ошибка #" ,err);
}
//--- Проверяем, получено ли время открытия дневного бараif (tempDayOpenTime== 0 || err!= 0 ) // Если время бара не полученоreturn ( false ); // Возвращаем ложь//--- Сохраняем в глобальную переменную значение открытия текущего дня
_dayOpenTime=tempDayOpenTime;
//---if (inpFileLog)
{
Print ( __FILE__ , ": Актуальное время открытия текущего дня = " + TimeToString (_dayOpenTime)+ ". Ошибка #" ,err);
}
//--- Возвращаем истинуreturn ( true );
}
//--- Время открытия дня ранее записано. Возвращаем истинуreturn ( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего часа |//+------------------------------------------------------------------+bool CheckCurrentHourOpenTime()
{
//--- Проверяем, записано ли времяif (_hourOpenTime== 0 ) // Если время не записано
{
//--- Получаем время открытия часового бараResetLastError ();
constdatetime tempHourOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
constint err= GetLastError ();
//---if (inpFileLog)
{
Print ( __FILE__ , ": Время открытия текущего часа = " + TimeToString (tempHourOpenTime)+ ". Ошибка #" ,err);
}
//--- Проверяем, получено ли время открытия часового бараif (tempHourOpenTime== 0 || err!= 0 ) // Если время бара не полученоreturn ( false ); // Возвращаем ложь//---
_hourOpenTime=tempHourOpenTime;
//---if (inpFileLog)
{
Print ( __FILE__ , ": Актуальное время открытия текущего часа = " + TimeToString (_hourOpenTime)+ ". Ошибка #" ,err);
}
//--- Возвращаем истинуreturn ( true );
}
//--- Время открытия часа ранее записано. Возвращаем истинуreturn ( true );
}
//+------------------------------------------------------------------+
Bana tavsiye edildiği gibi veri sayfalama uygular:
Birçok kez tartışıldı. "4066 hatası" sorgusu başına 12 sayfa
Ve OnInit'te bir istek göndermeniz ve OnCalculate'de analiz etmeniz doğru bir şekilde tavsiye edildi.
Milisaniye zamanlayıcı ne için? Eylemlerinizle istemci terminalinin normal şekilde yükselmesini engelliyorsunuz. Zamanlayıcınıza müdahale eden Windows mesajları değil, zamanlayıcınız herkese müdahale ediyor. Bir kez daha: MT4 İSTEMCİ TERMİNALİNDEKİ GÖSTERGELER ARAYÜZ AKIŞINDA ÇALIŞIYOR.
Uygulama tam olarak şudur: veri için ilk istek OnInit() içinde gerçekleşir. Ardından, ticaret sunucusuyla bağlantı kurulmasını bekliyoruz, ardından OnCalculate()'de! eski TF'lerin verilerini alıyoruz. Bugün ilk çalıştırmada sonucu alıyoruz:
2018.10 . 0409 : 10 : 56.266 test_isNewDayInOnCalculate EURGBP.e,M1: OnTimer : Данные старших ТФ загружены!
2018.10 . 0409 : 10 : 56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего часа = 2018.10 . 0309 : 00 . Ошибка # 02018.10 . 0409 : 10 : 56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего часа = 2018.10 . 0309 : 00 . Ошибка # 02018.10 . 0409 : 10 : 56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего дня = 2018.10 . 0300 : 00 . Ошибка # 02018.10 . 0409 : 10 : 56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего дня = 2018.10 . 0300 : 00 . Ошибка # 02018.10 . 0409 : 10 : 56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущей недели = 2018.10 . 0100 : 00 . Ошибка # 02018.10 . 0409 : 10 : 56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Время открытия недельного бара = 2018.09 . 3000 : 00 . Ошибка # 0
Logdan da anlaşılacağı gibi, saatin ve günün saatinin hatalı değerleri alındı.
Evet, geliştiriciler ( @Slava ) fark edebilir, bana verilen tüm tavsiyeleri uygulamadım. Onlar. Başlangıçta yavaş olanı başlatmam tavsiye edilse de, hızlı zamanlayıcıyı OnInit () içinde başlatıyorum. Ancak, bu durumda, bilerek yapılır. Bir arabirim iş parçacığında hızlı bir zamanlayıcı başlatılırsa ve diğer göstergelerin verilerinin alınmasını yavaşlatabilirse, bu büyük bir sorundur. Belgelerde bununla ilgili hiçbir uyarı yok, sık sık zamanlayıcılı bir programı piyasaya kolayca koyabilirsiniz, bu bir tür "virüs" olabilir ve diğer programların "kırılmasına" neden olabilir.
Yukarıdakilerle bağlantılı olarak, ya milisaniye zamanlayıcısının çalışmasına kısıtlamalar getirmenin ya da EventSetMillisecondTimer () belgelerinde işlevi OnInit () içinde çalıştıramayacağınızı belirtmenin gerekli olduğunu düşünüyorum, böylece terminal yükselebilir. normalde başlangıçta.
Bugün günün açılışında durum benzer, hata tekrarlandı. Test standı: üç göstergeli bir tablo. İkisi zamanlayıcıyı kullanmaz, üçüncüsü kullanır. Yükleme sırasında herkes yanlış veri aldı. Şimdi zamanlayıcıyı kullanan göstergeyi grafikten kaldırdım bakalım ne olacak.
Ve şimdi en ilginç olanı. Herhangi bir zamanlayıcı olmadan kod:
#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _weekOpenTime = 0 ;
datetime _hourOpenTime = 0 ;
datetime _dayOpenTime= 0 ;
//--- Вести лог журналаconstbool inpFileLog= true ;
//--- Количество секунд в одном днеconstint SEC_PER_DAY= 86400 ;
//--- Флаг работоспособности индикатораbool _isWorking= true ;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())bool _isConnected= false ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Сбрасываем время открытия текущего часа, дня и недели
_weekOpenTime= 0 ;
_dayOpenTime = 0 ;
_hourOpenTime= 0 ;
//--- Устанавливаем флаг работоспособности
_isWorking= true ;
//--- Сбрасываем флаг установки соединения
_isConnected= false ;
//--- Запрос данныхSeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверяем связь с серверомif (! IsConnected ()) // Если не удалось установить связь с сервером
{
//--- Сбрасываем флаг соединения с сервером
_isConnected= false ;
//--- Выходимreturn ( 0 );
}
//--- Проверяем первый запуск индикатораif (prev_calculated<= 0 )
{
//--- Проверяем, записано ли время открытия текущей неделиif (!CheckCurrentWeekOpenTime()) // Если время не записаноreturn ( 0 ); // Выходим//--- Проверяем, записано ли время открытия текущего дняif (!CheckCurrentDayOpenTime()) // Если время не записаноreturn ( 0 ); // Выходим//--- Проверяем, записано ли время открытия текущего часаif (!CheckCurrentHourOpenTime()) // Если время не записаноreturn ( 0 ); // Выходим//--- Устанавливаем флаг соединения с сервером для запуска таймера
_isConnected= true ;
//---Print ( __FUNCTION__ , ": Данные старших ТФ загружены!" );
}
//---return ( rates_total );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущей недели |//+------------------------------------------------------------------+bool CheckCurrentWeekOpenTime()
{
//--- Проверяем, записано ли времяif (_weekOpenTime== 0 ) // Если время не записано
{
//--- Получаем время открытия недельного бараResetLastError ();
constdatetime weekBarOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
constint err= GetLastError ();
//---if (inpFileLog)
{
Print ( __FILE__ , ": Время открытия недельного бара = " + TimeToString (weekBarOpenTime)+ ". Ошибка #" ,err);
}
//--- Проверяем, получено ли время открытия недельного бараif (weekBarOpenTime== 0 || err!= 0 ) // Если время бара не получено или история обновляетсяreturn ( false ); // Возвращаем ложь//--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
_weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
//---if (inpFileLog)
{
Print ( __FILE__ , ": Актуальное время открытия текущей недели = " + TimeToString (_weekOpenTime)+ ". Ошибка #" ,err);
}
//--- Возвращаем истинуreturn ( true );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn ( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего дня |//+------------------------------------------------------------------+bool CheckCurrentDayOpenTime()
{
//--- Проверяем, записано ли времяif (_dayOpenTime== 0 ) // Если время не записано
{
//--- Получаем время открытия дневного бараResetLastError ();
constdatetime tempDayOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
constint err= GetLastError ();
//---if (inpFileLog)
{
Print ( __FILE__ , ": Время открытия текущего дня = " + TimeToString (tempDayOpenTime)+ ". Ошибка #" ,err);
}
//--- Проверяем, получено ли время открытия дневного бараif (tempDayOpenTime== 0 || err!= 0 ) // Если время бара не полученоreturn ( false ); // Возвращаем ложь//--- Сохраняем в глобальную переменную значение открытия текущего дня
_dayOpenTime=tempDayOpenTime;
//---if (inpFileLog)
{
Print ( __FILE__ , ": Актуальное время открытия текущего дня = " + TimeToString (_dayOpenTime)+ ". Ошибка #" ,err);
}
//--- Возвращаем истинуreturn ( true );
}
//--- Время открытия дня ранее записано. Возвращаем истинуreturn ( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего часа |//+------------------------------------------------------------------+bool CheckCurrentHourOpenTime()
{
//--- Проверяем, записано ли времяif (_hourOpenTime== 0 ) // Если время не записано
{
//--- Получаем время открытия часового бараResetLastError ();
constdatetime tempHourOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
constint err= GetLastError ();
//---if (inpFileLog)
{
Print ( __FILE__ , ": Время открытия текущего часа = " + TimeToString (tempHourOpenTime)+ ". Ошибка #" ,err);
}
//--- Проверяем, получено ли время открытия часового бараif (tempHourOpenTime== 0 || err!= 0 ) // Если время бара не полученоreturn ( false ); // Возвращаем ложь//---
_hourOpenTime=tempHourOpenTime;
//---if (inpFileLog)
{
Print ( __FILE__ , ": Актуальное время открытия текущего часа = " + TimeToString (_hourOpenTime)+ ". Ошибка #" ,err);
}
//--- Возвращаем истинуreturn ( true );
}
//--- Время открытия часа ранее записано. Возвращаем истинуreturn ( true );
}
//+------------------------------------------------------------------+
Ve yine de istediğiniz sonucu alamıyorsunuz. Geliştiriciler ( @Slava ) lütfen yorum yapın. Terminali birkaç eski TF'den yüklerken doğru verileri almak imkansızdır. Ön koşul, terminalin kapatıldıktan sonra bir saatten fazla kapalı kalmasıdır (çünkü saatlik çubuk verileri alıyoruz). Ve elbette, TF'deki lansman bir saatten az.
Aleksey, internetteki kıdemli TF'lerden veri talebinde bulunuyorsunuz. Henüz bağlantı yok, büyük olasılıkla bir hata döndürdü. İlk kenenin gelmesiyle bir talepte bulunmaya çalışın.
Ülkeyi kontrol edemiyorum ve yanıma bir tablet almadım.
3. İlginç bir analiz anı, CopyClose()'un döndürdüğü şeydir, kendim kontrol ettim, eğer istenen TF için .hst dosyası yoksa, CopyClose() asla 2048'den fazla döndürmez - yani. bu indirilebilecek maksimum değer mi?
Numara. 2048, istemcide bulunmadığında sunucudan indirilen verilerin bir kısmıdır.
Numara. 2048, istemcide bulunmadığında sunucudan indirilen verilerin bir kısmıdır.
hmm, uzun süredir MQL yapıyorum gibi görünüyor, ama yine de bu benim için beklenmedik bir şey
Tamam, işte yardımdan bir örnek: https://www.mql5.com/en/docs/series/timeseries_access
olduğu belirtilir:
Bir sonraki önemli kontrol, fonksiyonun çağrıldığı programın tipidir. Güncellemeye neden olan gösterge ile aynı periyoda sahip bir zaman serisini güncellemek için bir istek göndermenin oldukça istenmeyen bir durum olduğunu hatırlayın. Gösterge ile aynı sembol periyodu için veri talep edilmesinin istenmemesi, geçmiş verilerin göstergenin çalıştığı aynı iş parçacığında güncellenmesinden kaynaklanmaktadır. Bu nedenle, bir perçin olasılığı yüksektir. Kontrol etmek için MQL5InfoInteger() işlevini MQL5_PROGRAM_TYPE değiştiricisiyle birlikte kullanırız .
onlar. örneğin kendisi https://www.mql5.com/ru/code/449
MT4 göstergesine geçmiş verileri yüklemek için uygun değildir, ancak hazırlanmış bir .hst dosyası yoksa göstergenin tüm geçmişinin nasıl indirileceği, yani. göstergenin kendisi indirme geçmişini sembolle başlattı
tüm geçmişi iBars(Symbol(),PERIOD_CURRENT);
iBars() da yanlış bir değer mi üretecek? - henüz geçmiş yok, çekirdek iBar yok()
MT5'te tarih sorunsuz bir şekilde sallanıyor gibi görünüyor, sadece beklemeniz ve geçmiş verilerin durumunu kontrol etmeniz gerekiyor, ancak MT4'te?
Not: dün kod tabanında MT4 için doğru çalışan çoklu para birimi göstergeleri arıyordum, ancak kodlar taklit konusu değil, kod tabanının birçok örneğinde, göstergede geçmiş sayfalama yok
Dördünde, "ev tuşunu basılı tuttular." Başka yolu yok. Konuyu uzun süredir çalışıyorsanız, "klavyede tuğla" ifadesini hatırlamanız gerekir.
https://www.mql5.com/ru/code/9968
https://www.mql5.com/ru/code/9153
https://www.mql5.com/ru/code/9888
Ücretsiz indiricimi görebilirsiniz.
Ücretsiz indiricimi görebilirsiniz.
Peki, kodunuza nasıl bakmamı önerirsiniz? Geçmişi nasıl indireceğimi biliyorum, ancak indirmeyi bir gösterge ile nasıl kontrol edeceğimi bilmiyorum
Dördünde, "ev tuşunu basılı tuttular." Başka yolu yok. Konuyu uzun süredir çalışıyorsanız, "klavyede tuğla" ifadesini hatırlamanız gerekir.
https://www.mql5.com/ru/code/9968
https://www.mql5.com/ru/code/9153
https://www.mql5.com/ru/code/9888
evet bu kodların hepsini biliyorum, daha önce kullandım, birkaç yıldır hiç MQL yapmadım, bu sene bilgilerimi yeniliyorum, geliştiricilerin MT5 ve MT4 arasında maksimum uyumluluğu büyük ölçüde sağlamasına çok şaşırdım. MQL4'ün performansını artırdı - daha önce MT4'ün projenin artık nasıl gelişmeyeceği konusunda bilgi olmasına rağmen, yalnızca hatalar düzeltilecek
ve MT4 göstergesinde tarihin otomatik yüklenmesi hakkında bilgi bulamadığıma dair bir umut vardı.
Prensip olarak, ek kontroller olmadan tüm geçmişi MT4'te indirmek istiyorsanız, xrenfix kodunu kullanmak daha kolaydır - .hst dosyasına datetime t=0 çubuğunu yazın;
Peki, kodunuza nasıl bakmamı önerirsiniz?
Sadece geçmişi otomatik olarak yüklemen gerektiğini düşündüm ...
MT4'te daha yüksek zaman dilimlerinden veri elde etme konusuna bir kez daha dönmek zorundayım. Bu sefer burada önerilen yöntemlerin işe yaramaması nedeniyle.
İşte kullanılan kod:
Bana tavsiye edildiği gibi veri sayfalama uygular:
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
[SERVICE DESK] Zamanlayıcıda kıdemli TF'nin zamanı alınırken hata oluştu!
Slava , 2018.09.27 06:20
Birçok kez tartışıldı. "4066 hatası" sorgusu başına 12 sayfa
Ve OnInit'te bir istek göndermeniz ve OnCalculate'de analiz etmeniz doğru bir şekilde tavsiye edildi.
Milisaniye zamanlayıcı ne için? Eylemlerinizle istemci terminalinin normal şekilde yükselmesini engelliyorsunuz. Zamanlayıcınıza müdahale eden Windows mesajları değil, zamanlayıcınız herkese müdahale ediyor. Bir kez daha: MT4 İSTEMCİ TERMİNALİNDEKİ GÖSTERGELER ARAYÜZ AKIŞINDA ÇALIŞIYOR.
Uygulama tam olarak şudur: veri için ilk istek OnInit() içinde gerçekleşir. Ardından, ticaret sunucusuyla bağlantı kurulmasını bekliyoruz, ardından OnCalculate()'de! eski TF'lerin verilerini alıyoruz. Bugün ilk çalıştırmada sonucu alıyoruz:
Logdan da anlaşılacağı gibi, saatin ve günün saatinin hatalı değerleri alındı.
Evet, geliştiriciler ( @Slava ) fark edebilir, bana verilen tüm tavsiyeleri uygulamadım. Onlar. Başlangıçta yavaş olanı başlatmam tavsiye edilse de, hızlı zamanlayıcıyı OnInit () içinde başlatıyorum. Ancak, bu durumda, bilerek yapılır. Bir arabirim iş parçacığında hızlı bir zamanlayıcı başlatılırsa ve diğer göstergelerin verilerinin alınmasını yavaşlatabilirse, bu büyük bir sorundur. Belgelerde bununla ilgili hiçbir uyarı yok, sık sık zamanlayıcılı bir programı piyasaya kolayca koyabilirsiniz, bu bir tür "virüs" olabilir ve diğer programların "kırılmasına" neden olabilir.
Yukarıdakilerle bağlantılı olarak, ya milisaniye zamanlayıcısının çalışmasına kısıtlamalar getirmenin ya da EventSetMillisecondTimer () belgelerinde işlevi OnInit () içinde çalıştıramayacağınızı belirtmenin gerekli olduğunu düşünüyorum, böylece terminal yükselebilir. normalde başlangıçta.
Ve şimdi en ilginç olanı. Herhangi bir zamanlayıcı olmadan kod:
Ve yine de istediğiniz sonucu alamıyorsunuz. Geliştiriciler ( @Slava ) lütfen yorum yapın. Terminali birkaç eski TF'den yüklerken doğru verileri almak imkansızdır. Ön koşul, terminalin kapatıldıktan sonra bir saatten fazla kapalı kalmasıdır (çünkü saatlik çubuk verileri alıyoruz). Ve elbette, TF'deki lansman bir saatten az.
Zamanlayıcı çalışmadı.