Programlı olarak "Marj Yüzdesi" nasıl alınır - sayfa 7

 
K-2SO :

Testler, marj yüzdesi 1'e eşit olduğunda kaldıraç dikkate alınmadığını gösteriyor! Ancak 100 ve üstü, zaten dikkate alınmıştır. 2'den 99'a kadar marj yüzdesine sahip bir komisyoncu bulamamam üzücü.

Ters giden birşey mi var. 1 standart lot başına marjdan bu yüzdeyi hesapladığınızda kaldıraç kullanılır ve ardından kaldıraç dikkate alınır.

Bu betiği derleyin ve açık siparişler varsa, herhangi bir çift üzerinde çalıştırın.

 void OnStart ()
{
 double size = 0 , percentage = 0 , orderMargin = 0 , accountMargin = 0 ;
 long leverage = 0 ;
 for ( int i = 0 ; i < OrdersTotal (); i++)
  {
   int tupe = - 1 ;
   if ( OrderSelect (i, SELECT_BY_POS ) && (tupe= OrderType ()) < OP_BUYLIMIT )
    {
     string symbol = OrderSymbol ();
     string symbolCurencyMargin = SymbolInfoString (symbol, SYMBOL_CURRENCY_MARGIN );
     double orderOpenPrice = OrderOpenPrice ();
     double margin = MarketInfo (symbol, MODE_MARGINREQUIRED );
     double ask = MarketInfo (symbol, MODE_ASK );
     double bid = MarketInfo (symbol, MODE_BID );
     double price = symbolCurencyMargin == "USD" ? 1 : tupe == OP_BUY ? bid : ask;
      size = SymbolInfoDouble (symbol, SYMBOL_TRADE_CONTRACT_SIZE );
      leverage = AccountInfoInteger ( ACCOUNT_LEVERAGE );
      percentage = NormalizeDouble (margin/(size*price/ 100 )*leverage, 0 );
      orderMargin = (size*orderOpenPrice*percentage/ 100 )/leverage;
      accountMargin += orderMargin;
       Print (symbolCurencyMargin, " ******** Маржа " , symbol, " = " , orderMargin);
    }
  }
 Print ( AccountInfoString ( ACCOUNT_CURRENCY ), " ******** AccountMargin = " , DoubleToString (accountMargin, 2 ));
} /********************************************************************/
Sadece 2 açık siparişim var, doğru gösteriyorlar.
 
Alexey Viktorov :

Ters giden birşey mi var. 1 standart lot başına marjdan bu yüzdeyi hesapladığınızda kaldıraç kullanılır ve ardından kaldıraç dikkate alınır.

Bu betiği derleyin ve açık siparişler varsa, herhangi bir çift üzerinde çalıştırın.

Sadece 2 açık siparişim var, doğru gösteriyorlar.

Yapılmış. Artık piyasa kapalıyken sadece altın emirleri açıkken demolarım var. Sözlerim insta tarafından onaylandı (marj yüzdesi: 1) betiğiniz bir tür boşluk gösteriyor ...

Marj yüzdesinin 100 ve 200 olduğu meta alıntılar ve robo için - her şey doğrudur.

 
Renat Akhtyamov :
100 kaldıraçlı 5 dolarlık bir demo hesabı açın ve örneğin aynı altın veya hatta daha soğuk için - ruble için yüzde olarak marjın ne olacağını görün...
Marj yüzdesinin hesaplanmasında henüz ustalaşmadım, hesaplamaların mantığını çoktan anladım ama henüz kodu yazmadım. Kendiniz varsa, ne demek istediğinizi kontrol edelim)
 
K-2SO :

Yapılmış. Artık piyasa kapalıyken sadece altın emirleri açıkken demolarım var. Sözlerim insta tarafından onaylandı (marj yüzdesi: 1) betiğiniz bir tür boşluk gösteriyor ... ancak, SYMBOL_CURRENCY_MARGIN gibi

Marj yüzdesinin 100 ve 200 olduğu meta alıntılar ve robo için - her şey doğrudur.

Sorunun ne olduğunu anlamıyorum. Burada, marj yüzdesi = 1 ve sözleşme büyüklüğünün para birimlerinde olduğu gibi 100.000 değil, yalnızca 1000 olduğu 2 petrol siparişi daha açtım.

İşte yazdırdığı şey

 2017.06 . 05 08 : 40 : 04.978 test EURUSD.e,H1: USD ******** AccountMargin = 2207.23
2017.06 . 05 08 : 40 : 03.360 test EURUSD.e,H1: US_ ******** Маржа BRENT = 508.0
2017.06 . 05 08 : 39 : 34.326 test EURUSD.e,H1: US_ ******** Маржа WTI = 484.9
2017.06 . 05 08 : 39 : 25.185 test EURUSD.e,H1: XAU ******** Маржа XAUUSD.e = 840.4333333333334
2017.06 . 05 08 : 39 : 19.651 test EURUSD.e,H1: EUR ******** Маржа EURUSD.e = 373.8933333333333

Burada bir resim var


Nedense bir kuruşa kadar çıkıyor.

Yani, kelimelerden ayrı olarak, resimler yayınlayın ...

 
Alexey Viktorov :

Yani, kelimelerden ayrı olarak, resimler yayınlayın ...


Bunun gibi bir yerde (lot 0.05, kaldıraç 300):

 2017.06 . 05 12 : 06 : 11.968 Script gold_test_vik XAUUSD,H1: removed
2017.06 . 05 12 : 06 : 11.953 gold_test_vik XAUUSD,H1: uninit reason 0
2017.06 . 05 12 : 06 : 11.953 gold_test_vik XAUUSD,H1: USD ******** AccountMargin = 8193395.74
2017.06 . 05 12 : 06 : 11.953 gold_test_vik XAUUSD,H1: USD ******** Маржа XAUUSD = 8193395.736
2017.06 . 05 12 : 06 : 11.953 gold_test_vik XAUUSD,H1: initialized
2017.06 . 05 12 : 06 : 11.937 Script gold_test_vik XAUUSD,H1: loaded successfully

 
K-2SO :


Bunun gibi bir yerde (lot 0.05, kaldıraç 300):

Açık. Marj para birimine dikkat edin. XAU versiyonumda ve USD'nizde ve sonra bu satırla bir şeyler yapmanız gerekiyor

 double price = symbolCurencyMargin == "USD" ? 1 : tupe == OP_BUY ? bid : ask;

böylece teklif hesaplamada dikkate alınır. Bir sembol yolu ekleyebilir.

Ve tekrar kontrol etmek için bu satırı şu şekilde değiştirin

 double price = tupe == OP_BUY ? bid : ask;

Ancak o zaman para birimlerine güvenmek yanlış olur.

Genel olarak, evrensellik için, araca giden yol için tüm seçenekleri ve marj para birimi seçeneklerini dikkate almak gerekir.

 
Alexey Viktorov :

Açık. Marj para birimine dikkat edin. XAU versiyonumda ve USD'nizde ve sonra bu satırla bir şeyler yapmanız gerekiyor

böylece teklif hesaplamada dikkate alınır. Bir sembol yolu ekleyebilir.

Ve tekrar kontrol etmek için bu satırı şu şekilde değiştirin


Hala yanlış, sıralama aynı, sonuç:

 2017.06 . 05 12 : 47 : 50.984 gold_test_vik XAUUSD,H1: USD ******** AccountMargin = 6392.70
2017.06 . 05 12 : 47 : 50.984 gold_test_vik XAUUSD,H1: USD ******** Маржа XAUUSD = 6392.7
Alexey Viktorov :

Genel olarak, evrensellik için, araca giden yol için tüm seçenekleri ve marj para birimi seçeneklerini dikkate almak gerekir.

Marj para birimi ile açık, ancak araca giden yol için hangi seçeneklerden bahsediyoruz?


ps Formüle göre, kaldıraç dikkate alınmadan her şey tam olarak hesaplanır:

margin=( OrderLots ()*contract* OrderOpenPrice ())/ 100 *Percentage; // инста - процент маржи 1% 
 
K-2SO :

Hala yanlış, sıralama aynı, sonuç:

Marj para birimi ile açık, ancak araca giden yol için hangi seçeneklerden bahsediyoruz?


ps Formüle göre, kaldıraç dikkate alınmadan her şey tam olarak hesaplanır:

Evet, biraz batırdım... Partinin büyüklüğü hiç hesaba katılmadı. Benim için doğru görünüyor çünkü 1 standart lot için siparişler... Bu satırı eklemeniz gerekiyor

orderMargin = ( OrderLots ()* size*orderOpenPrice*percentage/ 100 )/leverage;

Sembole giden yol aşağıdaki gibi tanımlanır

 SymbolInfoString (symbol, SYMBOL_PATH );

ama ne yazık ki, isimlerde bir belirsizlik yok, bu yüzden bir koşul koymak o kadar kolay değil.

Robo, ecn demosunda bu yola sahiptir,


ve bir yüzde

Diğerleri benzer olabilir, ancak açık bir şekilde değil. Elbette, bir alt diziyle karşılaştırabilirsiniz, ancak evrensellikten emin olmak için, bir yola sahip oldukları için birçok DC'yi kontrol etmeniz gerekir.

Yine de ... teminat hesaplama yöntemini kontrol etmeyi deneyebilirsiniz.

Şimdi kontrol edeceğim.

 
Alexey Viktorov :

Evet, biraz batırdım... Partinin büyüklüğü hiç hesaba katılmadı. Benim için doğru görünüyor çünkü 1 standart lot için siparişler... Bu satırı eklemeniz gerekiyor

Eklendi ve hala sonuç yanlış)

Alexey Viktorov :

Sembole giden yol aşağıdaki gibi tanımlanır

Bu yolu nasıl, nerede ve neden kullanmanız gerektiğinden bahsediyorum?
 

Peki, hemorajik ... Nasıl düşündüğünüzü kontrol edin.

 void OnStart ()
{
 double contractSize = 0 , orderMargin = 0 , accountMargin = 0 ; double percentage = 0 ;
 long leverage = 0 ;
 for ( int i = 0 ; i < OrdersTotal (); i++)
  {
   int type = - 1 ;
   if ( OrderSelect (i, SELECT_BY_POS ))
    {
      type = OrderType ();
     string symbol = OrderSymbol ();
     string symbolCurencyMargin = SymbolInfoString (symbol, SYMBOL_CURRENCY_MARGIN );
     double orderLots = OrderLots ();
      leverage = AccountInfoInteger ( ACCOUNT_LEVERAGE );
     double margin = MarketInfo (symbol, MODE_MARGINREQUIRED );
     double ask = MarketInfo (symbol, MODE_ASK );
     double bid = MarketInfo (symbol, MODE_BID );
     int calcMode = int ( SymbolInfoInteger (symbol, SYMBOL_TRADE_CALC_MODE ));
     int stringFind = StringFind (symbol, "USD" );
     double price = stringFind == 0 ? 1 : type% 2 == OP_BUY ? bid : ask;
     double orderOpenPrice = stringFind == 0 ? 1 : OrderOpenPrice ();
      contractSize = SymbolInfoDouble (symbol, SYMBOL_TRADE_CONTRACT_SIZE );
      percentage = NormalizeDouble (margin/(contractSize*price/ 100 )*(calcMode == 0 ? leverage : 1 ), 0 );
      orderMargin = (orderLots*contractSize*orderOpenPrice*percentage/ 100 )/(calcMode == 0 ? leverage : 1 );
       Print ( "******** Процент маржи " , int (percentage), " Маржа ордера " , symbol, " " , orderLots, " = " , orderMargin);
       if (type < OP_BUYLIMIT )
       accountMargin += orderMargin;
    }
  }
 Print ( "******** AccountMargin = " , DoubleToString (accountMargin, 2 ), " " , AccountInfoString ( ACCOUNT_CURRENCY ));
} /********************************************************************/
Bunu bekleyen siparişleri de saymak için yaptım, ancak toplam marj miktarını içermiyor.