Artyom Trishkin : Yani bir şekilde ( @fxsaber 'dan gelen çözüm):
//+------------------------------------------------------------------+ //| Возвращает смещение бара по времени | //+------------------------------------------------------------------+ int GetBarShift( conststring symbol_name, constENUM_TIMEFRAMES timeframe, constdatetime time) { int res=- 1 ; datetime last_bar; if ( SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE ,last_bar)) { if (time>last_bar) res= 0 ; else { constint shift= Bars (symbol_name,timeframe,time,last_bar); if (shift> 0 ) res=shift- 1 ; } } return (res); } //+------------------------------------------------------------------+
Burada birisi seçili satırda bunu yapmanız gerektiğini yazmıştı: if (time>=last_bar) res= 0 ;
Dürüst olmak gerekirse kontrol etmedim - her zaman ulaşmıyor. Lütfen kontrol edip sonucu yazınız.
yazdım. Ve bu mantıklı çünkü. zaman mevcut çubuğun açılış zamanı ile çakışıyorsa, indeksi de 0'dır. Evet, fxsaber'ın saf çözümü hatalarla çalışacaktır.
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
Bugün gördüklerimden sonra, bir şekilde kararımın doğruluğundan şüphe etmeye başladım.
Soru: Hangi seçenek daha iyi, yoksa sadece öğreniyor muyum?
Bu durumda, uygulamanız daha hızlı çalışmalıdır - daha az kopya çağrısı olduğundan - her seferinde bir değer değil, aynı anda üç değer kopyalıyorsunuz.
Her ne kadar hiç kimse bir seferde bir değer elde etmek için kodu dönüştürmekle uğraşmasa da:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose ( constint index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT ) { if (symbol== NULL ) symbol= Symbol (); if (timeframe== 0 ) timeframe= Period (); doubleClose [ 1 ]; double close= 0 ; int copied= CopyClose (symbol,timeframe,index, 1 , Close ); if (copied> 0 ) close= Close [ 0 ]; return (close); }
aynı anda birkaç değer almak için koda. sadece tembelim :)
Bu durumda, uygulamanız daha hızlı çalışmalıdır - daha az kopya çağrısı olduğundan - her seferinde bir değer değil, aynı anda üç değer kopyalıyorsunuz.
Her ne kadar hiç kimse bir seferde bir değer elde etmek için kodu dönüştürmekle uğraşmasa da:
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose ( constint index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT ) }
aynı anda birkaç değer almak için koda. sadece tembelim :)
Cevap için teşekkürler!
Yani, gönderdiğim çözümü uygulamak daha mı iyi? Yeterli bir kontrol var, hata olmayacak mı?
Yani, yayınladığım çözümü uygulamak daha mı iyi? Yeterli bir kontrol var, hata olmayacak mı?
Çözümünüz de optimal değil, çünkü Halihazırda almış olduğunuz bir diziden değerler içeren bir grup değişkeni başlatıyorsunuz. soru: neden? Ne zaman yalnızca bir dizi kullanılabilir? Barlar olarak adlandırın ve mutlu olacaksınız:
Çözümünüz de optimal değil, çünkü Halihazırda almış olduğunuz bir diziden değerler içeren bir grup değişkeni başlatıyorsunuz. soru: neden? Ne zaman yalnızca bir dizi kullanılabilir? Adını Barlar ve mutlu olacaksın:
Bars adlı derleyici, dünyanın neyi temsil ettiğini azarladı. Bu tasarımı test ettiniz mi, yoksa çalışması gerektiğini mi varsaydınız yoksa yanlış bir şey mi yapıyorum?
Yani bir şekilde ( @fxsaber 'dan gelen çözüm):
//| Возвращает смещение бара по времени |
//+------------------------------------------------------------------+
int GetBarShift( const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
int res=- 1 ;
datetime last_bar;
if ( SeriesInfoInteger (symbol_name,timeframe, SERIES_LASTBAR_DATE ,last_bar)) {
if (time>last_bar) res= 0 ;
else {
const int shift= Bars (symbol_name,timeframe,time,last_bar);
if (shift> 0 ) res=shift- 1 ;
}
}
return (res);
}
//+------------------------------------------------------------------+
Dürüst olmak gerekirse kontrol etmedim - her zaman ulaşmıyor. Lütfen kontrol edip sonucu yazınız.
Çözümümün ne kadar "kolay" olduğunu bilmiyorum ama şunu deneyin: https://www.mql5.com/en/forum/160945#comment_4053382
Ama ne, dilde standart bir işlev yok ve herkesin kendi bisikletini yapması gerekiyor ve ondan sonra performanslarını mı ölçüyorlar ?
Bunun dışında her şeyi buldum gibi görünüyor, ancak farklı çözümlere baktıktan sonra, "kimin ne umurunda" heykeltraş oldukları açık.
Ama ne, dilde standart bir işlev yok ve herkesin kendi bisikletini yapması gerekiyor ve ondan sonra performanslarını mı ölçüyorlar ?
Bunun dışında her şeyi buldum gibi görünüyor, ancak farklı çözümlere baktıktan sonra, "kimin ne umurunda" heykeltraş oldukları açık.
Son soru. Bugün kod tabanındaki "master" kodunu gördüm ve orada aşağıdakiler kullanıldı:
double open_2= iOpen ( 2 );
double high_0= iHigh ( 0 );
double high_1= iHigh ( 1 );
double high_2= iHigh ( 2 );
double high_3= iHigh ( 3 );
double low_0= iLow ( 0 );
double low_1= iLow ( 1 );
double low_2= iLow ( 2 );
double low_3= iLow ( 3 );
double close_1= iClose ( 1 );
double close_2= iClose ( 2 );
Daha dün benzerini yazdım ama şunu yazdım:
if ( CopyRates (dSymbol, 0 , 1 , 3 ,Tick)< 0 ) return ;
open1 = Tick[ 0 ].open; open2 = Tick[ 1 ].open; open3 = Tick[ 2 ].open;
high1 = Tick[ 0 ].high; high2 = Tick[ 1 ].high; high3 = Tick[ 2 ].high;
low1 = Tick[ 0 ].low; low2 = Tick[ 1 ].low; low3 = Tick[ 2 ].low;
close1= Tick[ 0 ].close; close2= Tick[ 1 ].close; close3= Tick[ 2 ].close;
Bugün gördüklerimden sonra, bir şekilde kararımın doğruluğundan şüphe etmeye başladım.
Soru: Hangi seçenek daha iyi, yoksa sadece öğreniyor muyum?
Son soru. Bugün kod tabanındaki "master" kodunu gördüm ve orada aşağıdakiler kullanıldı:
double open_2= iOpen ( 2 );
double high_0= iHigh ( 0 );
double high_1= iHigh ( 1 );
double high_2= iHigh ( 2 );
double high_3= iHigh ( 3 );
double low_0= iLow ( 0 );
double low_1= iLow ( 1 );
double low_2= iLow ( 2 );
double low_3= iLow ( 3 );
double close_1= iClose ( 1 );
double close_2= iClose ( 2 );
Daha dün benzerini yazdım ama şunu yazdım:
if ( CopyRates (dSymbol, 0 , 1 , 3 ,Tick)< 0 ) return ;
open1 = Tick[ 0 ].open; open2 = Tick[ 1 ].open; open3 = Tick[ 2 ].open;
high1 = Tick[ 0 ].high; high2 = Tick[ 1 ].high; high3 = Tick[ 2 ].high;
low1 = Tick[ 0 ].low; low2 = Tick[ 1 ].low; low3 = Tick[ 2 ].low;
close1= Tick[ 0 ].close; close2= Tick[ 1 ].close; close3= Tick[ 2 ].close;
Bugün gördüklerimden sonra, bir şekilde kararımın doğruluğundan şüphe etmeye başladım.
Soru: Hangi seçenek daha iyi, yoksa sadece öğreniyor muyum?
Bu durumda, uygulamanız daha hızlı çalışmalıdır - daha az kopya çağrısı olduğundan - her seferinde bir değer değil, aynı anda üç değer kopyalıyorsunuz.
Her ne kadar hiç kimse bir seferde bir değer elde etmek için kodu dönüştürmekle uğraşmasa da:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
{
if (symbol== NULL )
symbol= Symbol ();
if (timeframe== 0 )
timeframe= Period ();
double Close [ 1 ];
double close= 0 ;
int copied= CopyClose (symbol,timeframe,index, 1 , Close );
if (copied> 0 ) close= Close [ 0 ];
return (close);
}
aynı anda birkaç değer almak için koda. sadece tembelim :)
Bu durumda, uygulamanız daha hızlı çalışmalıdır - daha az kopya çağrısı olduğundan - her seferinde bir değer değil, aynı anda üç değer kopyalıyorsunuz.
Her ne kadar hiç kimse bir seferde bir değer elde etmek için kodu dönüştürmekle uğraşmasa da:
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
}
aynı anda birkaç değer almak için koda. sadece tembelim :)
Cevap için teşekkürler!
Yani, gönderdiğim çözümü uygulamak daha mı iyi? Yeterli bir kontrol var, hata olmayacak mı?
Cevap için teşekkürler!
Yani, yayınladığım çözümü uygulamak daha mı iyi? Yeterli bir kontrol var, hata olmayacak mı?
CopyRates'in en az iki kontrole ihtiyacı vardır:
Cevap için teşekkürler!
Yani, yayınladığım çözümü uygulamak daha mı iyi? Yeterli bir kontrol var, hata olmayacak mı?
Çözümünüz de optimal değil, çünkü Halihazırda almış olduğunuz bir diziden değerler içeren bir grup değişkeni başlatıyorsunuz. soru: neden? Ne zaman yalnızca bir dizi kullanılabilir? Barlar olarak adlandırın ve mutlu olacaksınız:
if ( CopyRates ( Symbol (), 0 , 1 , 3 , Bars )< 0 ) return ;
double value = Bars [ 0 ].open;
...
Çözümünüz de optimal değil, çünkü Halihazırda almış olduğunuz bir diziden değerler içeren bir grup değişkeni başlatıyorsunuz. soru: neden? Ne zaman yalnızca bir dizi kullanılabilir? Adını Barlar ve mutlu olacaksın:
if ( CopyRates ( Symbol (), 0 , 1 , 3 , Bars )< 0 ) return ;
double value = Bars [ 0 ].open;
...
Bars adlı derleyici, dünyanın neyi temsil ettiğini azarladı. Bu tasarımı test ettiniz mi, yoksa çalışması gerektiğini mi varsaydınız yoksa yanlış bir şey mi yapıyorum?
Bars adlı derleyici, dünyanın neyi temsil ettiğini azarladı. Bu tasarımı test ettiniz mi, yoksa çalışması gerektiğini mi varsaydınız?