Rss & SiteMap

金字塔客服中心 - 专业程序化交易软件提供商 http://www.weistock.com/bbs/

专业程序化软件提供商
共46 条记录, 每页显示 10 条, 页签: [1] [2][3][4][5]
[浏览完整版]

标题:请教止盈止损后排斥同方向开仓的问题

1楼
uheart 发表于:2013/10/24 9:34:15

又来麻烦老师了,实在过意不去。

以下是30分钟突破的代码和止盈止损。我想在里面加止盈止损后同方向不再开仓的条件(比如在上线多单止损后,今日不再开多单),学生不知如何编写。

恳请老师指点(_ _)

 

 

input:ss(1,1,100,1),nmin1(30,1,100,1),nmin2(1,1,100,1),n1(0,0,100,1),,n2(22,1,60,1),n3(13,10,20,1),n4(59,1,80,1);
N:=barslast(date<>ref(date,1))+1;
开盘30分钟最高价:=valuewhen(time<=090000+nmin1*100,hhv(h,n));
开盘30分钟最低价:=valuewhen(time<=090000+nmin1*100,llv(l,n));
上轨:开盘30分钟最高价+n1*mindiff;
下轨:开盘30分钟最低价-N1*mindiff;

 

//条件
开多条件:=cross(c,上轨);
开空条件:=cross(下轨,c);
t1:=time>091500+nmin2*100 and time<151000;
t2:=time=151300;

 

 

//交易系统

VARIABLE:DUOKONG=0;
TSFS:=0;     {停损反手,1-反手 0-不反手}
开仓手数:=ss;     {开仓手数}
ZSDS:=n4/100;     {止损百分比}
//以下变量用于移动止盈
VARIABLE:YDZY=1;     {移动止盈总开关,1为开,0为关}
VARIABLE:HIGHPRICE=0,LOWPRICE=0; {保存开仓后的最高价、最低价}
VARIABLE:DHCDS=n2/100,KHCDS=n2/100;   {多、空单回撤百分比}
VARIABLE:DYLDS=n3,KYLDS=n3;   {多、空单盈利点数,当盈利点数达到这个标准后,如果回撤达到上面的参数值百分比就平仓}
VARIABLE:Z3B1:=0;     {赚3保1开关}
DUOKONG:=1;

//持有空单
IF HOLDING<0 THEN BEGIN
 IF t2 THEN BEGIN   //平空单
  空平:SELLSHORT(1,0,market),ORDERQUEUE;
 END
 
 //止损59%
 IF (C-ENTERPRICE)/ENTERPRICE*100>=ZSDS THEN BEGIN
  空损:SELLSHORT(1,0,market),ORDERQUEUE;
 END
 
 //空单移动止盈
 IF YDZY=1 THEN BEGIN
  //每周期判断是否创新低
  IF L<LOWPRICE THEN BEGIN
   LOWPRICE:=L;
  END
 
  //如果盈利超过10点之后回撤达到22%,就平仓,保住盈利
  IF ENTERPRICE-LOWPRICE>=KYLDS THEN BEGIN
   IF (L-LOWPRICE)/LOWPRICE*100>=KHCDS THEN BEGIN  //回撤超过的百分比
    空赢:SELLSHORT(1,0,MARKET);
   END
  END
 END
 
 //赚3保1
 IF Z3B1=1 THEN BEGIN
  IF ENTERPRICE-LOWPRICE>=3 THEN BEGIN
   IF ENTERPRICE-L<=1.2 THEN BEGIN
    空保:SELLSHORT(1,0,MARKET);
   END
  END
 END
END

//开多单
IF HOLDING=0 THEN BEGIN
 IF DUOKONG=1 OR DUOKONG=2 THEN BEGIN
  IF 开多条件 and t1 THEN BEGIN
   多开:BUY(1=1,ss,market);
   HIGHPRICE:=ENTERPRICE;  //将开仓价保存到最高价
  END
 END
END

//持有多单
IF HOLDING>0 THEN BEGIN
 IF t2 THEN BEGIN  {平多单}
  多平:SELL(1,0,market),ORDERQUEUE;
 END
 
 //多单管理
 //多单止损
 IF (ENTERPRICE-C)/ENTERPRICE*100>=ZSDS THEN BEGIN
  多损:SELL(1,0,market),ORDERQUEUE;
 END
 
 //多单移动止盈
 IF YDZY=1 THEN BEGIN
  //每周期判断是否创新高
  IF H>HIGHPRICE THEN BEGIN
   HIGHPRICE:=H;
  END
 
  //如果盈利超过10点之后回撤达到22%,就平仓,保住盈利
  IF HIGHPRICE-ENTERPRICE>=DYLDS THEN BEGIN
   IF (HIGHPRICE-H)/HIGHPRICE*100>=DHCDS THEN BEGIN  //回撤超过22%
    多赢:SELL(1,0,MARKET);
   END
  END
 END
 
 //赚3保1
 IF Z3B1=1 THEN BEGIN
  IF HIGHPRICE-ENTERPRICE>=3 THEN BEGIN
   IF H-ENTERPRICE<=1.2 THEN BEGIN
    多保:SELL(1,0,MARKET);
   END
  END
 END
END

//开空单
IF HOLDING=0 THEN BEGIN
 IF DUOKONG=1 OR DUOKONG=3 THEN BEGIN
  IF 开空条件 and t1 THEN BEGIN
   空开:BUYSHORT(1=1,ss,market);
   LOWPRICE:=ENTERPRICE;
  END
 END
END

 

2楼
jinzhe 发表于:2013/10/24 9:49:05

需要用全局变量来限定开平状态,思路如下:

 

 

1.策略最开头添加代码

   variable:kaiguan_duo=0;//多头开关

   variable:kaiguan_kong=0;//空头开关

 

2.所有的止盈止损代码添加对全局变量的赋值以及判断,全局变量的赋值写在平仓语句之后,比如:

  ①

  空头添加开关

  //止损59%
   IF (C-ENTERPRICE)/ENTERPRICE*100>=ZSDS  and kaiguan_kong=0 THEN BEGIN
     空损:SELLSHORT(1,0,market),ORDERQUEUE;

     kaiguan_kong:=1;
   END
  ②

  多头添加开关

  //持有多单
  IF HOLDING>0 and kaiguan_duo=0 THEN BEGIN
    IF t2 THEN BEGIN  {平多单}
      多平:SELL(1,0,market),ORDERQUEUE;

      kaiguan_duo:=1;
  END

 

  其他的多空头止盈止损不做重复的讲解,按照上面的处理即可

 

3.策略最后面添加代码

  if time=closetime(0) then begin

    kaiguan_duo:=0;

    kaiguan_kong:=0;

  end

[此贴子已经被作者于2013/10/24 9:49:50编辑过]
3楼
uheart 发表于:2013/10/24 10:03:51

还是有点不懂,可以麻烦老师写个简单实例吗?

4楼
uheart 发表于:2013/10/24 10:06:35
我先摸索一下,多谢老师!
5楼
uheart 发表于:2013/10/24 10:44:13

加上去了,测试也通过。非常感谢!

。。不过又出现个问题,图表的时候线缩得不成样子了。不知道哪里错了,求救!

 

input:ss(1,1,100,1),nmin1(41,1,100,1),nmin2(1,1,100,1),n1(0,0,100,1),,n2(22,1,60,1),n3(13,10,20,1),n4(59,1,80,1);
N:=barslast(date<>ref(date,1))+1;
开盘30分钟最高价:=valuewhen(time<=090000+nmin1*100,hhv(h,n));
开盘30分钟最低价:=valuewhen(time<=090000+nmin1*100,llv(l,n));
上轨:开盘30分钟最高价+n1*mindiff;
下轨:开盘30分钟最低价-N1*mindiff;

 

//条件
开多条件:=h>上轨;
开空条件:=l<下轨;
t1:=time>091500+nmin2*100 and time<151000;
t2:=time=151300;

 

//交易系统

VARIABLE:DUOKONG=0;
variable:kaiguan_duo=0;//多头开关
variable:kaiguan_kong=0;//空头开关

TSFS:=0;     {停损反手,1-反手 0-不反手}
开仓手数:=ss;     {开仓手数}
ZSDS:=n4/100;     {止损百分比}


//以下变量用于移动止盈
VARIABLE:YDZY=1;     {移动止盈总开关,1为开,0为关}
VARIABLE:HIGHPRICE=0,LOWPRICE=0; {保存开仓后的最高价、最低价}
VARIABLE:DHCDS=n2/100,KHCDS=n2/100;   {多、空单回撤百分比}
VARIABLE:DYLDS=n3,KYLDS=n3;   {多、空单盈利点数,当盈利点数达到这个标准后,如果回撤达到上面的参数值百分比就平仓}
VARIABLE:Z3B1:=0;     {赚3保1开关}
DUOKONG:=1;

 

//持有空单
IF HOLDING<0 THEN BEGIN
 IF t2 THEN BEGIN   //平空单
  空平:SELLSHORT(1,0,market),ORDERQUEUE;
 END
 
 //止损59%
 IF (C-ENTERPRICE)/ENTERPRICE*100>=ZSDS and kaiguan_kong=0 THEN BEGIN
  空损:SELLSHORT(1,0,market),ORDERQUEUE;
  kaiguan_kong:=1;
 END
 
 //空单移动止盈
 IF YDZY=1 THEN BEGIN
  //每周期判断是否创新低
  IF L<LOWPRICE THEN BEGIN
   LOWPRICE:=L;
  END
 
  //如果盈利超过10点之后回撤达到22%,就平仓,保住盈利
  IF ENTERPRICE-LOWPRICE>=KYLDS THEN BEGIN
   IF (L-LOWPRICE)/LOWPRICE*100>=KHCDS THEN BEGIN  //回撤超过的百分比
    空赢:SELLSHORT(1,0,MARKET);
   END
  END
 END
 
 //赚3保1
 IF Z3B1=1 THEN BEGIN
  IF ENTERPRICE-LOWPRICE>=3 THEN BEGIN
   IF ENTERPRICE-L<=1.2 THEN BEGIN
    空保:SELLSHORT(1,0,MARKET);
   END
  END
 END
END

 

//开多单
IF HOLDING=0 THEN BEGIN
 IF DUOKONG=1 OR DUOKONG=2 THEN BEGIN
  IF 开多条件 and t1 THEN BEGIN
   多开:BUY(1=1,ss,market);
   HIGHPRICE:=ENTERPRICE;  //将开仓价保存到最高价
  END
 END
END

 

//持有多单
IF HOLDING>0 THEN BEGIN
 IF t2 THEN BEGIN  {平多单}
  多平:SELL(1,0,market),ORDERQUEUE;
 END
 
 //多单管理
 //多单止损
 IF (ENTERPRICE-C)/ENTERPRICE*100>=ZSDS and kaiguan_duo=0 THEN BEGIN
  多损:SELL(1,0,market),ORDERQUEUE;
  kaiguan_duo=1;
 END
 
 //多单移动止盈
 IF YDZY=1 THEN BEGIN
  //每周期判断是否创新高
  IF H>HIGHPRICE THEN BEGIN
   HIGHPRICE:=H;
  END
 
  //如果盈利超过10点之后回撤达到22%,就平仓,保住盈利
  IF HIGHPRICE-ENTERPRICE>=DYLDS THEN BEGIN
   IF (HIGHPRICE-H)/HIGHPRICE*100>=DHCDS THEN BEGIN  //回撤超过22%
    多赢:SELL(1,0,MARKET);
   END
  END
 END
 
 //赚3保1
 IF Z3B1=1 THEN BEGIN
  IF HIGHPRICE-ENTERPRICE>=3 THEN BEGIN
   IF H-ENTERPRICE<=1.2 THEN BEGIN
    多保:SELL(1,0,MARKET);
   END
  END
 END
END

 

//开空单
IF HOLDING=0 THEN BEGIN
 IF DUOKONG=1 OR DUOKONG=3 THEN BEGIN
  IF 开空条件 and t1 THEN BEGIN
   空开:BUYSHORT(1=1,ss,market);
   LOWPRICE:=ENTERPRICE;
  END
 END

END

 

 if time=closetime(0) then begin
    kaiguan_duo:=0;
    kaiguan_kong:=0;
  end


 


图片点击可在新窗口打开查看此主题相关图片如下:tm截图未命名.png
图片点击可在新窗口打开查看
6楼
jinzhe 发表于:2013/10/24 10:59:17

某些变量压缩了k线

 

你直接在 K线图Y轴 右键 勾选仅随k线变动

7楼
uheart 发表于:2013/10/24 11:21:06
感谢!
8楼
uheart 发表于:2013/10/24 12:34:26

还是不行呢,比如昨天的图形,开多止盈以后还是会同方向开仓,多单止盈以后如何可以禁止同方向开仓啊?请老师指点迷津!

 

代码和昨日图如下(红色为按老师的教程添加的代码,没有达到效果。)

 

input:ss(1,1,100,1),nmin1(41,1,100,1),nmin2(1,1,100,1),n1(0,0,100,1),,n2(22,1,60,1),n3(13,10,20,1),n4(59,1,80,1);
N:=barslast(date<>ref(date,1))+1;
开盘30分钟最高价:=valuewhen(time<=090000+nmin1*100,hhv(h,n));
开盘30分钟最低价:=valuewhen(time<=090000+nmin1*100,llv(l,n));
上轨:开盘30分钟最高价+n1*mindiff;
下轨:开盘30分钟最低价-N1*mindiff;

//条件
开多条件:=cross(c,上轨);
开空条件:=cross(下轨,c);
t1:=time>091500+nmin2*100 and time<151000;
t2:=time=151300;

//交易系统

VARIABLE:DUOKONG=0;
variable:kaiguan_duo=0;//多头开关
variable:kaiguan_kong=0;//空头开关

TSFS:=0;     {停损反手,1-反手 0-不反手}
开仓手数:=ss;     {开仓手数}
ZSDS:=n4/100;     {止损百分比}
//以下变量用于移动止盈
VARIABLE:YDZY=1;     {移动止盈总开关,1为开,0为关}
VARIABLE:HIGHPRICE=0,LOWPRICE=0; {保存开仓后的最高价、最低价}
VARIABLE:DHCDS=n2/100,KHCDS=n2/100;   {多、空单回撤百分比}
VARIABLE:DYLDS=n3,KYLDS=n3;   {多、空单盈利点数,当盈利点数达到这个标准后,如果回撤达到上面的参数值百分比就平仓}
VARIABLE:Z3B1:=0;     {赚3保1开关}
DUOKONG:=1;

//持有空单
IF HOLDING<0 THEN BEGIN
 IF t2 THEN BEGIN   //平空单
  空平:SELLSHORT(1,0,market),ORDERQUEUE;
 END
 
 //止损59%
 IF (C-ENTERPRICE)/ENTERPRICE*100>=ZSDS and kaiguan_kong=0 THEN BEGIN
  空损:SELLSHORT(1,0,market),ORDERQUEUE;
  kaiguan_kong:=1;
 END
 
 //空单移动止盈
 IF YDZY=1 THEN BEGIN
  //每周期判断是否创新低
  IF L<LOWPRICE THEN BEGIN
   LOWPRICE:=L;
  END
 
  //如果盈利超过10点之后回撤达到22%,就平仓,保住盈利
  IF ENTERPRICE-LOWPRICE>=KYLDS THEN BEGIN
   IF (L-LOWPRICE)/LOWPRICE*100>=KHCDS and kaiguan_kong=0 THEN BEGIN  //回撤超过的百分比
    空赢:SELLSHORT(1,0,MARKET);
    kaiguan_kong=1;
   END
  END
 END
 
 //赚3保1
 IF Z3B1=1 THEN BEGIN
  IF ENTERPRICE-LOWPRICE>=3 THEN BEGIN
   IF ENTERPRICE-L<=1.2 THEN BEGIN
    空保:SELLSHORT(1,0,MARKET);
   END
  END
 END
END

//开多单
IF HOLDING=0 THEN BEGIN
 IF DUOKONG=1 OR DUOKONG=2 THEN BEGIN
  IF 开多条件 and t1 THEN BEGIN
   多开:BUY(1=1,ss,market);
   HIGHPRICE:=ENTERPRICE;  //将开仓价保存到最高价
  END
 END
END

//持有多单
IF HOLDING>0 THEN BEGIN
 IF t2 THEN BEGIN  {平多单}
  多平:SELL(1,0,market),ORDERQUEUE;
 END
 
 //多单管理
 //多单止损
 IF (ENTERPRICE-C)/ENTERPRICE*100>=ZSDS and kaiguan_duo=0 THEN BEGIN
  多损:SELL(1,0,market),ORDERQUEUE;
  kaiguan_duo=1;
 END
 
 //多单移动止盈
 IF YDZY=1 THEN BEGIN
  //每周期判断是否创新高
  IF H>HIGHPRICE THEN BEGIN
   HIGHPRICE:=H;
  END
 
  //如果盈利超过10点之后回撤达到22%,就平仓,保住盈利
  IF HIGHPRICE-ENTERPRICE>=DYLDS THEN BEGIN
   IF (HIGHPRICE-H)/HIGHPRICE*100>=DHCDS and kaiguan_duo=0 THEN BEGIN  //回撤超过22%
    多赢:SELL(1,0,MARKET);
     kaiguan_duo=1;
   END
  END
 END
 
 //赚3保1
 IF Z3B1=1 THEN BEGIN
  IF HIGHPRICE-ENTERPRICE>=3 THEN BEGIN
   IF H-ENTERPRICE<=1.2 THEN BEGIN
    多保:SELL(1,0,MARKET);
   END
  END
 END
END

//开空单
IF HOLDING=0 THEN BEGIN
 IF DUOKONG=1 OR DUOKONG=3 THEN BEGIN
  IF 开空条件 and t1 THEN BEGIN
   空开:BUYSHORT(1=1,ss,market);
   LOWPRICE:=ENTERPRICE;
  END
 END
END

 if time=closetime(0) then begin
    kaiguan_duo:=0;
    kaiguan_kong:=0;
  end


图片点击可在新窗口打开查看此主题相关图片如下:tm截图未命名.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2013/10/24 12:35:39编辑过]
9楼
jinzhe 发表于:2013/10/24 13:02:56
这个止盈止损都要这样写
10楼
uheart 发表于:2013/10/24 13:09:57

是啊老师,怎么我写了还是没有效果,还是会同方向再次开仓的呢?现在是cross,如果是 h>上线 还要惨不忍睹。

可不可以麻烦老师帮忙修改一下?希望达到的效果是,当日开仓,止盈或者止损以后,同方向不再开仓了。

实在麻烦了。

共46 条记录, 每页显示 10 条, 页签: [1] [2][3][4][5]


Powered By Dvbbs Version 8.3.0
Processed in 0.04297 s, 3 queries.