Создание и тестирование арбитражных стратегий - страница 7

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

апну тему.

Вопрос возникший при определении ликвидности по арбитражной позиции.
Как правильно пересчитать ликвидность на бест-банде кроссовой пары в USD единицах (и почему)?

1) напрямую через мажор по базовой валюте
2) через мажор по валюте котирования

Пример: Объем на бест банде EURCHF 2 миллиона единиц. Надо заценить этот объем в USD. Что делать? Сразу смотрим на стакан EURUSD и прикидываем сколько это 2 миллиона евро. Либо сначала оцениваем сколько это франков по текущему курсу, а потом через стакана для USDCHF определяем объем в USD?

 
GaryKa:

апну тему.

Вопрос возникший при определении ликвидности по арбитражной позиции.
Как правильно пересчитать ликвидность на бест-банде кроссовой пары в USD единицах (и почему)?

1) напрямую через мажор по базовой валюте
2) через мажор по валюте котирования

Пример: Объем на бест банде EURCHF 2 миллиона единиц. Надо заценить этот объем в USD. Что делать? Сразу смотрим на стакан EURUSD и прикидываем сколько это 2 миллиона евро. Либо сначала оцениваем сколько это франков по текущему курсу, а потом через стакана для USDCHF определяем объем в USD?

А через стоимость тика, не?
 

Решение через TickValue видел. Но случай общий (не MT) и кроме того, скажу честно, от манипуляций с TickValue у меня голова ломается. Хотелось бы простого объяснения, которое бы легко легло в память.

Пока оно такое:

На ask бандах у нас находятся предложение для продажи, следовательно товар (базовая валюта) есть в наличии у продавцов. Просто пересчитаем её стоимость в другой валюте котирования (USD). На bid бандах наоборот предложения для покупки, товара нет, но есть средства (в валюте котирования). Через соответствующий мажор, пересчитываем эти средства.

Итого:

  • для Ask бандов считаем (1) способом
  • для Bid бандов считаем (2) способом
 
Вы шутите ... либо я не понял вашу мысль. Тоесть вы считаете что объем в 1 лот например на EURUSD равен объему в 1 лоту  на любом другом символе?
 
GaryKa: ... Тоесть вы считаете что объем в 1 лот например на EURUSD равен объему в 1 лоту  на любом другом символе?

Для пар у которых совпадает базовая валюта, сравнение по лотам приемлемо, так как единицы измерения одни и те же. Например объемы для EURCHF и EURUSD.


papaklass:

Одни продавцы EURUSD ASK-банд = 2,0 млн, т.е. продавцы хотят продать 2 000 000 / 100000 = 20 лотов евры и купить 2 000 000 / 136345 = 14,67 лотов USD.

Другие продавцы GBPUSD ASK-банд = 3,5 млн, т.е. хотят продать 3 500 000/ 100000 = 35 лотов фунта и купить 3 500 000/ 164349 = 21,3 лотов USD.

В итоге имеем, что в данный момент хотят купить 14,67 + 21,3 = 35,97 лотов USD за евро и фунт. Так можно посчитать любую валюту.

В этом примере у вас пары мажоры, у которых совпадает валюта котирования. Просто сравнение по лотам неприемлемо: 20 лотов евры и с 35 лотов фунта.  Поэтому конвертируем и получаем объемы в USD лотах: 14,67 и 21,3, которые уже можно сравнивать.


Вопрос был немного в другом? Как вы рассчитаете объем для кросовой пары? Покажите хоть с лотами, хоть без. Например как сравнить объемы на EURCHF и AUDNZD?

GaryKa: ... Как правильно пересчитать ликвидность на бест-банде кроссовой пары в USD единицах (и почему)?
 

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

Пусть у нас треугольный арбитраж вида A/B, B/C, C/A

1) Начинаем с первого символа и до последнего. Берем объем A на первой паре (запоминаем как размер ордера по A/B) и высчитываем объем B (конвертируем A в B). Если полученный объем больше чем по B/C переход к пункту 2. Если меньше, запоминаем этот объем (как размер ордера по B/C), высчитываем С, сравнием и т.п. ... Успешно дошли до конца цепочки -> объемы для ордеров у нас уже есть, выход.

2) Делаем циклический сдвиг (было A/B, B/C, C/A  стало B/C, C/A, A/B ), и возвращаемся к пункту 1)

 
papaklass: ... Выразите объемы по данным валютам через требуемый при открытии позиции залог. Залог считается в валюте депозита. Таким образом, получите объемы названных валют через лоты в USD и сравните.
Хорошее предложение.

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

- Мы хотим купить 1 лот EURCHF.
Покупка ЕURСHF - это покупка EUR за CHF. CHF у нас нет. Мы их занимаем, либо приобретаем самостоятельно (при плече 1:1). Тоесть у нас есть USD (депозит) а нам надо купить CHF (либо не покупать если нам предоставляют кредит в CHF), чтобы потом на них купить EUR. Значит для того, чтобы купить EURCHF, мы должны реально (плечо 1:1) или виртуально продать USDCHF (продажа долларов USD с депозита, покупка CHF), причем по рыночной (наихудшей) цене.

- Мы хотим продать 1 лот EURCHF.
Продажа ЕURСHF - это продажа EUR за CHF. EUR у нас нет (нам нечего продавать). Мы их занимаем, либо приобретаем самостоятельно (при плече 1:1). Тоесть у нас есть USD (депозит) а нам надо купить EUR (либо не покупать если нам предоставляют кредит в EUR), чтобы потом на них купить CHF. Значит для того, чтобы продать EURCHF, мы должны реально (плечо 1:1) или виртуально купить EURUSD (продажа долларов USD с депозита, покупка EUR), причем по рыночной (наихудшей) цене.

Итого:
  • при покупке   EURCHF   залог в USD для кредита должен вычисляться через цены по USDCHF
  • при продаже  EURCHF  залог в USD для кредита должен вычисляться через цены по EURUSD


Теперь давайте пройдемся по вашему коду. По-моему функции не хватает аргумента который бы отвечал за направление сделки. У вас есть перемененная marginCurrency  которая определяется всегда как базовая валюта. И соответственно залог и для продажи и для покупки EURCHF вы вычисляете всегда через EURUSD.

   string marginCurrency = StringSubstr( StringTrimLeft( smb ), 0, 3 );

...


   if( calcCurrency == "" ){
      calcCurrency = GetSymbolByCurrencies( marginCurrency, accCurrency );
      mode = true;
     
      if( calcCurrency == "NULL" ){
         calcCurrency = GetSymbolByCurrencies( accCurrency, marginCurrency );
         mode = false;
      }
   }


 P.S. Мне интересно насколько ваши расчеты маржи сейчас совпадают с расчетами MT, там более, что к ним раньше уже были схожее претензии.

 
papaklass:

Судя по молчанию не все понятно.

Ответ с цифрами на вопрос: "Как вы рассчитаете объем для кросовой пары? Покажите хоть с лотами, хоть без. Например как сравнить объемы на EURCHF и AUDNZD?" 

Чтобы узнать разницу в лотах, я делю курсы валют-мажоров стоящих в числителе. Валюта залога - валюта, стоящая в числителе.

EURUSD / AUDUSD -> 1.36368 / 0.90639 = 1.50451, т.е. объем открываемой позиции по AUDNZD должен быть в 1.50 раз больше, чем EURCHF.

Почему делю мажоры? ...

Вот этот пост точно не понял. Тоесть считая таким образом вы делаете вывод, что объем по AUDNZD (в usd) больше объема по EURCHF (в usd) примерно в 1.5 раза. Так?

 
papaklass: ... Теперь насчет моего кода расчета маржи. Ведь я его подробно прокомментировал. Неужели трудно прочитать и разобраться. ... Маржу считает другая функция ... посмотрите код после комментария "//получим текущую цену для указанного направления".

papaklass спокойно, а то скатимся к срачу. Я просмотрел ваш код, перед тем, как давал комментарии, а вы мой коммент смотрели? Внимательно?


Моя претензия  к вашему методу расчета (на примере расчета EURCHF) .

GaryKa: ... залог и для продажи и для покупки EURCHF вы вычисляете всегда через EURUSD.

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

   prc = Dbl_If( dir == OP_BUY, MarketInfo( calcCurrency, MODE_ASK ),
                                MarketInfo( calcCurrency, MODE_BID ) );

В примере с EURCHF, сalcCurrency  у вас всегда EURUSD.


P.S. это было лишним, пардон

GaryKa: ... По-моему функции не хватает аргумента который бы отвечал за направление сделки ...