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

 
Ihor Herasko :

Sadece:

hata mesajı veriyor

 
Aleksandr Lishchenko :

hata mesajı veriyor

Nerede hata veriyor? Ne hatası veriyor?

 

Merhaba. Kullanıcı tarafından belirtilen işlem hacminin giriş parametresinin doğruluğunu kontrol etme görevi vardır, daha doğrusu belirtilen lot, lot değiştirme adımının bir katı olmalıdır. Bunu yapmak için, bölmenin gerçek kalanını bulurum ve onu sıfır değeriyle veya sıfıra çok yakın bir değerle karşılaştırırım (örneğin, 0.000000001)

 void OnStart ()
{
   double volume = 0.03 ;
   Alert ( "Результат деления " , volume/ MarketInfo ( Symbol (), MODE_LOTSTEP ));
   Alert ( "Шаг изменения лота " , MarketInfo ( Symbol (), MODE_LOTSTEP ));
   Alert ( "Вешественный остаток " , fmod (volume, MarketInfo ( Symbol (), MODE_LOTSTEP )));
}

Sonuç:

 /*
   Вещественный остаток 0,009999999999999998
   Шаг изменения лота 0,01
   Результат деления 3,0
*/

Ayrıca bir ekran görüntüsü eklendi.

Bence kalan sıfır veya çok küçük bir sayı olmalı, ancak bir nedenden dolayı neredeyse 0,01 çıkıyor? Örneğin, kullanıcı hatalı olarak 0.001'i ayarlarsa, giriş parametresi nasıl kontrol edilir?

Dosyalar:
4npm6qh.png  8 kb
 
Aleksandr Teleguz :

Merhaba. Kullanıcı tarafından belirtilen işlem hacminin giriş parametresinin doğruluğunu kontrol etme görevi vardır, daha doğrusu belirtilen lot, lot değiştirme adımının bir katı olmalıdır. Bunu yapmak için, bölmenin gerçek kalanını bulurum ve onu sıfır değeriyle veya sıfıra çok yakın bir değerle karşılaştırırım (örneğin, 0.000000001)

Sonuç:

Ayrıca bir ekran görüntüsü eklendi.

Bence kalan sıfır veya çok küçük bir sayı olmalı, ancak bir nedenden dolayı neredeyse 0,01 çıkıyor? Örneğin, kullanıcı hatalı olarak 0.001'i ayarlarsa, giriş parametresi nasıl kontrol edilir?

Biraz yanlış. İlk adım, en yakın doğru değeri (verilen değere göre) hesaplamak ve ancak ondan sonra elde edilen değerler arasındaki farkı kontrol etmektir. Sıfırsa (veya DBL_EPSILON'dan fazla değilse), her şey yolunda demektir:

 void OnStart ()
{
   double volume = 0.03 ;

   double fVolumeMin = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );   
   double fVolumeMax = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );   
   double fVolumeStep = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_STEP ); 

   double fNearestCorrectVolume = VolumeCast(volume, fVolumeMin, fVolumeMax, fVolumeStep);
   if ( fabs (fNearestCorrectVolume - volume) > DBL_EPSILON )
       Alert ( "Ошибка" );
   else
       Alert ( "Все ОК" );
}

VolumeCast işlevi buradan alınabilir.

 
Ihor Herasko :

Nerede hata veriyor? Ne hatası veriyor?

1 hata(lar), 0 uyarı(lar) 2 1
'if' - genel bir ifadede ifadelere izin verilmez

 

Tünaydın!

Beyler bana danışmanı bir hesaba nasıl bağlayacağımı söyleyin (en son MT4 güncellemesi için).

Çok teşekkürler.

 
Aleksandr Lishchenko :

Tünaydın!

Beyler bana danışmanı bir hesaba nasıl bağlayacağımı söyleyin (en son MT4 güncellemesi için).

Çok teşekkürler.

Size zaten kod verildi.

Hatayı kendiniz yaptınız - hata açıklamasında size kodu global değişkenler alanında yaptığınız ve OnTick() veya OnInit() içinde yazmadığınız yazılmıştır:

'if' - expressions are not allowed on a global scope

Ve bu kadar bilgiyle, kodunuzu birinden de korumaya mı çalışıyorsunuz?
 
Artyom Trishkin :

Size zaten kod verildi.

Hatayı kendiniz yaptınız - hata açıklamasında size kodu global değişkenler alanında yaptığınız ve OnTick() veya OnInit() içinde yazmadığınız yazılmıştır:

'if' - expressions are not allowed on a global scope

Ve bu kadar bilgiyle, kodunuzu birinden de korumaya mı çalışıyorsunuz?

Ben sadece öğreniyorum!

Kesinlikle yargılamayın! ;)

 
Aleksandr Lishchenko :

1 hata(lar), 0 uyarı(lar) 2 1
'if' - genel bir ifadede ifadelere izin verilmez

Kodun nasıl uygulandığını gösterin. Yazdıklarımı kopyalamışlar mı?

 
Ihor Herasko :

Kodun nasıl uygulandığını gösterin. Yazdıklarımı kopyalamışlar mı?

öyle yaptım :)))

Neden: