以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  图表程式化 用固定时间间隔模式止损 K线模式开仓怎么做  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=99885)

--  作者:smilingsome
--  发布时间:2016/6/30 15:42:00
--  图表程式化 用固定时间间隔模式止损 K线模式开仓怎么做
请问:开仓条件 建立在K线模型上(比如1分钟K线模型),止损条件 建立在1秒钟固定时间查询的程序怎么写?
举例:
I. 开多条件是这样编写的 - 基于一分钟K线图的 前后两根K线的比较;前为阴线 后为阳线 则开多
CONDBUY:= REF(CLOSE,1)< REF(OPEN,1) AND CLOSE > REF(OPEN,1) AND CLOSE-OPEN>=2; // 开多条件[看涨]
BUY(CONDBUY, 10, MARKET);
II. 止损条件是这样写的
PRICE:= (HIGH+LOW)/2; SELL(LOW < PRICE, 10, MARKET); // 止损价格= (HIGH+LOW)/2; 要求当价格跌破止损价时,立即平多

III. 需求:我需要每秒查询一次实时交易价格,如果加过跌破止损价立即平多。
IV. 问题:开多 是一分钟判断一次的;止损是每秒中判断一次的,这样的程序在 图标程式化交易中 怎么写? 如果图标程式化中无法写出,后台程式化怎么写?
可以给个简单的模板或范例吗?



--  作者:jinzhe
--  发布时间:2016/6/30 15:59:45
--  
CONDBUY:= REF(CLOSE,1)< REF(OPEN,1) AND CLOSE > REF(OPEN,1) AND CLOSE-OPEN>=2; // 开多条件[看涨]
BUY(ref(CONDBUY,1), 10, MARKET);
PRICE:= (HIGH+LOW)/2;
SELL(c< PRICE, 10, MARKET);
就这样写,1秒固定轮询模式

--  作者:smilingsome
--  发布时间:2016/7/5 9:40:49
--  [求助]如果用IF语句该怎么写

使用IF语句的原因是要设置一些条件:比如HAVEBUY标志以开多(以开多的情况下才能平多)

原句:

  IF CONDBUY AND HOLDING = 0 THEN
   BEGIN
    PRICE:=TEMP; // 设置多仓止损价格
    BUY(1, 10, MARKET); // 全部买入
    HAVEBUY:=1; // 以开多,为平多
   END

 

为保证按K线周期开多,改写为:

  IF REF(CONDBUY,1) AND HOLDING = 0 THEN
   BEGIN
    PRICE:=TEMP; // 设置多仓止损价格
    BUY(1, 10, MARKET); // 全部买入
    HAVEBUY:=1; // 以开多,为平多
   END

可以吗?


--  作者:jinzhe
--  发布时间:2016/7/5 9:55:29
--  
上面的办法是用固定时间的办法来实现走完k\'线,所以信号上是有偏移的,简单的可行。如果代码里面有赋值之类的就不行了,偏移了的信号,赋的值也和原来的不一样
--  作者:smilingsome
--  发布时间:2016/7/5 10:21:54
--  [求助]解决办法
---------------------------------------------------------------------------------------------------------------------------------- 上面的办法是用固定时间的办法来实现走完k\'线,所以信号上是有偏移的,简单的可行。如果代码里面有赋值之类的就不行了,偏移了的信号,赋的值也和原来的不一样 ---------------------------------------------------------------------------------------------------------------------------------- 看了一篇IF语句中不能使用REF函数的原因,好像理解的老师您的意思。 那 要实现这样的 复杂功能 接下来 应该怎么做呢?
--  作者:jinzhe
--  发布时间:2016/7/5 10:30:44
--  

IF CONDBUY AND HOLDING = 0 THEN
   BEGIN
    PRICE:=TEMP; // 设置多仓止损价格
        HAVEBUY:=1; // 以开多,为平多
   END

 

IF REF(CONDBUY,1) AND HOLDING = 0 THEN
   BEGIN
        BUY(1, 10, MARKET); // 全部买入
       END

 

差不多这样改,让赋值先执行,


--  作者:smilingsome
--  发布时间:2016/7/5 11:03:53
--  [求助]
{
模型说明:
1. 开盘后5分钟不做交易
2. 5分钟后,分为30秒,1分钟,2分钟,3分钟 4中参数进行测试
3. 若前一根实体为 >= 2价位的 阴线,后一根K线的 收盘价>前开盘价,而且 最高价 - 收盘价 <= 1个价位

符合以上条件,而在最后一秒内开仓做多
止损点:前一根K线的均值(最高+最低/2)交易触到此价位有成交的,即止损平仓(低了3个价位确保成交)
止盈点:在前一根出现实体>=2个价位的阴险末止盈

4. 若前一根实体为>=2个价位的阴线,后一个K线的收盘价<前开盘价,而且最低价-收盘价<=1个价位
,在最后一秒内开仓做空
5. 收盘前10分钟全部清仓,不再开仓交易

开多条件:前为阴线且实体>=2 AND 后为阳线 AND (阳线收盘价 - 阴线开盘价) > 0
止盈条件:开多之后遇到第一根阴线(跌幅>=2价位),且收盘价没有低过止损点,按收盘价成交
止损条件:开多之后遇到第一根阴线(跌幅>=2价位),且收盘价低过止损点,按不得低于止损点价格卖出(?)
开空条件: 前为阳线且实体>=2 AND 后为阴线 AND (阳线开盘价 - 阴线收盘价) > 0
止盈条件:开空之后遇到第一根阳线(涨幅>=2价位),且收盘价没有高过止损点,按收盘价成交
止损条件:开多之后遇到第一根阳线(涨幅>=2价位),且收盘价高过止损点,按不得高于止损点价格卖出(?)

5.一次买入卖出多少:
全部买入,全部卖出

6. 当日开仓后, 一定要当日平仓吗?
7. 止损时机
目标: 开仓后,价格(任意一次交易的价格)第一次触及止损价,按市价(止损价以及止损价15个单位区间,防止极端情况)卖出。
否则,即出现异常情况(比如:剧烈波动,暴跌或者暴涨等)时,暂停机器平仓,转为人工操作
8. 如何人工操作

注意事项:
1. 选择哪种交易图:交易量丰富,数据量饱满
2. 时间跨度问题
中午吃饭时间
3. 适用范围: 秒线,分钟线等,相邻K线连续的情况;不适用于日线等,相邻K线不连续的情况
4. 缺点:无法应对震荡的情形(价格反复上下波动)
}
// 0. 设置全局变量
VARIABLE: HAVEBUY=0; // 标记以开多,为平多
VARIABLE: HAVEBUYSHORT=0; // 标记以开空,未平空
VARIABLE: PRICE = 0; // 止损价格
CONDBUY:= REF(CLOSE,1)< REF(OPEN,1) AND CLOSE > REF(OPEN,1) AND CLOSE-OPEN>=2; // 开多条件[看涨] - OK
CONDBUYSHORT:= REF(CLOSE,1)> REF(OPEN,1) AND CLOSE < REF(OPEN,1) AND OPEN-CLOSE>=2; // 开空条件[看跌] - OK
CONDSELL:=HAVEBUY AND CLOSE < OPEN AND (OPEN - CLOSE) >=2 AND CLOSE >= PRICE; // 平多条件[止盈]
CONDSELLSHORT:=HAVEBUYSHORT AND CLOSE > OPEN AND (CLOSE - OPEN) >=2 AND CLOSE <= PRICE; // 平空条件[止盈]
止损价格: PRICE, COLORGREEN, LINETHICK1;
TEMP:=(REF(CLOSE,1)+REF(OPEN,1))/2; // TEMP = (CLOSE+OPEN/2) - 止损价位
IF TIME > 090500 AND TIME < 145000 THEN // 限制开盘30分钟后收盘前10分钟进行交易
BEGIN
// 止损条件 - 最高优先级
IF  HAVEBUY AND L < PRICE AND (PRICE - L) < 10 THEN // 开多后,监测何时止损
BEGIN
SELL(1, 100%, MARKET); // 全部卖出
MSGOUT(1,\'以SELL止损\');
HAVEBUY := 0;
END

IF HAVEBUYSHORT AND H > PRICE AND (H - PRICE) < 10 THEN // 开空后,监测何时止损
  BEGIN
  SELLSHORT(1, 100%, MARKET); // 全部卖出
  MSGOUT(1,\'以SELLOUT止损\');
  HAVEBUYSHORT := 0;
  END
  // 1. 平多条件(止盈)
  IF CONDSELL AND HOLDING > 0 THEN
  BEGIN
  SELL(1, 100%, MARKET); // 全部卖出
  MSGOUT(1,\'以平多\');
HAVEBUY := 0;
  END
 
  // 2. 平空条件(止盈)
  IF CONDSELLSHORT AND HOLDING < 0 THEN
  BEGIN
  SELLSHORT(1, 100%, MARKET); // 全部卖出
  MSGOUT(1,\'以平空\');
  HAVEBUYSHORT := 0;
  END
 
  // 3. 开多条件
  IF CONDBUY AND HOLDING = 0 THEN 
  BEGIN
  PRICE:=TEMP; // 设置多仓止损价格
  BUY(1, 100%, MARKET); // 全部买入
  MSGOUT(1,\'以开多\');
  HAVEBUY:=1; // 以开多,为平多
  END
// 4. 开空条件
  IF CONDBUYSHORT AND HOLDING = 0 THEN
  BEGIN  
  PRICE:=TEMP; // 设置空仓止损价格
  BUYSHORT(1, 100%, MARKET); // 全部卖出
  MSGOUT(1,\'以开空\');
  HAVEBUYSHORT:=1; // 以开空,未平空
  END
MSGOUT(1,\'运行测试\');
END
IF TIME > 145000 AND TIME < 150000 THEN
BEGIN
IF HAVEBUY THEN SELL(1, 100%, MARKET); 
IF HAVEBUYSHORT THEN SELLSHORT(1, 100%, MARKET);
END

// 输出资产
当前持仓:HOLDING,COLORGRAY,LINETHICK0;
当前资产:ASSET,NOAXIS,COLORGRAY;//输出当前资产,但不影响坐标最高最低值
}


老师,以上是我的全部代码,图表交易模型;问题就是 止损我不希望按照K线周期来,想按照固定时间轮询来,应该怎么做?

--  作者:jinzhe
--  发布时间:2016/7/5 11:05:15
--  
上面已经讲了,不要重复老问题
--  作者:smilingsome
--  发布时间:2016/7/5 15:25:36
--  
补充一个问题:
IF REF(CONDBUY,1) AND HOLDING = 0 THEN
BEGIN
BUY(1, 10, MARKET); // 全部买入
END

条件 REF(CONDBUY, 1) 改为 REF(CONDBUY,0) 可以吗?或者说为什么要是REF(CONDBUY, 1) ?


--  作者:jinzhe
--  发布时间:2016/7/5 15:27:42
--  

这样的作用是引用上一个周期的条件,当新的k线出现时,上一根k线的已经形成和定型的条件就会被引用到。

这样在就相当于在固定轮询的模式下,实现了走完k线下单,ref后面参数写0就表示用当前周期的条件,并没有用。