如何以编程方式获得 "保证金的百分比"? - 页 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个订单,它显示正确。

我已经做到了。目前,市场 在演示模式下是关闭的,只有黄金上的订单是开放的。我的话得到了insta的证实(margin percentage:1),你的脚本显示了某种空间...

我不知道该怎么做,但我必须正确计算元报价和机器人中的保证金百分比,其中保证金百分比为100和200。

 
Renat Akhtyamov:
用5英镑和100的杠杆开一个模拟账户,看看保证金比例会是多少,例如,黄金或更有趣的--卢布,也是如此。
我还没有掌握百分比保证金的计算方法,计算的逻辑似乎已经明白,但我还没有写代码。如果你有自己的,让我们看看你在说什么 )
 
K-2SO:

完成了。现在在我的演示中,当市场关闭 时,只有黄金订单是开放的。我的话得到了insta的证实(margin percentage:1),你的脚本显示了某种空间...SYMBOL_CURRENCY_MARGIN 也是如此。

MetaQuotes和RoboQuotes的保证金百分比为100和200,一切都很正确。

我不明白它显示了什么问题。我又开了两张石油订单,其中保证金百分比=1,合同大小只有1000,而不是货币的100,000。

这就是印刷的内容

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

下面是一个截图


出于某种原因,它显示为最接近的一分钱。

因此,除了文字之外,把图片...

 
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的演示有这样一条路径。


和一美分上。

其他的可能是类似的,但不是明确的。当然我们可以用子串进行比较,但为了确保普遍性,我们应该检查许多经纪公司。

虽然...你可以尝试检查一下抵押品的计算方式。

我现在就去检查。

 
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));
}/********************************************************************/
我做了这个也是为了计算待定的订单,但它不包括总的保证金。