AccountMargin() не работает правильно в МТ4

 

Описание проблемы  в мт4

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

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

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

         if(flag==0)
           {

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

            if(OrdersTotal()>30) {OrderS(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()   дойдя постепенно   до  0  вдруг понимает , что  отрицательной закупки не бывает

опять знак почему-то  меняется, хотя продолжаем открывать шорты

 

если  поменять местами шорты и лонги   - бред  будет таким же

  

Странно все это ,  бред полный -   но факт !!   

 

 

 

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

 

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

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

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

 

К сожалению фирма разработчик отказывается исправлять  свои ошибки, они так боятся признать ошибки.... не хотят думать над своими ошибками.

Тем кто понимает, что это грубая ошибка я предлагаю не использовать AccountMargin() . Я написал программу нормального учета маржи:

 

  AccountMargin()  меняем  на  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;


  }


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

А мой ответ из предыдущей ветки не понравился?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

komposter, 2014.07.31 01:15

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

 

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

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

MODE_MARGINHEDGED

31

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

 

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



 

Ребят а как это в код в сову  всунуть????


Проверка маржи

Выяснить размер залоговых средств, требуемых на открытие или наращивание позиции, можно функцией OrderCalcMargin(), которой первым параметром передается значение из перечисления ENUM_ORDER_TYPE. Для операции покупки необходимо вызывать с параметромORDER_TYPE_BUY, для продажи - с параметром ORDER_TYPE_SELL. Функция возвращает размер маржи в зависимости от количества лотов и цены открытия.

void OnStart()
  {
//--- переменная для получения значения маржи
   double margin;
//--- для получения данных последнего тика
   MqlTick last_tick;
//--- попытаемся получить значения из последнего тика
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      //--- сбросим код последней ошибки
      ResetLastError();
      //--- вычислим значение маржи
      bool check=OrderCalcMargin(type,Symbol(),lots,last_tick.ask,margin);
      if(check)
        {
         PrintFormat("Для операции %s  %s %.2f lot at %G требуется %.2f %s",OrderTypeToString(type),
                     Symbol(),lots,last_tick.ask,margin,AccountInfoString(ACCOUNT_CURRENCY));
        }
     }
   else
     {
      Print("Неудачное выполнение функции SymbolInfoTick(), ошибка ",GetLastError());
     }
  }
 

У меня стоит:

 extern    int  MaxRisk                  = 10;

 int start()          

      

{

double Free    =AccountFreeMargin();

double Lot     =(Free*MaxRisk/100);    

но при тестировании с не моим(1:500) плечом у модеров возникли вопросы. Немогу код который выше вставить.Помогите новичку плиз!!!!!!!!!!!! 

 
ну у меня ноль  - хеджированная маржа........ и что дальше....

 

Вот открываем  лонги , - все нормально   - закупка растет

потом открываем шорты и   у Вас  появляются позиции с  знаком противоположным - минус  и вычитаются из  из общей суммы,  потом AccountMargin()   дойдя постепенно   до  0  вдруг понимает , что  отрицательной закупки не бывает! 

опять знак почему-то  меняется, хотя продолжаем открывать шорты.

 

Где логика и смысл всего этого? 

Как вы все это объясните  самому себе ?

 

 

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

Экономика одна для всех! понимать неправильно  - это ошибка  и ее нельзя подстроить под собственное усмотрение......


да ! вы не можете базовые смыслы  понимать по своему,  иначе 2*2=5

У вас 2*2=4  и у меня тоже! и это правильно!  А у них  пусть бред будет!!!


Знак позиции не может влиять на стоимость закупки  - только на прибыль

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

опять знак почему-то  меняется, хотя продолжаем открывать шорты. 

 

Этот  перелом ( минимум)  не объясняет  их же  понимания расчета   AccountMargin()  =0

 

      Если   у них AccountMargin()  =0    при   OrdersTotal() >0  -    то   это клиника и палата №6 !  Бред  полный!  

 

Например Вы купили  100  разных  товаров в магазине    (тут OrdersTotal() =100),  а  в ЧЕКЕ  (тут  AccountMargin()  =0)   у вас написано " итого 0 ".  Вы рады - магазин тоже!!!     Даром   вы купили , даром вам продали


 

MT6:

ну у меня ноль  - хеджированная маржа........ и что дальше.... 

Дальше включаем мозг и считаем: если перекрытые (захеджированные, залокированные) сделки не используют маржу (об этом и говорит 0), то при увеличении объема лока (уменьшении перекоса) используемая маржа будет уменьшаться.

Например, при марже $100 за лот:

  • открыли бай 1.0 (перекос в сторону бай = 1.0): маржа 100 
  • открыли бай 1.0 (перекос в сторону бай = 2.0): маржа 200
  • открыли бай 1.0 (перекос в сторону бай = 3.0): маржа 300
  • открыли селл 1.0 (перекос в сторону бай = 3.0 - 1.0 = 2.0): маржа 200
  • и т.д.
 
komposter:

Дальше включаем мозг и считаем: если перекрытые (захеджированные, залокированные) сделки не используют маржу (об этом и говорит 0), то при увеличении объема лока (уменьшении перекоса) используемая маржа будет уменьшаться.

Например, при марже $100 за лот:

  • открыли бай 1.0 (перекос в сторону бай = 1.0): маржа 100 
  • открыли бай 1.0 (перекос в сторону бай = 2.0): маржа 200
  • открыли бай 1.0 (перекос в сторону бай = 3.0): маржа 300
  • открыли селл 1.0 (перекос в сторону бай = 3.0 - 1.0 = 2.0): маржа 200
  • и т.д. 

 

А если 3 селл  открыть, а не  1

 

то по логике 

  • открыли селл 4.0 (перекос в сторону - ничья  = 3.0 - 3.0 =0):     маржа 0

 


 

МАРЖА  на форексе    -  это  закупка, себестоимость товара  в виде залога!!!! 

 

вы  считаете  и  так  же  считают разработчики .....Вам не приходилось ли задуматься над результатом.......?  какой физический смысл   результата?  А что экономика  говорит..... насчет таких  бредовых расчетов:

 Вы купили  100  разных  товаров в магазине    (тут OrdersTotal() =100),  а  в ЧЕКЕ  (тут  AccountMargin()  =0)   у вас написано " итого 0 ".  Вы рады - магазин тоже!!!     Даром   вы купили , даром вам продали 

это вне смысла  экономики, как науки.

 

 Бывают корни  уравнения  мнимые и отрицательные -   их  отбрасывают . почему тут не так?

Если им показать свои расчеты  закупки (маржи) нормальным экономистам  -  их   просто засмеют,   поправят если захотят  или  отправят в палату №6,  если будут настаивать на своем бреде.

Поэтому  они формулы  на показ не дают,   берегут  от лишних взоров  свой  "талант  экономиста"

 

Если считать   разработчиков  MQL5 Ltd. очень умными, но очень  очень  умными, то,  я писал им, после долгой переписке :

 

Я уговаривать никого не буду.......  я считаю Закупки   как положено в науке экономика.......

не хотите исправлять......не надо,  как хотите!!

Ошибка ....  останется с  вами.  Я понял как надо и считаю как положено!!  Я думал, что   ошибка у Вас  вызовет исправление  расчета ...... но хозяин барин.....


Мой  повторный вопрос, если вы  собираетесь  исправлять:   В каком билде ждать исправления ?

  

Мои последние вопросы, если вы не собираетесь ничего исправлять: 

 -   ВАМ очень выгодна эта ложь?  Почему?

-не хотите, чтоб пользователи вас поправляли, и видели глупости расчетов?

Тогда уберите Сервисдеск. И объявите всем, что ошибки больше не исправляем!!!! Мы непогрешимы, как римский папа.

 .....свет зеркальцо ( т.е Сервисдеск) скажи и всю правду доложи......я на свете .....всех умнее и прекрасней   и милее...    

Сервисдеск теперь не нужен, т.к. вы всех прекрасней и умней и нам никто не указ 

 

если я не прав, докажите всем и мне,  что Ваши расчеты  истина  с точки зрения НАУКИ ЭКОНОМИКИ , дайте формулы и алгоритм на всеобщее обозрение,  как вы считаете.....  предъявите доказательства правды

 

убедите всех, что закупки при постоянном открытии  могут расти, потом уменьшаться,  быть =0   и потом опять расти

 Расскажите всем, что это совершенно  новая экономика,и никто кроме вас в ней не смыслит. 

 

Я так понимаю, что окружающие в шоке от заявлений молодого специалиста.

 
Renat:

Я так понимаю, что окружающие в шоке от заявлений молодого специалиста.

Вы еще не поняли  ....... 

Вам не приходилось ли задуматься над результатом.......?  какой физический смысл   результата?  А что экономика  говорит..... насчет таких  бредовых расчетов:

 Вы купили  100  разных  товаров в магазине    (тут OrdersTotal() =100),  а  в ЧЕКЕ  (тут  AccountMargin()  =0)   у вас написано " итого 0 ".  Вы рады - магазин тоже!!!     Даром   вы купили , даром вам продали 

это вне смысла  экономики, как науки. 

 

если я не прав, докажите всем и мне,  что Ваши расчеты  истина  с точки зрения НАУКИ ЭКОНОМИКИ , дайте формулы и алгоритм на всеобщее обозрение,  как вы считаете.....  предъявите доказательства правды

 

убедите всех, что закупки при постоянном открытии  могут расти, потом уменьшаться,  быть =0   и потом опять расти

 Расскажите всем, что это совершенно  новая экономика,и никто кроме вас в ней не смыслит.  

 

Вы не купили 100 товаров, а купили 50 и продали 50 одинаковых товаров с получением 100 чеков, где по факту говорится "позиции захеджированы полностью, маржевых требования взаимно скомпенсированы и равны 0".

Рекомендую вам до получения определенного уровня знаний не делать громких заявлений и лучше сконцентрироваться на поиске объяснений. Иначе получается совсем смешно.

 
Renat:

Вы не купили 100 товаров, а купили 50 и продали 50 одинаковых товаров с получением 100 чеков, где по факту говорится "позиции захеджированы полностью, маржевых требования взаимно скомпенсированы и равны 0".

Рекомендую вам до получения определенного уровня знаний не делать громких заявлений и лучше сконцентрироваться на поиске объяснений. Иначе получается совсем смешно.

ВЫ не правы !

Лонги  это товар   обычный   и шорты тоже товар ( в кредите)   их  нельзя вычитать  в закупке.!

Они в прибыли   50лонгов -50 шортов=0    будут равны 0

 

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

Мне тоже 2*2=7  больше нравиться, а Вам? 

 

 Ваши разработчики  в трех соснах  запутались и Вас  пытаются уговорить, что все хорошо!   мне жаль что вы их  бред  считаете правдой!

 

купили 50  лонгов   и продали 50   шортов   -  но тогда почему

 

когда я " продаю" условно,    одни шорты   -  маржа  у меня   со знаком"+",   но по  вашей логике     AccountMargin()    должен быть   меньше 0  тогда  это   правильно  исходя из вашей логике

 

вот  покупая  только реально  шорты  - (условно продавая) измените  AccountMargin()     знак на "-",  тогда  будет правильно  - ПРОДАН по настоящему  шорт, а то получается ерунда, вы продаете,  а у меня маржа  растет в  "+" как у лонгов.  

 

иначе нельзя ПРОДАЖИ ШОРТОВ  считать продажами, а покупками  -  что я и пытаюсь всем объяснить !!  ШОРТЫ - это купил, а не продал. Это условное понимание кредита, но не сути.

Причина обращения: