# 基于Python的菲阿里四价策略

Author: Hukybo, Created: 2019-12-28 15:06:33, Updated: 2020-01-04 16:14:37

#### 策略逻辑

• 阻力线 = 昨日最高价
• 支撑线 = 昨日最低价

• 多头开仓：价格突破阻力线
• 空头开仓：价格突破支撑线

• 多头平仓：收盘前5分钟或达到多头止损线
• 空头平仓：收盘前5分钟或达到空头止损线

#### 策略编写

``````# 策略主函数
def onTick():
pass

# 程序入口
def main():
while True:  # 进入无限循环模式
onTick()  # 执行策略主函数
Sleep(1000)  # 休眠1秒
``````

``````import time  # 用于转换时间格式
``````

``````bar_arr = _C(exchange.GetRecords, PERIOD_D1)  # 获取日线数组
if len(bar_arr) < 2:  # 如果小于2根K线
return  # 返回继续等待数据
yesterday_high = bar_arr[-2]['High']  # 昨日最高价
yesterday_low = bar_arr[-2]['Low']  # 昨日最低价
yesterday_close = bar_arr[-2]['Close']  # 昨日收盘价
today_open = bar_arr[-1]['Open']  # 当日开盘价
``````

``````bar_arr = _C(exchange.GetRecords)  # 获取当前设置周期K线数组
current_time = bar_arr[-1]['Time']  # 获取当前K线时间戳
time_local = time.localtime(current_time / 1000)  # 处理时间戳
hour = int(time.strftime("%H", time_local))  # 格式化时间戳，并获取小时
minute = int(time.strftime("%M", time_local))  # 格式化时间戳，并获取分钟
current_close = bar_arr[-1]['Close']  # 获取最新价格
``````

``````def trade_time(hour, minute):
hour = str(hour)
minute = str(minute)
if len(minute) == 1:
minute = "0" + minute
return int(hour + minute)
``````

``````real_position = _C(exchange.GetPosition)  # 获取持仓数组
if len(real_position) > 0:  # 如果持仓数组长度大于0
real_position = real_position[0]
if real_position['ContractType'] == 'rb888':  # 如果持仓品种等于订阅品种
if real_position['Type'] == 0 or real_position['Type'] == 2:  # 如果是多单
mp = real_position['Amount']  # 赋值持仓为正数
elif real_position['Type'] == 1 or real_position['Type'] == 3:
mp = -real_position['Amount']  # 赋值持仓为负数
else:
mp = 0  # 赋值持仓为0
``````

GetPosition返回的是一个包含字典的一维数组：

``````# 例子
[{'MarginLevel': 16, 'Amount': 1.0, 'FrozenAmount': 0.0, 'Price': 3540.0, 'Profit': -30.0, 'Margin': 2124.0, 'Type': 0, 'ContractType': 'rb888'}]
``````

``````# 设置多头止损
if today_open / yesterday_high > 1.005:  # 如果当天开盘价大于昨天最高价
long_stop_loss = yesterday_high  # 设置多头止损价为昨天最高价
elif today_open / yesterday_high < 0.995:  # 如果当天开盘价小于昨天最高价
long_stop_loss = today_open  # 设置多头止损价为当天开盘价
else:  # 如果当天开盘价接近于昨天最高价
long_stop_loss = (yesterday_high + yesterday_low) / 2  # 设置多头止损为昨天中间价

# 设置空头止损
if today_open / yesterday_low < 0.995:  # 如果当天开盘价小于昨天最低价
short_stop_loss = yesterday_low  # 设置空头止损价为昨天最低价
elif today_open / yesterday_low > 1.005:  # 如果当天开盘价大于昨天最低价
short_stop_loss = today_open  # 设置空头止损价为当天开盘价
else:  # 如果当天开盘价接近于昨天最低价
short_stop_loss = (yesterday_high + yesterday_low) / 2  # 设置多头止损为昨天中间价
``````

``````if mp > 0:  # 如果当前持有多单
if current_close < long_stop_loss or trade_time(hour, minute) > 1450:  # 如果当前价格小于多头止损线，或者超过规定的交易时间
exchange.Sell(current_close - 1, 1)  # 平多单
if mp < 0:  # 如果当前持有空单
if current_close > short_stop_loss or trade_time(hour, minute) > 1450:  # 如果当前价格大于空头止损线，或者超过规定的交易时间
exchange.SetDirection("closesell")  # 设置交易方向和类型
exchange.Buy(current_close + 1, 1)  # 平空单
if mp == 0 and 930 < trade_time(hour, minute) < 1450:  # 如果当前无持仓，并且在规定的交易时间内
if current_close > yesterday_high:  # 如果当前价格大于昨天最高价
exchange.Buy(current_close + 1, 1)  # 开多单
elif current_close < yesterday_low:  # 如果价格小于昨天最低价
exchange.SetDirection("sell")  # 设置交易方向和类型
exchange.Sell(current_close - 1, 1)  # 开空单
``````

Related

More