Çubuklar ve Hacim, yeni çubuğu algılamak için güvenilir değildir.
Bir bilgisayar nano saniyede çalışıyor, bu nedenle iyi kodlanmış bir EA 20 ms'de çok şey yapabilir.

- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com

- www.mql5.com
teşekkür ederim Alain,
çok ilginç ... tam olarak tahmin ettiğim şey . . . 10 kat daha hızlı. ..hmmm.
Anlamı: TimeCurrent() hızlıdır ve çubuk kenarlarına senkronize midir?
Neden .... hmmm ...
Bu konuda biraz zamana ihtiyacım var.
Willbur
Tamam - bunun gibi şeyleri sevenler için: Bu konuyla ilgili çalışmam.
Her "OnTick" Etkinliğinde bir dosyaya bir cümle yazdım.
TimeLocal (PC CLock), TimeCurrent(), SymbolInfoTick() kullanılarak gelen son tik hakkında bazı bilgiler ve - CopyRates() kullanılarak - mevcut Bar hakkında bazı bilgiler.
"USD/JPY"den bir örnek - Dönem "M1"dir:
43. dakikanın ilk işareti geldiğinde PC Saati 19:43:01'di, aynı anda yeni bir çıta yükseldi.
Tik hacminin 1 olmadığı gerçeğinin yanı sıra, bu işlerin normal akışıdır.
Bazen o kadar kolay değil - Bu durumda olduğu gibi:
41 dakikalık çubuğun üç işareti daha geldiğinde PC zaten 19:42:00 gösteriyor. Hala 19:41:59 zaman damgası var.
Şimdi dünya derin bir nefes alıyor - 8.150 msn tam bir durgunluk.
Sonra - PC zaten 19:42:09 gösteriyor - yeni çubuğun ilk tik işareti - 42 dakikalık çubuk - içeri giriyor.
Kene 19:42:07 ile işaretlenmiştir ve - onunla birlikte gelen 19:42 çubuğu olduğu için - çubukların zaman damgası 19:42:00'dir.
Şimdi .... hmmm ....
1. TimeCurrent() her zaman kenenin zaman damgasına eşit midir?
40.000 kaydı kontrol ettim ve TimeCurrent'ın halihazırda değiştirildiği ancak son tik işaretinin zaman damgasının değiştirilmediği yalnızca beş vaka buldum.
2. last_tick her zaman yeni çubuğun açılmasının önünde midir?
(devam edecek)
TimeCurrent() sunucudan gelen son işaretin zamanıdır , grafik sembolünüzden olup olmaması kodunuza bağlıdır.
"Son tik" sorununuzu anlamıyorum, bu çıktıyı üreten kodu göstermelisiniz.
Merhaba Alain
OnTick() içindeki TimeCurrent() öğesini kontrol ediyorum, bu da uğraştığım sembole ait olmasını sağlamalı.
Bu benim "Yeni Çubuk Tanımlayıcım" olmalı - küçük ve hızlı - ne düşünüyorsunuz?
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) //-----------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
return(INIT_SUCCEEDED);
}
void OnTick() //--------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
Bu sequenz ile kontrol edeceğim:
//--- Just for testing
int ExtHdlFile1=0;
MqlRates rates[1];
//--- New Bar
bool NewBar = false;
long currPeriodSeconds;
double currPeriodProgress = 0;
int OnInit(void) // -------------------------------------------------------
{
currPeriodSeconds = PeriodSeconds();
ExtHdlFile1=FileOpen("NewBarTest.csv",FILE_READ|FILE_WRITE|FILE_CSV);
FileSeek (ExtHdlFile1,0,SEEK_END);
FileWrite(ExtHdlFile1, "TimeLocal",
"TimeCurrent",
"rates[0].time",
"rates[0].tick");
return(INIT_SUCCEEDED);
}
void OnTick() // -----------------------------------------------------------
{
if(MathMod(TimeCurrent(),currPeriodSeconds) < currPeriodProgress)
NewBar = true;
else NewBar = false;
currPeriodProgress = MathMod(TimeCurrent(),currPeriodSeconds);
//--- lets check this
if(NewBar)
{
// last Time Stamp of old Bar
FileWrite(ExtHdlFile1, " ",
" ",
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
// get the new bar
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return;
// first Time Stamp of new Bar
FileWrite(ExtHdlFile1,TimeToString(TimeLocal(),TIME_MINUTES|TIME_SECONDS),
TimeToString(TimeCurrent(), TIME_MINUTES|TIME_SECONDS),
TimeToString(rates[0].time, TIME_MINUTES|TIME_SECONDS),
IntegerToString(rates[0].tick_volume));
}
if(CopyRates(Symbol(),Period(),0,1,rates)!= 1) return; // != clean code - just a test
}
void OnDeinit(const int reason)
{
FileClose(ExtHdlFile1);
return;
}
Merhaba Alain
OnTick() içindeki TimeCurrent() öğesini kontrol ediyorum, bu da uğraştığım sembole ait olmasını sağlamalı.
Pekala, bu benim "Yeni Çubuk Tanımlayıcım" olmalı - küçük ve hızlı - ne düşünüyorsunuz?
İşte benim son versiyonum .
Aslında biraz endişeliyim çünkü çok kolay.
Alain: Kutsamayı yayınlarsan iyi olur.
// -----------------------------------------------------------------------
bool NewBar(void)
{
bool iNewBar = false;
static double currPeriodProgress = 0;
currPeriodProgress = MathMod(TimeCurrent(),PeriodSeconds());
return(iNewBar);
}
// ------------------------------------------------------------------------
void OnTick()
{
if(NewBar()) PlaySound("tick.wav");
Köln'den selamlar
Willbur
En kolay yol:
statik tarihsaat tlastbar=0;
tarihsaat tnewbar=iTime(NULL,PERIOD_CURRENT,0);
bool isnewbar=tnewbar!=tlastbar;
tlastbar=tnewbar;

- Ü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
Yeni bir barın gün ışığını gördüğünü nasıl anlayacağımı biliyorum.
Öncelikle performans konusunda endişeleniyorum. Bazı Sembollerde her 20 ms'de bir keneler gördüm. Tepki vermek için çok zaman yok.
Bir fikir, Rates.tick_volume
Mqlrates rates[1];
OnInit()
{
if(CopyRates(_Symbol,_Period,0,1,rates) < 1)
if(rates[0].tick_volume == 1)
{
... deal with new bar ...
}
Başka bir fikir , çubuk sayısının artırılıp artırılmadığını kontrol etmek olabilir.
OnInit()
{
if(BarsOld < Bars ( _Symbol , _Period ))
{
BarsOld = Bars ( _Symbol , _Period );
... deal with new bar ...
}
OnChartEvent'i de kontrol ettim, ancak yeni çubukları diğer şeylerden ayırt etmenin bir yolunu bulamadım.
puan verdiğiniz için teşekkürler
WIllbur