Данный алгоритм производит поиск серий сделок по одному инструменту. А, именно: если вы купли 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