Блог им. bsk

Как в Quik на языке Qpile совместить несколько стратегий по одному инструменту

Встала задача на одном счете торговать разные стратегии по одному инструменту.
В 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 
 

 

 
★6
14 комментариев
Одновременно торговать:
— более одной стратегией
— на один и тот же инструмент
— по одному торговому счету
у вас не получиться на каком бы языке вы не кодили.
Допустим Тренд стратегия +10, а флет стратегия -10, итого по счету открытых позиций 0.
Это тогда надо называть — трендфлет стратегия.
avatar
Egorax, Если на Тренд и Флет в какой-то момент времени одинаковое количество контрактов, то на какой то период может быть кеш, пока обе не станут в лонг или в шорт.
Если +30 Тренд и +20 Флет = + 50
Потом флетовая -20 общая позиция = +10
avatar
robot_bsk, я лишь высказал свою точку зрения. Ваше право хоть пять стратегий запустить — главное что бы плюс генерировался.
Правда Qpile умер, пора как минимум на LUA переходить в КВИКЕ.
avatar
Egorax, Согласен, но руки не доходят и ЛЕНЬ выискивать баги в LUA, как в Qpile. Мне расчет Qpile в 1 секунду хватает. Как будет время займусь LUA :-)
avatar
засунь обе стратегии в одну и все, и вообще давно пора на C# писать
avatar
SHCHUTUSHCHA, на С# пишу, но плохо. Для меня Pascal родной.
Почему пишу на Qpile:
1) ЛЕНЬ изучать что-то новое, я лучше буду тестировать новые стратегии.
2) Не люблю всякие адаптеры DDE, API и т.д. (есть шанс что глюканет). Люблю, когда все в одном ПО.
3) Сделок мало и расчетов тоже, зачем мне C#?
4) Я знаю, как глючит Quik и выдает 0 в начале свечи или старую тек. чист. поз. после сделки и т.д. На все эти глюки стоят заглушки. Как это прописать в C# я даже голову не хочу ломать.
5) Quik стоит на виртуальном сервере, а дополнительное ПО (wealth-lab, amibroker и т.д.) будет отжирать оперативку

Обе стратегии запихать в одну не получиться, т.к. манименеджмент для каждой рассчитывается отдельно. Если начнутся тренды, то кол-во контрактов для Трендовой вырастет, а у Флетовой сократиться или останется прежней.
avatar
robot_bsk, можно объеденить учитывая манименеджмент
avatar
skatino, Согласен, вот я и объединил их в одном роботе, который реально торгует, но тестировал я обе стратегии отдельно друг от друга.
avatar
robot_bsk, если есть интерес к LUA могу несколько уроков по основам преподать, а в нюансах сам дальше разберешься.
avatar
Egorax, С удовольствием, добавь меня в друзья. Сам не могу, рейта не хватает
avatar
robot_bsk, я без рейтинга, здесь недавно.
Quik форум — дом родной))))
[email protected]
avatar
finstrateg, Верно :-)
avatar
У меня DDE экспорт на Delphi и С++ стабильно работают.
Спасибо разрабам.
avatar

теги блога robot_bsk

....все тэги



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