以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  交易策略发布专区  (http://www.weistock.com/bbs/list.asp?boardid=10)
----  【另类策略】闪灵交易者策略  (http://www.weistock.com/bbs/dispbbs.asp?boardid=10&id=34050)

--  作者:RogarZ
--  发布时间:2012/12/26 13:25:58
--  【另类策略】闪灵交易者策略

闪灵交易者策略

The Ghost Trader Trading Stategy)

在交易中,特别是突破类模型,成功率并不高,若碰上反复的假突破,更是一种灾难。那有没有方法来减少这种情形的发生呢?本文介绍的闪灵交易者策略(The Ghost Trader Trading Stategy)为大家提供了一种方式。

闪灵交易者策略源自于交易者的观察,一些交易者从自己的交易记录中发现,若上一次交易是盈利的,那么下一笔交易是亏损的概率比较大。因此在设计策略时,希望能跳过这些我们认为会亏损的交易。具体到策略中,我们将引入模拟交易的概念(这个概念仅指此策略中代码部分,请勿与金字塔模拟交易混淆), 与之对应的是真实下单模块。模拟交易始终在运行交易条件。而真实下单模块直到上一笔模拟交易是亏损的情况下才执行。

本文的例子,将忠于原策略,建立在一个指数移动平均和RSI指标上。默认只考虑一次亏损的情况,周期为日线,运行模式为走完K线(在小周期运行此策略,效果更明显些)。

开多:9日收盘价指数平均大于等于19日最高价的指数平均并且9日收盘价的RSI指标下穿70

开空:9日收盘价指数平均小于19日最高价的指数平均并且9日收盘价的RSI指标上穿30

平多:最新价下穿20日低点。

平空:最新价上穿20日高点。

以上进出场点并不是这个策略的要点,重在如何记录模拟交易的状况,在金字塔软件中,我们将使用全局变量来构建这个部分。具体的见代码,我会多做些注释。若您完全理解后,移动止盈止损的代码也应不在话下。

代码:
//
策略:闪灵交易者系统
//
类型:
//
版本:1.0
//
修订时间:2012.11.24
//DESIGNED BY ROGARZ
//weibo:http://weibo.com/rogarwahoo

//
中间变量
INPUT:N1(9,1,100,1),SS(1,1,100);
VARIABLE:
该笔盈亏:=0;模拟持仓:=0,模拟开仓价:=0,模拟平仓价:=0,真实系统下单开关:=0;
LC := REF(CLOSE,1);
RSI:=SMA(MAX(CLOSE-LC,0),N1,1)/SMA(ABS(CLOSE-LC),N1,1)*100;//RSI
指标默认N19
9
日收盘价指数平均:REF(EMA(CLOSE,9),1);
19
日最高价收盘价平均:REF(EMA(HIGH,19),1);
20
日高点:=REF(HHV(H,20),1);
20
日低点:=REF(LLV(L,20),1);
手数:=SS;
//
交易条件
开多条件:=9日收盘价指数平均>=19日最高价收盘价平均 AND REF(RSI,1)<70;
开空条件:=9日收盘价指数平均<19日最高价收盘价平均 AND REF(RSI,1)>30;
平多条件:=C<20日低点;
平空条件:=C>=20日高点;


//
交易系统
//
模拟交易模块
IF
开多条件 AND 模拟持仓=0 THEN BEGIN
   
模拟开仓价:=CLOSE;//记录开仓价
   
模拟持仓:=1;//模拟持仓为1
END

IF 平多条件 AND 模拟持仓=1 THEN BEGIN
   
模拟平仓价:=CLOSE;//记录平仓价
   
该笔盈亏:=模拟平仓价-模拟开仓价;//在模拟交易模块中我们只需计算上一笔交易是赚还是亏,在这里我只计算盈亏最后的点数
   
模拟持仓:=0;//将全局变量*模拟持仓*初始化为0
   IF
该笔盈亏>0 THEN BEGIN
    
真实系统下单开关:=0;//0代表模拟交易上一笔是赚钱的。
    
模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
    
模拟平仓价:=0;//将全局变量*模拟开仓价*初始化为0
   END
   IF
该笔盈亏<=0 THEN BEGIN
    
真实系统下单开关:=1;//1代表模拟交易上一笔是亏钱的。
    
模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
    
模拟平仓价:=0;//将全局变量*模拟平仓价*初始化为0    
   END
 END
 
IF
开空条件 AND 模拟持仓=0 THEN BEGIN
   
模拟开仓价:=CLOSE;//记录开仓价
   
模拟持仓:=-1;//模拟持仓为-1
END

IF 平空条件 AND 模拟持仓=-1 THEN BEGIN
   
模拟平仓价:=CLOSE;//记录平仓价
   
该笔盈亏:=模拟开仓价-模拟平仓价;//在模拟交易模块中我们只需计算上一笔交易是赚还是亏,在这里我只计算盈亏最后的点数
   
模拟持仓:=0;//将全局变量*模拟持仓*初始化为0
   IF
该笔盈亏>0 THEN BEGIN
    
真实系统下单开关:=0;//0代表模拟交易上一笔是赚钱的。
    
模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
    
模拟平仓价:=0;//将全局变量*模拟开仓价*初始化为0
   END
   IF
该笔盈亏<=0 THEN BEGIN
    
真实系统下单开关:=1;//1代表模拟交易上一笔是亏钱的。
    
模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
    
模拟平仓价:=0;//将全局变量*模拟开仓价*初始化为0
   END
 END
 
//
真实下单模块 
平空:SELLSHORT(平空条件 AND HOLDING<0,手数,MARKET);
平多:SELL(平多条件 AND HOLDING>0,手数,MARKET);
开多:BUY(开多条件 AND 真实系统下单开关=1 AND HOLDING=0,手数,MARKET);
开空:BUYSHORT(开空条件 AND 真实系统下单开关=1 AND HOLDING=0,手数,MARKET);

 

       这个策略虽说是一个完整的策略,但个人觉得更像是一个模板。大家理解后,应很容易修改这个模板,任意发挥,默认只计算一次亏损策略的效果并不明显。若改成比如连亏3次后再交易的情形,交易次数和效果很明显。

 


--  作者:ackvz
--  发布时间:2012/12/26 17:13:51
--  
图片点击可在新窗口打开查看
--  作者:shy508
--  发布时间:2012/12/26 18:03:58
--  
图片点击可在新窗口打开查看
--  作者:翻手为云
--  发布时间:2013/1/9 22:28:20
--  感觉很实用,
我想把这个东西用在我的趋势模型里面,估计能效果会更好呵呵,
--  作者:gwczhwt
--  发布时间:2013/2/17 11:45:15
--  
rogarz老师,请问如果连亏3次才交易该怎么修改?
--  作者:RogarZ
--  发布时间:2013/2/18 9:53:24
--  
以下是引用gwczhwt在2013-2-17 11:45:15的发言:
rogarz老师,请问如果连亏3次才交易该怎么修改?

思路,在设个全局变量记录次数 然后判断 是否打开 真实系统下单开关

 

新增 全局变量 盈亏记录

 

   IF 该笔盈亏>0 THEN BEGIN
    盈亏记录:=0;
    真实系统下单开关:=0;//0代表模拟交易上一笔是赚钱的。
    模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
    模拟平仓价:=0;//将全局变量*模拟开仓价*初始化为0
   END
   IF 该笔盈亏<=0 THEN BEGIN
    if 盈亏记录=0 then 盈亏记录:=1;
    if 盈亏记录=1 then 盈亏记录:=2;
    if 盈亏记录>=2 then 盈亏记录:=3;
    if  盈亏记录=3 then 真实系统下单开关:=1

    模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
    模拟平仓价:=0;//将全局变量*模拟平仓价*初始化为0   
   END
 END


--  作者:free_chase
--  发布时间:2013/4/3 22:51:57
--  

这段代码我实在是不会理解。。。

 

 IF 该笔盈亏<=0 THEN BEGIN      \\\\代表这次模拟交易亏损
if 盈亏记录=0 then 盈亏记录:=1;    \\\\如果盈亏记录等于0,则盈亏记录等于1;
if 盈亏记录>=2 then 盈亏记录:=3;   \\\\这样推导下来,只要亏损一次,盈亏记录就可以等于3.
if 盈亏记录=3 then 真实系统下单开关:=1\\\\这段代码是不是有问题啊???

模拟开仓价:=0;//将全局变量*模拟开仓价*初始化为0
模拟平仓价:=0;//将全局变量*模拟平仓价*初始化为0
END

 

 


--  作者:dwjgwsm
--  发布时间:2013/4/4 21:56:01
--  
他这个应该用 

if 盈亏记录=0 then 
     盈亏记录:=1;
else
    if 盈亏记录=1 then 
    else
        盈亏记录:=2;
   ......
end

这样的来解决。
如果有vba 的 case语句就更明了了

--  作者:free_chase
--  发布时间:2013/4/5 23:33:29
--  

还是不太理解。。。

if 盈亏记录=0 then
盈亏记录:=1;
else
if 盈亏记录=1 then
//这里执行什么语句?能让程序再进行一次盈亏计算呢??
else
盈亏记录:=2;
......
end
求高手再指点下,谢谢。。。

--  作者:RogarZ
--  发布时间:2013/4/6 10:14:49
--  

上面的写的有问题,只是给个思路

 

如果 原来盈亏记录=0  那么赋值盈亏记录=1

如果 原来盈亏记录=1  那么赋值盈亏记录=2

如果 原来盈亏记录>=2  那么赋值盈亏记录=3

如果 原来盈亏记录=3  那么 真实下单开关=1 (0代表未启动,1代表启动)