Bunu EA'nızda OnTick işlevinin başında deneyin.
// Bar zamanına hizmet etmek için statik Old_Time değişkenini kullanacağız.
// Her OnTick yürütmesinde, mevcut çubuk zamanını kayıtlı olanla kontrol edeceğiz.
// Çubuk zamanı kaydedilen zamana eşit değilse, yeni bir tik aldığımızı gösterir.
statik tarihsaat Old_Time;
tarihsaat New_Time[1];
bool IsNewBar=yanlış;
// son çubuk zamanı New_Time[0] öğesine kopyalanıyor
int kopyalanan=CopyTime(_Symbol,_Period,0,1,New_Time);
if(copied>0) // tamam, veriler başarıyla kopyalandı
{
if(Old_Time!=New_Time[0]) // eğer eski zaman yeni bar zamanına eşit değilse
{
IsNewBar=true; // ilk arama değilse, yeni çubuk belirdi
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Burada yeni bir çubuğumuz var ",New_Time[0]," eski zaman ",Old_Time);
Old_Time=New_Time[0]; // bar zamanını kaydetme
}
}
başka
{
Alert("Geçmiş zaman verileri kopyalanırken hata oluştu, error =",GetLastError());
ResetLastError();
dönüş;
}
//--- EA, yalnızca yeni bir çubuğumuz varsa yeni ticareti kontrol etmelidir
if(IsNewBar==yanlış)
{
dönüş;
}
//--- Çalışmak için yeterli barımız var mı?
int Mybars=Barlar(_Symbol,_Period);
if(Mybars<60) // eğer toplam barlar 60 bardan az ise
{
Alert("60 bardan daha azına sahibiz, EA şimdi çıkacak!!");
dönüş;
}
Merhaba oneillj,
Zaten cevap verdiğimi sanıyordum, ama görünüşe göre internet eterinde kayboldu.
Sağladığınız kod parçası, hemen hemen ilk başta şikayet ettiğim kod parçası. Neden bu kadar karmaşık? Sadece daha kolay bir yolu olması gerektiğini düşündüm. İşe yarayacak gibi görünen bununla geldim. Yanılıyorsam lütfen beni düzeltin. (Ayrıca BarsCalculated kullanmayı denedim , ancak her zaman Bars'a eşitti, bu nedenle test her zaman false olarak değerlendirildi.)
statik int LastBarCount = 0;
if (Barlar(_Symbol, _Period) > LastBarCount)
LastBarCount = Çubuklar(_Symbol, _Period);
başka
dönüş;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if (BARS!= Bars ( _Symbol , _Period )) { BARS= Bars ( _Symbol , _Period ); return ( true ); } return ( false ); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
Bunu kullanıyorum...
Bunu da deneyebilirsiniz:
// Rates structure array for last two bars MqlRates mrate[ 2 ]; CopyRates ( Symbol (), Period (), 0 , 2 , mrate); // NEW BAR CHECK. //--------------- static double dBar_Open; static double dBar_High; static double dBar_Low; static double dBar_Close; static long lBar_Volume; static datetime nBar_Time; // Boolean for new BAR confirmation. bool bStart_NewBar = false ; // Check if the price data has changed tov the previous bar. if (mrate[ 0 ].open != dBar_Open || mrate[ 0 ].high != dBar_High || mrate[ 0 ].low != dBar_Low || mrate[ 0 ].close != dBar_Close || mrate[ 0 ].tick_volume != lBar_Volume || mrate[ 0 ].time != nBar_Time) { bStart_NewBar = true ; // A new BAR has appeared! // Update the new BAR data. dBar_Open = mrate[ 0 ].open; dBar_High = mrate[ 0 ].high; dBar_Low = mrate[ 0 ].low; dBar_Close = mrate[ 0 ].close; lBar_Volume = mrate[ 0 ].tick_volume; nBar_Time = mrate[ 0 ].time; } // Check if a new bar has formed. if (bStart_NewBar == true ) { // Your code. }
Bunu kullanıyorum...
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Herkese selam,
MQL5'te tamamen acemiyim ama diğer platformlar için oldukça fazla kodlama yaptım.
Bir EA'nın yalnızca yeni bir çubukta yürütmesinin neden bu kadar zor olduğunu merak ediyorum. "Yeni çubuk" olay işleyicisi de dahil olmak üzere bazı makalelere baktım ve çok zor görünüyor.
Bu işe yaramazsa ve "yeni çubuk" olay işleyicisini kullanmam gerekiyorsa, ilgili dosyaları indirip Dosyalar(?) klasörüne kopyalamak ve ardından #include onları mümkün mü? Temelde ne yaptıkları hakkında hiçbir fikri olmayan benim gibi insanlar için bunun belgelendiği bir yer var mı?
https://www.mql5.com/en/articles/100 adresindeki öğretici üzerinde çalışıyorum ve fark ettiğim ilk şey, üzerinde hesaplamalar yapmak için yeterli çubuk olduğundan emin olmak için "Barlar" işlevinin kullanılmasıydı, ancak bir sonraki kod parçası, görünüşe göre yeni bir çubuğu algılamak için tasarlandı ve (zaten anladığım kadarıyla) çok karmaşık bir kod parçası. Çubuklar işlevi yeni bir Çubuğu algılamak için kullanılamaz mı? if(Bars > int LastBarCount ) {bool IsNewBar = true; LastBarCount = Çubuklar;} başka {IsNewBar = false;}. Böyle bir şey işe yarar mı? .
İstek listesi için bir tane. OnTick yerine geçersiz kılabileceğimiz bir OnNewBar olayı olsaydı iyi olmaz mıydı? Gördüğüm her gösterge kenelerde değil çubuklarda çalıştığından, herkesin hayatını çok daha kolaylaştıracağını düşünüyorum.
Az önce başka bir olasılık buldum: "BarsCalculated". Yine, açıklamadan bunun ne anlama geldiğinden tam olarak emin değilim, ancak EA'nın zaten işlediği çubukların sayısı gibi görünüyor. Eğer bu doğruysa, kontrol etmem gereken tek şey if(Bars > BarsCalculated), eğer doğruysa o zaman gidip işlemlerimi yapın, aksi halde geri mi dönelim? Bir şey mi kaçırıyorum?
Teşekkürler,
Ian