Встала задача на одном счете торговать разные стратегии по одному инструменту.
В Quik все стирается после вечернего клиринга, поэтому пришлось воспользоваться текстовыми файлами.
Дано: 2 стратегии на одном инструменте.
Одна трендовая, другая флетовая. Суммы на обе стратегии от депозита разные:
Флетовая 200т.р. (20 контрактов), Трендовая 300т.р. (30 контрактов)
Количество контрактов должно варьироваться от эквити стратегий, т.е. если эквити Трендовой станет 330т.р., то начнем торговать 31 контракт.
Реализация (ВЫДЕРЖКИ — САМОЕ ГЛАВНОЕ):
PATHTREND=«C:\1\TREND.txt» ' ПУТЬ К ПАПКЕ ГДЕ ЛЕЖИТ ФАЙЛ ПО ТРЕНДОВОЙ СТРАТЕГИИ
PATHFLET=«C:\1\FLET.txt» ' ПУТЬ К ПАПКЕ ГДЕ ЛЕЖИТ ФАЙЛ ДЛЯ ФЛЕТОВОЙ СТРАТЕГИИ
ERROR=0
TPSUM=0 ' ТЕКУЩЕЕ КОЛИЧЕСТВО КОНТРАКТОВ ПО ОБОИМ СТРАТЕГИЯМ
LOTS=0 'КОЛИЧЕСТВО ЛОТОВ ДЛЯ СОВЕРШЕНИЯ СДЕЛКИ
IF 'УСЛОВИЕ НА ПОКУПКУ ПО ТРЕНДОВОЙ СТРАТЕГИИ
TPSUM=TPSUM+MANY(PATHTREND,1)+0
END IF
IF 'УСЛОВИЕ НА ПРОДАЖУ ПО ТРЕНДОВОЙ СТРАТЕГИИ
TPSUM=TPSUM-MANY(PATHTREND,-1)+0
END IF
IF 'УСЛОВИЕ НА ПОКУПКУ ПО ФЛЕТОВОЙ СТРАТЕГИИ
TPSUM=TPSUM+MANY(PATHFLET,1)+0
END IF
IF 'УСЛОВИЕ НА ПРОДАЖУ ПО ФЛЕТОВОЙ СТРАТЕГИИ
TPSUM=TPSUM-MANY(PATHFLET,-1)+0
END IF
'========= ОТПРАВКА СИГНАЛА SHORT
IF TP>TPSUM AND TP<>TPPREV 'TP ТЕКУЩАЯ ПОЗИЦИЯ ПО ИНСТРУМЕНТУ. TPPREV ПРЕДЫДУЩАЯ
LOTS=TP-TPSUM
SELL(LOTS)
TPPREV=TP
END IF
'========= ОТПРАВКА СИГНАЛА LONG
IF TP<TPSUM AND TP<>TPPREV
LOTS=TPSUM-TP
BUY(LOTS)
TPPREV=TP
END IF
' ФУНКЦИЯ ДЛЯ РАССЧЕТ КОЛИЧЕСТВА КОНТРАКТОВ И ЭКВИТИ
FUNC MANY(FPATH,FN,FPATH2)
LONGORSHORT=READ_LINE (FPATH,2, ERROR)+0 ' ПРЕДЫДУЩАЯ ПОЗИЦИЯ (1 ЛОНГ. -1 ШОРТ)
IF FN<>LONGORSHORT
EQUITYPREV=READ_LINE (FPATH,1, ERROR)+0 ' ПРЕДЫДУЩЕЕ ЗНАЧЕНИЕ ЭКВИТИ
KOLPREV=READ_LINE (FPATH,3, ERROR)+0 ' ПРЕДЫДУЩЕЕ ЗНАЧЕНИЕ КОЛИЧЕСТВА КОНТРАКТОВ
PRICEENTER=READ_LINE (FPATH,4, ERROR)+0 ' ЦЕНА ВХОДА В ПОЗИЦИЮ
PROFIT=0
IF LONGORSHORT<0
PROFIT=KOLPREV*(PRICEENTER-PRICEEXIT)+0 ' РАСЧЕТ ПРОФИТА
END IF
IF LONGORSHORT>0
PROFIT=KOLPREV*(PRICEEXIT-PRICEENTER)+0 ' РАСЧЕТ ПРОФИТА
END IF
EQUITY=EQUITYPREV+PROFIT ' РАСЧЕТ ЭКВИТИ
KOL=FLOOR(EQUITY/(PROC*GO))+0 ' РАСЧЕТ КОЛИЧЕСТВА КОНТРАКТОВ ДЛЯ ТЕКУЩЕЙ СДЕЛКИ
CLEAR_FILE(FPATH) ' СТИРАЕМ ВСЕ В ФАЙЛЕ
WRITELN (FPATH, EQUITY) ' ЗАПИСЫВАЕМ НОВЫЕ ЗНАЧЕНИЯ В ФАЙЛ
WRITELN (FPATH, FN)
WRITELN (FPATH, KOL)
WRITELN (FPATH, PRICEEXIT)
RESULT=KOL
END IF
IF FN=LONGORSHORT
KOLPREV=READ_LINE (FPATH,3, ERROR)+0
RESULT=KOLPREV
END IF
END FUNC
В txt файле для Трендовой стратегии построчно:
300000 'ЗНАЧЕНИЕ ЭКВИТИ
0 'ПРЕДЫДУЩАЯ ПОЗИЦИЯ (1 ЛОНГ. -1 ШОРТ)
0 'ПРЕДЫДУЩЕЕ ЗНАЧЕНИЕ КОЛИЧЕСТВА КОНТРАКТОВ
0 'ЦЕНА ВХОДА В ПОЗИЦИЮ
После первой сделки все автоматом будет перезаписываться, пример:
301000
-1
30
35000
— более одной стратегией
— на один и тот же инструмент
— по одному торговому счету
у вас не получиться на каком бы языке вы не кодили.
Допустим Тренд стратегия +10, а флет стратегия -10, итого по счету открытых позиций 0.
Это тогда надо называть — трендфлет стратегия.
Если +30 Тренд и +20 Флет = + 50
Потом флетовая -20 общая позиция = +10
Правда Qpile умер, пора как минимум на LUA переходить в КВИКЕ.
Почему пишу на Qpile:
1) ЛЕНЬ изучать что-то новое, я лучше буду тестировать новые стратегии.
2) Не люблю всякие адаптеры DDE, API и т.д. (есть шанс что глюканет). Люблю, когда все в одном ПО.
3) Сделок мало и расчетов тоже, зачем мне C#?
4) Я знаю, как глючит Quik и выдает 0 в начале свечи или старую тек. чист. поз. после сделки и т.д. На все эти глюки стоят заглушки. Как это прописать в C# я даже голову не хочу ломать.
5) Quik стоит на виртуальном сервере, а дополнительное ПО (wealth-lab, amibroker и т.д.) будет отжирать оперативку
Обе стратегии запихать в одну не получиться, т.к. манименеджмент для каждой рассчитывается отдельно. Если начнутся тренды, то кол-во контрактов для Трендовой вырастет, а у Флетовой сократиться или останется прежней.
Quik форум — дом родной))))
egorax@gmail.com
Спасибо разрабам.