2023-10-31 12:29:56 +08:00
|
|
|
|
|
|
|
|
> Name
|
|
|
|
|
|
|
|
|
|
子辰量化香农网格交易策略
|
|
|
|
|
|
|
|
|
|
> Author
|
|
|
|
|
|
|
|
|
|
子辰量化
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> Strategy Arguments
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|Argument|Default|Description|
|
|
|
|
|
|----|----|----|
|
2024-03-03 22:15:35 +08:00
|
|
|
|totalInvestment|10000|总投资额|
|
2023-10-31 12:29:56 +08:00
|
|
|
|buyRatio|0.02|下跌多少买入|
|
|
|
|
|
|sellRatio|0.02|上涨多少卖出|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> Source (python)
|
|
|
|
|
|
|
|
|
|
``` python
|
|
|
|
|
##
|
2024-03-03 22:15:35 +08:00
|
|
|
# 香农网格交易策略(公开版)
|
|
|
|
|
# Author: 子辰量化
|
|
|
|
|
# Last Modified: 2024-1-4
|
2023-10-31 12:29:56 +08:00
|
|
|
##
|
|
|
|
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
assetRatio = 0.5 # 资产投资比例
|
|
|
|
|
|
2024-03-03 22:15:35 +08:00
|
|
|
originalTotalMoney = totalInvestment # 基准投资额,总投资额+盈亏后的全部权益
|
2023-10-31 12:29:56 +08:00
|
|
|
originalAssetMoney = totalInvestment * assetRatio # 基准资产价值
|
|
|
|
|
originalCashMoney = totalInvestment * (1 - assetRatio) # 基准现金
|
|
|
|
|
|
|
|
|
|
remainCashMoney = originalCashMoney # 当前剩余现金
|
2024-03-03 22:15:35 +08:00
|
|
|
investAssetMoney = 0 # 当前资产价值
|
|
|
|
|
inverstAssetAmount = 0 # 当前资产数量
|
2023-10-31 12:29:56 +08:00
|
|
|
|
|
|
|
|
boolInited = False # 是否完成了首次建仓
|
|
|
|
|
|
|
|
|
|
i = 0 # tick计算
|
|
|
|
|
|
2024-03-03 22:15:35 +08:00
|
|
|
def num_cut(num, c):
|
|
|
|
|
str_num = str(num)
|
|
|
|
|
return float(str_num[:str_num.index('.') + 1 + c])
|
|
|
|
|
|
2023-10-31 12:29:56 +08:00
|
|
|
def onTick():
|
|
|
|
|
global assetRatio
|
2024-03-03 22:15:35 +08:00
|
|
|
global originalTotalMoney
|
2023-10-31 12:29:56 +08:00
|
|
|
global originalAssetMoney
|
|
|
|
|
global originalCashMoney
|
|
|
|
|
global remainCashMoney
|
|
|
|
|
global investAssetMoney
|
|
|
|
|
global inverstAssetAmount
|
|
|
|
|
global boolInited
|
|
|
|
|
global i
|
|
|
|
|
|
|
|
|
|
ticker = exchange.GetTicker()
|
|
|
|
|
# Log(ticker)
|
|
|
|
|
openTime = time.localtime(ticker.Time / 1000) # ticker time
|
|
|
|
|
openTimeStr = time.strftime("%Y-%m-%dT%H:%M:%S", openTime)
|
|
|
|
|
price = ticker.Last
|
|
|
|
|
|
|
|
|
|
# 初始建仓
|
|
|
|
|
if not boolInited:
|
2024-03-03 22:15:35 +08:00
|
|
|
money = originalAssetMoney
|
|
|
|
|
id = exchange.Buy(-1, money) # 市价单
|
|
|
|
|
# Log("order id:", id)
|
|
|
|
|
order = exchange.GetOrder(id)
|
|
|
|
|
Log("buy money:", money)
|
|
|
|
|
Log("order id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:", order["DealAmount"], "AvgPrice:", order["AvgPrice"], "Status:", order["Status"], "Type:", order["Type"])
|
|
|
|
|
money = order["Amount"] # 成交的money
|
|
|
|
|
dealAmount = order["DealAmount"] # 已扣除手续费的资产数量
|
|
|
|
|
price = order["AvgPrice"] # 成交均价
|
2023-10-31 12:29:56 +08:00
|
|
|
investAssetMoney = originalAssetMoney
|
|
|
|
|
remainCashMoney = originalCashMoney
|
2024-03-03 22:15:35 +08:00
|
|
|
inverstAssetAmount = dealAmount
|
2023-10-31 12:29:56 +08:00
|
|
|
boolInited = True
|
|
|
|
|
Log(f"use ${investAssetMoney} buy {inverstAssetAmount} asset at price ${price} at time {openTimeStr}")
|
|
|
|
|
|
|
|
|
|
Log(f"{i} summary:")
|
|
|
|
|
originalTotalMoney = originalAssetMoney + originalCashMoney
|
|
|
|
|
investAssetMoney = inverstAssetAmount * price
|
|
|
|
|
currentTotalMoney = investAssetMoney + remainCashMoney
|
|
|
|
|
Log(f"originalAssetMoney: ${originalAssetMoney}")
|
|
|
|
|
Log(f"originalCashMoney: ${originalCashMoney}")
|
|
|
|
|
Log(f"originalTotalMoney: ${originalTotalMoney}")
|
|
|
|
|
Log(f"inverstAssetAmount: ${inverstAssetAmount}")
|
|
|
|
|
Log(f"investAssetMoney: ${investAssetMoney}")
|
|
|
|
|
Log(f"remainCashMoney: ${remainCashMoney}")
|
|
|
|
|
Log(f"currentTotalMoney: ${currentTotalMoney}")
|
|
|
|
|
# account = exchange.GetAccount()
|
|
|
|
|
# Log("Balance:", account["Balance"], "FrozenBalance:", account["FrozenBalance"], "Stocks:", account["Stocks"], "FrozenStocks:", account["FrozenStocks"])
|
|
|
|
|
|
|
|
|
|
# 买入
|
|
|
|
|
money = inverstAssetAmount * price # pirce
|
|
|
|
|
if money < originalAssetMoney * (1 - buyRatio):
|
|
|
|
|
money = originalAssetMoney * buyRatio / 2 # 买入金额
|
2024-03-03 22:15:35 +08:00
|
|
|
account = exchange.GetAccount()
|
|
|
|
|
if remainCashMoney > money and account["Balance"] > money: # 判断是否还有足够的现金,双重检查
|
|
|
|
|
# amount = money / price
|
2023-10-31 12:29:56 +08:00
|
|
|
id = exchange.Buy(-1, money) # 市价单
|
|
|
|
|
# Log("order id:", id)
|
|
|
|
|
order = exchange.GetOrder(id)
|
2024-03-03 22:15:35 +08:00
|
|
|
Log("buy money:", money)
|
2023-10-31 12:29:56 +08:00
|
|
|
Log("order id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:", order["DealAmount"], "AvgPrice:", order["AvgPrice"], "Status:", order["Status"], "Type:", order["Type"])
|
2024-03-03 22:15:35 +08:00
|
|
|
money = order["Amount"] # 成交的money
|
|
|
|
|
dealAmount = order["DealAmount"] # 已扣除手续费的资产数量
|
2023-10-31 12:29:56 +08:00
|
|
|
price = order["AvgPrice"] # 成交均价
|
|
|
|
|
originalAssetMoney -= money #
|
|
|
|
|
originalCashMoney -= money #
|
|
|
|
|
remainCashMoney -= money
|
2024-03-03 22:15:35 +08:00
|
|
|
inverstAssetAmount = inverstAssetAmount + dealAmount
|
|
|
|
|
Log(f"bull/bear buy {dealAmount} asset at ${price} at time {openTimeStr}")
|
2023-10-31 12:29:56 +08:00
|
|
|
|
|
|
|
|
Log(f"{i} summary:")
|
|
|
|
|
originalTotalMoney = originalAssetMoney + originalCashMoney
|
|
|
|
|
investAssetMoney = inverstAssetAmount * price
|
|
|
|
|
currentTotalMoney = investAssetMoney + remainCashMoney
|
|
|
|
|
Log(f"originalAssetMoney: ${originalAssetMoney}")
|
|
|
|
|
Log(f"originalCashMoney: ${originalCashMoney}")
|
|
|
|
|
Log(f"originalTotalMoney: ${originalTotalMoney}")
|
|
|
|
|
Log(f"inverstAssetAmount: ${inverstAssetAmount}")
|
|
|
|
|
Log(f"investAssetMoney: ${investAssetMoney}")
|
|
|
|
|
Log(f"remainCashMoney: ${remainCashMoney}")
|
|
|
|
|
Log(f"currentTotalMoney: ${currentTotalMoney}")
|
|
|
|
|
# account = exchange.GetAccount()
|
|
|
|
|
#Log("Balance:", account["Balance"], "FrozenBalance:", account["FrozenBalance"], "Stocks:", account["Stocks"], "FrozenStocks:", account["FrozenStocks"])
|
|
|
|
|
|
2024-03-03 22:15:35 +08:00
|
|
|
# 卖出
|
|
|
|
|
money = inverstAssetAmount * price # pirce
|
|
|
|
|
if money > (originalAssetMoney * (1 + sellRatio)):
|
|
|
|
|
money = originalAssetMoney * sellRatio / 2 # 卖出金额
|
|
|
|
|
amount = money / price
|
|
|
|
|
id = exchange.Sell(-1, amount) # 市价单
|
|
|
|
|
# Log("order id:", id)
|
|
|
|
|
order = exchange.GetOrder(id)
|
|
|
|
|
Log("sell money:", money)
|
|
|
|
|
Log("sell amount:", amount)
|
|
|
|
|
Log("order id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:", order["DealAmount"], "AvgPrice:", order["AvgPrice"], "Status:", order["Status"], "Type:", order["Type"])
|
|
|
|
|
amount = order["Amount"] # 计划卖出资产数量
|
|
|
|
|
dealAmount = order["DealAmount"] # 成交资产数量,这里好像是从balance扣除的手续费吗?
|
|
|
|
|
# 从日志来看amount == dealAmount,所以手续费是从balance扣除的
|
|
|
|
|
price = order["AvgPrice"] # 成交均价
|
|
|
|
|
dealMoney = dealAmount * price # 未扣除手续费
|
|
|
|
|
remainCashMoney += dealMoney # 这里需要减去手续费
|
|
|
|
|
originalAssetMoney += money #
|
|
|
|
|
originalCashMoney += money #
|
|
|
|
|
inverstAssetAmount = inverstAssetAmount - dealAmount
|
|
|
|
|
Log(f"bull/bear sell {amount} asset at ${price} at time {openTimeStr}")
|
|
|
|
|
|
|
|
|
|
Log(f"{i} summary:")
|
|
|
|
|
originalTotalMoney = originalAssetMoney + originalCashMoney
|
|
|
|
|
investAssetMoney = inverstAssetAmount * price
|
|
|
|
|
currentTotalMoney = investAssetMoney + remainCashMoney
|
|
|
|
|
Log(f"originalAssetMoney: ${originalAssetMoney}")
|
|
|
|
|
Log(f"originalCashMoney: ${originalCashMoney}")
|
|
|
|
|
Log(f"originalTotalMoney: ${originalTotalMoney}")
|
|
|
|
|
Log(f"inverstAssetAmount: ${inverstAssetAmount}")
|
|
|
|
|
Log(f"investAssetMoney: ${investAssetMoney}")
|
|
|
|
|
Log(f"remainCashMoney: ${remainCashMoney}")
|
|
|
|
|
Log(f"currentTotalMoney: ${currentTotalMoney}")
|
|
|
|
|
# account = exchange.GetAccount()
|
|
|
|
|
# Log("Balance:", account["Balance"], "FrozenBalance:", account["FrozenBalance"], "Stocks:", account["Stocks"], "FrozenStocks:", account["FrozenStocks"])
|
|
|
|
|
|
|
|
|
|
# tick计数
|
2023-10-31 12:29:56 +08:00
|
|
|
i = i + 1
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
Log(totalInvestment, buyRatio, sellRatio)
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
onTick()
|
|
|
|
|
Sleep(1000) # 1秒
|
|
|
|
|
|
|
|
|
|
def onexit():
|
|
|
|
|
global inverstAssetAmount
|
|
|
|
|
|
|
|
|
|
# 清仓
|
|
|
|
|
Log("清仓")
|
|
|
|
|
if inverstAssetAmount > 0:
|
2024-03-03 22:15:35 +08:00
|
|
|
amount = num_cut(inverstAssetAmount * (1-0.0001), 8) # 留0.01%一丢丢,小数位控制
|
2023-10-31 12:29:56 +08:00
|
|
|
id = exchange.Sell(-1, amount) # 市价单
|
|
|
|
|
Log("order id:", id)
|
|
|
|
|
order = exchange.GetOrder(id)
|
|
|
|
|
Log("order id:", order["Id"], "Price:", order["Price"], "Amount:", order["Amount"], "DealAmount:", order["DealAmount"], "AvgPrice:", order["AvgPrice"], "Status:", order["Status"], "Type:", order["Type"])
|
|
|
|
|
# 倒计时
|
|
|
|
|
beginTime = time.time() * 1000
|
|
|
|
|
while True:
|
|
|
|
|
ts = time.time() * 1000
|
|
|
|
|
Log("程序停止倒计时...,已经过去:", (ts - beginTime) / 1000, "秒!")
|
|
|
|
|
Sleep(1000) # 1秒
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
> Detail
|
|
|
|
|
|
|
|
|
|
https://www.fmz.com/strategy/425193
|
|
|
|
|
|
|
|
|
|
> Last Modified
|
|
|
|
|
|
2024-03-03 22:15:35 +08:00
|
|
|
2024-01-04 13:48:44
|