Göstergeniz veri güncellemelerini izlemiyor. Komisyoncudan yeni çubuklar gelir, ancak onları kontrol etmezsiniz. Kontrol edildiğinde her şeyin doğru görüntülendiğini göstermek için birkaç satır ekledim.
Bu bir çalışma durumu - yeni bir çubuğu kontrol etmek.
Evet sen ne! Ve sana yeni barları takip etmem gerektiğini düşündüren ne? Belgelerde var mı? Demek istediğim, işlevin değerini almalı ve sonra onu öncekiyle karşılaştırmalı mıyım? Bir fonksiyon var, fonksiyon daha yüksek zaman dilimlerinde çalışmak üzere tasarlandı. İşlev, verisi olmadığında bir hata verebilir veya geçersiz bir değer döndürebilir (bu durumda 0'a eşittir). Herşey. Programcılar %100 doğru bir değer elde etmek için bir şeyi çitle çevirmemelidir.
Ama bak SeriesInfoInteger() belgelerinde ne buldum:
Hata hakkında daha fazla bilgi almak için GetLastError() işlevini çağırmanız gerekir.
GetLastError() kodumda, gördünüz mü? İşte çek. Bu kontrol gerekli ve YETERLİ olmalıdır! Diğer her şey koltuk değneği çözümleri.
Ve ilk mesajıma bakın. Orada 4066 hatasını görüyor musunuz? Ardından 0 hatası ve yanlış verilerin döndürülmesi. İşlev (bu durumda SeriesInfoInteger()) verileri göndermeden önce neden geçerliliğini kontrol etmiyor? Neden hata bayrağını kaldırmıyor? Görüyorsunuz, hataları daha sonra aramak yerine, dahili kontrollerin geçmesi için biraz daha beklemek daha iyidir.
Ancak ondan sonra, sonucun alınmadığı birçok tavsiye verildi. Ve zamanlayıcıda bile ortaya çıkmadı.
tamam, yardımı oku)
SeriBilgiTamsayı
Geçmiş verilerin durumu hakkında bilgi verir.
Tarihsel kelimesi ne anlama gelir? Geçmiş yüklenirse, hata yoktur.
Alexey Kozitsyn :
Evet sen ne! Ve sana yeni barları takip etmem gerektiğini düşündüren ne? Belgelerde var mı? Demek istediğim, işlevin değerini almalı ve sonra onu öncekiyle karşılaştırmalı mıyım? Bir fonksiyon var, fonksiyon daha yüksek zaman dilimlerinde çalışmak üzere tasarlandı. İşlev, verisi olmadığında bir hata verebilir veya geçersiz bir değer döndürebilir (bu durumda 0'a eşittir). Herşey. Programcılar %100 doğru bir değer elde etmek için bir şeyi çitlememelidir.
Ama bak SeriesInfoInteger() belgelerinde ne buldum:
GetLastError() kodumda, gördünüz mü? İşte çek. Bu kontrol gerekli ve YETERLİ olmalıdır! Diğer her şey koltuk değneği çözümleri.
Hiçbir şey borçlu değilsin) ...aracı size güncellenmiş verileri gönderir - isterseniz, bunları hesaplama için kullanın, değilse - hangi sorunları, mevcut Geçmişe göre düşünün)
not. hafta sonu, piyasa kapalı , terminalde yanlış verileriniz var! ve hata yok!!!
Tarihsel kelimesi ne anlama gelir? Geçmiş yüklenirse, hata yoktur.
Hiçbir şey borçlu değilsin) ...aracı size güncellenmiş veriler gönderir - isterseniz, bunları hesaplama için kullanın, değilse - hangi problemler, Geçmişe göre sayın)
Terminale gelen her tik zaten tarih oluyor. Ve gerçek değerlerini veya bir hatasını almak istiyorum. Her şey size uyuyorsa - tamam.
Terminale gelen her tik zaten tarih oluyor. Ve gerçek değerlerini veya bir hatasını almak istiyorum. Her şey size uyuyorsa - tamam.
Evet, tarih zaten yüklenmiş bir şeydir veya geçmişe yüklenmiş bir şeydir. Ve sadece şimdi güncellenen (son alıntıdan sonra) henüz tarih değil, yeni ham verilerdir.
Evet, bu ilk kene, bitmiş hikayeyi veren, mevcut olan. Bu onay işaretinden sonra ( yeni çubuklar varsa), kodumun değişkenlerinizi güncellediği ve doğru verileri gösterdiği ikinci onay hemen gelir.
not. yeni bir çubuğu kontrol etmek için kendi işlevinizi ekleyebilirsiniz, aynı olacaktır.
pps. Evde, sayı 1'den fazla değiştiyse, çubuk sayısını sürekli kontrol ediyorum, o zaman her şeyi yeniden hesaplamanız gerekir, sayı 1 değiştiyse, bu sadece yeni bir çubuk anlamına gelir. Ve sadece en kritik hataları kontrol ediyorum ve bu gecikme hatasını görmüyorum.
Evet, bu ilk kene, bitmiş hikayeyi veren, mevcut olan. Bu onay işaretinden sonra ( yeni çubuklar varsa), kodumun değişkenlerinizi güncellediği ve doğru verileri gösterdiği ikinci onay hemen gelir.
not. yeni bir çubuğu kontrol etmek için kendi işlevinizi ekleyebilirsiniz, aynı olacaktır.
pps. Evde, sayı 1'den fazla değiştiyse, çubuk sayısını sürekli kontrol ediyorum, o zaman her şeyi yeniden hesaplamanız gerekir, sayı 1 değiştiyse, bu sadece yeni bir çubuk anlamına gelir. Ve sadece en kritik hataları kontrol ediyorum ve bu gecikme hatasını görmüyorum.
Ve burada, bu arada, bir hatanın meydana geldiği lehine başka bir argüman var. Göstergedeki hesaplamada bir HATA! Danışman yazdı:
#property version"1.00"#property strict//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _weekOpenTime = 0 ;
datetime _hourOpenTime = 0 ;
datetime _dayOpenTime= 0 ;
//--- Вести лог журналаconstbool inpFileLog= true ;
//--- Количество секунд в одном днеconstint SEC_PER_DAY= 86400 ;
//--- Флаг работоспособности индикатораbool _isWorking= true ;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())bool _isConnected= false ;
//---bool _firstLaunch = true ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Устанавливаем флаг первого запуска
_firstLaunch = true ;
//--- Сбрасываем время открытия текущего часа, дня и недели
_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();
}
////+------------------------------------------------------------------+////| |////+------------------------------------------------------------------+//void OnTimer()// {////---// if(!_isWorking)// return;////---// if(!_isConnected)// return;////---// Print(__FUNCTION__,": Данные старших ТФ загружены!");////--- Отключаем таймер// EventKillTimer();// }//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick ()
{
//--- Проверяем связь с серверомif (! IsConnected ()) // Если не удалось установить связь с сервером
{
//--- Сбрасываем флаг соединения с сервером
_isConnected= false ;
//--- Выходимreturn ;
}
//--- Проверяем первый запуск экспертаif ( _firstLaunch )
{
//--- Проверяем, записано ли время открытия текущей неделиif (!CheckCurrentWeekOpenTime()) // Если время не записаноreturn ; // Выходим//--- Проверяем, записано ли время открытия текущего дняif (!CheckCurrentDayOpenTime()) // Если время не записаноreturn ; // Выходим//--- Проверяем, записано ли время открытия текущего часаif (!CheckCurrentHourOpenTime()) // Если время не записаноreturn ; // Выходим////--- Устанавливаем флаг соединения с сервером для запуска таймера//_isConnected=true;//---Print ( __FUNCTION__ , ": Данные старших ТФ загружены!" );
//--- Сбрасываем флаг первого запуска
_firstLaunch = false ;
}
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущей недели |//+------------------------------------------------------------------+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 );
}
//+------------------------------------------------------------------+
Gösterge ile aynı grafikten başlatılır. Sonuçları görelim:
2018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: OnTick : Данные старших ТФ загружены!
2018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего часа = 2018.10 . 0906 : 00 . Ошибка # 02018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего часа = 2018.10 . 0906 : 00 . Ошибка # 02018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего дня = 2018.10 . 0900 : 00 . Ошибка # 02018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего дня = 2018.10 . 0900 : 00 . Ошибка # 02018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущей недели = 2018.10 . 0800 : 00 . Ошибка # 02018.10 . 0908 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия недельного бара = 2018.10 . 0700 : 00 . Ошибка # 02018.10 . 0908 : 45 : 41.479 test_isNewDayInOnTick GBPUSD,M1: initialized
2018.10.09 08:45:40.822 GBPUSD,M1: CheckCurrentHourOpenTime: Время открытия текущего часа = 2018.10.08 11:00
2018.10.09 08:45:40.822 GBPUSD,M1: CheckCurrentDayOpenTime: Время открытия текущего дня = 2018.10.08 00:00
2018.10.09 08:45:40.822 GBPUSD,M1: CheckCurrentWeekOpenTime: Время открытия текущей недели = 2018.10.08 00:00
2018.10.09 08:45:40.064 GBPUSD,M1: initialized
2018.10 . 0908 : 45 : 40.022 Expert Other\test_isNewDayInOnTick GBPUSD,M1: loaded successfully
Ne görüyoruz. Her şeyin yolunda olduğunu görüyoruz. Her şey yüklendi ve dikkat edin, hata yok, hemen güncel veriler! Ana SORU: Neden bir Uzman Danışmanda normal olarak daha yüksek zaman dilimlerinin verilerini alabilirsiniz, ancak göstergede "tef ile dans etmeniz" gerekiyor? Programlar aynı şekilde çalışmamalı mı? Bir göstergede ve bir EA'da aynı kod neden farklı çalışıyor?! Böyle olmamalı.
Ve burada, bu arada, bir hatanın meydana geldiği lehine başka bir argüman var. Göstergedeki hesaplamada bir HATA! Danışman yazdı:
Gösterge ile aynı grafikten başlatılır. Sonuçları görelim:
Ne görüyoruz. Her şeyin yolunda olduğunu görüyoruz. Her şey yüklendi ve dikkat edin, hata yok, hemen güncel veriler! Ana SORU: Neden bir Uzman Danışmanda normal olarak daha yüksek zaman dilimlerinin verilerini alabilirsiniz, ancak göstergede "tef ile dans etmeniz" gerekiyor? Programlar aynı şekilde çalışmamalı mı? Bir göstergede ve bir EA'da aynı kod neden farklı çalışıyor?! Böyle olmamalı.
Yükleme, kontrol vb. ile bağlantı kurmak ve bir şeyler yapmak terminale bağlı olduğundan, tüm göstergeler aynı iş parçacığındadır ve iş parçacığındaki her şey bitene kadar (aslında, bir sonraki OnCalculate çağrısına kadar), yeni bir şey olmaz. , yani Bu akışın içinde, akışın sonundan daha hızlı olarak, yine de hiçbir şey elde edemezsiniz. Uzman Danışman kendi iş parçacığında bulunur, bu nedenle başlatıldığında, veri güncellemeleri, verileri güncelleme süresi boyunca lansmanını ertelemesine izin verilir - terminaldeki diğer her şey etkilenmez. Doğumdan itibaren bu hiçbir şekilde düzeltilemez, çünkü. metatrader4 ortamı gömüldü.
Yükleme, kontrol vb. ile bağlantı kurmak ve bir şeyler yapmak terminale bağlı olduğundan, tüm göstergeler aynı iş parçacığındadır ve iş parçacığındaki her şey bitene kadar (aslında, bir sonraki OnCalculate çağrısına kadar), yeni bir şey olmaz. , yani Bu akışın içinde, akışın sonundan daha hızlı olarak, yine de hiçbir şey elde edemezsiniz. EA kendi iş parçacığında bulunur, bu nedenle başlatıldığında, veri güncellemeleri, verileri güncelleme süresi boyunca lansmanını ertelemesine izin verilir - terminaldeki diğer her şey etkilenmez. Doğumdan itibaren bu hiçbir şekilde düzeltilemez, çünkü. metatrader4 ortamı gömüldü.
Evet, bir sembolün tüm göstergelerinin tek bir iş parçacığında olduğunun ve her Uzman Danışmanın kendi iş parçacığına sahip olduğunun farkındayım. Ama mesele bu değil. Geliştiriciler - kreasyonlarındaki hataları düzelten geliştiricilerdir. Programlar farklı çalışmamalı! Göstergelerin bir şey yapmak için zamanı yoksa - bir hata ve sorun yok. Sonuçta, uzman bir şekilde doğru verileri hatasız olarak aldı! Yani uygulanabilir. @Slava , bariz hatalı davranışın düzeltilip düzeltilmeyeceği konusunda yorum yapabilir misiniz? Ya da en azından belgelere bir ek (önceki_hesaplanmış = 0 ise, eski zaman dilimlerinin doğru verileri elde edilemez)?
Evet, bir sembolün tüm göstergelerinin tek bir iş parçacığında olduğunun ve her Uzman Danışmanın kendi iş parçacığına sahip olduğunun farkındayım. Ama mesele bu değil. Geliştiriciler - kreasyonlarındaki hataları düzelten geliştiricilerdir. Programlar farklı çalışmamalı! Göstergelerin bir şey yapmak için zamanı yoksa - bir hata ve sorun yok. Sonuçta, uzman bir şekilde doğru verileri hatasız olarak aldı! Yani uygulanabilir. @Slava , bariz hatalı davranışın düzeltilip düzeltilmeyeceği konusunda yorum yapabilir misiniz? Ya da en azından belgelere bir ek (önceki_hesaplanmış = 0 ise, eski zaman dilimlerinin doğru verileri elde edilemez)?
Belgelerde bir yerde, uzmana veri almaya başlamadan önce 5 saniye kadar süre verildiği ve şu anda terminalin uzman için veri indirmeye çalıştığı söylendi. Bu, göstergeye verilmez, göstergenin bir geçmiş güncellemesi talep etmemesi gerektiği gibi, onun için kritik değildir, kritikse bir Uzman Danışmanda değerlendirin. Ana fikir, mevcut uygulamada istenen durumun mümkün olmadığıdır. Özünde, TF'ler zamanlayıcılardır ve bu çoklu zamanlayıcıların bir anda çakıştığı dönemler vardır - bu %100 eşzamanlı eşzamanlı bir süreçtir (açma/kapama zamanı hariç), çünkü. mevcut TF'nin dakikasının ilk işareti, beş dakikalık, saat, vb.'nin ilk dakikasına denk geliyor. - bu sadece birkaç değişkende aynı değerin bir kaydıdır ve bu anlarda gerekli TF'leri ayarlayabilmeniz ve gerekli tüm verileri bir kerede alabilmeniz mantıklıdır. Geliştiriciler bunu neden yaptı, aksi halde xs değil, belki de istemci-sunucu ayrımı nedeniyle, bunu mevcut terminal modelinde yapmak imkansızdı (olacak), çünkü Şimdi göstergelere uzmanların imkanını verirsek, terminali asacaklar.
Gösterge çağrısının nasıl çalıştığını merak edenler için günün sonuna bakabilirsiniz, gösterge başka bir göstergeyi çağırır, Uzman Danışman (_asktfexp) göstergeyi (_asktf_sample) çağırarak göstergeyi (_asktf) çağırır. Bir Uzman Danışmandan bir gösterge çağrıldığında, göstergedeki zamanlayıcı başlamaz, bu nedenle göstergede bir zamanlayıcı bulunan çözümler yalnızca bu göstergenin yalnızca grafikte asılı kalacağı ve çağrılmayacağı durumlar içindir (bu genellikle mantıklıdır) ).
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
Göstergeniz veri güncellemelerini izlemiyor.
Komisyoncudan yeni çubuklar gelir, ancak onları kontrol etmezsiniz.
Kontrol edildiğinde her şeyin doğru görüntülendiğini göstermek için birkaç satır ekledim.
Bu bir çalışma durumu - yeni bir çubuğu kontrol etmek.
Evet sen ne! Ve sana yeni barları takip etmem gerektiğini düşündüren ne? Belgelerde var mı? Demek istediğim, işlevin değerini almalı ve sonra onu öncekiyle karşılaştırmalı mıyım? Bir fonksiyon var, fonksiyon daha yüksek zaman dilimlerinde çalışmak üzere tasarlandı. İşlev, verisi olmadığında bir hata verebilir veya geçersiz bir değer döndürebilir (bu durumda 0'a eşittir). Herşey. Programcılar %100 doğru bir değer elde etmek için bir şeyi çitle çevirmemelidir.
Ama bak SeriesInfoInteger() belgelerinde ne buldum:
Hata hakkında daha fazla bilgi almak için GetLastError() işlevini çağırmanız gerekir.
Ve ilk mesajıma bakın. Orada 4066 hatasını görüyor musunuz? Ardından 0 hatası ve yanlış verilerin döndürülmesi. İşlev (bu durumda SeriesInfoInteger()) verileri göndermeden önce neden geçerliliğini kontrol etmiyor? Neden hata bayrağını kaldırmıyor? Görüyorsunuz, hataları daha sonra aramak yerine, dahili kontrollerin geçmesi için biraz daha beklemek daha iyidir.
Ancak ondan sonra, sonucun alınmadığı birçok tavsiye verildi. Ve zamanlayıcıda bile ortaya çıkmadı.
tamam, yardımı oku)
SeriBilgiTamsayı
Geçmiş verilerin durumu hakkında bilgi verir.
Tarihsel kelimesi ne anlama gelir?
Geçmiş yüklenirse, hata yoktur.
Evet sen ne! Ve sana yeni barları takip etmem gerektiğini düşündüren ne? Belgelerde var mı? Demek istediğim, işlevin değerini almalı ve sonra onu öncekiyle karşılaştırmalı mıyım? Bir fonksiyon var, fonksiyon daha yüksek zaman dilimlerinde çalışmak üzere tasarlandı. İşlev, verisi olmadığında bir hata verebilir veya geçersiz bir değer döndürebilir (bu durumda 0'a eşittir). Herşey. Programcılar %100 doğru bir değer elde etmek için bir şeyi çitlememelidir.
Ama bak SeriesInfoInteger() belgelerinde ne buldum:
GetLastError() kodumda, gördünüz mü? İşte çek. Bu kontrol gerekli ve YETERLİ olmalıdır! Diğer her şey koltuk değneği çözümleri.Hiçbir şey borçlu değilsin)
...aracı size güncellenmiş verileri gönderir - isterseniz, bunları hesaplama için kullanın, değilse - hangi sorunları, mevcut Geçmişe göre düşünün)
not. hafta sonu, piyasa kapalı , terminalde yanlış verileriniz var!
ve hata yok!!!
tamam, yardımı oku)
Tarihsel kelimesi ne anlama gelir?
Geçmiş yüklenirse, hata yoktur.
Hiçbir şey borçlu değilsin)
...aracı size güncellenmiş veriler gönderir - isterseniz, bunları hesaplama için kullanın, değilse - hangi problemler, Geçmişe göre sayın)
Terminale gelen her tik zaten tarih oluyor. Ve gerçek değerlerini veya bir hatasını almak istiyorum. Her şey size uyuyorsa - tamam.
Terminale gelen her tik zaten tarih oluyor. Ve gerçek değerlerini veya bir hatasını almak istiyorum. Her şey size uyuyorsa - tamam.
Evet, tarih zaten yüklenmiş bir şeydir veya geçmişe yüklenmiş bir şeydir.
Ve sadece şimdi güncellenen (son alıntıdan sonra) henüz tarih değil, yeni ham verilerdir.
Çubukların hesaplanmasını değil, mumun zamanını kontrol edin.
Bu şekilde doğru bir şekilde güncellenecektir (işaretli).
Taras, işte kodunun sonucu:
Taras, işte kodunun sonucu:
Evet, bu ilk kene, bitmiş hikayeyi veren, mevcut olan.
Bu onay işaretinden sonra ( yeni çubuklar varsa), kodumun değişkenlerinizi güncellediği ve doğru verileri gösterdiği ikinci onay hemen gelir.
not. yeni bir çubuğu kontrol etmek için kendi işlevinizi ekleyebilirsiniz, aynı olacaktır.
pps. Evde, sayı 1'den fazla değiştiyse, çubuk sayısını sürekli kontrol ediyorum, o zaman her şeyi yeniden hesaplamanız gerekir, sayı 1 değiştiyse, bu sadece yeni bir çubuk anlamına gelir. Ve sadece en kritik hataları kontrol ediyorum ve bu gecikme hatasını görmüyorum.
Evet, bu ilk kene, bitmiş hikayeyi veren, mevcut olan.
Bu onay işaretinden sonra ( yeni çubuklar varsa), kodumun değişkenlerinizi güncellediği ve doğru verileri gösterdiği ikinci onay hemen gelir.
not. yeni bir çubuğu kontrol etmek için kendi işlevinizi ekleyebilirsiniz, aynı olacaktır.
pps. Evde, sayı 1'den fazla değiştiyse, çubuk sayısını sürekli kontrol ediyorum, o zaman her şeyi yeniden hesaplamanız gerekir, sayı 1 değiştiyse, bu sadece yeni bir çubuk anlamına gelir. Ve sadece en kritik hataları kontrol ediyorum ve bu gecikme hatasını görmüyorum.
Ve burada, bu arada, bir hatanın meydana geldiği lehine başka bir argüman var. Göstergedeki hesaplamada bir HATA! Danışman yazdı:
Gösterge ile aynı grafikten başlatılır. Sonuçları görelim:
Ne görüyoruz. Her şeyin yolunda olduğunu görüyoruz. Her şey yüklendi ve dikkat edin, hata yok, hemen güncel veriler! Ana SORU: Neden bir Uzman Danışmanda normal olarak daha yüksek zaman dilimlerinin verilerini alabilirsiniz, ancak göstergede "tef ile dans etmeniz" gerekiyor? Programlar aynı şekilde çalışmamalı mı? Bir göstergede ve bir EA'da aynı kod neden farklı çalışıyor?! Böyle olmamalı.
Ve burada, bu arada, bir hatanın meydana geldiği lehine başka bir argüman var. Göstergedeki hesaplamada bir HATA! Danışman yazdı:
Gösterge ile aynı grafikten başlatılır. Sonuçları görelim:
Ne görüyoruz. Her şeyin yolunda olduğunu görüyoruz. Her şey yüklendi ve dikkat edin, hata yok, hemen güncel veriler! Ana SORU: Neden bir Uzman Danışmanda normal olarak daha yüksek zaman dilimlerinin verilerini alabilirsiniz, ancak göstergede "tef ile dans etmeniz" gerekiyor? Programlar aynı şekilde çalışmamalı mı? Bir göstergede ve bir EA'da aynı kod neden farklı çalışıyor?! Böyle olmamalı.
Yükleme, kontrol vb. ile bağlantı kurmak ve bir şeyler yapmak terminale bağlı olduğundan, tüm göstergeler aynı iş parçacığındadır ve iş parçacığındaki her şey bitene kadar (aslında, bir sonraki OnCalculate çağrısına kadar), yeni bir şey olmaz. , yani Bu akışın içinde, akışın sonundan daha hızlı olarak, yine de hiçbir şey elde edemezsiniz. Uzman Danışman kendi iş parçacığında bulunur, bu nedenle başlatıldığında, veri güncellemeleri, verileri güncelleme süresi boyunca lansmanını ertelemesine izin verilir - terminaldeki diğer her şey etkilenmez. Doğumdan itibaren bu hiçbir şekilde düzeltilemez, çünkü. metatrader4 ortamı gömüldü.
Yükleme, kontrol vb. ile bağlantı kurmak ve bir şeyler yapmak terminale bağlı olduğundan, tüm göstergeler aynı iş parçacığındadır ve iş parçacığındaki her şey bitene kadar (aslında, bir sonraki OnCalculate çağrısına kadar), yeni bir şey olmaz. , yani Bu akışın içinde, akışın sonundan daha hızlı olarak, yine de hiçbir şey elde edemezsiniz. EA kendi iş parçacığında bulunur, bu nedenle başlatıldığında, veri güncellemeleri, verileri güncelleme süresi boyunca lansmanını ertelemesine izin verilir - terminaldeki diğer her şey etkilenmez. Doğumdan itibaren bu hiçbir şekilde düzeltilemez, çünkü. metatrader4 ortamı gömüldü.
Evet, bir sembolün tüm göstergelerinin tek bir iş parçacığında olduğunun ve her Uzman Danışmanın kendi iş parçacığına sahip olduğunun farkındayım. Ama mesele bu değil. Geliştiriciler - kreasyonlarındaki hataları düzelten geliştiricilerdir. Programlar farklı çalışmamalı! Göstergelerin bir şey yapmak için zamanı yoksa - bir hata ve sorun yok. Sonuçta, uzman bir şekilde doğru verileri hatasız olarak aldı! Yani uygulanabilir. @Slava , bariz hatalı davranışın düzeltilip düzeltilmeyeceği konusunda yorum yapabilir misiniz? Ya da en azından belgelere bir ek (önceki_hesaplanmış = 0 ise, eski zaman dilimlerinin doğru verileri elde edilemez)?
Evet, bir sembolün tüm göstergelerinin tek bir iş parçacığında olduğunun ve her Uzman Danışmanın kendi iş parçacığına sahip olduğunun farkındayım. Ama mesele bu değil. Geliştiriciler - kreasyonlarındaki hataları düzelten geliştiricilerdir. Programlar farklı çalışmamalı! Göstergelerin bir şey yapmak için zamanı yoksa - bir hata ve sorun yok. Sonuçta, uzman bir şekilde doğru verileri hatasız olarak aldı! Yani uygulanabilir. @Slava , bariz hatalı davranışın düzeltilip düzeltilmeyeceği konusunda yorum yapabilir misiniz? Ya da en azından belgelere bir ek (önceki_hesaplanmış = 0 ise, eski zaman dilimlerinin doğru verileri elde edilemez)?
Belgelerde bir yerde, uzmana veri almaya başlamadan önce 5 saniye kadar süre verildiği ve şu anda terminalin uzman için veri indirmeye çalıştığı söylendi. Bu, göstergeye verilmez, göstergenin bir geçmiş güncellemesi talep etmemesi gerektiği gibi, onun için kritik değildir, kritikse bir Uzman Danışmanda değerlendirin. Ana fikir, mevcut uygulamada istenen durumun mümkün olmadığıdır. Özünde, TF'ler zamanlayıcılardır ve bu çoklu zamanlayıcıların bir anda çakıştığı dönemler vardır - bu %100 eşzamanlı eşzamanlı bir süreçtir (açma/kapama zamanı hariç), çünkü. mevcut TF'nin dakikasının ilk işareti, beş dakikalık, saat, vb.'nin ilk dakikasına denk geliyor. - bu sadece birkaç değişkende aynı değerin bir kaydıdır ve bu anlarda gerekli TF'leri ayarlayabilmeniz ve gerekli tüm verileri bir kerede alabilmeniz mantıklıdır. Geliştiriciler bunu neden yaptı, aksi halde xs değil, belki de istemci-sunucu ayrımı nedeniyle, bunu mevcut terminal modelinde yapmak imkansızdı (olacak), çünkü Şimdi göstergelere uzmanların imkanını verirsek, terminali asacaklar.
Gösterge çağrısının nasıl çalıştığını merak edenler için günün sonuna bakabilirsiniz, gösterge başka bir göstergeyi çağırır, Uzman Danışman (_asktfexp) göstergeyi (_asktf_sample) çağırarak göstergeyi (_asktf) çağırır. Bir Uzman Danışmandan bir gösterge çağrıldığında, göstergedeki zamanlayıcı başlamaz, bu nedenle göstergede bir zamanlayıcı bulunan çözümler yalnızca bu göstergenin yalnızca grafikte asılı kalacağı ve çağrılmayacağı durumlar içindir (bu genellikle mantıklıdır) ).