增加交易策略、交易指标、量化库代码等文件夹
This commit is contained in:
1 parent
ca3b209096
commit
f57150dae8
589 files changed
+854346
-1757
No files matched your search
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 547 KiB |
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
eyJ2ZXJzaW9uIjoiMS4wLjAuMiIsImF1dGhvciI6IiIsImF1dGhlbm5hbWUiOiLnvZHmoLzkuqTmmJPnrZbnlaUiLCJkZXNjIjoiIiwiZGF0YSI6InZJK21zcG40TGtVRW56MVJTaGErYUkrbERKVytiRktlTy9OV3FwSFdjNHRJR2FJUlpkVVNwSjdIcVZHQkxEY1A2Y1lQVDVWK1J3dGNZSnFJeWVsWERkQkk2aFhCSnBUNWs3SERDdVY0L0xhNUZCNGRrZG5jRUE5VXQ1eDVhT0hkZ2FuWXkrOVdzd0JKTnZzQWpTU3RkOXM1S055Tlc3SzJJTXdpYzRBVnBtejQ5WnJER2lhT2tUVDluSnI2ZnhHcDNiNmlvRk9tS2xNc1o5R1pPZTNmR3BpKzgrcHlDbHRsc3YyY1NQQjc0MEwwVHdCaW9Dc3hhUVFLTmoxU1gxNDVGYXJtRFp6SzhJRksyak1uaW9KbWRLaTZZM3RGdkQzYzlzV0JsK3BnQWlrNUtFZHUrYVkwbkczWld2OEFWV0Z2TUdtN2t0V0FQSHA5b21LcUxRMFUvM1M4V1FmUlJWMUNIOFB3Y1FvK3NDdUVNNDcveE5XWTZVRXRaY1BOVEY2SW1yeXB1cnM5cm9iekxvWG4zVmxlRXdtd1dKSlV3eWlKbGVvSXE2bWo3VVdtbDJQa0VzTFVFU2JNWmdPV2FyMS9kNTlaYXhUMEZnU1ZGVWJCZjA2Njg3ZWlPTUNHQmc5SE13MnAwcTNvL1JZZGpDTlNQTnZieksyU0VZRWdUWCtwTm1kalN3VVg0b2cxQnRLV2pMWmMydUJFcEpPVnI5TmNnTUM3OTlYRWwzK1VzR2pYN0FqZ0d4VWhDMG5sUlBRZEh2UVhjb2RLRUR3NWZKSTlwRWVBaTRCdTgrQStwdCtXQkFqa0FoaGNCNWM4NmY2WVpWbjdaVHc2ckJERm00TUxla05JNWNIUWdaY0tjYytoQUFOSHdCSzM4T01tL0ltbW9FallnazNQY0JCcHdQYithRW81dzFibFBMbFU1VTRhNVNPdUQydURkY0ExMHFCUGpPanNTeVRwZmxvM2RUL0NiY2lGQTAwSk16SmRJZHp6dnFSRjg5T09PRGZKUCt6TzNUd0xtUHk1SmJ6MHV6ZkJhOHRzdzNDZ0R0OHF5cnVtWXFnUldFNngyRU5wT3o1VEJNTThqT2dFcUZtWDlxQVZiN0pITDlOY3dUdTdMQ3BVeE11bUc4Yjcyb1JhT0pUYkJYV3dhQjVLZU1EUzNXNXhvekUzeWhxMVVwME5EajNqZnNBSDU0Y3BCMFgwaGtzMUVaY1dhcFZyNVJrMG5TTjFiQm1YaGFndVlyOWI2YU1sUlR3ZGJtL3oybmFVYWxmNm9oV09HK0lIaFNQNmt4K2JYVmpGWTJBc0x6QjVPY3lyWldIVk1OVEpCL0lGaTRkY3YrdmJacGp3YWhkY1JyWGZ0czA5ak5RMWtobUtiMnF3OGxtL0JRZFVIOWxjbVJwKzZWNi96YU9HMUlrbWYzMjM4bVltcE1YZzR1Tk43TE5TQStnbk1YWURudDdYT0VjbnJ0cnJTYS93VDRNZHc3MmYvTGNmb2VWajRHd0k4empSM1BOcC9JUmRaNGQrYlhLMEl1V1k2bjVqQmdjRS9oWmNkMW9LUm0vdmhERjE0cVJIc1JhUEd5ZTlET0lLdU1xVGN2WTV0b2VXUlIxZU9LZUs2K1VWd3R0ZDloWkVpd2hpM2R1SWFud3ZuZWdkd1RhR3NjejhTQ0QzNUJGZG5QZ2JoanNDOHlVM1A1bEU2cnBLRjZJamh5b3NtMmQ1bDEyTWVnTy9WZERqRXdORDhETFZKSWNuTG4yOUcySWpoVW5LWkNDaythcFJBZTVRdXQ2Yk9INStIQkd1alhydjF4TUZaR2VKeEN1NTFrTUY5MjYxTmNlUVBxNnc3SjMrQ0t2VG1kYTlCdEFITFEvYTVRRkVKNmpNRmNBelBUVE4xdEhHLzFmYkNLWmlPOVJZdTZSdlJ1NzBieHNqUURhek1PdDVzOVgwdkpVNzZ5SVF3WkNiK3crVUFUQXVzUXVtV1B2cFdTNVVlTzV1dnhta0FIZkROcVhiMytFaWtzZ0x1NStFNnMrUFFkREYvU01xOWFLeFRzakNrbXBYaXhzaTVTR2IrQjZhNVAxZ2U1enlxQ2lwSEhsR1JQSHJWb0cwamphVUhPRkV5WTV3MlR3OEZibm1HcDdTaVdxZmhXbWhYSmJtQjBmWVlWL2VjaTljK0VlMWM4OXArdk5acXNSSURXV0xwVTJXOWRILzQzMFpWaG1menlkK3kvUS9GTWZiWHlOV2RremFtMWFZbjFINlZlWTJWM0hrRnovTjFNcTVOV1NYYzhwN01aWUhCa2ZVT3hWSWpXSTFielJEbmd2QVNyZ2NlemZpV1k0NWR3ZHdLeTJxM0M3c2lHQjcwQmpFSE9hcTgzQTBqcEpieHFCRHVwQk5zY3M0ZUc4dVJrYkVTUjlPdzdrd29Yb1Q0WURaYzVGUHUvMWo2WWlWczNtSXA3a09NTGtXZ1R4U0RKN2t1N0I3aFBwYk1nTTRqajhxb2hMOTNKWWZSU3NtL2JVY2xqVEUySnRKY2RaMGJGOC9DZk1kYTkxNXNuSzlET1RWNlErejByVnR6anc0NklWQVBUd0tRMVlORmxiVW10clpCbkw0MUtDczdGLzEra0hqMnFJQ2loNGxkajhuTmJWcWdXVlJxQWNXNmxQZkV0b21ZMFhzT0JDaml1dnFDRXhiMEl5cUQyWmVNcTFaRUhaRC90Ri95cHdwSjJGcmZjZUlKdmtJdHB0L1k5bGE2RDVWSnVsTG5qTm82VHZydE0zMW4vTEtFSHpteG40RThxRlNYOWVlSHpyeDZ6NHlpZWh4NEgzSWN0SE5BWE9PSjUwZnM2dHh4SW53RGx0bkFSOVBDM29mUjFMMCtWcmFvaWNWdmFseGJyUWxCTjRIWFpDNUlpYWpCUHNDd2Z4Wm9RN0QyZUZ4RUxVSTRWMkRsUVZWLzRuUC80Ukg4M3YveTUxM1pPY0c2MUhJVGY0N2VESFBtTTdvUHNPM1IrV2Q1TUVGV0g3OHFSTitKM2UwQ0pSUENiQjl1bmtVOVFpVHpCREZ4VjhnWnVnRStmN2pwK01HdlA3NHZNck9sZzVvYmtNaXVaNG1OS09LSTZpQ1FleWRYelExa0FFcHBmbVdiTHhuLzdRdjVRdTUyREh6dHdmMkg0NWRySDNRT0ZzbWRMbFhJekIrN0tNdXY0SGpRaWptalQ5clJKZ2k3SDNYRjdUa3l3Wnp4NUd0eXJ2QVhxQzNReVJreFI2MExQRVF2SVF2Mlo1aHo5YzhpS1dNZUlNaUhTMi9tRGJoejhjL2lGNWxNajMyS1hjTUVLT3RZSFFYcEJ3QktmVXhxeWdSTHoxKzVvQVFaSy9sNGNpVUpadm8vbWF1OFJYVHNka3F1cWdENktoRnNmOUwwWEVWSzYrVW92RmRGUzRyNkJFM0NRTGNmS21ieThScHIzbkpWQm9lNUZTZmlVbjVYWUlKS0R0QlVyd1ZZOTNxOHE5MzNFSmlVa3RHRzMxUWJ0S0N1K0RoU1dPbjhZOTlLYVVEaTZqNVgwVUYwaTI5R29ZTjJJUW1XWkdLTGU4WExJVTZVWjA0cWpNc1k5TDVhWktCUURLbzlubjJlcGxYTmMxMGlGOEJhajZiSGpLZ3ZWeUJITzVIbHZkcWVNMStSdGFrVjJ6aHFxRFlpdVBrbmI4bDlPeFpPdnZIYitOaG11azZSMFllNnBGWkdRZUF6VFpmZ0ZQVG1kVHd4V3BvRjlsUHRhai9HUXZpZU1jQjJvNkZJYlhCMVNjNVJYNWg0akh6U3hueW0yWlQrbmRPSTdQUmhiaEs0ZXI4Y1dFMHZQUUNBQlBGSU9lYzhwWlRnSDIrenR6K1RNY2JFREVMcXhBRm5TWmFDWkpLeGoxQ1UzTmNwcXJjeE1qS1hSNitjTzl0ei84bGFLR3B4cm9TR041Y3pLRDg5K2xtUk55ZTBsSzcyTGxyVmR0MEZoVUpmeHMrMFVQMm1qYlJldVJ4VmJjbTR2bUdvdXBvTUQwMlpnVmdmbm93ZldDcmpjRGJMeXdENEdvaWRmZlo5MXJ5VGlFTE9XbC9PK00vTGlWOXNlS2hsdnZVR1pIc3M4K0lBQXpYV3JzcXdDK1hjYWhMcmpEQU9sSE5teGplTlA0b1ErUkxIV1BzSzU4U1ZFNlExWHBQSVdkaDZRVWk1TWQ3VFNEd3RxclNzSXZCdGpISXMrZWpMWmdneHVYWnhKYlFFcUhYZWZXNTRjQkVpMTJkczBUM2xnTlhBOGg4RzNEdmEzTUdwVGNjcUpZYkJ1OGJxVlpMZEppb3dFRDBLVnJ6ZU1qcWVHeXBoOTNTaGpZdnl6c2MxN1kxaHplS1VXeitTMkxyVEhOWGVJZHZiSXVGRVdCQlRNYlMrNDNHQjYrOThuZDFoVElKODIzS0gxOG1qSm9ldUtWUVM3RDJBYXBucXdRTDAzQ1o3dHQ0bFQ2YVF4cVc5Q083b3RWZS9QWUlDc21nU2EvUVRrb04wMkkwRkhsNFJtRnBnajlJR0dBdGZwaXVBYlJpRkxKSFRrS1RKMkpPN1BBdERXaDFiaVd6SVhwL0VQcXdZZU9iM1JvVUQ2bkx3MDlXMVNlbFlPK2VWRTZEMmV3aElQTFR2MkNObUlla2hLdU05RG5xdWREKzFBVzg0RzRLOHhkV3I4cmdjWXlsZ1J0RXVjZi9KWlVsRUpwZmhpMDNzTFluRTIvajdGS0VFOG9xbjJ2QnV4cW43ekpxR2IvT091Q1c0dXY5S29Ja1hpMFBPdnZvbUNPTGIrYllnNlYvNFk1eVFGaThzVXdBZ2cyL0xjRGN3MU4vVDhPaHNNOFUxaisrRm04ZjR3dm5UK2hPakp0VHJUMmlBb2FEblF1dWxQQTkLine truncated
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,230 @@
|
||||
from vnpy_ctastrategy import (
|
||||
CtaTemplate,
|
||||
TargetPosTemplate,
|
||||
StopOrder,
|
||||
TickData,
|
||||
BarData,
|
||||
TradeData,
|
||||
OrderData,
|
||||
BarGenerator,
|
||||
ArrayManager,
|
||||
)
|
||||
import numpy as np
|
||||
|
||||
class MoveSpaceStrategy(CtaTemplate):
|
||||
author = "Quant789.com"
|
||||
|
||||
# 策略参数
|
||||
periods = 85
|
||||
multiplier = 2
|
||||
grid_step = 16
|
||||
grid_length = 16
|
||||
ss = 1
|
||||
zhiying_count = 5
|
||||
|
||||
# 策略变量
|
||||
avg = 0
|
||||
flag = 0
|
||||
hl2 = 0
|
||||
atr_value = 0
|
||||
up = 0
|
||||
dn = 0
|
||||
kg = 1
|
||||
midKG = 0
|
||||
cur_grid_price = 0
|
||||
tp_price = 0
|
||||
re_price = 0
|
||||
statprice = 0
|
||||
orderprice = 0
|
||||
hh = 0
|
||||
ll = 0
|
||||
lots_top = 1
|
||||
ggprice = 0
|
||||
lots_scale = 0
|
||||
has_send_order = 0
|
||||
trss = 0
|
||||
krss = 0
|
||||
lorder_ids = []
|
||||
sorder_ids = []
|
||||
lpoisout = []
|
||||
spoisout = []
|
||||
pc_short_lots = 0
|
||||
pc_long_lots = 0
|
||||
|
||||
# 用于存储网格价格的字典
|
||||
grid_prices = {}
|
||||
|
||||
parameters = [
|
||||
"periods", "multiplier", "grid_step",
|
||||
"grid_length", "ss", "zhiying_count"
|
||||
]
|
||||
|
||||
variables = [
|
||||
"avg", "flag", "hl2", "atr_value", "up", "dn", "kg", "midKG",
|
||||
"cur_grid_price", "tp_price", "re_price", "statprice",
|
||||
"orderprice", "hh", "ll", "lots_top", "ggprice", "lots_scale",
|
||||
"has_send_order", "trss", "krss", "lorder_ids", "sorder_ids",
|
||||
"lpoisout", "spoisout", "pc_short_lots", "pc_long_lots"
|
||||
]
|
||||
|
||||
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
|
||||
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
|
||||
self.am = ArrayManager()
|
||||
|
||||
def on_init(self):
|
||||
self.write_log("策略初始化")
|
||||
self.load_bar(10)
|
||||
|
||||
def on_start(self):
|
||||
self.write_log("策略启动")
|
||||
self.put_event()
|
||||
|
||||
def on_stop(self):
|
||||
self.write_log("策略停止")
|
||||
self.put_event()
|
||||
|
||||
def on_tick(self, tick: TickData):
|
||||
pass
|
||||
|
||||
def on_bar(self, bar: BarData):
|
||||
self.am.update_bar(bar)
|
||||
if not self.am.inited:
|
||||
return
|
||||
|
||||
# 计算ATR值和HL2值
|
||||
self.atr_value = self.am.atr(self.periods)
|
||||
self.hl2 = (self.am.high[-1] + self.am.low[-1]) / 2
|
||||
|
||||
# 计算上轨和下轨
|
||||
self.up = self.hl2 - (self.multiplier * self.atr_value)
|
||||
self.dn = self.hl2 + (self.multiplier * self.atr_value)
|
||||
|
||||
if self.am.close[-2] >= self.up:
|
||||
self.up = max(self.up, self.am.high[-2])
|
||||
if self.am.close[-2] <= self.dn:
|
||||
self.dn = min(self.dn, self.am.low[-2])
|
||||
|
||||
# 更新趋势信号
|
||||
if self.kg == -1 and self.am.close[-1] > self.dn:
|
||||
self.kg = 1
|
||||
elif self.kg == 1 and self.am.close[-1] < self.up:
|
||||
self.kg = -1
|
||||
|
||||
# 趋势转变时平仓
|
||||
if self.kg == 1 and self.am.close[-2] < self.up and self.am.close[-3] >= self.up:
|
||||
if self.pos < 0:
|
||||
self.cover(bar.close_price, abs(self.pos))
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
else:
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
elif self.kg == -1 and self.am.close[-2] > self.dn and self.am.close[-3] <= self.dn:
|
||||
if self.pos > 0:
|
||||
self.sell(bar.close_price, abs(self.pos))
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
else:
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
|
||||
# 初始化中轨值
|
||||
if not self.statprice:
|
||||
self.statprice = bar.open_price
|
||||
self.midKG = 0
|
||||
|
||||
# 计算网格线相关数值
|
||||
hh = ll = self.statprice
|
||||
for i in range(1, int(self.grid_length / 2) + 1):
|
||||
a_intprice = self.statprice + (self.grid_step * i)
|
||||
hh = max(a_intprice, hh)
|
||||
b_intprice = self.statprice - (self.grid_step * i)
|
||||
ll = min(b_intprice, ll)
|
||||
|
||||
# 中轨值迭代
|
||||
if self.am.high[-1] >= hh:
|
||||
self.rstatprice = self.statprice
|
||||
self.statprice = hh
|
||||
self.midKG = 0
|
||||
if self.pos < 0:
|
||||
self.cover(bar.close_price, abs(self.pos))
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
else:
|
||||
self.sell(bar.close_price, abs(self.pos))
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
|
||||
if self.am.low[-1] <= ll:
|
||||
self.rstatprice = self.statprice
|
||||
self.statprice = ll
|
||||
self.midKG = 0
|
||||
if self.pos > 0:
|
||||
self.sell(bar.close_price, abs(self.pos))
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
else:
|
||||
self.cover(bar.close_price, abs(self.pos))
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
|
||||
# 计算网格价格并存储到字典
|
||||
if self.midKG == 0:
|
||||
self.cur_grid_price = self.statprice + self.grid_step * (self.grid_length / 2)
|
||||
for i in range(1, self.grid_length + 1):
|
||||
ggprice = self.cur_grid_price - (i - 1) * self.grid_step
|
||||
self.grid_prices["price_" + str(i)] = ggprice
|
||||
self.midKG = 1
|
||||
|
||||
# 网格交易逻辑
|
||||
if self.midKG == 1:
|
||||
for i in range(1, self.grid_length + 1):
|
||||
orderprice = self.grid_prices.get("price_" + str(i), None)
|
||||
if orderprice is None:
|
||||
continue
|
||||
if self.kg > 0 and self.am.close[-2] > orderprice > self.am.low[-1]:
|
||||
self.trss += 1
|
||||
self.grid_prices["price_" + str(i)] = -999999
|
||||
elif self.kg < 0 and self.am.close[-2] < orderprice < self.am.high[-1]:
|
||||
self.krss += 1
|
||||
self.grid_prices["price_" + str(i)] = 999999
|
||||
|
||||
if self.pos >= 0 and self.trss > 0 and self.kg > 0:
|
||||
self.buy(bar.open_price, self.trss * self.ss)
|
||||
self.lorder_ids.append(self.trss * self.ss)
|
||||
self.lpoisout.append(bar.open_price + self.grid_step * self.zhiying_count)
|
||||
self.trss = 0
|
||||
elif self.pos <= 0 and self.krss > 0 and self.kg < 0:
|
||||
self.short(bar.open_price, self.krss * self.ss)
|
||||
self.sorder_ids.append(self.krss * self.ss)
|
||||
self.spoisout.append(bar.open_price - self.grid_step * self.zhiying_count)
|
||||
self.krss = 0
|
||||
|
||||
# 多头仓位止盈逻辑
|
||||
if self.pos > 0 and len(self.lorder_ids) > 0:
|
||||
for i in range(len(self.lorder_ids)):
|
||||
pc_long = self.lorder_ids[i]
|
||||
pc_long_price = self.lpoisout[i]
|
||||
if self.am.high[-1] >= pc_long_price:
|
||||
self.sell(bar.close_price, pc_long)
|
||||
self.lorder_ids[i] = 99999999
|
||||
self.lpoisout[i] = 99999999
|
||||
|
||||
# 空头仓位止盈逻辑
|
||||
if self.pos < 0 and len(self.sorder_ids) > 0:
|
||||
for i in range(len(self.sorder_ids)):
|
||||
pc_short = self.sorder_ids[i]
|
||||
pc_short_price = self.spoisout[i]
|
||||
if self.am.low[-1] <= pc_short_price:
|
||||
self.cover(bar.close_price, pc_short)
|
||||
self.sorder_ids[i] = -1
|
||||
self.spoisout[i] = -1
|
||||
|
||||
# 清空持仓时重置订单ID和位置列表
|
||||
if self.pos == 0:
|
||||
self.lorder_ids.clear()
|
||||
self.lpoisout.clear()
|
||||
self.sorder_ids.clear()
|
||||
self.spoisout.clear()
|
||||
|
||||
self.put_event()
|
||||
Reference in new issue
Block a user