Hatalar, hatalar, sorular - sayfa 9

 
DC2008 :

Çift tip değişkenler için == koşulunu kullanmak doğru değildir. Bunun gibi bir şeyi karşılaştırmanız önerilir:


Buna, biraz gecikmeli de olsa, bu konuda hala bir makale yazdığımızı ekleyebilirim - MQL4'te çiftlerle çalışmanın özellikleri . Gerçek sayılarla (MQL5'te çift ve kayan nokta) çalışma söz konusu olduğunda, içinde söylenen her şey kalır ve herhangi bir programlama dili için alakalı kalacaktır.
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008 :

double türündeki değişkenler için == koşulunu kullanmak doğru değildir. Bunun gibi bir şeyi karşılaştırmanız önerilir:


Oldukça makul ve en önemlisi makul bir yaklaşım. Bana öyle geliyor ki en azından ilk satır şöyle görünmeliydi:

 if ( MathAbs (LotStep- 0.01 )< 0.01 ) return ( NormalizeDouble (Lot, 2 ));
 

Aşağıdaki mesajlar zaman zaman günlükte görünmeye başladı

2010.06.15 14:48:09 MemoryException 4915200 bayt mevcut değil

ne yapalım ? Desteğe göndermeniz gerekiyorsa, ancak ne göndereceğimi bilmiyorum ((

 
Prival :

Aşağıdaki mesajlar zaman zaman günlükte görünmeye başladı

2010.06.15 14:48:09 MemoryException 4915200 bayt mevcut değil

ne yapalım ? desteğe göndermeniz gerekiyorsa, ancak ne göndereceğimi bilmiyorum ((

Op eksik. hafıza. Dinamik dizilerin boyutlarını kontrol edin, büyük olasılıkla mevcut olandan daha fazla bellek ayırma girişimi.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008 :

double türündeki değişkenler için == koşulunu kullanmak doğru değildir. Bunun gibi bir şeyi karşılaştırmanız önerilir:


Eğer doğru anladıysam sorunun amacı bu değildi. daha sonra kullanıcı tanımlı işlevin sonuna her zaman return ifadesini koymalısınız.
 
joo :
Op eksik. hafıza. Dinamik dizilerin boyutlarını kontrol edin, büyük olasılıkla mevcut olandan daha fazla bellek ayırma girişimi.
hayır, mesele bu değil. Büyük olasılıkla sunucularla ilgili bir şey. bazı işler yapılıyor. verilerde bir boşluk var. sunucuyla iletişim genellikle kaybolur. geçmiş indirilmiyor. büyük ihtimalle bir hataya neden olmuştur.
 
sergey1294 :
Eğer doğru anladıysam mesele bu değildi. daha sonra kullanıcı tanımlı işlevin sonuna her zaman return ifadesini koymalısınız.

== hakkındaki cevabın aslında olduğu gibi. Gerçekten de, double türünde bir fonksiyonda bir yerde bir dönüş (...) olmalıdır. Sonunda zorunlu değil. if() return(); içinde == operatörünü kullanma 0.1000000000000000001 türünde bir LotStep'iniz varsa false döndürebilir. Sonra birden fazla dönüş başarısız olur ve işlev hiçbir şey döndürmez. Her ne kadar sizin durumunuzda olsa da, büyük olasılıkla geri dönüş NormalizeDouble'ı sevmiyor. Çalışan sürümünüzde, sonunu return(NormilizeDouble(lot,2)) olarak değiştirin ve çalışıp çalışmadığını görün. Ben kendim ilgileniyorum.

 
gpwr :

== hakkındaki cevabın aslında olduğu gibi. Gerçekten de, double türünde bir fonksiyonda bir yerde bir dönüş (...) olmalıdır. Sonunda zorunlu değil. if() return(); içinde == operatörünü kullanma 0.1000000000000000001 türünde bir LotStep'iniz varsa false döndürebilir. Sonra birden fazla dönüş başarısız olur ve işlev hiçbir şey döndürmez. Her ne kadar sizin durumunuzda olsa da, büyük olasılıkla geri dönüş NormalizeDouble'ı sevmiyor. Çalışan sürümünüzde, sonunu return(NormilizeDouble(lot,2)) olarak değiştirin ve çalışıp çalışmadığını görün. Ben kendim ilgileniyorum.

Sonunda mutlaka bir dönüş olmalı (...), ancak ulaşmayabilir (eğer koşullardan biri çalışıyorsa)...
 
Interesting :
Sonunda mutlaka bir dönüş olmalı (...), ancak ulaşmayabilir (eğer koşullardan biri çalışıyorsa)...
Beni ilgilendiren buydu, dördünde sona koymaya gerek yoktu.
 

 double volMin     = SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
double LotSize    = SymbolInfoDouble ( _Symbol , SYMBOL_TRADE_CONTRACT_SIZE );
long    Leverage   = AccountInfoInteger ( ACCOUNT_LEVERAGE );
double FreeMargin = AccountInfoDouble ( ACCOUNT_FREEMARGIN );  
double LotRqdMgn  =LotSize/Leverage;
double vol= NormalizeDouble ( MathFloor (FreeMargin*MaxRisk/LotRqdMgn/Step)*Step, 2 );
if (vol<volMin) vol=volMin;
if (vol*LotRqdMgn>FreeMargin) vol= 0.0 ;
Print (LotRqdMgn, " " ,FreeMargin);
return (vol);
Renat :

Hata, hesaplamalarınızda marj para birimini unutmuş olmanızdır. Bakiye = 100 USD ve Marj Gereksinimleri = 100 EUR (119 USD).

Bu nedenle, işlemi gerçekleştiremezsiniz - bu doğru.

Doğru marj hesaplamasıyla ilgili soruma geri dönmek istiyorum. Renat'ın belirttiği gibi, hesaplamalarımda LotRqdMgn (1 lot almak için gerekli marj) para biriminin fiyatını dikkate almıyor. Sonra böyle bir masa gördüğümü hatırladım.

tanımlayıcı

Tanım

formül

SYMBOL_CALC_MODE_FOREX

Ex modu için - Forex için kar ve marj hesaplaması

Marj: Lot*Sözleşme_Boyutu/Kaldıraç

P ro fit: ( close_price -open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_FUTURES

Vadeli işlemler modu - vadeli işlemler için marjın ve kârın hesaplanması

Marj: Lot *İlk Marj*Yüzde/100

Kar: (close_price-open_price)*TickPrice/TickSize*Lots

SYMBOL_CALC_MODE_CFD

CFD modu - CFD için marj ve kar hesaplaması

Marj: Lot *Sözleşme Büyüklüğü*PiyasaFiyatı*Yüzde/100

Kar: (close_price-open_price)*Contract_Size*Çok

SYMBOL_CALC_MODE_CFDINDEX

CFD endeks modu - endekslere göre CFD için marj ve kârın hesaplanması

Marj: (Lot*SözleşmeBoyutu*PiyasaFiyatı)*TickPrice/TickSize

Kar: (close_price-open_price)*Contract_Size*Lot s

SYMBOL_CALC_MODE_CFDLEVERAGE

CFD Kaldıraç modu - kaldıraç ticaretinde CFD için marj ve kârın hesaplanması

Marj: (Lot*Sözleşme Büyüklüğü*PiyasaFiyatı*Yüzde)/Kaldıraç

Kar: (close_price-open_price)*Contract_Size*Çok

Yani tabloda bir hata olduğu ortaya çıkıyor: Lots*Sözleşme_Boyutu/ Kaldıraç yerine Fiyat*Lot*Sözleşme_Boyutu/Kaldıraç olmalıdır.