Hatalar, hatalar, sorular - sayfa 2020

 
Kirill Belousov :

OrderCalcMargin işlevi, marjı hesaplarken açılış fiyatını dikkate almaz

Bu bir bug mı yoksa böyle mi olması gerekiyor?

Böcek tabii ki. SD'ye yazın.

 Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));

Bu satır olması gerektiği gibi çalışıyor, ancak kontrol etmem gerekti çünkü yürütme sırasını tahmin etmelisin. Bu noktanın tartışılması burada .

 
fxsaber :

Böcek tabii ki. SD'ye yazın.

Bu satır olması gerektiği gibi çalışıyor, ancak kontrol etmem gerekti çünkü yürütme sırasını tahmin etmelisin. Bu noktanın tartışılması burada .

Print() içinde ifadelerin değerlendirilme sırası sağdan soladır. Öyle görünüyor ki ... Şimdilik ... Ben de önceden kontrol ettim :)


MQL4/5 yardımında doğrudan bir çelişki olduğunda emin olmak zordur:

MQL5 Referansı Dil Temelleri Fonksiyonlar Geçiş parametreleri

Not

Parametrelerin fonksiyona geriye doğru iletildiği , yani en son parametrenin önce hesaplanıp iletildiği, ardından sondan bir önceki parametrenin vb . Açılan parantezden sonra ilk gelen parametre değerlendirilir ve sırayla en son geçer.


MQL5 Referansı Dil Temelleri İşlemler ve İfadeler Diğer işlemler

x1, x2,..., xn argümanlarıyla bir fonksiyon çağırma

Her bağımsız değişken, uygun türde bir sabit, değişken veya ifade olabilir. Geçilen argümanlar virgülle ayrılır ve parantez içinde olmalıdır, açılış parantezi çağrılan fonksiyonun adını takip etmelidir.

Bir ifadenin değeri, işlev tarafından döndürülen değerdir. Bir fonksiyonun dönüş tipi void ise, böyle bir fonksiyona yapılan bir çağrı atama işleminin sağ tarafına yerleştirilemez. x1,..., xn ifadelerinin yürütme sırasının garanti edildiğine dikkat edin.


Parametrelerin baş aşağı transferi tarafından yönlendirilirken.

 
Kirill Belousov :

Bir sonraki başlıkta https://www.mql5.com/en/forum/216697/page3 OrderCalcMargin hakkında bir soru soruldu


Test: Farklı açılış fiyatlarının ikamesi ile marjı hesaplamak için 2 farklı seçeneği kontrol edelim.

İşte LOG

OrderCalcMargin işlevi, marjı hesaplarken açılış fiyatını dikkate almaz

Bu, açılış anı ve fiyatı için yeniden hesaplanması gereken teklif döviz kuru ile ilgili görünüyor.

Eğer kote edilen para birimi USD ise (hesap para birimi de USD'dir), hesaplanan marj açılış fiyatına göre değişir.

GBPUSD için oturum açın

Bu bir bug mı yoksa böyle mi olması gerekiyor?

Muhtemelen öyle olmalı, çünkü hesaplamada, özellikle hesaplama sırasında fiyatları değişmeyen AUDJPY, AUDUSD ve USDJPY dahil.

Ama bu düşünce beni kontrol etmeye itiyor... Piyasaya genel bakışta MetaQuotes-Demo hesabında GBPUSD var ama hesapta robo yok...

 
Alexey Viktorov :

Muhtemelen öyle olmalı, çünkü hesaplamada, özellikle hesaplama sırasında fiyatları değişmeyen AUDJPY, AUDUSD ve USDJPY dahil.

Ama bu düşünce beni kontrol etmeye itiyor... Piyasaya genel bakışta MetaQuotes-Demo hesabında GBPUSD var ama hesapta robo yok...

Sadece size söylemek istedim - bir hata var.

OrderCalcMargin'i hesaplarken durumunuzu Margin=0 ile zaten yeniden oluşturdum

Sadece henüz yayınlanmadı.

 
Alexey Viktorov :

Piyasaya genel bakışta MetaQuotes-Demo hesabında GBPUSD var, ancak hesapta robo yok...

Büyük olasılıkla Piyasa İzleme'de mevcuttur (genel sembol listesiyle karıştırılmamalıdır), ancak gösterilmemiştir.

 
Alexey Viktorov :

Muhtemelen öyle olmalı, çünkü hesaplamada, özellikle hesaplama sırasında fiyatları değişmeyen AUDJPY, AUDUSD ve USDJPY dahil.

Ama bu düşünce beni kontrol etmeye itiyor... Piyasaya genel bakışta MetaQuotes-Demo hesabında GBPUSD var ama hesapta robo yok...

İşte test:

 #define TOSTRING(A) #A+ " = " +(string)(A)
void OnStart ()
  {
   double margin_1= 999 ,price_1;

   Print (TOSTRING(price_1= SymbolInfoDouble ( Symbol (), SYMBOL_ASK )));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print (TOSTRING(price_1= SymbolInfoDouble ( Symbol (), SYMBOL_BID )));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print (TOSTRING(price_1= 10.0 ));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print (TOSTRING(price_1= 1.0 ));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING( OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
   Print ( "price_1= " ,price_1, " margin_1= " , NormalizeDouble (margin_1, 8 ), " " ,TOSTRING(MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1)));
//выведем признак выбранности мажоров
   Print (TOSTRING( SymbolInfoInteger ( "GBPUSD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "USDJPY" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "USDCAD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "AUDUSD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "NZDUSD" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "USDCHF" , SYMBOL_SELECT )));
   Print (TOSTRING( SymbolInfoInteger ( "EURUSD" , SYMBOL_SELECT )));
   for ( int i= SymbolsTotal ( false )-1;i>= 0 ;i--)
     {
       //проверим для каждого символа брокера ситуацию, когда OrderCalcMargin()==true, а маржа=0
       if ( OrderCalcMargin ( ORDER_TYPE_BUY , SymbolName (i, false ), 0.1 , SymbolInfoDouble ( SymbolName (i, false ), SYMBOL_ASK ),margin_1)== true && margin_1== 0 )
        {
         Print (TOSTRING( SymbolName (i, false )), " " ,TOSTRING(margin_1), " " );
        }
     }
  }

// Альтернатива OrderCalcMargin
bool MyOrderCalcMargin( const ENUM_ORDER_TYPE action, const string symbol, const double volume, const double price, double &margin)
  {
   double MarginInit,MarginMain;

   const bool Res= SymbolInfoMarginRate (symbol,action,MarginInit,MarginMain);

   margin=Res ? MarginInit*price*volume* SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_VALUE )/
          ( SymbolInfoDouble (symbol, SYMBOL_TRADE_TICK_SIZE )* AccountInfoInteger ( ACCOUNT_LEVERAGE )) : 0 ;

   return (Res);
  }

1. MarketWatch'ta çarpıları seçin ve USD ile her şeyi gizleyin

2. DSHBTC sembolünü ekleyin ve grafiğini açın.

3. Terminali kapatın

4. Terminali açın

5. DSHBTC'de bir test yapın

İşte LOG:

JM       0        09 : 26 : 05.485     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_ASK ) = 0.07183
QK       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07183 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
KO       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07183 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
QN       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_BID ) = 0.07079000000000001
NJ       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07079000000000001 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
HO       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 0.07079000000000001 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
LL       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 10.0 = 10.0
EE       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
QF       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
HD       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 1.0 = 1.0
EN       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
OM       0        09 : 26 : 05.487     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
EN       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (GBPUSD, SYMBOL_SELECT ) = 0
GI       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (USDJPY, SYMBOL_SELECT ) = 0
DS       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (USDCAD, SYMBOL_SELECT ) = 0
JL       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (AUDUSD, SYMBOL_SELECT ) = 0
JF       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (NZDUSD, SYMBOL_SELECT ) = 0
MQ       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (USDCHF, SYMBOL_SELECT ) = 0
HK       0        09 : 26 : 05.487     test (DSHBTC,H1)         SymbolInfoInteger (EURUSD, SYMBOL_SELECT ) = 0
LH       0        09 : 26 : 05.488     test (DSHBTC,H1)         SymbolName (i, false ) = DSHBTC margin_1 = 0.0 
RS       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = NZDJPY margin_1 = 0.0 
FE       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = NZDCHF margin_1 = 0.0 
QO       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = NZDCAD margin_1 = 0.0 
RP       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPNZD margin_1 = 0.0 
JD       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPCAD margin_1 = 0.0 
CN       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPJPY margin_1 = 0.0 
KP       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPCHF margin_1 = 0.0 
JK       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = GBPAUD margin_1 = 0.0 
QL       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURNZD margin_1 = 0.0 
RG       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURJPY margin_1 = 0.0 
RH       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURGBP margin_1 = 0.0 
HS       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURCHF margin_1 = 0.0 
CD       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURCAD margin_1 = 0.0 
GO       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = EURAUD margin_1 = 0.0 
QP       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = CHFJPY margin_1 = 0.0 
JJ       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = CADJPY margin_1 = 0.0 
JL       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = CADCHF margin_1 = 0.0 
QF       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDNZD margin_1 = 0.0 
NI       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDJPY margin_1 = 0.0 
JS       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDCHF margin_1 = 0.0 
EF       0        09 : 26 : 05.489     test (DSHBTC,H1)         SymbolName (i, false ) = AUDCAD margin_1 = 0.0 

Tüm çaprazlar için kenar boşluğu=0 ve ÇAPRAZ İÇİN BÜYÜKLER SEÇİLMEDİ gösterir.

Bir kez daha DSHBTC'ye bir komut dosyası atacağız

KAYIT

HF       0        09 : 29 : 07.268     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_ASK ) = 0.07185999999999999
IQ       0        09 : 29 : 07.268     test (DSHBTC,H1)        price_1= 0.07185999999999999 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
KP       0        09 : 29 : 07.268     test (DSHBTC,H1)        price_1= 0.07185999999999999 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
DE       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= SymbolInfoDouble ( Symbol (), SYMBOL_BID ) = 0.07087
OQ       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 0.07087 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
MQ       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 0.07087 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
QP       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 10.0 = 10.0
HI       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
LK       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 10.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
MH       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 1.0 = 1.0
HR       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
NP       0        09 : 29 : 07.269     test (DSHBTC,H1)        price_1= 1.0 margin_1= 0.0 MyOrderCalcMargin( ORDER_TYPE_BUY , _Symbol , 0.1 ,price_1,margin_1) = true
GR       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (GBPUSD, SYMBOL_SELECT ) = 1
FM       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (USDJPY, SYMBOL_SELECT ) = 0
JG       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (USDCAD, SYMBOL_SELECT ) = 1
DP       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (AUDUSD, SYMBOL_SELECT ) = 1
DJ       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (NZDUSD, SYMBOL_SELECT ) = 1
OE       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (USDCHF, SYMBOL_SELECT ) = 1
FO       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolInfoInteger (EURUSD, SYMBOL_SELECT ) = 1
DD       0        09 : 29 : 07.269     test (DSHBTC,H1)         SymbolName (i, false ) = DSHBTC margin_1 = 0.0 

Binbaşılar çıktı, ancak USDJPY hariç

Tüm testler MetaQuotes üzerinde gerçekleştirilmiştir.


 
fxsaber :

Büyük olasılıkla Piyasa İzleme'de mevcuttur (genel sembol listesiyle karıştırılmamalıdır), ancak gösterilmemiştir.

Bir şekilde aynı şey hakkında farklı şekillerde konuşuyoruz


 
Alexey Viktorov :

Bir şekilde aynı şey hakkında farklı şekillerde konuşuyoruz

Aynen öyle. Piyasa İzleme'de gösterilmez, ancak vardır .

 
Kirill Belousov :
 for ( int i= SymbolsTotal ( false ) - 1 ;i>= 0 ;i--)
Doğru.
 
fxsaber :
Doğru.

Tamamlandı!

Not: Stoku kaldırmayı unuttum :)

Neden: