プログラムによる「マージン率」の取得方法 - ページ 7

 
K-2SO:

テストによると、マージン率が1に等しい場合、レバレッジは考慮されないことがわかりましたしかし、100以上の場合は、すでに考慮されているのです。証拠金率が2~99包括のブローカーがあればいいのですが。

何かが間違っている。1標準ロットの証拠金からこの割合を計算するときに、レバレッジがそこに考慮されます。

このスクリプトをコンパイルし、未決済の注文がある場合、任意のペアで実行します。

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));
}/********************************************************************/
注文は2つしか開いていませんが、正しく表示されています。
 
Alexey Viktorov:

何かが間違っている。レバレッジは、1標準ロットの証拠金からその割合をカウントすると、そこにレバレッジが加味されます。

このスクリプトをコンパイルし、未決済の注文がある場合、任意のペアで実行します。

注文は2つしか開いていませんが、正しく表示されています。

してきました。現在、デモモードでは市場は閉鎖されて おり、金地金の注文のみが可能です。インスタで私の言葉を確認すると(マージン率:1)、あなたのスクリプトでは何らかのスペースが表示されていますね...。

メタクォートとロボットのやつでマージンの割合を100と200で正しく計算しないといけないのですが、どうすればいいのでしょうか?

 
Renat Akhtyamov:
5ポンド、レバレッジ100でデモ口座を開設し、マージン率を確認します。例えば、金やもっと面白いことにルーブルでも同じです...
マージン率の計算はまだマスターしておらず、計算のロジックは理解できているようですが、コードはまだ書いていません。自分の言っていることを確認しよう )
 
K-2SO:

完了しました。現在、私のデモでは、マーケットが閉じて いる間、ゴールドの注文だけが開かれています。インスタで私の言葉を確認すると(マージン率:1)、あなたのスクリプトでは何らかのスペースが表示されていますね...。SYMBOL_CURRENCY_MARGINも 同様です。

MetaQuotesとRoboQuotesはマージン率が100と200の場合、すべて正しく表示されます。

何を間違えて表示しているのかがわからない。原油の注文を2つ追加しました。マージン率=1、契約サイズは1000のみで、通貨のように10万ではありません。

このように印刷されています。

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

以下はスクリーンショットです。


なぜか正確な1円玉が表示される。

だから、言葉とは別に、絵を入れて...。

 
Alexey Viktorov:

だから、言葉だけでなく、写真も載せて...。


こんなところ(ロット0.05、レバレッジ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:


こんなところ(ロット0.05、レバレッジ300)。

なるほど。証拠金の通貨に 注意する。私のはXAU、あなたのはUSDで、この行をどうにかしてください。

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

ので、見積もりは計算に含まれます。シンボルにパスを追加するとか。

また、ダブルチェックのため、この行を次のように変更します。

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

しかし、この場合、通貨については正しく動作しません。

一般的には、シンボルへのパスのすべてのバリエーションと、マージン通貨のすべてのバリエーションを、普遍性のために考慮する必要があります。

 
Alexey Viktorov:

なるほど。証拠金の通貨に 注意する。私のはXAU、あなたのはUSDで、この行をどうにかしてください。

ので、見積もりは計算に含まれます。シンボルにパスをつけるといいかもしれませんね。

もう一度確認するには、この行を次のように変更します。


すべて同じ、正しくない、順番も同じ、結果も同じ。

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
アレクセイ・ヴィクトロフ

一般に、シンボルと証拠金通貨へのパスのすべてのバリエーションは、普遍性のために考慮されるべきです。

証拠金通貨は明確ですが、シンボルへのパスバリエーションはどのようなものなのでしょうか?


p.s. レバレッジのない計算式は、すべてを正確にカウントしています。

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

まだ間違っている、同じ順序、同じ結果。

証拠金通貨は明確だが、どの経路で計測するのか?


p.s. レバレッジなしの計算式によると、すべてが正確に計算されます。

ああ、ちょっと失敗した...。敷地面積は全く考慮されていません。私の注文は1標準ロットなので、正しく表示されていますが...。この行を追加する必要があります。

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

シンボルまでのパスは以下のように定義されています。

SymbolInfoString(symbol, SYMBOL_PATH);

が、残念ながら曖昧な命名ではないので、条件を設定するのはそう簡単ではありません。

Roboさん、ecnのデモにはそのようなパスがあります。


と1セントで。

その他は、似ていても一概には言えません。もちろん、部分文字列で比較することもできますが、普遍性を確認するためには、多くの証券会社をチェックする必要があります。

とはいえ...担保の計算方法を確認してみてはいかがでしょうか。

これから確認します。

 
Alexey Viktorov:

ああ、ちょっと失敗した...。敷地面積は全く考慮されていません。注文が1標準ロットずつなので、うまくいっているのですが・・・。この一行を付け加えなければならない。

したのですが、結果はやはり間違っていました)

アレクセイ・ヴィクトロフ

シンボルまでのパスは以下のように定義されています。

つまり、このパスをどのように、どこで、なぜ使う必要があるのか?
 

なんて面倒なんだ...。自分にとってどのようにカウントされるかを確認する。

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));
}/********************************************************************/
これは、保留中の注文も カウントするようにしたのですが、マージンの合計が含まれていません。