Блог им. 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

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
7.6К | ★42
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

Читайте на SMART-LAB:
СД Займера рекомендовал направить на дивиденды около 100% чистой прибыли III квартала
Объявляем финансовые результаты III квартала 2026 года, а также рекомендацию по дивидендам. 🟢 Чистая прибыль Группы Займер составила 716 млн...
Фото
📌 МГКЛ выплатило купон по облигациям серии 001Р-04
27 октября ПАО «МГКЛ» перечислило в Национальный расчётный депозитарий 11 967 000 рублей для выплаты купонного дохода по выпуску...
Фото
USD/CAD: канадец позитивно настроился на грядущее повышение ставки
Канадский доллар в прошедшем периоде перешел к укреплению после того, как накануне достиг 18-месячного минимума на фоне слабой статистики по...
Фото
Банковский сектор сентябрь 2026 г. - рекордная прибыль, но рост все менее равномерный
Банки отчитались за сентябрь. Что интересного мы узнали?  За 12 месяцев прибыль сектора составляет уже 4,5 трлн руб. при прогнозе ЦБ 3,9–4,4...

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

....все тэги



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