Функция AccountMargin() вообще неправильно работает - срочно надо разработчикам все исправить!

 

Описание проблемы  в мт4  ( может быть такая проблема скопировалась в мт5)

 Я выводил в советнике 670 билда   ( в режиме  тестера),  через глобальную переменную для индикатора Функцию AccountMargin()  (стоимость закупки позиций)

Последовательность действий

 вот программа проверки:    (не важно сколько лотов, для примера  взят  минимальный лот)

         if(flag==0)
           {

            if(OrdersTotal()<=30) { OrderL(0.01); }  //  открываем лонг 0,01                /// OrderS(0.01);

            if(OrdersTotal()>30) {OrderS(0.01);OrderL(0.01);} //  открываем шорт 0,01 и  открываем лонг 0,01

            if(OrdersTotal()>80) {CLOSE_ALL(); flag=1;}     все закрыть  и остановиться!

           }
           
           
            GlobalVariableSet("Grafik",AccountMargin());
         

 

Полученный результат в зависимости от  вариантов  (см файлы)

В советнике происходит не правильный расчет    AccountMargin()  

 1)    лонги + (лонги +шорты)

  • сначала растет с увеличением позиции  ( правильно!)
  •  потом стабилизируется   при  добавлении позиций S    -  это грубая ошибка, такого не может быть, чтобы закупки не росли при открытии  новых  лотов
  • и при полном  закрытии =0 

  2)    лонги(шорты)   +   шорты ( лонги)

  • сначала растет с увеличением позиции
  •  потом падает  при  добавлении позиций S    -  это грубая ошибка, такого не может быть чтобы закупки не росли при открытии лотов
  • и при полном  закрытии =0 

  3)     сразу лонги+ шорты  открываем

  •  постоянно  AccountMargin()   =0     (  индикатор график почему-то  = 0  не показал!  " почему  0  - не показывает?   это попутный глюк ?)
  • и при полном  закрытии =0 

 4)  сначала  лонги + затем шорты   или     сначала  шорты+ затем лонги

  • сначала растет с увеличением позиции  ( правильно!)
  •  потом стабилизируется   при  добавлении первой  позиций S    -  это грубая ошибка, такого не может быть, чтобы закупки не росли при открытии  новых  лотов
  • потом падает  при  добавлении позиций S                        -  бред полный -   это грубая ошибка, 
  • потом   =0  при  добавлении позиций                               -   такого не может быть никогда
  • потом опять  растет с увеличением позиции  ( правильно!)
  • и при полном  закрытии =0 

  Ожидаемый результат

 

Если я все время открываю позиции , то обязан  AccountMargin()  все время увеличиваться, независимо от  лонгов или шотов 

 AccountFreeMargin()= AccountEquity() -AccountMargin()   связана  уравнением с AccountMargin() и поэтому тоже неправильно считает. 

 Поэтому из-за этого  неправильно маржинкол  и стоп аут считается ,  и все  другие параметры напрямую связанные с ошибкой.  

 

 Как  исправил с своей программе (для полного закрытия  любого  j ордера)  AccountMargin()  на свой  AccountMarginAccountMargin   

 

AccountMarginAccountMargin   всегда больше или равен нулю и логика работы четкая и ясная 

// привел пример   
 //Внимание !! при частичном закрытие лота  нельзя  применять, надо модифицировать!!



//+------------------------------------------------------------------+


 ПРАВИЛЬНАЯ  итоговая маржа="закупки открытых"  минус  "возврат  закрытых"

AccountMargin()=ZAKUPSUM-VozvratSUM;
AccountFreeMarginAccountFreeMargin=AccountEquity()-AccountMargin_AccountMargin;


//+------------------------------------------------------------------+


глобально  присвоим   единожды
double
AccountMarginAccountMargin=0; AccountFreeMarginAccountFreeMargin=AccountEquity()-AccountMargin_AccountMargin;
   ZAKUPSUM=0;  //закупка     VozvratSUM=0;  //возврат суммы  OrderZAK[];   //запомним  стоимость  ордера
////////////////////////////////////////////////////////////////////////////////////////////////////
Уже  в программе при тиках


когда вызываем действие над позициями

//Открытие Buy

if(IsTradeAllowed()==1) TicketBUY=OrderSend(Symbol(),OP_BUY,Lts,NormalizeDouble(Ask,Digits),0,0,0," купил лонг",magic,0,clrBlue);

if(TicketBUY>0) // Получилось :)

  {

   OrderZAK[magic]=Lts*Ask*Contract_1_LOT/plecho;  //запомним  стоимость  ордера
   ZAKUPSUM=ZAKUPSUM+OrderZAK[magic];         закупка  лонгов
   
   AccountMarginAccountMargin=ZAKUPSUM-VozvratSUM;            AccountFreeMarginAccountFreeMargin=AccountEquity()-AccountMargin_AccountMargin;

   magic=magic+1;

  }

//+------------------------------------------------------------------+

// Закрытие Buy  

Lot=OrderLots();   // полное закрытие позиции

if(IsTradeAllowed()==1) AnsBUY=OrderClose(OrderTicket(),Lot,NormalizeDouble(Bid,Digits),0,clrGreen);

if(AnsBUY==true) // Получилось :)

  {

   VozvratSUM=VozvratSUM+OrderZAK[OrderMagicNumber()];      возврат суммы  после продажи лонгов
   

   AccountMarginAccountMargin=ZAKUPSUM-VozvratSUM; AccountFreeMarginAccountFreeMargin=AccountEquity()-AccountMargin_AccountMargin;

  }
//+------------------------------------------------------------------+


//Открытие Sel

if(IsTradeAllowed()==1) TicketSELL=OrderSend(Symbol(),OP_SELL,Lts,NormalizeDouble(Bid,Digits),0,0,0," продал шорт",magic,0,clrRed);

if(TicketSELL>0) // Получилось :)
  {

   OrderZAK[magic]=Lts*Bid*Contract_1_LOT/plecho;    //запомним  стоимость  ордера

   ZAKUPSUM=ZAKUPSUM+OrderZAK[magic];     закупка шортов
   
 
AccountMarginAccountMargin=ZAKUPSUM-VozvratSUM;        AccountFreeMarginAccountFreeMargin=AccountEquity()-AccountMargin_AccountMargin;

   magic=magic+1;
   
   

  }


//+------------------------------------------------------------------+


// Закрытие Sell

Lot=OrderLots();    // полное закрытие позиции

if(IsTradeAllowed()==1) AnsSELL=OrderClose(OrderTicket(),Lot,NormalizeDouble(Ask,Digits),0,clrDarkOrange);

if(AnsSELL==true) // Получилось :)
  {

   VozvratSUM=VozvratSUM+OrderZAK[OrderMagicNumber()];      возврат суммы  после откупа шортов
   
AccountMarginAccountMargin=ZAKUPSUM-VozvratSUM; AccountFreeMarginAccountFreeMargin=AccountEquity()-AccountMargin_AccountMargin;

  }


//+------------------------------------------------------------------+
Файлы:
 

Вот к чему приводит ордерная система учета - полное непонимание сути процесса (бай + селл = 0) ;)

 

Есть такое понятие, как "хеджированная маржа" - маржа, которая взимается за локированную позицию (когда есть бай и селл по одному инструменту).

Получить это значение можно с помощью функции MarketInfo - http://docs.mql4.com/ru/constants/environment_state/marketinfoconstants

MODE_MARGINHEDGED

31

Маржа, взимаемая с перекрытых ордеров в расчете на 1 лот

 

В терминале можно посмотреть в свойствах символа:


Информация об инструменте - Документация на MQL4
  • docs.mql4.com
Информация об инструменте - Документация на MQL4