dev
This commit is contained in:
106
holdings.py
Normal file
106
holdings.py
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# coding:gbk
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
account = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||||
|
# 全局变量用于跟踪已触发9%盈利的持仓
|
||||||
|
triggered_positions = {}
|
||||||
|
def init(ContextInfo):
|
||||||
|
# 设置对应的资金账号
|
||||||
|
ContextInfo.set_account(account)
|
||||||
|
holdings = ContextInfo.get_holdings()
|
||||||
|
|
||||||
|
def account_callback(ContextInfo, accountInfo):
|
||||||
|
print(show_data(accountInfo))
|
||||||
|
|
||||||
|
def show_data(data):
|
||||||
|
tdata = {}
|
||||||
|
for ar in dir(data):
|
||||||
|
if ar[:2] != 'm_':continue
|
||||||
|
try:
|
||||||
|
tdata[ar] = data.__getattribute__(ar)
|
||||||
|
except:
|
||||||
|
tdata[ar] = '<CanNotConvert>'
|
||||||
|
return tdata
|
||||||
|
|
||||||
|
def quote_callback(ContextInfo, quote_info):
|
||||||
|
"""行情数据更新回调"""
|
||||||
|
current_time = datetime.datetime.now()
|
||||||
|
|
||||||
|
# 只在交易时间内执行
|
||||||
|
if current_time.hour >= 9 and current_time.hour < 15:
|
||||||
|
# 从行情信息中提取symbol和当前价格
|
||||||
|
symbol = quote_info.m_symbol # 假设行情数据包含股票代码
|
||||||
|
current_price = quote_info.m_last_price # 假设行情数据包含最新价格
|
||||||
|
|
||||||
|
# 调用检查函数,传入当前行情价格
|
||||||
|
check_and_sell_positions_with_price(ContextInfo, symbol, current_price)
|
||||||
|
|
||||||
|
def check_and_sell_positions_with_price(ContextInfo, symbol, current_price):
|
||||||
|
"""带行情价格的持仓检查函数"""
|
||||||
|
holdings = ContextInfo.get_holdings()
|
||||||
|
current_time = datetime.datetime.now()
|
||||||
|
today = current_time.date()
|
||||||
|
|
||||||
|
# 只处理指定股票
|
||||||
|
if symbol in holdings:
|
||||||
|
position = holdings[symbol]
|
||||||
|
|
||||||
|
# 获取持仓的开仓日期
|
||||||
|
open_date = getattr(position, 'm_open_date', None)
|
||||||
|
|
||||||
|
# 跳过今日开仓的股票
|
||||||
|
if open_date and open_date.date() == today:
|
||||||
|
print(f"股票 {symbol} 为今日开仓,跳过监控")
|
||||||
|
return
|
||||||
|
|
||||||
|
cost_basis = position.m_cost_price
|
||||||
|
quantity = position.m_quantity
|
||||||
|
|
||||||
|
# 计算当前盈利率
|
||||||
|
profit_pct = calculate_profit_percentage(current_price, cost_basis)
|
||||||
|
|
||||||
|
# 如果盈利达到9%,开始监控
|
||||||
|
if profit_pct >= 9:
|
||||||
|
if symbol not in triggered_positions:
|
||||||
|
# 首次触发9%盈利,记录最高价和时间
|
||||||
|
triggered_positions[symbol] = {
|
||||||
|
'new_price': current_price,
|
||||||
|
'trigger_time': current_time,
|
||||||
|
'cost_basis': cost_basis,
|
||||||
|
'quantity': quantity
|
||||||
|
}
|
||||||
|
print(f"股票 {symbol} 盈利达到9%,开始监控,当前价格: {current_price}")
|
||||||
|
else:
|
||||||
|
# 更新最高价
|
||||||
|
if current_price > triggered_positions[symbol]['new_price']:
|
||||||
|
triggered_positions[symbol]['new_price'] = current_price
|
||||||
|
triggered_positions[symbol]['trigger_time'] = current_time
|
||||||
|
print(f"股票 {symbol} 刷新最高价: {current_price}")
|
||||||
|
|
||||||
|
# 检查是否需要平仓(从最高点回撤)
|
||||||
|
last_price = triggered_positions[symbol]['new_price']
|
||||||
|
drawdown_pct = ((last_price - current_price) / last_price) * 100
|
||||||
|
|
||||||
|
# 当回撤达到一定比例时平仓(例如0.5%回撤)
|
||||||
|
if drawdown_pct >= 0.5:
|
||||||
|
print(f"股票 {symbol} 从最高点回撤 {drawdown_pct:.2f}%,执行平仓")
|
||||||
|
ContextInfo.place_order(symbol, 'SELL', quantity, current_price)
|
||||||
|
# 移除已平仓的持仓
|
||||||
|
del triggered_positions[symbol]
|
||||||
|
else:
|
||||||
|
# 如果盈利低于9%,且之前被监控过,则移除监控
|
||||||
|
if symbol in triggered_positions:
|
||||||
|
print(f"股票 {symbol} 盈利回落至 {profit_pct:.2f}%,取消监控")
|
||||||
|
del triggered_positions[symbol]
|
||||||
|
|
||||||
|
def calculate_profit_percentage(current_price, cost_basis):
|
||||||
|
return ((current_price - cost_basis) / cost_basis) * 100
|
||||||
|
|
||||||
|
def get_current_price(symbol):
|
||||||
|
# 这里需要实现获取实时价格的逻辑
|
||||||
|
# 可能需要调用QMT的行情接口
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 计算持仓盈利率
|
||||||
|
def calculate_profit_percentage(current_price, cost_basis):
|
||||||
|
return ((current_price - cost_basis) / cost_basis) * 100
|
||||||
Reference in New Issue
Block a user