Разработчикам: AccountMargin() - неправильно выдает значения по прямым котировкам

 
Код для проверки
bool print = true;
int start()
  {double LOTS = 1;
   if (print) 
       {
        OrderSend (Symbol(), OP_SELL, LOTS, Bid, 5, 0, 0, "xxx", 0, 0, Red);
        
        Print("===================== Symbol = ", Symbol());
        Print("===================== AccountMargin() = ", AccountMargin());
        Print("===================== Real AccountMargin = MODE_LOTSIZE / AccountLeverage() * Bid * LOTS = ", 
              MathRound( MathRound( MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage()) * Bid) * LOTS);

        OrderClose(1,1,Ask,5,Black);
        print = false;
        }
   return(0);
  }


получаем следующее: маржа везде одна и та же ?)

01:19:03 xxx EURUSD,H1: loaded successfully
01:19:04 xxx started for testing
01:19:04 2004.12.30 05:00  xxx EURUSD,H1: open #1 sell 1.00 EURUSD at 1.3619 ok
01:19:04 2004.12.30 05:00  xxx EURUSD,H1: ===================== Symbol = EURUSD
01:19:04 2004.12.30 05:00  xxx EURUSD,H1: ===================== AccountMargin() = 1000
01:19:04 2004.12.30 05:00  xxx EURUSD,H1: ===================== Real AccountMargin = MODE_LOTSIZE / AccountLeverage() * Bid * LOTS = 1362
01:19:04 2004.12.30 05:00  xxx EURUSD,H1: close #1 sell 1.00 EURUSD at 1.3619 at price 1.3622
01:19:26 xxx started for testing
01:19:26 2005.11.10 15:00  xxx EURUSD,H1: open #1 sell 1.00 GBPUSD at 1.7471 ok
01:19:26 2005.11.10 15:00  xxx EURUSD,H1: ===================== Symbol = GBPUSD
01:19:26 2005.11.10 15:00  xxx EURUSD,H1: ===================== AccountMargin() = 1000
01:19:26 2005.11.10 15:00  xxx EURUSD,H1: ===================== Real AccountMargin = MODE_LOTSIZE / AccountLeverage() * Bid * LOTS = 1747
01:19:26 2005.11.10 15:00  xxx EURUSD,H1: close #1 sell 1.00 GBPUSD at 1.7471 at price 1.7475
01:19:30 xxx started for testing
01:19:30 2004.03.12 10:00  xxx EURUSD,H1: open #1 sell 1.00 AUDUSD at 0.7274 ok
01:19:30 2004.03.12 10:00  xxx EURUSD,H1: ===================== Symbol = AUDUSD
01:19:30 2004.03.12 10:00  xxx EURUSD,H1: ===================== AccountMargin() = 1000
01:19:30 2004.03.12 10:00  xxx EURUSD,H1: ===================== Real AccountMargin = MODE_LOTSIZE / AccountLeverage() * Bid * LOTS = 727
01:19:30 2004.03.12 10:00  xxx EURUSD,H1: close #1 sell 1.00 AUDUSD at 0.7274 at price 0.7278


если поменять принт на комент, то все ок. Обратите внимание :)

 
И еще непонятно?
Кусок лога теста: (маржа определена неправильно изначально - открыто лотов всего 6.2 по ауду - показано маржи 6200 при цене в диапазоне 0.6880 - 0.7260??? см. пост выше)
01:39:11 2004.06.30 03:09  mtg_XVI: open #65 sell 0.10 AUDUSD at 0.6880 ok
........................
................ open
........................
01:39:13 2004.07.12 00:55  Tester: not enough money for buy 0.10 AUDUSD at 0.7260 sl: 0.0000 tp: 0.0000 [2004.07.12 00:55]
01:39:13 2004.07.12 00:55  Tester: PrevBalance: 22353.67, PrevPL: -10217.35, PrevEquity 12136.32, PrevMargin: 6200.00, NewMargin: 12300, FreeMargin: -163.68
01:39:13 2004.07.12 00:55  upi: Order BUY Send Error = 134
.........................


Что мы видим, что при попытке открыть 0.1 лота BUY, дополнитеоьной (New) маржи требуется 6200*2-100 = 12300 - откуда? что это за расчет такой? В итоге получаем, что свободной (Free) маржи 12136-12300 = -163.68 НЕдостаточно! И всему тестированию 3.14здец.

Если это не пи, а у меня с головой, то беру свои претензии обратно :)

 
1. Дело в том, что некоторые компании используют фиксированные маржевые требования по форексным
инструментам - т.е. для для любого инструмента (вне зависимости от contract size и базовой валюты) за 1 лот взимается, например 1000 USD.

2. Существует понятие маржи хеджирования - сколько маржи нужно довнести для открытия хеджирующей (встречной) позиции - видимо в настройках инструмента у дилерской компании стоит значение маржи хеджирования равное размеру контракта - это означает что с каждой из хэджирующих позиций взимается полная маржа.
Вы можете это проверить, посмотрев настройки инструмента ("Свойства символа" - в тестере).
 
1. Дело в том, что некоторые компании используют фиксированные маржевые требования по форексным
инструментам - т.е. для для любого инструмента (вне зависимости от contract size и базовой валюты) за 1 лот взимается, например 1000 USD.

Интересно какой это брокер требует одинаковые требования, скажем для фунта и ауда? Совсем одинаковые валюты. Чтобы убедиться, меняем в эксперте, что выше ф-цию Print на Comment, и запускаем эксперта в онлайн на демке на ПРЯМОЙ котировке.
int start()
  {double LOTS = 1;
   if (OrdersTotal() < 1) 
       {
        OrderSend (Symbol(), OP_SELL, LOTS, Bid, 5, 0, 0, "xxx", 0, 0, Red);
        }
   Comment("Symbol = ", Symbol(), "\n",
           "AccountMargin() = ", AccountMargin(), "\n",
           "Real AccountMargin = MODE_LOTSIZE / AccountLeverage() * Bid * LOTS = ", 
           MathRound(MarketInfo(Symbol(),MODE_LOTSIZE) / AccountLeverage() * Bid) * LOTS);
   return(0);
  }


Что мы видим? Маржа оди-НА-ко-вая в оБОих случаях, напрашивается вывод, что ф-ция AccountMargin() в тестовом режиме здит, в все тесты, где тестер обращается к марже тоже :) проверте, я это не выдумал


2. Существует понятие маржи хеджирования - сколько маржи нужно довнести для открытия хеджирующей (встречной) позиции - видимо в настройках инструмента у дилерской компании стоит значение маржи хеджирования равное размеру контракта - это означает что с каждой из хэджирующих позиций взимается полная маржа.
Вы можете это проверить, посмотрев настройки инструмента ("Свойства символа" - в тестере).

К сведению: терминал метаквотовский, котировки тоже, хеджированная маржа по трем прямым валютам - 0 (ноль). или покажите такого СЕрьезного брокера, будем знать куда лаве нести :)
это означает что с каждой из хэджирующих позиций взимается полная маржа

Интересная трактовка. Так в этом то и весь фикус-пикус, что и происходит в тестовом режиме, но это ведь неПРавильно.

Вот тупой пример. Баланс 10 косых. Тестим эксперта на евре один раз.

int start()
  {if (OrdersTotal() < 1)          
       {                                              // 5
        OrderSend (Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, "xxx", 0, 0, Red);
        
        Print("=========================sell== AccountFreeMargin() = ", AccountFreeMargin());
        
        return(0);
        }
   if (OrdersTotal() != 0 && OrdersTotal() < 2)
       {OrderSelect (0, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() == OP_SELL)      
            {                                           // 0.1
             OrderSend (Symbol(), OP_BUY, 5, Ask, 5, 0, 0, "xxx", 0, 0, Blue);
        
             Print("=====================sell-buy== AccountFreeMargin() = ", AccountFreeMargin());
             
             return(0);
             }
        }
   return(0);
  }


потом меняем лоты местами 0.1 на 5 в сел и 5 на 0.1 в бае и тестим еще раз, открываем лог.

19:33:50 xxx: loaded successfully
19:33:59 xxx started for testing
19:33:59 2005.11.11 11:00  xxx: open #1 sell 0.10 EURUSD at 1.1695 ok
19:33:59 2005.11.11 11:00  xxx: =========================sell== AccountFreeMargin() = 9900
19:33:59 2005.11.11 11:05  xxx: open #2 buy 5.00 EURUSD at 1.1706 ok
19:33:59 2005.11.11 11:05  xxx: =====================sell-buy== AccountFreeMargin() = 5100
19:33:59 2005.12.06 17:59  Tester: order #2 is closed
19:33:59 2005.12.06 17:59  Tester: order #1 is closed
19:34:41 xxx EURUSD,H1: loaded successfully
19:34:41 xxx started for testing
19:34:41 2005.11.11 11:00  xxx EURUSD,H1: open #1 sell 5.00 EURUSD at 1.1695 ok
19:34:41 2005.11.11 11:00  xxx EURUSD,H1: =========================sell== AccountFreeMargin() = 5000
19:34:41 2005.11.11 11:05  Tester: not enough money for buy 0.10 EURUSD at 1.1706 sl: 0.0000 tp: 0.0000 [2005.11.11 11:05]
19:34:41 2005.11.11 11:05  Tester: PrevBalance: 10000.00, PrevPL: -550.00, PrevEquity 9450.00, PrevMargin: 5000.00, NewMargin: 9900, FreeMargin: -450.00
19:34:41 2005.11.11 11:05  xxx EURUSD,H1: =====================sell-buy== AccountFreeMargin() = 5000
19:34:41 2005.11.11 11:10  Tester: not enough money for buy 0.10 EURUSD at 1.1704 sl: 0.0000 tp: 0.0000 [2005.11.11 11:10]
19:34:41 2005.11.11 11:10  Tester: PrevBalance: 10000.00, PrevPL: -450.00, PrevEquity 9550.00, PrevMargin: 5000.00, NewMargin: 9900, FreeMargin: -350.00
19:34:41 2005.11.11 11:10  xxx EURUSD,H1: =====================sell-buy== AccountFreeMargin() = 5000
19:34:41 2005.11.11 11:20  Tester: not enough money for buy 0.10 EURUSD at 1.1707 sl: 0.0000 tp: 0.0000 [2005.11.11 11:20]
19:34:41 2005.11.11 11:20  Tester: PrevBalance: 10000.00, PrevPL: -600.00, PrevEquity 9400.00, PrevMargin: 5000.00, NewMargin: 9900, FreeMargin: -500.00
19:34:41 2005.11.11 11:20  xxx EURUSD,H1: =====================sell-buy== AccountFreeMargin() = 5000
19:34:41 2005.11.11 11:25  xxx EURUSD,H1: open #2 buy 0.10 EURUSD at 1.1690 ok
19:34:41 2005.11.11 11:25  xxx EURUSD,H1: =====================sell-buy== AccountFreeMargin() = 5100
19:34:41 2005.11.28 20:10  xxx stopped because of Stop Out
19:34:41 2005.11.28 20:10  Tester: order #2 is closed
19:34:41 2005.11.28 20:10  Tester: order #1 is closed


Получаем те же яйца только сбоку.

Но ведь это полный тестовый бред. Брокеру по..ер с какой стороны ты открываешся. В онлайне такого нет, маржа взымается как положено марже, достаточно вывести инфу в коммент и порулить ордерами.
А вот в тестовом режиме все получается <нецензурное выражение> как :) см. пример выше.






 
Что-то странное получилось - обязательно проверим.
 
обнаружили и исправили. спасибо за подробные пояснения.
 
Спасибо, что востановили на форуме :)
 
Спасибо, что востановили на форуме :)

не ругайтесь матом даже в завуалированной форме магического числа пи. мы вполне доступны к конструктивному диалогу
 
обнаружили и исправили. спасибо за подробные пояснения.

Ошибка, что выдает код осталась
Баланс 10 косых. Тестим эксперта на ауде один раз.
int start()
{
if (OrdersTotal() < 1)          
       {                             
        OrderSend (Symbol(), OP_SELL, 7, Bid, 5, 0, 0, "xxx", 0, 0, Red);
        
        Print("=========================sell== AccountFreeMargin() = ", AccountFreeMargin());
        
        return(0);
        }
   if (OrdersTotal() != 0 && OrdersTotal() < 2)
       {OrderSelect (0, SELECT_BY_POS, MODE_TRADES);
        if (OrderType() == OP_SELL)      
            {                          
             OrderSend (Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0, "xxx", 0, 0, Blue);
        
             Print("=====================sell-buy== AccountFreeMargin() = ", AccountFreeMargin());
             
             return(0);
             }
        }
   return(0);
  }


потом меняем лоты местами 0.1 на 7 в сел и 7 на 0.1 в бае и тестим еще раз, открываем лог.
"Tester: not enough money for buy 0.10"
При лоте 6 все нормально???????????????????????????????????????????????????????????????????

00:14:44 xxx AUDUSD,H1: loaded successfully
00:14:44 xxx started for testing
00:14:44 2004.04.22 09:00  xxx AUDUSD,H1: open #1 sell 0.10 AUDUSD at 0.7279 ok
00:14:44 2004.04.22 09:00  xxx AUDUSD,H1: =========================sell== AccountFreeMargin() = 9927.19
00:14:44 2004.04.22 10:00  xxx AUDUSD,H1: open #2 buy 6.00 AUDUSD at 0.7293 ok
00:14:44 2004.04.22 10:00  xxx AUDUSD,H1: =====================sell-buy== AccountFreeMargin() = 5698.31
00:14:44 2004.04.29 13:00  xxx stopped because of Stop Out
00:14:44 2004.04.29 13:00  Tester: order #2 is closed
00:14:44 2004.04.29 13:00  Tester: order #1 is closed
00:14:56 xxx AUDUSD,H1: loaded successfully
00:14:56 xxx started for testing
00:14:56 2004.04.22 09:00  xxx AUDUSD,H1: open #1 sell 0.10 AUDUSD at 0.7279 ok
00:14:56 2004.04.22 09:00  xxx AUDUSD,H1: =========================sell== AccountFreeMargin() = 9927.19
00:14:56 2004.04.22 10:00  xxx AUDUSD,H1: open #2 buy 7.00 AUDUSD at 0.7293 ok
00:14:56 2004.04.22 10:00  xxx AUDUSD,H1: =====================sell-buy== AccountFreeMargin() = 4969.21
00:14:56 2004.04.29 11:00  xxx stopped because of Stop Out
00:14:56 2004.04.29 11:00  Tester: order #2 is closed
00:14:56 2004.04.29 11:00  Tester: order #1 is closed
00:15:16 xxx AUDUSD,H1: loaded successfully
00:15:17 xxx started for testing
00:15:17 2004.04.22 09:00  xxx AUDUSD,H1: open #1 sell 6.00 AUDUSD at 0.7279 ok
00:15:17 2004.04.22 09:00  xxx AUDUSD,H1: =========================sell== AccountFreeMargin() = 5631.4
00:15:17 2004.04.22 10:00  xxx AUDUSD,H1: open #2 buy 0.10 AUDUSD at 0.7293 ok
00:15:17 2004.04.22 10:00  xxx AUDUSD,H1: =====================sell-buy== AccountFreeMargin() = 5698.31
00:15:17 2004.10.08 16:00  xxx stopped because of Stop Out
00:15:17 2004.10.08 16:00  Tester: order #2 is closed
00:15:17 2004.10.08 16:00  Tester: order #1 is closed
00:15:22 xxx AUDUSD,H1: loaded successfully
00:15:23 xxx started for testing
00:15:23 2004.04.22 09:00  xxx AUDUSD,H1: open #1 sell 7.00 AUDUSD at 0.7279 ok
00:15:23 2004.04.22 09:00  xxx AUDUSD,H1: =========================sell== AccountFreeMargin() = 4903.3
00:15:23 2004.04.22 10:00  Tester: not enough money for buy 0.10 AUDUSD at 0.7293 sl: 0.0000 tp: 0.0000 [2004.04.22 10:00]
00:15:23 2004.04.22 10:00  Tester: PrevBalance: 10000.00, PrevPL: -980.00, PrevEquity 9020.00, PrevMargin: 5103.70, NewMargin: 10134, FreeMargin: -1114.49
00:15:23 2004.04.22 10:00  xxx AUDUSD,H1: =====================sell-buy== AccountFreeMargin() = 4896.3
00:15:23 2004.04.22 11:00  xxx AUDUSD,H1: open #2 buy 0.10 AUDUSD at 0.7250 ok
00:15:23 2004.04.22 11:00  xxx AUDUSD,H1: =====================sell-buy== AccountFreeMargin() = 4998.88
00:15:23 2004.10.08 15:00  xxx stopped because of Stop Out
00:15:23 2004.10.08 15:00  Tester: order #2 is closed
00:15:23 2004.10.08 15:00  Tester: order #1 is closed


Уважаемые программисты MQ сделайте что-нибудь плз

 
Уважаемые программисты MQ сделайте что-нибудь плз

Ошибка уже исправлена, на днях выйдет новый билд с исправлениями.