slinger
1
All posts from slinger
  slinger in slinger,

Подсчет серии сделок на QPILE

 

Данный алгоритм производит поиск серий сделок по одному инструменту. А, именно: если вы купли 100 лотов RIU, то ваша заявка исполнится в виде множества мелких сделок. Скрипт ищет все данные сделки, выводит их количество и подсчитывает среднюю цену позиции. Подсчет ведется, как в шорт так и в лонг.

Применение: для подсчета статистики и создания стат листов.

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

 

Общая блок схема:

 

 

 

PORTFOLIO_EX подсчет серий сделок;
DESCRIPTION описалово;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRMID;


PROGRAM

client_code="SPBFUT" 'имя клиента писать именно так. SPBFUT - фортс. 
firm_id="SPBFUTXXXXX" 'идентификатор фирмы

NEW_GLOBAL("log_string_num","0")' переменная для добавления новой строчки в таблицу логов
NEW_GLOBAL("GLOB",0)' флаг для выдачи сообщений. если поставить 0 в кавычках, то будет строковая глобальная переменная



'определяем количество сделок в таблице сделок
a=GET_NUMBER_OF("TRADES")' количество сделок
'log("всего сделок:"&a)' выводим количество сделок 


zayav_in_order_unic=0' при первом просчете тут будт 0. дальше он заменится на первую уникальную заявку
' а, при дальнейших просчетах в этой переменной будет сидеть номер заявки из последней сделки
kol_zdel=0' переменная для хранения количества сделок с одинаковым номером заявки 
sum_obem=0' переменная в которой накапливается суммарный объем в лотах для сделок с одинаковым номером заявки
sum_price=0' переменная для хранения нарастающей суммы всех сделок с уникальным номером. нуна для нахождения средей цены входа

' цикл перебора всех сделок для поиска уникального номера заявки в таблице сделок 
for z from 1 to a
temp_a=GET_ITEM("TRADES",z)' получаем мап масси z-ой строчки из таблицы сделок 
zayav_in_order=0+GET_VALUE(temp_a, "ORDER_NUMBER")' выдераем номер заявки из сделки. не путать с номерм сделки!
'оказывается get value по умолчанию возвращает строку
if zayav_in_order!=zayav_in_order_unic' проверка на уникальность заяаки. ОСНОВНОЕ СОБЫТИЕ ПОЯВЛЕНИЯ СДЕЛКИ!

zayav_in_order_unic=zayav_in_order' в zayav_in_order_unic будет сидеть номер последней уникальной заявки в группе сделок

end if' для условия появления уникальной сделки
end for' для первого цикла 



' второй цикл перебора всех сделк. выбираем все заявки с только что найденным уникальны номером
for z from 1 to a
temp_a=GET_ITEM("TRADES",z)' получаем мап масси z-ой строчки из таблицы сделок 
zayav_in_order=0+GET_VALUE(temp_a, "ORDER_NUMBER")' выдераем номер заявки из сделки. не путать с номерм сделки!
obem_in_order=0+GET_VALUE(temp_a, "QUANTITY")' выдираем количество лотов
all_price=0+GET_VALUE(temp_a, "PRICE")' выдираем цену входа
direction_temp=GET_VALUE(temp_a, "OPERATION")' выдираем направление сделки

' выбираем все сделки в которых одинаковые номера заявок
if zayav_in_order=zayav_in_order_unic

kol_zdel=kol_zdel+1' количество сделок с одинаковым номером заявки
sum_obem=sum_obem+obem_in_order' наращиваем суммарный объем в лотах
sum_price=sum_price+(all_price*obem_in_order)' наращиваем суммарную цену
direction=direction_temp' записываемм направление сделки. во всех сделках с одинаковой заявкой - оно одинаковое 
end if

end for' для второго цикла



aver_price=sum_price/sum_obem' расчитываем среднюю цену входа. складываем объемы в пунктах по всем сделкам с уникальной заявкой
' далее делим полученную сумм на сумму всех лотов в этих сделках.



' проверка для наступления события по уникальному номеру заявки в сделки. если для этого номера событие уже наступало
' (выдачаа сообщения, запись в файл и др. - то событие больге не повторяем)
IF GLOB!=zayav_in_order_unic' проверка на выдачу сообщения. при первом запуске GLOB=пустота и значит условие выполняется и выдаем сообщение
' далее в GLOB попадает номер уникальной заявки в сделки. событие наступает только один раз при появлении новой уникальной
' серии сделок или сделки в который номер заявки - кникален

DELETE_ALL_ITEMS()' очищаем таблицу логов
log("всего сделок:"&a)' выводим количество сделок
log("номер уникальной заявки:"&zayav_in_order_unic)
log("сделок с уникальной заявкой:"&kol_zdel)
log("направление серии:"&direction) 
log("суммарный объем в этих сделках:"&sum_obem)
log("средняя цена входа:"&aver_price)

'пошла запись в файл

'получили длину файла в строках
' читаем строку по последнему номеру и передаем ее на разбор READ_LINE

'конец файла найден? - если да, то значит это пустая строка после предыдущей пары сделок. 
'или вообще первая в файле или следующая строчка
'ИНСТРУМЕНТ, НАПРАВЛЕНИЕ,ОБЪЕМ В ЛОТАХ,ЦЕНА ВХОДА

'если 2 поле = BUY, то значит происходит закрытие сделки. пишем в файл (WRITELN):
'НАПРАВЛЕНИЕ,ОБЪЕМ В ЛОТАХ,ЦЕНА ВЫХОДА,(ЦЕНА ВЫХОДА - ЦЕНА ВХОДА) + СИМВОЛ ПЕРЕВОДА НА НОВУЮ СТРОКУ

'если 2 поле = SELL, то значит происходит закрытие сделки. пишем в файл (WRITELN):
'НАПРАВЛЕНИЕ,ОБЪЕМ В ЛОТАХ,ЦЕНА ВЫХОДА,(ЦЕНА ВХОДА - ЦЕНА ВЫХОДА) + СИМВОЛ ПЕРЕВОДА НА НОВУЮ СТРОКУ


GLOB=zayav_in_order_unic 
END IF



'пишем в файл: ИНСТРУМЕНТ,direction,aver_pice (входа) - при первой серии
'при второй серии: aver_price (выхода), профит в пунктах, профит в рублях, % в рублях
'если direction в этой строчке - BUY то
'выход - вход (лонг)
'иначе вход - выход (шорт)




FUNC log(log_string)' функция добавления строчки в таблицу логов

log_string_num=log_string_num+1' каждую новую запись пишем в таблиуц в новую строчку
time_value=get_value(GET_DATETIME(), "Datetime")' получаем время
st=CREATE_MAP() 'создаем мап массив
st=SET_VALUE(st,"x", log_string)' записываем в этот массив первую пару значений 
st=SET_VALUE(st,"time", time_value)' записываем вторую пару time=time_value
ADD_ITEM(log_string_num,st)' пишем весь массив в таблицу


END FUNC


END_PROGRAM

PARAMETER time;
PARAMETER_TITLE time;
PARAMETER_DESCRIPTION time;
PARAMETER_TYPE STRING(45);
END

PARAMETER x;
PARAMETER_TITLE x;
PARAMETER_DESCRIPTION x;
PARAMETER_TYPE STRING(45);
END