Mql4 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 29

 
Vladimir Karputov :

Ve " Veri Penceresinde " zaman aynı mı?

Evet.

 
Andrey Khatimlianskii :

Evet.

Apaçık. Yani gerçekten bar zamanı. Sadece " Doğru zaman ölçeği " ayarı hakkında şüphelerim vardı.

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

Merhaba!
Bir "for" döngüsünde "double" kullanmanın doğru yolu nedir? Yardımda, "çift" kullanımına ilişkin bir yasak yok gibi görünüyor. "i"yi normalleştirmenin gerekli olduğunu anlıyorum ama yapamıyorum.

 double expr1= 1.0 ;
double expr2= 2.8 ;
double step= 0.2 ;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int count= 0 ;
   for (i=expr1; i<=expr2; i+=step)
     {
       NormalizeDouble (i, 1 );
      count++;
       Print ( " i: " ,DoubleToStr(i, 8 ), " step: " ,DoubleToStr(step, 8 ));
     }
   int MaxPass=( int ) NormalizeDouble (((expr2-expr1)/step), 0 )+ 1 ;
   Print ( " MaxPass: " ,MaxPass, " count: " ,count, " i: " ,i);
  }
//+------------------------------------------------------------------+

"expr2=2.6" ise, 9 yineleme yine de her şey yolundadır, ancak zaten "expr2=2.8" ile yanlış 9 yineleme gösterir (doğru 10).

 
Nauris Zukas :

Merhaba!
Bir "for" döngüsünde "double" kullanmanın doğru yolu nedir? Yardımda, "çift" kullanımına ilişkin bir yasak yok gibi görünüyor. "i"yi normalleştirmenin gerekli olduğunu anlıyorum ama yapamıyorum.

"expr2=2.6" ise, 9 yineleme için her şey yolundadır, ancak zaten "expr2=2.8" ile yanlış 9 yineleme gösterir (doğru 10).

Muhtemelen değerleri normalleştirmeniz gerekir.

 
Alexey Viktorov :

Muhtemelen değerleri normalleştirmeniz gerekir.

Bu şekilde demek istediyseniz, bu da yardımcı olmadı:

 double expr1= 1.0 ;
double expr2= 2.8 ;
double step= 0.2 ;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int count= 0 ;
   for (i= NormalizeDouble (expr1, 1 ); i<= NormalizeDouble (expr2, 1 ); i+= NormalizeDouble (step, 1 ))
     {
       NormalizeDouble (i, 1 );
      count++;
       Print ( " i: " ,DoubleToStr(i, 8 ), " step: " ,DoubleToStr(step, 8 ));
     }
   int MaxPass=( int ) NormalizeDouble (((expr2-expr1)/step), 0 )+ 1 ;
   Print ( " MaxPass: " ,MaxPass, " count: " ,count, " i: " ,i);
  }
 
Nauris Zukas :

Bu şekilde demek istediyseniz, bu da yardımcı olmadı:

Numara. En azından optimize edilmesi gerekiyor.

 double expr1= 1.0 ;
double expr2= 2.8 ;
double step= 0.2 ;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int count= 0 ;
   for (i= NormalizeDouble (expr1, 1 ); i<= NormalizeDouble (expr2, 1 ); NormalizeDouble ( i+=step , 1 ))
     {
       NormalizeDouble (i, 1 );
      count++;
       Print ( " i: " ,DoubleToStr(i, 8 ), " step: " ,DoubleToStr(step, 8 ));
     }
   int MaxPass=( int ) NormalizeDouble (((expr2-expr1)/step), 0 )+ 1 ;
   Print ( " MaxPass: " ,MaxPass, " count: " ,count, " i: " ,i);

çünkü yanlış değeri veren budur. Gerisi gerekli olmayabilir.

 
Nauris Zukas :

Merhaba!
Bir "for" döngüsünde "double" kullanmanın doğru yolu nedir? Yardımda, "çift" kullanımına ilişkin bir yasak yok gibi görünüyor. "i" yi normalleştirmenin gerekli olduğunu anlıyorum, ama yapamam.

"expr2=2.6" ise, 9 yineleme için her şey yolundadır, ancak zaten "expr2=2.8" ile yanlış 9 yineleme gösterir (doğru 10).

Buldum, Nikolay'ın gönderisini okudum, işi duble ile çok detaylı ve çok kaliteli anlattı https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

malzeme ilk kez asimile edilmemişse, kodunuzdaki Print()'i printf() ile en az 15. karaktere kadar çift çıktı ile değiştirmeyi deneyin https://www.mql5.com/en/forum/1111/ page2623#comment_14474138

belki o zaman nedenini anlarsın

 
Alexey Viktorov :

Numara. En azından optimize edilmesi gerekiyor.

çünkü yanlış değeri veren budur. Gerisi gerekli olmayabilir.

Teşekkürler, ancak örneğiniz de doğru sonucu vermedi. printf içinde normalleşmenin gerçekleşmediğini görebilirsiniz:

0 10:29:31.595 Test_Double_EURCHF,H4 için: i = 1.00000000000000000000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_EURCHF,H4 için: i = 1.1999999999999999999555910790149937383054733276367187500000000
0 10:29:31.595 Test_Double_EURCHF,H4 için: i = 1.399999999999999911182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_EURCHF,H4 için: i = 1.599999999999999866773237044981215149164199829101562500000000
0 10:29:31.595 Test_Double_EURCHF,H4 için: i = 1.799999999999999999822364316059974953532218933105468750000000000
0 10:29:31.595 Test_Double_EURCHF için,H4: i = 1.999999999999999777955395074968691915273666381835937500000000
0 10:29:31.595 Test_Double_EURCHF için,H4: i = 2.199999999999999733546474089962430298328399658203125000000000
0 10:29:31.595 Test_Double_EURCHF,H4 için: i = 2.399999999999999999911182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_EURCHF için,H4: i = 2.6000000000000000088817841970012523233890533447265625000000000
0 10:29:31.595 Test_Double_EURCHF için,H4: MaxPass: 10 sayı: 9
0 10:29:31.595 Test_Double_For EURCHF,H4: Son i = 2.800000000000000266453525910037569701671600341796875000000000

 
Igor Makanu :

Buldum, Nikolay'ın gönderisini okudum, işi duble ile çok detaylı ve çok kaliteli anlattı https://www.mql5.com/ru/forum/1111/page2623#comment_14473837

malzeme ilk kez asimile edilmemişse, kodunuzdaki Print()'i printf() ile en az 15. karaktere kadar çift çıktı ile değiştirmeyi deneyin https://www.mql5.com/en/forum/1111/ page2623#comment_14474138

belki o zaman nedenini anlarsın

Teşekkürler, bunun neden olduğunu anlıyorum, bu yüzden normalleştirmeye çalıştım. başaramadım. Alexey Viktorov, varyant da durumu düzeltmedi, değerler normalleşmedi. Öyleyse soru devam ediyor, bir döngüde "çift" kullanılabilir ve her zaman doğru yineleme sayısını alabilir mi?

 
Nauris Zukas :

Yani soru devam ediyor, "çift" bir döngüde kullanılabilir

olabilmek

Nauris Zukas :

ve her zaman doğru yineleme sayısını alıyor musunuz?

double değeri her zaman doğrudur, ancak görmek veya almak istediğiniz konumsal ondalık sisteme karşılık gelmez

Nauris Zukas :

Teşekkürler, bunun neden olduğunu anlıyorum, bu yüzden normalleştirmeye çalıştım. başaramadım. Alexey Viktorov, varyant da durumu düzeltmedi, değerler normalleşmedi

çift dönüşümlü herhangi bir manipülasyonun her zaman sınırlamaları olacaktır, bu görevin sizin örneklerinizle aynı şekilde çözüldüğünden şüpheliyim

güvenilir bir karar verin: döngüde int kullanın ve sonuç değerini double olarak hesaplayacağınız formülü kullanın ve döngüde yineleme yaparken sonuç olarak double toplama kullanmayın - Nikolay ile diyalogdaki örneğime tekrar bakın