MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 106
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Lütfen yuvarlama sorununun çözümünü söyleyin!
Virgül sayısını kalansız çıkarmak gerekir - yuvarlamak ve bir güce yükseltmek tüm sorunu çözmez - ne yapmalı?
Örneğin, 1.44430'du ve 144430'a ihtiyacınız var.
Kodun bir parçası - olduğu gibi
NormalizeDouble(Low[1],Digits)*MathPow(10,(Digits+1)*1-1)
Sadece _Point ile bölün
Yanlış sonucu yazdırıyor, orijinal 161188 (1.61188) 161187 yazdırma yönteminiz 1.6119 veriyor (beş ondalık basamak varsa Düşük[1] yazdırırken neden yuvarlama yapıyor?), benim sürümüm 161188.
Ama eğer görevi zorlaştırırsan
long Calc=
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
NormalizeDouble ( Low [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 1 - 1 );
Ardından, 161184 sayısının son kısmı - yani. 4 birim tutarsızlık
Bu İfadedeki Seçeneğiniz benzer bir değer üretir
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
Low [ 1 ]/ Point ;
Neyin yanlış olduğu ve nasıl düzeltileceği hakkında bir fikriniz var mı?
Yanlış sonuç yazdırılıyor, orijinal 161188 (1.61188) 161187 yazdırma yönteminiz 1.6119 veriyor (beş ondalık basamak varsa Düşük[1] yazdırırken neden yuvarlama yapıyor?), benim sürümüm 161188.
Ama eğer görevi zorlaştırırsan
long Calc=
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
NormalizeDouble ( Low [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 1 - 1 );
Ardından, 161184 sayısının son kısmı - yani. 4 birim tutarsızlık
Bu İfadedeki Seçeneğiniz benzer bir değer üretir
NormalizeDouble ( Close [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 3 - 1 )+
NormalizeDouble ( High [ 1 ], Digits )* MathPow ( 10 ,( Digits + 1 )* 2 - 1 )+
Low [ 1 ]/ Point ;
Neyin yanlış olduğu ve nasıl düzeltileceği hakkında bir fikriniz var mı?
void OnStart ()
{
string i = DoubleToString ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point , 0 );
Print (i);
Print ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point );
} /*******************************************************************/
Bu şekilde başlatın.
void OnStart ()
{
string i = DoubleToString ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point , 0 );
Print (i);
Print ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point );
} /*******************************************************************/
Evet, doğru sayı bir dize değişkeni aracılığıyla elde edilir (önceden), ancak sıfırlar eklenir 161188.000000000 bunlardan nasıl kurtulur?
Evet, doğru sayı bir dize değişkeni aracılığıyla elde edilir (önceden), ancak sıfırlar eklenir 161188.000000000 bunlardan nasıl kurtulur?
Kodumda sıfır yok. Bakın nasıl yazılmış.
Teşekkürler - sıfırı kaçırdım.
Sonuç böyle bir tasarımdı
DoubleToString ( Close [ 1 ]/ _Point , 0 )+
DoubleToString ( High [ 1 ]/ _Point , 0 )+
DoubleToString ( Low [ 1 ]/ _Point , 0 );
Print ( "CalcX=" ,CalcX);
Ve şimdi bu sayıları tekrar bileşenlere ayırmamız gerekiyor.
Bir dizeyi sayıya dönüştürmeye çalışırken, 161188 yerine 161184 yanlış sayısını tekrar yakalıyorum
Print ( "testX=" ,testX);
Görünüşe göre çizgiyi kesmek gerekiyor, ancak en uygun şekilde nasıl yapılır?
Evet, bir dize değişkeni aracılığıyla doğru sayı elde edilir (önceden), ancak sıfırlar eklenir 161188.00000000 bunlardan nasıl kurtulur ?
Yani... şablonu göster. Ve sonra orada ne olduğunu nereden biliyorsun?
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
//--- indicator buffers mapping
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
Teşekkürler - sıfırı kaçırdım.
Sonuç böyle bir tasarımdı
DoubleToString ( Close [ 1 ]/ _Point , 0 )+
DoubleToString ( High [ 1 ]/ _Point , 0 )+
DoubleToString ( Low [ 1 ]/ _Point , 0 );
Print ( "CalcX=" ,CalcX);
Ve şimdi bu sayıları tekrar bileşenlere ayırmamız gerekiyor.
Bir dizeyi sayıya dönüştürmeye çalışırken, 161188 yerine 161184 yanlış sayısını tekrar yakalıyorum
Print ( "testX=" ,testX);
Görünüşe göre çizgiyi kesmek gerekiyor, ancak en uygun şekilde nasıl yapılır?
Pekala, eğer karşı konulmaz bir sapıklık arzusu varsa, o zaman dizgiyi tekrar bir StringToDouble () sayısına çevirin ve gerekli sayıda karaktere, muhtemelen _Digits'e normalleştirme ile _Point ile çarpın.