> Name 子辰量化香农网格交易策略 > Author 子辰量化 > Strategy Arguments |Argument|Default|Description| |----|----|----| |totalInvestment|10000|总投资额| |buyRatio|0.02|下跌多少买入| |sellRatio|0.02|上涨多少卖出| > Source (python) ``` python ## # 香农网格交易策略(公开版) # Author: 子辰量化 # Last Modified: 2024-1-4 ## import time assetRatio = 0.5 # 资产投资比例 originalTotalMoney = totalInvestment # 基准投资额,总投资额+盈亏后的全部权益 originalAssetMoney = totalInvestment * assetRatio # 基准资产价值 originalCashMoney = totalInvestment * (1 - assetRatio) # 基准现金 remainCashMoney = originalCashMoney # 当前剩余现金 investAssetMoney = 0 # 当前资产价值 inverstAssetAmount = 0 # 当前资产数量 boolInited = False # 是否完成了首次建仓 i = 0 # tick计算 def num_cut(num, c): str_num = str(num) return float(str_num[:str_num.index('.') + 1 + c]) def onTick(): global assetRatio global originalTotalMoney 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: 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"] # 成交均价 investAssetMoney = originalAssetMoney remainCashMoney = originalCashMoney inverstAssetAmount = dealAmount 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 # 买入金额 account = exchange.GetAccount() if remainCashMoney > money and account["Balance"] > money: # 判断是否还有足够的现金,双重检查 # amount = money / price 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"] # 成交均价 originalAssetMoney -= money # originalCashMoney -= money # remainCashMoney -= money inverstAssetAmount = inverstAssetAmount + dealAmount Log(f"bull/bear buy {dealAmount} 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"]) # 卖出 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计数 i = i + 1 def main(): Log(totalInvestment, buyRatio, sellRatio) while True: onTick() Sleep(1000) # 1秒 def onexit(): global inverstAssetAmount # 清仓 Log("清仓") if inverstAssetAmount > 0: amount = num_cut(inverstAssetAmount * (1-0.0001), 8) # 留0.01%一丢丢,小数位控制 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-20 14:21:21