MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 106

 
-Aleks- :

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
 
Alexey Viktorov :
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

long CalcX=
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ı?

 
-Aleks- :

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

long CalcX=
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ı?

Bu şekilde başlatın.

/********************Script program start function*******************/
void OnStart ()
{
   string i = DoubleToString ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point , 0 );
   Print (i);
   Print ( SymbolInfoDouble ( _Symbol , SYMBOL_BID )/ _Point );
} /*******************************************************************/
 
Alexey Viktorov :
Bu şekilde başlatın.

/********************Script program start function*******************/
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?

 
-Aleks- :

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ış.
 
Alexey Viktorov :
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ı

string CalcX=
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

long testX = StringToDouble (CalcX);
Print ( "testX=" ,testX);

Görünüşe göre çizgiyi kesmek gerekiyor, ancak en uygun şekilde nasıl yapılır?


 
-Aleks- :

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 ?

"." sınırlayıcısını kullanarak dizeyi ayrıştırın.
 
Artyom Trishkin :
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);
  }
//+------------------------------------------------------------------+
 
Göstergeyi nasıl uygulayacağını bilen söyle bana, böylece trend çizgisindeki ikinci zaman koordinatı, kırılma zamanına veya ona dokunmaya göre ayarlanır. Yani bir trend çizgisi var ve başlangıcı belli bir yerde ve ikinci koordinatın zamanı sizin takdirinize bağlı olarak ayarlanmış ancak çizginin mumla kesiştiği yerde bitmesi gerekiyor. Şekilde görüntülenen göstergede izin verildiği gibi
 
-Aleks- :

Teşekkürler - sıfırı kaçırdım.

Sonuç böyle bir tasarımdı

string CalcX=
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

long testX = StringToDouble (CalcX);
Print ( "testX=" ,testX);

Görünüşe göre çizgiyi kesmek gerekiyor, ancak en uygun şekilde nasıl yapılır?


Hiçbir şeyi ayrıştırmanıza gerek yok. Sadece normal bir sayı görmek için dizeye çeviri. Hesaplamak için bir şey yapmanıza gerek yok.

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.