Расчет плеча без AccountLaverage для разных инструментов

  • Автор темы Автор темы Retrade
  • Дата начала Дата начала

moneyinnetwork

Интересующийся
Ну, истина восторжествовала, надеюсь. Все поймете:
12:34 Kirill в чате.

vlad | 12:34
Здравствуйте. Вчера с Вами речь вели, по-моему про расчет маржи.


Kirill | 12:35
Здравствуйте. Как я могу Вам помочь?

vlad | 12:35
Открываешь демо-счет, указываешь плечо 1:100, а выдает маржу на 1 лот 200 баксов. А это говорит, что реальное плечо по инструменту как бы 1:500. Но когда открываешь позу в 0.5 лот указывает маржу в терминале 1000, что соответствует плечу 1:50.

Что-то с настройками у Вас неправильно. И калькулятор на сайте также неправильно считает.

Kirill | 12:36
А что именно неправильно считает?
Какой инструмент?

vlad | 12:36
Калькулятор же из МТ данные берет. Значит, в МТ маржа неправильно забита.
USDCHF
например


Kirill | 12:37
__http://www.gkfx.ru/trade_specs/margin_requirements.html
Плечо 1:50 у этого инструмента.

vlad | 12:38
Так вчера в чате здесь мне написали, что на сайте данные в этом разделе не правильные (не обновлены)
надо типа по калькулятору считать

vlad | 12:39
Почему МТ неправильную маржу выдает при запросе по MarketInfo () ?

Kirill | 12:39
Кто Вам такое сказал?
На сайте данные правильные. Калькулятор считает правильно тоже.

vlad | 12:41
Неправильно.

Kirill | 12:41
Вы пример приведите, что неправильно.
Если плечо в Калькуляторе поставить 100 или 500, то да, будет неправильно, потому что плечо 1:50.

vlad | 12:44
Так почему тогда MarketInfo по инструменту возвращает размер маржи для плеча счета без учета изменения маржинальных требований (плеча) по инструменту?
Смысл тогда в такой информации от МТ



vlad | 12:45
Он должен возвращать инфу исходя из реального плеча для инструмента, а не плеча на счете. Это разные значения.
Скорректируйте у себя настройки в МТ.

Kirill | 12:47
Я передам Вашу просьбу техническому директору.

vlad | 12:48
Грубо говоря, зная маржу на 1 лот по инструменту, мы можем обратным пересчетом определить плечо для этого инструмента и это правильно. Многие советники сливаются на завышенном плече, беря его из AccountLeverage().

Это не только моя просьба. За мной массы ))

Kirill | 12:50
Хорошо, я все передал.
Есть ли у Вас еще какие-либо вопросы с которыми я мог бы Вам помочь?

vlad | 12:50
Нет. Ждем реализации. Там дело 5 минут.
Так что, ждем реализации и теребим поддержку, если не сделают в ближайшее время. Я, думаю, аргументированно к ним постучался. :)
 

moneyinnetwork

Интересующийся
Проблема-то с параметрами глобальная. В Альпари, например, та же "песня". Стучался к ним. Код отправил. Никогда этим голову не забивал, потому что больше 1 - 2 ордеров давно уже не держу, да и загрузка копеечная. А тут на тебе "подстава" :)
 

Retrade

Интересующийся
Да, информация интересная.

Вообще, это важно, знать реальное плечо по инструменту, хотя бы даже для того, чтобы не лезть в рынок в моменте, когда плечо не соответствует плечу на счете. Для кого-то в определенной ситуации это даже может быть критично. Так что про просьбу от масс вы правильно заметили.:)

Что касается AccountLeverage(), то у меня индюк максимального лота берет из него значение плеча, вводя меня тем самым в заблуждение, если плечо по инструменту было изменено.
 

moneyinnetwork

Интересующийся
Что касается AccountLeverage(), то у меня индюк максимального лота берет из него значение плеча, вводя меня тем самым в заблуждение, если плечо по инструменту было изменено.
Тогда как вариант писать прогу, которая будет открываться на демо счете и маржу (AccountMargin();). Из маржи рассчитывать плечо:
Код:
Expand Collapse Copy
Плечо = MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/AccountMargin()/MarketInfo(Symbol(),MODE_POINT)
а потом программно передать плечо в сову на реальном счете. В общем изобретать велосипед. Но тут опять возможны грабли. Например, в GKFX открываешь демо счет с плечом 1:100, а по факту плечо будет 1:500. Не следит никто за этим. Организация, так сказать, хромает. В общем проблему можно решить грамотно только глобально. Парсить сайт на MQL4 несложно, но не факт, что там будут реальные значения. В общем решение найдено. Хоть и не универсальное. Чуть позже опишу.
 
Последнее редактирование:

moneyinnetwork

Интересующийся
В общем, если глобально не решат эту проблему, то остается только 2 способа.
1. Парсить сайты брокеров. Но часто там бывают неправильные данные.
2. Открывать ордера на демо, считывать маржу. После чего считать плечо. Самый точный.
Как вариант реализации п.2, открыть замком (sell, buy) два ордера на демо (любым равным объемом по 0.01, например) и запустить этот код:
Код:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                real_leverage.mq4 |
//+------------------------------------------------------------------+
#property copyright "Влад Сергеев aka moneyinnetwork"
#property version   "2.00"
#property strict
//на демо счете открыть две разнонаправленные позиции любым равным объемом
int OnInit()  
{
   if (ObjectFind("Real_Leverage_1") >= 0)
      ObjectDelete("Real_Leverage_1");
   ObjectCreate("Real_Leverage_1", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("Real_Leverage_1", "g", 180, "Webdings", LightSlateGray);
   ObjectSet("Real_Leverage_1", OBJPROP_CORNER, 0);
   ObjectSet("Real_Leverage_1", OBJPROP_BACK, TRUE);
   ObjectSet("Real_Leverage_1", OBJPROP_XDISTANCE, 0);
   ObjectSet("Real_Leverage_1", OBJPROP_YDISTANCE, 12);
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) 
{
      if (ObjectFind("Real_Leverage_1") >= 0)
         ObjectDelete("Real_Leverage_1");
}

void OnTick()  
{
      int trade, max_order = 2, all_order = 0, all_buy_order = 0, all_sell_order = 0, order_one_symbol = 0;
      string com="";
      double sell_lots=0, buy_lots=0;
      RefreshRates();
      for ( trade = OrdersTotal() - 1; trade >= 0; trade-- )    
      {
         if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && 
              (OrderType() == OP_BUY || OrderType() == OP_SELL) )  
         {
             all_order++;
             if ( OrderType()==OP_BUY ) 
             {
                 all_buy_order++;
                 buy_lots = OrderLots();
             }    
             if ( OrderType()==OP_SELL ) 
             {
                 all_sell_order++;
                 sell_lots = OrderLots();
             }
             if ( OrderSymbol() == Symbol() )
             {
                 order_one_symbol++;
             }
         }
      }
      if ( all_order == max_order &&
           all_buy_order == 1 &&
           all_sell_order == 1 &&
           buy_lots == sell_lots &&
           order_one_symbol == max_order )
      {
            com = "Плечо счета: " + AccountLeverage()+ 
                  "\nИнструмент: " + Symbol()+ 
                  "\nПлечо расчетное из MarketInfo: " + DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),MODE_POINT),1) + 
                  "\nРеальное плечо: " + DoubleToStr(sell_lots*MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/AccountMargin()/MarketInfo(Symbol(),MODE_POINT),1);
      }
      else 
      {
            com = "Плечо счета: " + AccountLeverage()+ 
                  "\nИнструмент: " + Symbol()+ 
                  "\nПлечо расчетное из MarketInfo: " + DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),MODE_POINT),1) + 
                  "\nНе могу рассчитать реальное плечо:\nДва ордера замком открыли (не больше - не меньше)?\nОрдера открыты для " + Symbol() + "? Проверьте.";
      }
      return;
      Comment (com);
}
Если все правильно сделали, то выведет три плеча:
1. Плечо для счета
2. Расчетное плечо инструмента из параметров MarketInfo.
3. Реальное плечо, рассчитанное из маржи на замок. - Точное
В общем, в терминале открыли демку, соответствующую реальному счету по параметрам. Встали в замок и любуемся на плечо. В другом терминале торгуем на реале, зная реальное плечо. Есть, конечно, варианты автоматизации, но, честно говоря, они мне не интересны (в плане затрат времени).
 

Вложения

Последнее редактирование:

moneyinnetwork

Интересующийся
Не успел отредактировать сообщение. Там ошибка в коде
Было:
Код:
Expand Collapse Copy
      }
      return;
      Comment (com);
}
Надо, естественно:
Код:
Expand Collapse Copy
      }
       Comment (com);
       return;
}
Закачал новое.
 

Вложения

moneyinnetwork

Интересующийся
Retrade, кстати, ранее Вам предлагали вариант с AccountFreeMarginCheck(), так там изначально была та же засада. Никто это не отслеживает из тех. специалистов или MT "недоделанный" :)
 

Retrade

Интересующийся
Спасибо moneyinnetwork за труды, приятно иметь дело. Наконец-то можно лицезреть реальное плечо 50 по USDCHF и по другим инструментам соответственно.:D

Итак, что мы имеем: советник может быть запущен одновременно на нескольких графиках. Для расчета плеча достаточно открыть две разнонаправленные позиции минимальным объемом 0,01 лотом на инструменте, где запущен советник. Важно, чтобы кроме этих двух позиций в рынке не было никаких других позиций, ни по инструменту, где происходит расчет плеча, ни по какому либо другому инструменту. В противном случае советник выдаст подсказку, о том, что он не может рассчитать плечо. Для расчета плеча по другому инструменту, следует закрыть две разнонаправленные позиции и открыть их на необходимом инструменте, где запущен советник.

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

Кстати, теоритически, может ли реальное плечо на демке отличаться от реального плеча на реальном счете?

предлагали вариант с AccountFreeMarginCheck(), так там изначально была та же засада
Вот поэтому меня не устроил тот вариант.:)
 

moneyinnetwork

Интересующийся
Кстати, теоретически, может ли реальное плечо на демке отличаться от реального плеча на реальном счете?

Retrade, насколько мне известно условия на реале не отличаются от условий на демке для одного и того же типа счетов. Т.е., в том же GKFX плавающее плечо от 1:500 до 1:25, что на реале, что на демке и, вроде совпадают. Ну, по сути так и должно быть. А как бывает на самом деле мы уже знаем :)

К сожалению, не получится мониторить реальное плечо по нескольким инструментам одновременно
Можно несколько модернизировать код. Например, сделать так, что мы в параметрах строкой задавали какие инструменты мониторить, а советник будет поочередно открывать сделки по этим инструментам и рассчитывать плечи по ним. Задать периодичность такой проверки. Ну, и, в таком случае, разумеется, сделать т.н. защиту от "дурака", чтобы сова работала только на демо-счете (проверка IsDemo() ), а то натворит делов, если по ошибке запустить ее на реале :)
Да, и, кстати, вариант с замком я сделал для длительного мониторинга, а так можно и по одной сделке отслеживать. Вот эта модернизация:
Код:
Expand Collapse Copy
//+------------------------------------------------------------------+
//|                                                real_leverage_v3.mq4 |
//+------------------------------------------------------------------+
#property copyright "Влад Сергеев aka moneyinnetwork"
#property version   "3.00"
#property strict
//на демо счете открыть две разнонаправленные позиции любым равным объемом
int OnInit()  
{
   if (ObjectFind("Real_Leverage_1") >= 0)
      ObjectDelete("Real_Leverage_1");
   ObjectCreate("Real_Leverage_1", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("Real_Leverage_1", "g", 180, "Webdings", LightSlateGray);
   ObjectSet("Real_Leverage_1", OBJPROP_CORNER, 0);
   ObjectSet("Real_Leverage_1", OBJPROP_BACK, TRUE);
   ObjectSet("Real_Leverage_1", OBJPROP_XDISTANCE, 0);
   ObjectSet("Real_Leverage_1", OBJPROP_YDISTANCE, 12);
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) 
{
      if (ObjectFind("Real_Leverage_1") >= 0)
         ObjectDelete("Real_Leverage_1");
}

void OnTick()  
{
      int trade, max_order = 2, all_order = 0, all_buy_order = 0, all_sell_order = 0, order_one_symbol = 0;
      string com="";
      double sell_lots=0, buy_lots=0;
      RefreshRates();
      for ( trade = OrdersTotal() - 1; trade >= 0; trade-- )    
      {
         if ( OrderSelect(trade, SELECT_BY_POS, MODE_TRADES) && 
              (OrderType() == OP_BUY || OrderType() == OP_SELL) )  
         {
             all_order++;
             if ( OrderType()==OP_BUY ) 
             {
                 all_buy_order++;
                 buy_lots = OrderLots();
             }    
             if ( OrderType()==OP_SELL ) 
             {
                 all_sell_order++;
                 sell_lots = OrderLots();
             }
             if ( OrderSymbol() == Symbol() )
             {
                 order_one_symbol++;
             }
         }
      }
      if ( (all_order == max_order &&
           all_buy_order == 1 &&
           all_sell_order == 1 &&
           buy_lots == sell_lots &&
           order_one_symbol == max_order) ||
           (all_order == 1 && 
            order_one_symbol == 1) )
      {
            if ( sell_lots < buy_lots ) sell_lots = buy_lots;
            com = "Плечо счета: " + AccountLeverage()+ 
                  "\nИнструмент: " + Symbol()+ 
                  "\nПлечо расчетное из MarketInfo: " + DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),MODE_POINT),1) + 
                  "\nРеальное плечо: " + DoubleToStr(sell_lots*MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/AccountMargin()/MarketInfo(Symbol(),MODE_POINT),1);
      }
      else 
      {
            com = "Плечо счета: " + AccountLeverage()+ 
                  "\nИнструмент: " + Symbol()+ 
                  "\nПлечо расчетное из MarketInfo: " + DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE)*Bid/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/MarketInfo(Symbol(),MODE_POINT),1) + 
                  "\nНе могу рассчитать реальное плечо:\nДва ордера замком открыли (не больше - не меньше)?\nОрдера открыты для " + Symbol() + "? Проверьте.";
      }
      Comment (com);
      return;
}
 

Вложения

Последнее редактирование:
Верх