Расчет маржи уже открытых ордеров - страница 3

 
leon_17:

  Спасибо, посмотрю... но пока мне кажется там речь не совсем о том, что меня интересует.

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

Например, форекс залог по EUR/GBP рассчитывается с учетом стоимости евро по отношению к доллару, и если котировка составляет 1,3545 долларов за один евро, то для открытия сделки в один лот  при кредитном плече 1:100 нам понадобится 1355,5 долларов

Так вот, все окей, если я рассчитываю маржу для ордера, который только собираюсь выставить в данном случае. Но если ордер выставлен месяц назад, а курс EURUSD уже давно не тот, что был на момент выставления ордера, как рассчитывать тогда? Я вот про этот момент, отсюда и дальнейшие сложности. Но даже если взять только этот момент, я ведь правильно понимаю, что точно определить маржу для такого ордера в USD, и так чтобы расчет совпадал с уже зафиксированным ранее расчетом терминала, невозможно?

И допустим у меня валюта депозита даже не доллар а вообще рубли, соответственно и расчет залога мне тоже нужен именно в рублях, и видимо тоже по курсам EURRUB месячной давности.

цена открытия ордера известна

вот и вернетесь в то время

А если валюта депозита не доллар, то переводите по курсу обмена в баксы и наоборот
 
Konstantin Nikitin:


Спасибо!

Alexey Viktorov:

А вот это о том? Пересчитай калькулятором.


Но, как я уже говорил, окончательного варианта нет. Личной заинтересованности нету и интереса тоже никакого.

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

Renat Akhtyamov:

цена открытия ордера известна

вот и вернетесь в то время

А если валюта депозита не доллар, то переводите по курсу обмена в баксы и наоборот

Известна цена открытия ордера в валюте котировки его инструмента, а терминал показывает залог по ордеру в валюте депозита, если валюта депозита отличается от валюты котировки инструмента ордера, должен учитываться курс совсем другого инструмента (и курс этот  может оказаться совсем не связанным с инструментом ордера)

Попробую привести еще более конкретный пример:

Инструмент EURUSD,   Валюта депозита RUB = 1000 рублей,  Плечо 1 к 1
Покупаем 1 евро за 1.2 доллара (соответственно курс продажи EURUSD на этот момент 1.2)
Залог будет равен 1.2 в долларах

Но! Терминал ведь рассчитывает залог  в валюте депозита, и в нашем случае - это рубли.
То есть мы обязаны перевести в рубли, либо 1 евро, либо 1.2 доллара

По какому курсу? Либо по курсу EURRUB если по правильному, либо по курсу USDRUB, если делаем расчет через доллар. Так же?
А как у нас EURRUB или USDRUB связаны с текущим графиком (EURUSD) - да вообще никак - они живут своей жизнью. 
И курсы конвертации из доллара или евро в рубли на текущий момент и спустя месяц для точно того же ордера будут совершенно различными.
Соответственно и число залога в рублях для него будет совершенно другим и получить его с точностью терминала мы видимо уже никак не сможем.

p/s Расписал уже подробно как мог, если я ошибся в каких-то выводах, прошу конкретно указать в каком месте. 

 
leon_17:

Известна цена открытия ордера в валюте котировки его инструмента, а терминал показывает залог по ордеру в валюте депозита, если валюта депозита отличается от валюты котировки инструмента ордера, должен учитываться курс совсем другого инструмента (и курс этот  может оказаться совсем не связанным с инструментом ордера)

Попробую привести еще более конкретный пример:

Инструмент EURUSD,   Валюта депозита RUB = 1000 рублей,  Плечо 1 к 1
Покупаем 1 евро за 1.2 доллара (соответственно курс продажи EURUSD на этот момент 1.2)
Залог будет равен 1.2 в долларах

Но! Терминал ведь рассчитывает залог  в валюте депозита, и в нашем случае - это рубли.
То есть мы обязаны перевести в рубли, либо 1 евро, либо 1.2 доллара

По какому курсу? Либо по курсу EURRUB если по правильному, либо по курсу USDRUB, если делаем расчет через доллар. Так же?
А как у нас EURRUB или USDRUB связаны с текущим графиком (EURUSD) - да вообще никак - они живут своей жизнью. 
И курсы конвертации из доллара или евро в рубли на текущий момент и спустя месяц для точно того же ордера будут совершенно различными.
Соответственно и число залога в рублях для него будет совершенно другим и получить его с точностью терминала мы видимо уже никак не сможем.

p/s Расписал уже подробно как мог, если я ошибся в каких-то выводах, прошу конкретно указать в каком месте. 

Подробно, не спорю ;)

Но и я запутался в Ваших рассуждениях

Связать валютные пары можно через время открытия ордера

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

Не так уж и сложно, просто повозюкаться чуток

Запишите у парочки ордеров сумму залога в комментарий и произведите расчет через пару дней

Все получится

 
leon_17:

Спасибо!

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

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

1.

MODE_MARGINREQUIRED

32

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

Возвращает в валюте депозита.

2.

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

Как получить программно "Процент маржи"

Alexey Viktorov, 2017.06.03 10:46

Сравни 2 снимка, в первом сообщении и на пятой странице в моём сообщении. И там и там спецификация золота, но в первом валюта маржи USD, а во втором XAU. Отсюда, в первом случае ничего можно не делать, а во втором, получив маржу в валюте депозита её надо перевести в валюту маржи, умножив на котировку и это ставить в формулу по которой вычисляем процент маржи. Иначе будет неверный результат. Соответственно в формулу надо ещё доставать

SYMBOL_CURRENCY_MARGIN

Валюта в которой вычисляется залоговые средства

string


 

Расчет стоимости минимального лота в тыс. USD для пар из восьми валют "USD EUR GBP JPY AUD CHF CAD NZD "

Зная плечо, несложно посчитать маржу 

// на глобальном уровне
   // список мажоров для расчета TickValue
   string MajorSymbolList = "EURUSD GBPUSD AUDUSD USDJPY USDCHF USDCAD NZDUSD ";

//+------------------------------------------------------------------+
//| Процедура вычисления веса валютной пары на момент времени ptime  |
//|                   = стоимость минимального лота в USD / 1000 USD |
//| Вызывается из CountArrays(), SearchForPair(), GetExistingPattern()|
//| Вызываются модули: LastKnownPrice()                              |
//+------------------------------------------------------------------+
double CountWeightUSD( string pair, datetime ptime )
{
   double r;
   string FirstChar, Pair;
   // вычисляем валюту числителя
   FirstChar  = StringSubstr( pair, 0, 3 );

   // если первый символ USD тогда объем минимального лота 1000 USD
   if (FirstChar == "USD" )
      r = 1.0;
   else
   {
      // первый символ не USD
      Pair = FirstChar + "USD";
      if ( StringFind( MajorSymbolList, Pair ) >= 0 )
      {
         // если есть такая пара в списке мажоров
         // объем минимального лота равен котировке пары Pair
         r = LastKnownPrice( Pair, ptime );
      }
      else
      {
         // иначе в списке мажоров пара "USD" + FirstChar
         Pair = "USD" + FirstChar;
         r = 1.0 / LastKnownPrice( Pair, ptime );
      }
   }
   return( r );
}
//+---- CountWeightUSD() END -------------------------------------------+

//+------------------------------------------------------------------+
//| Функция возвращает последнее известное на момент времени cTime   |
//| цены для пары SymbolName                                         |
//| Вызывается из ResultForPair()                                    |
//| Вызываются модули:                                               |
//+------------------------------------------------------------------+
double  LastKnownPrice( string SymbolName, datetime cTime )
{
   int   shift;
   
   shift = iBarShift( SymbolName, 0, cTime, false);
   if (iTime(SymbolName, 0, shift) > cTime) shift++;
   return( iClose(SymbolName, 0, shift) );
}
//+------------------------------------------------------------------+
 
Renat Akhtyamov:

Подробно, не спорю ;)

Но и я запутался в Ваших рассуждениях

Связать валютные пары можно через время открытия ордера

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

Не так уж и сложно, просто повозюкаться чуток

Запишите у парочки ордеров сумму залога в комментарий и произведите расчет через пару дней

Все получится

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

Alexey Viktorov:

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

1.

MODE_MARGINREQUIRED

32

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

Возвращает в валюте депозита.

2.


MODE_MARGINREQUIRED здесь вообще причем? Это расчет исключительно для текущего момента. Да, пользуясь им можно рассчитать процент маржи, но это уже детали, которые к обсуждаемой проблеме не имеют практически никакого отношения. Пусть уже этот процент маржи будет 100 процентов всегда и везде и закроем эту тему - не в нем суть совершенно.  Неважно также кросс курс это или прямая или обратная котировка. Не особо важно даже какая там валюта маржи, если только она одновременно не является и валютой депозита или она не совпадает с базовой валютой инструмента ордера, а валюта его котировки с валютой депозита, как в твоих примерах.

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


Mislaid:

Расчет стоимости минимального лота в тыс. USD для пар из восьми валют "USD EUR GBP JPY AUD CHF CAD NZD "

Зная плечо, несложно посчитать маржу 

Ну вот наконец вижу в коде использование метода, который был предложен еще на первой странице данной темы - можно попробовать узнать искомые цены через iBarShift 

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

Спасибо за код,  потестирую на досуге насколько точно справляется со своей задачей LastKnownPrice

 
leon_17:


Спасибо за код,  потестирую на досуге насколько точно справляется со своей задачей LastKnownPrice

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

У меня такой проблемы нет совсем. На минутках стоит мультивалютный индикатор расчета индексов валют, он-то и подгружает котировки по всем валютным парам.

 

Могу предложить свой приблизительный способ.
Обозначим нашу пару XXXYYY. 0 это прошлый момент открытия ордера, 1 это настоящий момент. Quote это ask или bid для buy и sell.

quote0 XXXUSD == quote1 XXXUSD * sqrt( quote0 XXXYYY / quote1 XXXYYY ), где quote0 XXXYYY это цена открытия ордера, quote1 - текущие курсы.

USD взят как самая ходовая валюта. Не возбраняется любая другая валюта по вкусу.
Аналогично можно предсказывать будущее для отложенных ордеров.