Блог им. andrey_koltsov

Анализатор спреда (спот-фьючерс) для QUIK.

В свое время у меня была задумка — посмотреть какой в реальности (включая комиссии) спред между спотом и фьючерсом и стОит ли его торговать. Так как, ни С#, ни Lua я, пока, не изучил, то пришлось писАть на Qpile…

Торговый функционал в скрипте не прописывал, поэтому его можно использовать только, как анализатор.

Кому надо – забирайте, так как я решил для себя дальше эту тему не развивать (по крайней мере пока)…

Выглядит интерфейс вот так:

Анализатор спреда (спот-фьючерс) для QUIK.

Особенности:

— текущий фьючерс определяется автоматически, в день экспирации автоматически переключается на новый;

— перед использованием надо указать папку в настройках пользователя для расчетов;

— в скобках отражается средний процент за последние 500 замеров для объективности расчетов (цифру можно менять в настройках пользователя);

— также в настройках можно указать при каком проценте информация об этом запишется в файл в следующем виде:

Анализатор спреда (спот-фьючерс) для QUIK.

Сам код:

PORTFOLIO_EX Koltsov-Spred-all-4.0;
DESCRIPTION Koltsov-Spred-all-4.0;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRMID;
USE_CASE_SENSITIVE_CONSTANTS;

PROGRAM
'________________________________________________________________________________

'------- НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ --------

papka             = "C:/Quik_Open/Info/raschet/spred_all/"  'Папка дря осуществления расчетов
procent_nado      = 8             'Отсечка процента (для записи информации в файл)
procent_period    = 500           'За сколько циклов засчитываем средний процент
komissiy_broker_fr= 0.057         'Брокерская комиссия (Фондовый рынок в процентах)
komissiy_broker_sr= 0.47          'Брокерская комиссия (срочный рынок в рублях)
'_______________________________________________________________________________
  
DELETE_ALL_ITEMS()


spred_kolichestvo = 8             'Сколько спредов анализируем (цикл программы)

'---
Classcode11       = "SPBFUT"      'Индексы
Seccode11         = "SR"          'фьючерс 
Classcode21       = "TQBR"        'Индексы
Seccode21         = "SBER"        'акция
nazvanie21        = "Сбербанк"
'---
Classcode12       = "SPBFUT"      'Индексы
Seccode12         = "VB"          'фьючерс  
Classcode22       = "TQBR"        'Индексы
Seccode22         = "VTBR"        'акция
nazvanie22        = "ВТБ"
'---
Classcode13       = "SPBFUT"      'Индексы
Seccode13         = "GZ"          'фьючерс  
Classcode23       = "TQBR"        'Индексы
Seccode23         = "GAZP"        'акция
nazvanie23        = "Газпром"
'---
Classcode14       = "SPBFUT"      'Индексы
Seccode14         = "LK"          'фьючерс  
Classcode24       = "TQBR"        'Индексы
Seccode24         = "LKOH"        'акция
nazvanie24        = "Лукойл"
'---
Classcode15       = "SPBFUT"      'Индексы
Seccode15         = "RN"          'фьючерс  
Classcode25       = "TQBR"        'Индексы
Seccode25         = "ROSN"        'акция
nazvanie25        = "Роснефть"
'---
Classcode16       = "SPBFUT"      'Индексы
Seccode16         = "GM"          'фьючерс  
Classcode26       = "TQBR"        'Индексы
Seccode26         = "GMKN"        'акция
nazvanie26        = "Нор.Никель"
'---
Classcode17       = "SPBFUT"      'Индексы
Seccode17         = "SN"          'фьючерс  
Classcode27       = "TQBR"        'Индексы
Seccode27         = "SNGS"        'акция
nazvanie27        = "Сургутнефт"
'---
Classcode18       = "SPBFUT"      'Индексы
Seccode18         = "TN"          'фьючерс  
Classcode28       = "TQBR"        'Индексы
Seccode28         = "TRNFP"       'акция
nazvanie28        = "Транснефть"
'---------

Lot               = 1              'Для расчета ГО (формальность)
procent           = papka&"procent.log"

'------------------
'Задаем время онлайн

Vrema           = GET_INFO_PARAM ("SERVERTIME")               'определяем время 

Hour0="" & (0 + substr(Vrema,0,2))
Min0 =floor (substr(Vrema,3,2))
Sec0 =floor (substr(Vrema,6,2))

if len(Sec0) == 1
Sec0= "0" & Sec0
end if
if len(Min0) == 1
Min0= "0" & Min0
end if
if len(Hour0) == 1
Hour0= "0" & Hour0
end if

Time0=Hour0 & Min0 & Sec0         'Время on-line
Time0=Time0+0
Time=Hour0 & Min0 & 0 & 0         'Время с округлением до минуты

'------------------
'Задаем дату

dats = GET_INFO_PARAM ("TRADEDATE")

Year="" & (0 + substr(dats,6,4))

Month="" & (0 + substr(dats,3,2))
if len(Month) == 1
Month= "0" & Month
end if

Day="" & (0 + substr(dats,0,2))
if len(Day) == 1
Day= "0" & Day
end if

Date = Year & Month & Day   'переводим в нужный формат
Date0= Date
Date = Date+0



'===============================================================================================================================
'===============================================================================================================================

'Начало основного цикла

for cikl from 1 to spred_kolichestvo

'===============================================================================================================================

Classcode1  = "нет"
Seccode1    = "нет"
nazvanie1   = "нет"
Classcode2  = "нет"
Seccode2    = "нет"
nazvanie2   = "нет"
shag_strike = 9999999999999

if cikl=1
   Classcode1  = Classcode11
   Seccode1    = Seccode11
   Classcode2  = Classcode21
   Seccode2    = Seccode21 
   nazvanie2   = nazvanie21
end if

if cikl=2
   Classcode1  = Classcode12
   Seccode1    = Seccode12
   Classcode2  = Classcode22
   Seccode2    = Seccode22 
   nazvanie2   = nazvanie22
end if

if cikl=3
   Classcode1  = Classcode13
   Seccode1    = Seccode13
   Classcode2  = Classcode23
   Seccode2    = Seccode23 
   nazvanie2   = nazvanie23
end if

if cikl=4
   Classcode1  = Classcode14
   Seccode1    = Seccode14
   Classcode2  = Classcode24
   Seccode2    = Seccode24 
   nazvanie2   = nazvanie24
end if

if cikl=5
   Classcode1  = Classcode15
   Seccode1    = Seccode15
   Classcode2  = Classcode25
   Seccode2    = Seccode25 
   nazvanie2   = nazvanie25
end if

if cikl=6
   Classcode1  = Classcode16
   Seccode1    = Seccode16
   Classcode2  = Classcode26
   Seccode2    = Seccode26 
   nazvanie2   = nazvanie26
end if

if cikl=7
   Classcode1  = Classcode17
   Seccode1    = Seccode17
   Classcode2  = Classcode27
   Seccode2    = Seccode27 
   nazvanie2   = nazvanie27
end if

if cikl=8
   Classcode1  = Classcode18
   Seccode1    = Seccode18
   Classcode2  = Classcode28
   Seccode2    = Seccode28 
   nazvanie2   = nazvanie28
end if

if cikl=9
   Classcode1  = Classcode19
   Seccode1    = Seccode19
   Classcode2  = Classcode29
   Seccode2    = Seccode29 
   nazvanie2   = nazvanie29
end if

if cikl=10
   Classcode1  = Classcode110
   Seccode1    = Seccode110
   Classcode2  = Classcode210
   Seccode2    = Seccode210 
   nazvanie2   = nazvanie210
end if

if cikl=11
   Classcode1  = Classcode111
   Seccode1    = Seccode111
   Classcode2  = Classcode211
   Seccode2    = Seccode211 
   nazvanie2   = nazvanie211
end if

if cikl=12
   Classcode1  = Classcode112
   Seccode1    = Seccode112
   Classcode2  = Classcode212
   Seccode2    = Seccode212 
   nazvanie2   = nazvanie212
end if

if cikl=13
   Classcode1  = Classcode113
   Seccode1    = Seccode113
   Classcode2  = Classcode213
   Seccode2    = Seccode213 
   nazvanie2   = nazvanie213
end if


procent_sredniy = papka & "procent_" & nazvanie2 & ".log"

'------------------

'Задаем параметры ближнего фьючерса

Mesyac  = "A"

Mesyac0 = Month+0
God     = 0 + substr(dats,9,1)  

'Январь	 - F
'Февраль - G
'Март	   - H
'Апрель	 - J
'Май	   - K
'Июнь	   - M
'Июль	   - N
'Август	 - Q
'Сентябрь- U
'Октябрь - V
'Ноябрь	 - X
'Декабрь - Z

'------------------

for m from 1 to 4

Seccode11 = Seccode1

if Mesyac0 = 1
   Mesyac  = "F"
end if

if Mesyac0 = 2
   Mesyac  = "G"
end if

if Mesyac0 = 3
   Mesyac  = "H"
end if

if Mesyac0 = 4
   Mesyac  = "J"
end if

if Mesyac0 = 5
   Mesyac  = "K"
end if

if Mesyac0 = 6
   Mesyac  = "M"
end if

if Mesyac0 = 7
   Mesyac  = "N"
end if

if Mesyac0 = 8
   Mesyac  = "Q"
end if

if Mesyac0 = 9
   Mesyac  = "U"
end if

if Mesyac0 = 10
   Mesyac  = "V"
end if

if Mesyac0 = 11
   Mesyac  = "X"
end if

if Mesyac0 = 12
   Mesyac  = "Z"
end if

'------------------

Seccode11 = Seccode1 & Mesyac & God
nazvanie1 = Seccode1

'Получение значения количества дней до погашения из Таблицы текущих значений параметров

DAYS_TO_MAT_DATE_Seccode1 = GET_PARAM_EX (Classcode1, Seccode11, "DAYS_TO_MAT_DATE")
DAYS_TO_MAT_DATE_Seccode1 = GET_VALUE(DAYS_TO_MAT_DATE_Seccode1,"PARAM_VALUE")+0

if DAYS_TO_MAT_DATE_Seccode1<=0 and Mesyac0<12
   Mesyac0 = Mesyac0+1
 else
  if DAYS_TO_MAT_DATE_Seccode1<=0 and Mesyac0=12 and God<9
     Mesyac0 = 1
     God     = God +1
   else
    if DAYS_TO_MAT_DATE_Seccode1<=0 and Mesyac0=12 and God=9
       Mesyac0 = 1
       God     = 0
    end if
  end if
end if

end for   'for m from 1 to 4

Seccode1  = Seccode1 & Mesyac & God
nazvanie1 = Seccode1

'------------------
'------------------

'Получение значения лучшей цены предложения из Таблицы текущих значений параметров

Seccode1_BUY = GET_PARAM_EX (Classcode1, Seccode1, "OFFER")
Seccode1_BUY = GET_VALUE(Seccode1_BUY,"PARAM_VALUE")+0

Seccode2_BUY = GET_PARAM_EX (Classcode2, Seccode2, "OFFER")
Seccode2_BUY = GET_VALUE(Seccode2_BUY,"PARAM_VALUE")+0

'Получение значения лучшей цены спроса из Таблицы текущих значений параметров

Seccode1_SELL = GET_PARAM_EX (Classcode1, Seccode1, "BID")
Seccode1_SELL = GET_VALUE(Seccode1_SELL,"PARAM_VALUE")+0

Seccode2_SELL = GET_PARAM_EX (Classcode2, Seccode2, "BID")
Seccode2_SELL = GET_VALUE(Seccode2_SELL,"PARAM_VALUE")+0

'Получение размера лота из Таблицы текущих значений параметров

Seccode1_LOT_SHT = GET_PARAM_EX (Classcode1, Seccode1, "LOTSIZE")
Seccode1_LOT_SHT = GET_VALUE(Seccode1_LOT_SHT,"PARAM_VALUE")+0

Seccode2_LOT_SHT = GET_PARAM_EX (Classcode2, Seccode2, "LOTSIZE")
Seccode2_LOT_SHT = GET_VALUE(Seccode2_LOT_SHT,"PARAM_VALUE")+0

'Получение значения количества дней до погашения из Таблицы текущих значений параметров

DAYS_TO_MAT_DATE_Seccode1 = GET_PARAM_EX (Classcode1, Seccode1, "DAYS_TO_MAT_DATE")
DAYS_TO_MAT_DATE_Seccode1 = GET_VALUE(DAYS_TO_MAT_DATE_Seccode1,"PARAM_VALUE")+0

'Получение значения Гарантийного обеспечения покупателя из Таблицы текущих значений параметров

GO_Seccode1  = GET_PARAM_EX (Classcode1, Seccode1, "BUYDEPO")
GO_Seccode1  = GET_VALUE(GO_Seccode1,"PARAM_VALUE")+0

'Получение Минимального шага цены из Таблицы текущих значений параметров

Seccode1_STEPPRICE = GET_PARAM_EX (Classcode1, Seccode1, "SEC_PRICE_STEP")
Seccode1_STEPPRICE = GET_VALUE(Seccode1_STEPPRICE,"PARAM_VALUE")+0
shag_cena1         = Seccode1_STEPPRICE*100

Seccode2_STEPPRICE = GET_PARAM_EX (Classcode2, Seccode2, "SEC_PRICE_STEP")
Seccode2_STEPPRICE = GET_VALUE(Seccode2_STEPPRICE,"PARAM_VALUE")+0
shag_cena2         = Seccode2_STEPPRICE*100

'----------
'Расчет спрэда в стаканах

spred1 = Seccode1_BUY - Seccode1_SELL
spred2 = Seccode2_BUY - Seccode2_SELL

'----------
'Получение Стоимости шага цены БА из Таблицы текущих значений параметров

SHAG_PRICE_RUB = 0
SHAG_PRICE_RUB = GET_PARAM_EX (Classcode1, Seccode1, "STEPPRICET")
SHAG_PRICE_RUB = GET_VALUE(SHAG_PRICE_RUB,"PARAM_VALUE")+0

'---------------
'Биржевой сбор

BaseFutFee=0.6   'Для акций 0.6

'Расчет значения Биржевого сбора за контракт СР

FutPrice = GET_PARAM_EX (Classcode1, Seccode1, "PREVSETTLEPRICE")   'Предыдущая расчетная цена из Таблицы текущих значений параметров
FutPrice = GET_VALUE(FutPrice,"PARAM_VALUE")+0

Sbor_birzhi_Seccode1 = 0

if Seccode1_STEPPRICE<>0
   Sbor_birzhi_Seccode1 = APPLY_SCALE((APPLY_SCALE(FutPrice*APPLY_SCALE((SHAG_PRICE_RUB/Seccode1_STEPPRICE),5),2)*BaseFutFee*0.0001),2)+0
end if

if Sbor_birzhi_Seccode1<0.01
   Sbor_birzhi_Seccode1=0.01
end if

'Расчет размера Биржевого сбора ФР

Sbor_birzhi_Seccode2 = 0
Sbor_birzhi_Seccode2 = ((Seccode2_BUY*Seccode1_LOT_SHT)/100*komissiy_broker_fr)

'Расчет общего размера Биржевого сбора 

Sbor_birzhi_ALL = 0
Sbor_birzhi_ALL = Sbor_birzhi_Seccode1*2 + Sbor_birzhi_Seccode2*2 + komissiy_broker_sr*2

'---------------
'Расчет спрэда для входа и выхода из сделки

spred_on_raschet  = Seccode1_SELL - (Seccode2_BUY*Seccode1_LOT_SHT) - Sbor_birzhi_ALL
spred_off_raschet = Seccode1_BUY - (Seccode2_SELL*Seccode1_LOT_SHT)
spred_raznica = 0
spred_raznica = spred_on_raschet-spred_off_raschet

spred_on_raschet_procent = 0
if Seccode2_BUY>0 and Seccode1_LOT_SHT>0 and GO_Seccode1>0 and DAYS_TO_MAT_DATE_Seccode1>0
   spred_on_raschet_procent = (spred_on_raschet/((Seccode2_BUY*Seccode1_LOT_SHT)+GO_Seccode1))*100/DAYS_TO_MAT_DATE_Seccode1*365
end if

'---------------
'Расчет среднего спрэда в % за период

str  = GET_FILE_LEN(procent_sredniy)+0                   'Сколько строк в файле 

if str<procent_period
   nachalo=1
  else
   nachalo=str-procent_period+1
end if

a=0
procent=CREATE_MAP ()
FOR i FROM nachalo TO str
     dannye     = READ_LINE(procent_sredniy,i,"error")+0
     a=a+1
     procent=SET_VALUE(procent, "key" & a, dannye)                'Добавляем в массив предыдущие значения 
END FOR

a=a+1
procent=SET_VALUE(procent, "key" & a, spred_on_raschet_procent)   'Добавляем в массив текущее значение 

'---
b=0
if spred_on_raschet_procent<>0 and ((Time0>100000 and Time0<140000) or (Time0>140500 and Time0<184000))
 if a<=procent_period 
   b=a
   CLEAR_FILE(procent_sredniy)
   FOR i FROM 1 TO b
       s = GET_VALUE(procent,"key" & i)
       WRITELN (procent_sredniy, s)            'Запись в файл из массива
   END FOR
  else
   b=a
   CLEAR_FILE(procent_sredniy)
   FOR i FROM 2 TO b
       s = GET_VALUE(procent,"key" & i)
       WRITELN (procent_sredniy, s)            'Запись в файл из массива со смещением на 1
   END FOR
 end if
end if
 
'---
procent_za_period = 0
str  = GET_FILE_LEN(procent_sredniy)+0                   'Сколько строк в файле 
FOR i FROM 1 TO str
     dannye            = READ_LINE(procent_sredniy,i,"error")+0
     procent_za_period = procent_za_period + dannye
END FOR

if str>0
    procent_za_period = procent_za_period/str
end if

'---
'Для визуализации

procent_za_period_vizion = APPLY_SCALE(procent_za_period,2)
spred_on_raschet_procent_vision = APPLY_SCALE(spred_on_raschet_procent,2) & " (" & procent_za_period_vizion & ") %"

'---------------
'Для визуализации BUY и SELL

Price_ON_1 = Seccode1_SELL
Price_ON_2 = Seccode2_BUY*Seccode1_LOT_SHT

Price_OFF_1 = Seccode1_BUY
Price_OFF_2 = Seccode2_SELL*Seccode1_LOT_SHT

'-----

'Расчет необходимых инвестиций

investicii = 0
GO_Seccode2= 0
investicii = ((Seccode2_BUY*Seccode1_LOT_SHT)+GO_Seccode1)*lot
GO_Seccode2= (Seccode2_BUY*Seccode1_LOT_SHT)

'-----

'Информируем, если значение достигло нужного уровня

if spred_on_raschet_procent>=procent_nado and ((Time0>100000 and Time0<140000) or (Time0>140500 and Time0<184000))
   MESSAGE (nazvanie2 & "-" & spred_on_raschet_procent_vision,1)
   WRITELN (procent,Date & "-" & Time0 & "-" & nazvanie2 & "-" & spred_on_raschet_procent_vision)
end if

'==============================================================================

stroka_3 = cikl*3 
stroka_2 = stroka_3-1 
stroka_1 = stroka_2-1


output=CREATE_MAP()
output=SET_VALUE(output,"1",cikl)
output=SET_VALUE(output,"2",nazvanie1)
output=SET_VALUE(output,"3",Seccode1_LOT_SHT)
output=SET_VALUE(output,"4",Seccode1_STEPPRICE)
output=SET_VALUE(output,"5",GO_Seccode1)
output=SET_VALUE(output,"7",DAYS_TO_MAT_DATE_Seccode1)
output=SET_VALUE(output,"9","sell:")
output=SET_VALUE(output,"10",Price_ON_1)
output=SET_VALUE(output,"11","buy:")
output=SET_VALUE(output,"12",Price_OFF_1)
output=SET_VALUE(output,"26",Sbor_birzhi_Seccode1)
ADD_ITEM(stroka_1,Output)

output=CREATE_MAP()
output=SET_VALUE(output,"1",cikl)
output=SET_VALUE(output,"2",nazvanie2)
output=SET_VALUE(output,"3",Seccode2_LOT_SHT)
output=SET_VALUE(output,"4",Seccode2_STEPPRICE)
output=SET_VALUE(output,"5",GO_Seccode2)
output=SET_VALUE(output,"9","buy:")
output=SET_VALUE(output,"10",Price_ON_2)
output=SET_VALUE(output,"11","sell:")
output=SET_VALUE(output,"12",Price_OFF_2)
output=SET_VALUE(output,"26",Sbor_birzhi_Seccode2)
ADD_ITEM(stroka_2,Output)

output=CREATE_MAP()
output=SET_VALUE(output,"2","==========")
output=SET_VALUE(output,"5",investicii)
'output=SET_VALUE(output,"6",spred_raznica)
'output=SET_VALUE(output,"8",dohod_raschet)
output=SET_VALUE(output,"9","спред:")
output=SET_VALUE(output,"10",spred_on_raschet)
output=SET_VALUE(output,"11",spred_on_raschet_procent_vision)
output=SET_VALUE(output,"26",Sbor_birzhi_ALL)
ADD_ITEM(stroka_3,Output)

'==============================================================================
'==============================================================================

SET_ROW_COLOR_EX (stroka_3, "RGB(240,240,240)", "DEFAULT_COLOR", "RGB(0,0,255)", "RGB(0,0,255)")      'легкая серая заливка и синий шрифт

'Конец основного цикла

end for

'==============================================================================
'==============================================================================

END_PROGRAM

PARAMETER 1;
PARAMETER_TITLE №;
PARAMETER_DESCRIPTION №;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER 2;
PARAMETER_TITLE Пара;
PARAMETER_DESCRIPTION Пара;
PARAMETER_TYPE STRING(32);
END

PARAMETER 3;
PARAMETER_TITLE Лот (шт);
PARAMETER_DESCRIPTION Лот (шт);
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER 4;
PARAMETER_TITLE Шаг;
PARAMETER_DESCRIPTION Шаг цены;
PARAMETER_TYPE STRING(32);
END

PARAMETER 5;
PARAMETER_TITLE ГО;
PARAMETER_DESCRIPTION ГО;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER 7;
PARAMETER_TITLE Day;
PARAMETER_DESCRIPTION End day;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER 9;
PARAMETER_TITLE -;
PARAMETER_DESCRIPTION -;
PARAMETER_TYPE STRING(32);
END

PARAMETER 10;
PARAMETER_TITLE ON;
PARAMETER_DESCRIPTION Цена;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER 11;
PARAMETER_TITLE -;
PARAMETER_DESCRIPTION -;
PARAMETER_TYPE STRING(32);
END

PARAMETER 12;
PARAMETER_TITLE OFF;
PARAMETER_DESCRIPTION Цена;
PARAMETER_TYPE NUMERIC(10,0);
END

PARAMETER 26;
PARAMETER_TITLE Сбор (руб);
PARAMETER_DESCRIPTION Биржевой сбор (руб);
PARAMETER_TYPE NUMERIC(10,2);
END

END_PORTFOLIO_EX

★43
24 комментария
уфф!
самый длинный пост за последнее время на ресурсе))
кто до конца осилил дочитать?
плюсую, сохраню в избранное, вдруг пригодится, только не удаляйте, спасибо!
Отличный пост, спасибо
avatar
А почему решили не продолжать?
avatar
Jame Bonds, 
Если торговать «в чистом виде», то доходность маленькая получается — 7%… ОФЗ, пока, еще выгоднее. Данную стратегию надо торговать для торговли акций в short, чтобы не платить за маржинальное кредитование (сначала делаете нейтральную позицию: short фьючерс + long акции + доходность 7% годовых, а если нужен short по акции, продаете ее и получаете доходность от short фьючерса)… Но у меня все стратегии торгуют акции в long…
Может быть потом что-нибудь придумаю…
avatar
Скрипт замечательный. Сам такой хотел  написать, только проблема, что данную информацию использовать очень сложно. Из за маленькой ликвидности  фьючерсов на большинство акций. Следствие этого гигантский спрэд.
А ликвидных фьючах большая конкуренция много ботов.
Пробовал руками — результат меня не удовлетворил. 
avatar
_Beginner_, 
В том-то и дело, что торговать руками здесь не реально… Даже на Qpile сложно из-за минимального времени расчета скрипта в 1 сек… Хотя, можно… Доработать скрипт — когда уровень спрэда превысит расчетный, то сразу отправляются встречные заявки… Ведь, в моем скрипте отображается информация не по последней сделке, а по реальным BID и ASK… Остается только отправить заявки… Но сделать это надо ОЧЕНЬ быстро… :) А сделать это может только робот… :)
avatar

Андрей Кольцов, в Qpile расчёты только раз в 1 сек.?  это такое ограничение именно Qpile?

цены берёте из стакана?  для этого не нужно что б стакан был открыт? 

avatar
Igr, 
BID и ASK берется из Текущей таблицы параметров. Стакан и график открывать не надо...
Да, только для Qpile: минимум 1 сек., «по-умолчанию» стоит 10 сек.:



avatar
Андрей Кольцов, 1 сек, это минус для Qpile 
avatar
Igr, никто и не спорит... 
Но… Внутри цикла он все делает относительно быстро (если внутренними циклами сильно не нагружать)… Просто, следующий цикл расчета начнется только через 1 секунду...
Разумеется, для HFT он не подойдет, но если торговать средне-срок или даже внутри дня, то вполне хватает…
avatar

Андрей Кольцов, в луа расчёт минимум вроде как 0,001 секунды, может и меньше можно

но от момента отправки заявки до получения результата по ней проходит около 0,3 сек

 

ну просто к сведению) 

 

 

avatar
_Beginner_, 
Хотя, если Вы не ловите резких аномалий, то можно успеть и ручками… Думаю, что 7% поймать можно… Ведь, сделать это надо всего-лишь один раз в квартал… :)
avatar
Андрей Кольцов, Один раз в квартал замораживать всё депо или его часть из-за 7% (с учетом что вы вошли и вышли в сделку идеально), это неэффективно.
И вы прекрасно это понимаете, как и многие другие которые разбирались с арбитражом.
avatar
_Beginner_, 
Согласен… Отвечал аналогично выше....
Продублирую:
«Если торговать «в чистом виде», то доходность маленькая получается — 7%… ОФЗ, пока, еще выгоднее. Данную стратегию надо торговать для торговли акций в short, чтобы не платить за маржинальное кредитование (сначала делаете нейтральную позицию: short фьючерс + long акции + доходность 7% годовых, а если нужен short по акции, продаете ее и получаете доходность от short фьючерса)…»
avatar
Андрей Кольцов, +1

avatar
Андрей Кольцов, то есть, short фьючерс + long акции, держим позу ждём, увидели возможность шорта акции, просто продаёте акцию и получаете прибыль от шорта фьюча, вы об этом или я чего то не понял?
avatar
Igr, 
Совершенно верно...
А если нужен будет long по акциям, то, просто, докупаете акции еще...
Так многие торгуют… И доход 7% идет, и за маржиналку платить не надо…
avatar

Андрей Кольцов, хорошо для такого иметь единый счёт

а не легче держать офз?

и плечо стоит то больше 7%, если всё депо во фьюче и акции то следующая покупка акции это плечо, а оно дорогое, легче наверное фьючи откупить

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

 

avatar
Igr, 
торговать «на всю котлету», да еще и только по одному инструменту крайне нежелательно с точки зрения манименеджмента...
У каждого свои стратегии… На такие случаи надо и кэш держать…
avatar
Ключевая фраза здесь — «Доработать скрипт» 
Да, доработать и желательно чтобы скрипт был написан на Си Шарп лежал на сервере в здании мос. биржи и отправлял заявки через Plaza2.
И тогда с доработанным скриптом есть все шансы получить прибыль

:)
З.Ы. В любом случае то, что вы написали  очень полезно. Опыт не пропьешь)
avatar
я так понимаю дивы в расчётах вы не учитываете? 
avatar
Igr, 
в период выплаты дивидендов по фьючерсам будет наблюдаться бэквордация, то есть акции будут стоит дороже фьючерсов, так как в стоимости акций будет заложена дивидендная составляющая. Разумеется, если дивиденды выше безрисковой процентной ставки… После отсечки все нормализуется…
avatar

Андрей Кольцов, после отсечки в любом случаи нормализуется, правда по моему не сразу

ну получается дивы не учитываете 

 

avatar
Igr, нет, робот учитывает только технический спрэд… А решение, остается за трейдером. Тем более, торгового функционала в роботе нет…
avatar

теги блога Андрей Кольцов

....все тэги



UPDONW
Новый дизайн