增加交易策略、交易指标、量化库代码等文件夹
This commit is contained in:
1 parent
ca3b209096
commit
f57150dae8
589 files changed
+854346
-1757
No files matched your search
Binary file not shown.
@@ -0,0 +1 @@
|
||||
eyJ2ZXJzaW9uIjoiMS4wLjAuMiIsImF1dGhvciI6IiIsImF1dGhlbm5hbWUiOiJ2aXAxNeW3peS9nOWMuijlsI/ms6LlhL8pIiwiZGVzYyI6IiIsImRhdGEiOiJ2SSttc3BuNExrVUVuejFSU2hhK2FJK2xESlcrYkZLZSt0Szdock1uSUVyTndpZlFUclpMZ09QYjFmcFYwSGViWHhqbytLVGlncGlUdlUyN2o0OFJEQ1l5OE1Vb0xOdGt3cm0zb1d5T2Q4QnRXMloxZkM4TjFseTJ3MzFCUVIweSswaEhrK1YxeDZ0Z0tZdFdZd3R2b1MwSzJseEtwTWVONVN3MWlNSDY0ZTRUaG9KdmdaUGZrNm92amF1QzNEN1VkdllsaEJyekVxOUdJQjZrUmdDakw2NVljS3BvNHkrbFNNUDh2YmVUd0o4aUxjbDM3a3VUYnVTVVFGanJ0UTJkeDI4clZLSEJTMVpGemZyV25XUjluZ3Q4dFI2NzR5dDVrd2tQU0tJOEJWS3ZlTld1OFUwZUtDRVlPRURsMGZ5eUxFVXhEdWdZN2hGVEpsVUFyalQ0M1BNSkJjR291eHZIUDBDY1pMMVVIbytnR0d2clpkZFdtcmtZa1hZa3Q5dmJtTjhDTlRRanZHanJMcnAxd0dyalVhaThWUGFtek1IVG9LR1RIR25EQXh1b3ZGVDJwc3pCMDZGK0NobnJ5THVsYTVqVmY2U2QvMkxUY25GQkZCWm5mbnU0YmdNbnllV0hQMk90ckVOcVJpUjZHejdKakl6cUpoSlVXNHR5Q1pFYm9scDAzWTNBeVhFamJldUdpOWZuU3pEb24wSk42c2V0ZDhrWmZKTmVFN1FIU1lSUlZZSlZsaldOeVFibFlQTkdEbmRoalRWYWNJUFNrQ2ZlS2xEY01RaUpCQUpncUZpK0d4NFhGb2VaendRMUM2YlJ0VzU5RVo2REFpTVB1b2VrWVBPanNrM0MwSlNXWmF6cGZFSWwrR1hDOGMyOHRRSHVPRFBzSXB2Sk5DV1p1dE8yVVg2aUt2ZFo4dEFnR0dNeWpaY0x3SmlrTE9nS0ZETnQwbzF4K3lPUVBGYTFham5abDRJRWQvbTBHNVR0WjBJaHZudlpqb2FzSzQxckQvM3d2NVlPSDdsOTloUFRSR3d0K3VDaFRoeXBYbnB4Qmp4STg0YkpwMFFGR3N4WWpNV1pYK0ZOQmczZVB2bnVMRmtxMWVQMTlUbkdJVGpKTXFPZGFvSFUxUlFNVmZFSW5XVHJzNVBMbGhBaXF1M0xqNnFtV2xGOHU1bEtwS21XcTdhbHhyMUZJSDR0MU5jOWdlc1poeUl2ckVUR2tBZkZNbi9TQ2ZvVklWQ2VSVzUxTmNjQTdHdms5UXlWQ05rZGtZeTJURWdXKzhDS1RLT0paYzNJc0lnaWxGeUgzek1rT0ZGTFpxR3FyZDZHTzBjczMzdWxWelB0bStnb2NNTjZTSllkbDZwRzhTcTg5VHJEMDJNTzEyUHBpWml2WGtRMkVtdGdnc3pDY0EwdS9jT3JQbEx2M2FuSG1Vb2ZDVG5QZ3hzNkFCWmlURU1yMlJkb2lyMVdnckdCb3NsSWxOUlZQZklrR1NxTzk2QUo1eE5FOWNWaGtBTEJlT2hSMEVibkpIakxuVnk3K2xvZDQwUzBBbHpPUEFlakN3S0Q5b2Fwd0xSeTdzck1takMzaTV2Y0Q5U2hybzFqN1NTbVFNdzVDS0lyeTNBZXBpQ2tGMERCNmJOREJQcGdROHE2SGoxZG9jM0FEWEF4S1JaZUE1dWxLakZsTW1aaXYySFI3a0UwWU5CQ05FZmlmK1hPVTBHMzY0SUlwRnRkOXF4SU9vejhDcDhydTNwK05VbDFWVlNXeUI4em9vRE00SVFMOUZCbEtVUHF3aURhVURwTDc3bG5pTFdQcFplbkxVY0p6U3ZZcGlCNEVNVTJTV2d4eGVlTitHUHdiNmZWTDlyK0lENm1mM29jZVR5c1BGK3BVcnEwVFZJdENQWUdaRUpEUllHV05qZGt0a0xZUTR3MjhEM2krZ2pwbHIrc2Vlc1VQNFVpc0dRamh6RXdqV3B0bDBGREtGdkU0TXBEME1WRTBOTmhhVld2d1dmeUJRSEwwZUlBaVdBeS9ncXU2akxQSUNZemNSb0NDRGRKbm1qL3dTQmhKa2ROVkdReENWMWovQjBkSGxjT2N3YnVTdU5nQUlzb1BnSWp5YVNsaUJHaFNBYys5Ykl0OEU4K3FvWDFseWVRb3Vnekp0MGZlejg4cytpTHcwMTJLU1pRSVlSTXRMc0Y5R2xWY3dZb01HdnkyejJ1K2t1TGRWVG4vb1NyTXF2N0xwenVET3VyOWpLWG05Y0xZRnc1NFlBc1BkaTRRUGdodkQyeUhWa1pxS2QzVytTalpPVUdrVmRJNjF0eU82d25SMmdoL3A5Y2dMd29TeFY5QkZMRFFNcWNMbS9UaVg2OVV4c0kyVDBHRm5TOC9kczNLYllBWVFQVmNGa0tvalVxSy85eFNPU3Bid21sYlFFZGl6akVDajRHZVRMQzZJQm15K0FJUEY2c1Y2amI2alJuTXRyVFI4a1B0cWw3cVpCRnIveVFKNjRMaDlkMGo3aWFSL2JhbFhkUHlGNngxUEZoRVVSdjJnNWRHbitzOG9mY0xid1cxTEpOSHVEeGU2L2ZCRGRFM01rMVlzWmdQTjZ5QmNFMlpteXJTV3NzTVVHdC9NaVArQmN6UjF6SEE3d3FaV0VjZU1UWGpGSUhYVlZJdjBMK092bmVFNDJhSHFLMkRmTUsrY3RXRFYwb0R6SnpabTJ1bFhFRXphY3Z0UXB6OVJoMTNySjJKQ3RTVmRMem5sRS9Bc21rTWw1MjBBdkRwRDBrOW9WSFRSaDVaTzNUeVd4Z2VPSmovSXBMMzZrZ24rTGRBZis4SXE1bnR4RTZLUEIrS1ovRjlDY09jMUhRdjNmNUZBajAwaW95dktMZHl3SmJ1UldrUDY0YWQzUnVKYmFMRTZBcFovWlJiR3R4OE5tVkZsNExWSU9xbnplWnhEL2VpaDZDRlJZd0xHMXJKcFlhYWpRcTVUQkQ5WjZpMFNKcDhzOXFIY3UwQnNYb0VpRit0MzcrUXNhaXhKOFRhNnFFMHp4MGt1OW43dFBlMDhWSUZWNmUxdTcwNDNuWEkxOWhyb2hKVlduVER3YmhIaGNMSW15YmUrM1EybzdIVSs1bFhRM3BucCtLa1Y2WlBmaWRCbWh3QzNCbWpXK05xSVdGa0JZYUJ1ZnpzM2kweHpzTW1teUVuc0g4V1UxVzlHanNiSHhGMEczejFJQTRzVlczbjZsWWlORWJ2WEY0eDh3YWlhby9veWZZejRvRGFSclU1NGl0RUdxbmxaRlc4c0pINFBuMndNMDVyS3djM2RRazlFWlQzNndGeDQyUTVueFlxY3cySEZZbmlyRmI5MUF1Z0JVbC9PQkdNaVUzTTYyMTEvTzUxbVJ2YytBbVAyUkE1OUw4b0ZnaDRBZ21WYkRWRFd2UjFKajJSazJkQ28vZ0Y0ZmQ0dFhpVGhsOThoRE9jaFVPd3QzT3NCOTRRdXNIQWNlZjBWRlJKRXVISGxuKytDU0c3M3NSeHo4c2VZRFJ3OFZPRk5JNHZXMHdMZktTSCswNVVhbXRCeTJUUU14NzJoYlpRVnhLVUR0QmNXOHg0Sk5lTlBYVnRsbjRZUm1pTkFra0pPbDRTY0xwZFJLT3NaejBQd1pIL1NIdk53VldMZXp5c0h0YWd6SmdNbDF3YUpubWg2cTdidnVCRkF2UGgrSzhSVHd4MmlpK3ZaSnhYK0ZMbmJoTk4xV0Q1dkV3T2FnVTEwU3htcCtxWlVsb1E3VzVhSWlFcGdvOGtacnpZbXZ5NG1vVGhSR3RTekpHeWFza2piNGZlSHhsd0ZCS1J5dlBUZDYyWmlYUDE4b21yN2t3azBxcWdWUTUxOFZBeWNYUThVaS92c1N6bTB1dEZBRVNSU0JCZXpFUndpWStycEZJYVBIM01UcGNMY3FnNG9kODNJUkNYS2Y5NzF3U3Z2NlFsUWVuNm12V0RUc1RmUE14UkpjRVhuamwrRVpVYmE1SWtjMlVrdThBaWpwbUxFTEhJTncyQytMVHQwZndkVHArOTZZOEd2alhHcU1xUi9xOU91UzUxa2g2NXl0RnZqV0Zoekd1cHdRSkZPU2doNzBQNUpiaFNqc2h4aUl4RU81ci9VVUt2WG4wNjZSM1kwVVBORk5PVGtXcU5TdUZpWWNIM1lRdVR0VHdadVlOOUg5R1FrYTY2Tk5ockFGVm8yMG1tZ0owUVMzdk8yeDN6Vmh1bjREWlIwbVpqeG1ZVHFXVU44dWY5SGdXam02SEFMcDZTdVNYU2Nzam5GNUpUUlpTRHVnd1JCNXYyK2QxcUlIS3dndmZGejdaMitxNzl6R0NWNWhMdkUrL2xCY2pvd2tPTnpPY000M2ZYV0lhZ1Evditqd002NmI4aVVJV1RUNzBzemFlU2JsZW1ieDhacldvU3VUQUhWbmVtckNXNmhjVHhPcWZaUkhOM0JXRzhsbUhqSFd0ZXdlOUVxdy9GZEpQWG1RZWFGOGlwd3liSFpOajM5UFJwNzdLNi9QKzFDVlJjSDlrZkJKYWI5K3RsOFoyTnQ3U2dTT2VkdExtUWpWeVh3WnhjYWtHSm1NWWxiYkl5T3pQQnZFQ1FMVEVFRzZRUmdpeFMwaXlBbEJpcFlWOHRIMFRmNy91NW5JZHNKYXhhNFYwQ2p0REVRMmQ2S3Z3bTNVcWR1U3Rqb3VSZldBeUQrQjZxdVR3bkQ2REpQVFdocTJsYk9hOVh3TFFtcFNBRHdBY3ptOHpaeVZhaDVOQmRtVTRkYTBJdzB0UXlYVnYzcGtMTFdidFlTY2xYWmhoeW0rWC9JUVdaaWkwbG8vNmk0V3B4MEdIRlhtZzRPTEYwQU0yZmR2MDAzd0xneE5pazJyZVRLine truncated
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,155 @@
|
||||
from vnpy_ctastrategy import (
|
||||
CtaTemplate,
|
||||
TargetPosTemplate,
|
||||
StopOrder,
|
||||
TickData,
|
||||
BarData,
|
||||
TradeData,
|
||||
OrderData,
|
||||
BarGenerator,
|
||||
ArrayManager,
|
||||
)
|
||||
import numpy as np
|
||||
import numpy as np
|
||||
import talib
|
||||
|
||||
|
||||
class vip15(CtaTemplate):
|
||||
author = "quant789.com"
|
||||
|
||||
period = 5
|
||||
pds = 24
|
||||
trailing_stop_rate = 65
|
||||
lots = 1
|
||||
kg = 0
|
||||
parameters = ["period", "pds", "trailing_stop_rate", "lots"]
|
||||
variables = ["sdo_value", "lots", "barcout", "kg", "dd", "ss"]
|
||||
|
||||
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
|
||||
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
|
||||
|
||||
self.bg = BarGenerator(self.on_bar)
|
||||
self.am = ArrayManager(300) # Adjust size as needed
|
||||
|
||||
self.sdo_array = 0
|
||||
self.barcout = 0
|
||||
|
||||
self.dd = 0
|
||||
self.ss = 0
|
||||
|
||||
self.over_bought = 40
|
||||
self.over_sold = -40
|
||||
self.lb_period = 50
|
||||
|
||||
self.highest_low_after_entry = 0
|
||||
self.lowest_high_after_entry = 0
|
||||
self.liq_ka = 1
|
||||
self.dliq_point = 0
|
||||
self.kliq_point = 0
|
||||
self.ent_bar = 0
|
||||
self.ent_price = 0
|
||||
|
||||
def calculate_sdo(self):
|
||||
if len(self.am.close_array) < self.lb_period:
|
||||
return []
|
||||
|
||||
close = self.am.close_array
|
||||
dist = np.abs(close - np.roll(close, self.period))
|
||||
lowest_dist = np.minimum.accumulate(dist[::-1])[::-1]
|
||||
highest_dist = np.maximum.accumulate(dist[::-1])[::-1]
|
||||
|
||||
# 避免除以零
|
||||
denom = highest_dist - lowest_dist
|
||||
denom[denom == 0] = 1e-10 # 将零值替换为一个很小的数
|
||||
dval = np.where(denom != 0, (dist - lowest_dist) / denom, 0)
|
||||
|
||||
ddval = np.zeros_like(dval)
|
||||
ddval[close > np.roll(close, self.period)] = dval[close > np.roll(close, self.period)]
|
||||
ddval[close < np.roll(close, self.period)] = -dval[close < np.roll(close, self.period)]
|
||||
|
||||
sdo = np.convolve(ddval, np.ones(self.pds), 'valid') / self.pds * 100
|
||||
return sdo
|
||||
|
||||
def on_init(self):
|
||||
self.write_log("策略初始化")
|
||||
self.load_bar(10)
|
||||
|
||||
def on_start(self):
|
||||
self.write_log("策略启动")
|
||||
|
||||
def on_stop(self):
|
||||
self.write_log("策略停止")
|
||||
|
||||
def on_tick(self, tick: TickData):
|
||||
self.bg.update_tick(tick)
|
||||
|
||||
def on_bar(self, bar: BarData):
|
||||
self.am.update_bar(bar)
|
||||
if not self.am.inited:
|
||||
return
|
||||
|
||||
self.sdo_array = self.calculate_sdo()
|
||||
|
||||
cond1 = self.sdo_array[-2] > self.over_bought and self.sdo_array[-1] <= self.over_bought
|
||||
cond2 = self.sdo_array[-2] < self.over_sold and self.sdo_array[-1] >= self.over_sold
|
||||
|
||||
hh = self.am.high_array[-self.period:].max()
|
||||
ll = self.am.low_array[-self.period:].min()
|
||||
|
||||
if cond1==True or cond2==True:
|
||||
self.dd = hh
|
||||
self.ss = ll
|
||||
self.kg = 1
|
||||
self.barcout = 0
|
||||
|
||||
if self.kg > 0:
|
||||
self.barcout += 1
|
||||
|
||||
if self.barcout > self.pds:
|
||||
self.barcout = 0
|
||||
self.dd = 0
|
||||
self.ss = 0
|
||||
self.kg = 0
|
||||
|
||||
if self.kg > 0 and bar.high_price >= self.dd and self.dd>0 : #
|
||||
self.buy(bar.close_price, self.lots)
|
||||
self.kg = 0
|
||||
self.barcout = 0
|
||||
self.highest_low_after_entry = bar.close_price
|
||||
self.initialize_vars_on_entry(bar)
|
||||
if self.kg > 0 and bar.low_price <= self.ss and self.ss>0 : #
|
||||
self.short(bar.close_price, self.lots)
|
||||
self.kg = 0
|
||||
self.barcout = 0
|
||||
self.lowest_high_after_entry = bar.close_price
|
||||
self.initialize_vars_on_entry(bar)
|
||||
else:
|
||||
self.trailing_stop(bar)
|
||||
|
||||
self.put_event()
|
||||
|
||||
|
||||
|
||||
def trailing_stop(self, bar: BarData):
|
||||
if self.pos > 0:
|
||||
self.highest_low_after_entry = max(self.highest_low_after_entry, bar.low_price)
|
||||
self.dliq_point = self.highest_low_after_entry - (bar.open_price * self.trailing_stop_rate / 10000) * self.liq_ka
|
||||
if bar.low_price <= self.dliq_point and bar.datetime.timestamp() > self.ent_bar:
|
||||
self.sell(bar.close_price , abs(self.pos))
|
||||
elif self.pos < 0:
|
||||
self.lowest_high_after_entry = min(self.lowest_high_after_entry, bar.high_price)
|
||||
self.kliq_point = self.lowest_high_after_entry + (bar.open_price * self.trailing_stop_rate / 10000) * self.liq_ka
|
||||
if bar.high_price >= self.kliq_point and bar.datetime.timestamp() > self.ent_bar:
|
||||
self.cover(bar.close_price , abs(self.pos))
|
||||
|
||||
def initialize_vars_on_entry(self, bar: BarData):
|
||||
self.ent_bar = bar.datetime.timestamp()
|
||||
self.ent_price = bar.close_price
|
||||
self.liq_ka = 1
|
||||
|
||||
|
||||
def on_order(self, order: OrderData):
|
||||
pass
|
||||
|
||||
def on_stop_order(self, stop_order: StopOrder):
|
||||
pass
|
||||
@@ -0,0 +1,7 @@
|
||||
通过网盘分享的文件:VIP15参数文件.rar
|
||||
链接: https://pan.baidu.com/s/1liwdmvmGJ7wjHWVewZUUWA?pwd=7777 提取码: 7777
|
||||
--来自百度网盘超级会员v7的分享
|
||||
|
||||
如果过期了不能用了,联系小松鼠微信:viquant01
|
||||
|
||||
quant789.com可以使用参数选取工具
|
||||
Binary file not shown.
Reference in new issue
Block a user