Разбор коллекции сделок
Ранее был приведён текст функции Получение коллекции сделок по номеру заявки, произошедших на основании выставленного ордера. Сама по себе эта функция не имеет самостоятельного значения - она только собирает данные. Чтобы получить из этих данных информацию о себестоимости купленного/проданного, количестве, сумме я использую функцию Parse_Trades_Collection(). Она возвращает ассоциативный массив, содержащий рассчитанные данные по коллекции сделок.
' Рассчитывает суммарные и средние величины по коллекции сделок
' Создаёт массив с полями:
' QUANTITY - общее количество лотов
' LOT_SIZE - размер лота
' VALUE - общая сумма
' LOT_PRICE - средняя стоимость лота
' PRICE - средняя стоимость акции/контракта
' TS_COMISSION - комиссия торговой системы
FUNC Parse_Trades_Collection(ptc_trades_collection)
result = create_map()
gtv_count = get_collection_count(ptc_trades_collection)
if gtv_count != 0
for gtv_i from 0 to gtv_count - 1
gtv_trade = get_collection_item(ptc_trades_collection,gtv_i)
' Получаем размер лота
if gtv_i == 0
result = set_value(result,"LOT_SIZE",get_value(gtv_trade,"VALUE") / (get_value(gtv_trade,"PRICE") * get_value(gtv_trade,"QUANTITY")))
end if
' Заполняем поля
for gtv_attribute in "QUANTITY,VALUE,TS_COMISSION"
result = inc_value(result,gtv_attribute,get_value(gtv_trade,gtv_attribute))
end for
end for
' Рассчитываем стоимость лота
result = set_value(result,"LOT_PRICE",get_value(result,"VALUE") / get_value(result,"QUANTITY"))
' Рассчитываем стоимость акции
result = set_value(result,"PRICE",get_value(result,"LOT_PRICE") / get_value(result,"LOT_SIZE"))
end if
END FUNC
Либо вариант с использованием препроцессора M4:
dnl Рассчитывает суммарные и средние величины по коллекции сделок
dnl Создаёт массив с полями:
dnl ~QUANTITY - общее количество лотов
dnl ~LOT_SIZE - размер лота
dnl ~VALUE - общая сумма
dnl ~LOT_PRICE - средняя стоимость лота
dnl ~PRICE - средняя стоимость акции/контракта
dnl ~LOT - размер лота
dnl ~TS_COMISSION - комиссия торговой системы
FUNC Parse_Trades_Collection(collection)
Local(i,count,trade,attribute)
WithInit(result)
count = get_collection_count(collection) - 1
if count != -1
for i from 0 to count
trade = get_collection_item(collection,i)
dnl Получаем размер лота
if i == 0
SetKey("~LOT_SIZE",get_value(trade,"VALUE") / (get_value(trade,"PRICE") * get_value(trade,"QUANTITY")))
end if
dnl Заполняем поля
for attribute in "~QUANTITY,~VALUE,~TS_COMISSION"
IncKey(attribute,get_value(trade,attribute))
end for
end for dnl Рассчитываем стоимость лота
SetKey("~LOT_PRICE",GetKey("~VALUE") / GetKey("~QUANTITY")) dnl Рассчитываем стоимость акции
SetKey("~PRICE",GetKey("~LOT_PRICE") / GetKey("~LOT_SIZE"))
end if
EndWith
EndFunc(result)
Следует иметь ввиду, что рассчитывается себестоимость позиции в разрезе денег, а не котировок. Для рублёвых инструментов деньги и котировки совпадут. Чтобы получить себестоимость нерублевых инструментов в разрезе котировок, полученные себестоимости необходимо пересчитать через стоимость шага цены инструмента.