EA'da yeni bir çubuğu kontrol etmek için forumlarda bulduğum "CopyTime", "CopyRates" tabanlı işlevleri kullandım. Hesaplarının çok zaman aldığı sonucuna vardım.
İşte kontrol verileri ( gösterge çağrısının 171 ms sürmesi dikkat çekicidir):
datetime New_Time[]; //буффер для проверки нового бараvoidOnStart ()
{
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
staticdatetime t; //записываем старое время ArraySetAsSeries (New_Time, true ); //направление индексацииCopyTime ( _Symbol , _Period , 0 , 1 ,New_Time); //копируем время нового бара
t=New_Time[ 0 ];
}
uint time= GetTickCount ()-start;
Print ( "New_Time = " ,time, " ms" );
}
Sonra düşündüm ki, eğer denersem, başka bir şey. Örneğin "Zaman Akımı"
Optimizasyon için aşağıdaki kodu yaptı:
voidOnStart ()
{
int t;
int s;
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
MqlDateTime m;
TimeCurrent (m);
t=m.min;
s=m.sec;
}
uint time= GetTickCount ()-start;
Print ( "time = " ,time, " ms" );
}
Expert Advisor'da optimizasyon için aşağıdaki kodu yaptım:
staticdouble ind1; //записываю значенияstaticdouble ind2; // значенияstaticdouble indsmall; //индикаторовMqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
if (MIN== 0 && SEC== 0 )//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}
Her tikte gösterge değerleri elde edildiğinde, yeni bir çubuğu kontrol etmeden tek bir çalıştırmada sonuç: 817.196 ms
Yeni çubuk kontrolü ile: 735.904 ms
Fark özellikle etkileyici değil, iyileştirmeler var, ancak bu yeterli değil.
Göstergeyi şöyle alıyorum:
int TSIHandle; // хэндл индикатора TSIdouble TSI[]; // динамические массивы для хранения численных значений TSIintOnInit ()
{
TSIHandle= iCustom ( NULL , 0 , "Blau_TSI" ,q,r,s,u, PRICE_CLOSE );
if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}
ArraySetAsSeries (TSI, true );
return ( 0 );
}
voidOnDeinit ( constint reason)
{
//--- освобождаем хэндлы индикаторовIndicatorRelease (TSIHandle);
ArrayFree (TSI);
}
voidOnTick ()
{
MqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
staticdouble tsismall;
if (MIN== 0 && SEC== 0 )
{
//--- копируем значения индикаторов из индикаторных буферовif ( CopyBuffer (TSIHandle, 0 , 0 , 3 ,TSI)< 0 )
{
Alert ( "Ошибка копирования буферов индикатора Moving Average - номер ошибки:" , GetLastError (), "!!" );
return ;
}
tsismall=TSI[ 1 ];
}
}
Yeni çubuğun kontrol edildiği bloğa tanıtıcı çağrı ile kodu yerleştirmeye çalıştım, bu satırda bir hata oluşuyor
if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}
odönüşü koydumhiçbir şey döndürmez, hata vermez, ancak danışman çalışmıyor.
Mümkünse tanıtıcı çağrısının ve genel olarak statik değişken dışındaki tüm ana kodun yeni bir çubuğu kontrol etmek için koşullu operatörün içine yerleştirilmesi gerektiğini varsayıyorum.
Bir yerde yanılmıyorsam kolu çağırsak da tamponlarda indikatör istemesek de yine de hesaplandığını okumuştum.
Yalnızca bir formül tamponunun [i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID) sonuçlarının çıktısına dayalı olarak nasıl bir gösterge yapılacağını kim söyleyebilir?) ))*10000;
rus-lot : Yalnızca bir formül tamponunun [i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID) sonuçlarının çıktısına dayalı olarak nasıl bir gösterge yapılacağını kim söyleyebilir?) ))*10000;
Özel bir gösterge yazmanız gerekir. Süreci kolaylaştırmak için - en basit göstergelerden birini alın - iMa ve biraz yeniden yazın. İşte MarketInfo'dan bahseden başka bir konu . Kod yaz, yolunda gitmeyen bir şey olup olmadığını sor.
Senaryoda şöyle bir şey yaptım:
zaman=0
SymbolInfoTick Pazartesi günü kontrol edecek
Bu kodla kontrol edebilirsiniz:
Ama sembolle kenelere ihtiyacımız var.
Bu kodla kontrol edebilirsiniz:
Ama sembolle kenelere ihtiyacımız var.
Evet, " SymbolInfoTick ", bugün test edilmedi.
Keneler gidene kadar denedim hiçbir şey işe yaramayacak
iask=0Evet, "SymbolInfoTick", bugün test edilmedi.
Keneler gidene kadar denedim hiçbir şey işe yaramayacak
iask=0Bu özellik çok hızlı.
Performansı ölçmek için, çok sayıda yineleme içeren bir döngüde birden çok çağrı uygulamanız ve toplam yürütme süresini ölçmeniz gerekir.
Daha da ilginç olanı, bir kod örneği var. Sonucu bekliyoruz.
EA'da yeni bir çubuğu kontrol etmek için forumlarda bulduğum "CopyTime", "CopyRates" tabanlı işlevleri kullandım. Hesaplarının çok zaman aldığı sonucuna vardım.
İşte kontrol verileri ( gösterge çağrısının 171 ms sürmesi dikkat çekicidir):
Sonra düşündüm ki, eğer denersem, başka bir şey. Örneğin "Zaman Akımı"
Optimizasyon için aşağıdaki kodu yaptı:
Expert Advisor'da optimizasyon için aşağıdaki kodu yaptım:
Her tikte gösterge değerleri elde edildiğinde, yeni bir çubuğu kontrol etmeden tek bir çalıştırmada sonuç: 817.196 ms
Yeni çubuk kontrolü ile: 735.904 ms
Fark özellikle etkileyici değil, iyileştirmeler var, ancak bu yeterli değil.
Göstergeyi şöyle alıyorum:
Yeni çubuğun kontrol edildiği bloğa tanıtıcı çağrı ile kodu yerleştirmeye çalıştım, bu satırda bir hata oluşuyor
o dönüşü koydum hiçbir şey döndürmez, hata vermez, ancak danışman çalışmıyor.
Mümkünse tanıtıcı çağrısının ve genel olarak statik değişken dışındaki tüm ana kodun yeni bir çubuğu kontrol etmek için koşullu operatörün içine yerleştirilmesi gerektiğini varsayıyorum.
Bir yerde yanılmıyorsam kolu çağırsak da tamponlarda indikatör istemesek de yine de hesaplandığını okumuştum.
Yalnızca bir formül tamponunun [i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID) sonuçlarının çıktısına dayalı olarak nasıl bir gösterge yapılacağını kim söyleyebilir?) ))*10000;
Özel bir gösterge yazmanız gerekir. Süreci kolaylaştırmak için - en basit göstergelerden birini alın - iMa ve biraz yeniden yazın. İşte MarketInfo'dan bahseden başka bir konu . Kod yaz, yolunda gitmeyen bir şey olup olmadığını sor.
Statik değişkenlere ne oldu? Bugün terminalin eski yapısını güncelledim ve şimdi hatayı derlerken:
Şimdi sınıfın statik veri üyeleri yerleştirilmelidir :