版主及各位py高手节日愉快
有个问题想垂询:
在图表交易下,信号和指标能够一一对应,但用py做交易系统,调用同样指标,信号和指标不能够对应,不知是软件问题,还是我编的有问题,谢谢各位。
下面是具体的指标和系统:
指标:
均线交叉
input:a(5),b(15),n(20);
MYKD:CROSS(MA(C,a),MA(C,b)),LINETHICK3; //开多条件
MYPD:CROSS(MA(C,n),MA(C,a)); //平多条件
MYKK:CROSS(MA(C,b),MA(C,a)),LINETHICK3; //开空条件
MYPK:CROSS(MA(C,a),MA(C,n)); //平空条件
pel交易系统
input:a(5),b(15),n(20);
KD:=CROSS(MA(C,a),MA(C,b)); //开多条件
PD:=CROSS(MA(C,n),MA(C,a)); //平多条件
KK:=CROSS(MA(C,b),MA(C,a)); //开空条件
PK:=CROSS(MA(C,a),MA(C,n)); //平空条件
开多:BUY(KD AND HOLDING=0,1,LIMITR,C); //开多信号
平多:SELL(PD,1,LIMITR,C); //平多信号
开空:BUYSHORT(KK AND HOLDING=0,1,LIMITR,C); //开空信号
平空:SELLSHORT(PK,1,LIMITR,C); //平空信号
py交易系统
from PythonApi import *
def init(context):
# 在context中保存全局变量
context.s1 = "IF00" #
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
pass
def handle_bar(context):
# 开始编写你的主要的算法逻辑
mr=get_indicator('IF00','均线交叉','MYKD', '5,15,20','1d',30)
mc=get_indicator('IF00','均线交叉','MYKK', '5,15,20','1d',30)
pd=get_indicator('IF00','均线交叉','MYPD', '5,15,20','1d',30)
pk=get_indicator('IF00','均线交叉','MYPK', '5,15,20','1d',30)
portfolio=get_portfolio('IF00',0) #获取持仓量
if mr[-1]==1 and portfolio.buy_quantity==0 and portfolio.sell_quantity==0: # 开多成立并持仓为0
buy_open('IF00', "ThisClose",0,1) # 开多1手
if pd[-1]==1 and portfolio.buy_quantity==1:
sell_close('IF00',"ThisClose",0,1)
if mc[-1]==1 and portfolio.sell_quantity==0 and portfolio.buy_quantity==0: # 开空成立并持仓为0
sell_open('IF00', "ThisClose",0,1) # 开空1手
if pk[-1]==1 and portfolio.sell_quantity==1:
buy_close('IF00',"ThisClose",0,1)
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
pass
更有意思的是,如果把py中调用pel指标中的指标线名随便改掉,居然也能有回测结果。例如改为如下:
mr=get_indicator('IF00','均线交叉','MMYKD', '5,15,20','1d',30)
mc=get_indicator('IF00','均线交叉','MMYKK', '5,15,20','1d',30)
pd=get_indicator('IF00','均线交叉','MMYPD', '5,15,20','1d',30)
pk=get_indicator('IF00','均线交叉','MMYPK', '5,15,20','1d',30)
MMYKD,MMYKK,MMYPD,MMYPK,这四条指标线名在指标”均线交叉“ 中其实并不存在。谢谢!
代码里print输出下引用过来的指标的值,看下差别在哪
另外可以试下指标定义close这种简单的价格,看下正确否
一楼已经发了
pel指标:
均线交叉
input:a(5),b(15),n(20);
MYKD:CROSS(MA(C,a),MA(C,b)),LINETHICK3; //开多条件
MYPD:CROSS(MA(C,n),MA(C,a)); //平多条件
MYKK:CROSS(MA(C,b),MA(C,a)),LINETHICK3; //开空条件
MYPK:CROSS(MA(C,a),MA(C,n)); //平空条件
pel交易系统:
input:a(5),b(15),n(20);
KD:=CROSS(MA(C,a),MA(C,b)); //开多条件
PD:=CROSS(MA(C,n),MA(C,a)); //平多条件
KK:=CROSS(MA(C,b),MA(C,a)); //开空条件
PK:=CROSS(MA(C,a),MA(C,n)); //平空条件
开多:BUY(KD AND HOLDING=0,1,LIMITR,C); //开多信号
平多:SELL(PD,1,LIMITR,C); //平多信号
开空:BUYSHORT(KK AND HOLDING=0,1,LIMITR,C); //开空信号
平空:SELLSHORT(PK,1,LIMITR,C); //平空信号
py交易系统:
from PythonApi import *
def init(context):
# 在context中保存全局变量
context.s1 = "IF00" #
# before_trading此函数会在每天基准合约的策略交易开始前被调用,当天只会被调用一次。--(选择实现)
def before_trading(context):
pass
def handle_bar(context):
# 开始编写你的主要的算法逻辑
mr=get_indicator('IF00','均线交叉','MYKD', '5,15,20','1d',30)
mc=get_indicator('IF00','均线交叉','MYKK', '5,15,20','1d',30)
pd=get_indicator('IF00','均线交叉','MYPD', '5,15,20','1d',30)
pk=get_indicator('IF00','均线交叉','MYPK', '5,15,20','1d',30)
portfolio=get_portfolio('IF00',0) #获取持仓量
if mr[-1]==1 and portfolio.buy_quantity==0 and portfolio.sell_quantity==0: # 开多成立并持仓为0
buy_open('IF00', "ThisClose",0,1) # 开多1手
if pd[-1]==1 and portfolio.buy_quantity==1:
sell_close('IF00',"ThisClose",0,1)
if mc[-1]==1 and portfolio.sell_quantity==0 and portfolio.buy_quantity==0: # 开空成立并持仓为0
sell_open('IF00', "ThisClose",0,1) # 开空1手
if pk[-1]==1 and portfolio.sell_quantity==1:
buy_close('IF00',"ThisClose",0,1)
# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
pass
我这边没有问题。
建议python的问题,客户一定要学会去print调试,这种相对pel底层的你必须要自己去调试

此主题相关图片如下:1557108770(1).jpg