一 软件使用
1.1快捷键切换分析周期
在图形分析窗口可用以下快捷键切换分析周期:
0 分笔成交
1 1分钟线
2 5分钟线
3 15分钟线
4 30分钟线
5 60分钟线
6 日线
7 周线
8 月线
9 年线
如何快速切换多分钟、多秒、多小时或者多日线周期
敲击键盘输入“12SEC” 或“S12”:调用12秒线;
敲击键盘输入“14MIN”或“M14”:调用14分钟线;
敲击键盘输入“6HOUR”:调用6小时线;
敲击键盘输入“D8”:调用8日线;
其他周期同理输入。
[n+] 数字n后,再键入“+”,表示n秒K线
[n-] 数字n后,再键入“-”,表示n分钟K线
[n*] 数字n后,再键入“*”,表示n小时K线
[n/] 数字n后,再键入“/”,等笔K线,表示每根k线的笔数相等
[M]、[Mn] 多分钟线(输入M3回车可切换到3分钟线)
[S]、[Sn] 多秒线(输入S3回车可切换到3秒线)
1.2金字塔的连续合约如何换月
遵循两个原则
(1)第一天,成交量大于当前连续合约, 第二天早上,就换月
(2)但如果,是因为当前主力所连合约涨停或跌停引起的成交量减少,则不会换月
需要做以下三步,分笔成交数据,要完整(如不完整,请下载),
(1)工具--数据--数据管理器,"收盘清盘"里,
选对应市场,勾选保存分笔成交,然后"执行收盘"
就会把分笔数据保存在本地.
(2)工具--选项--维护,里面,"分笔成交存储",天数调整大
(3)工具--选项--常规,里面,"K线图仅使用当日分笔\1分数据"前的勾去掉
分时图上的红绿线用法说明:红绿柱揭示主动性买卖盘的力量对比。红柱越长,表明主动性买盘强;绿柱越长,表明主动性卖盘强.
具体解释:
以0轴为界,红柱向上,且一个比一个高为上涨,低于0以下为绿柱为跌
分时图中,白线上穿黄线,在黄线以上的运动都是上涨的波浪运动,黄线下方的运动都是下跌,具体的大趋势方向,还要以K线为准。分时内的红绿柱只代表在短时间之内的力量的强弱
分时图中黄线作为多空的分界比红绿柱准确的多
代码实现如下
昨收盘:DYNAINFO(3),COLORRED,LINETHICK2;
refc:=DYNAINFO(3);
redgr:=(SMA(C,2,1)-SMA(C,6,1))*2.1;//红绿柱
STICKLINE(redgr>0,refc,refc+redgr,0.1,0),Color5050FF;
STICKLINE(redgr<=0,refc,refc+redgr,0.1,0),ColorCyan;
1.5(真实波幅)计算公式,是哪个周期的波幅
在哪个周期上使用,就是那个周期的真实波幅。
TR:MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));
“真实”表现在考虑了新K线可能产生的跳空
1.6日线上的最高价/最低价比1分或者5分钟图上高/低
日线生成是使用的交易所当日给出的开高低收报价,而分钟K线是使用当日分笔数据生成,对于国内期货分笔数据是交易所每隔0.5秒一次的快照数据,在行情变化剧烈时,这0.5秒会撮合很多笔交易,但是交易所只给了间隔0.5秒的快照,也就是传递过来的分笔数据不是所有成交报价的。故在极端位置会出现分钟线与日线有不一致的情况。
1.7叠加主图的交易系统公式怎么会有白色的箭头
白色箭头是未成交标志,交易系统测试时,对于价格在当日高低价之外的模拟委托价格视为无效委托而为白色箭头标记(例如海龟交易算法不断的发出止损指令),用户可以在选项->视图->将“显示未成交标志”钩选去掉,就会不显示的。
1.8基础数据
金字塔的基础数据是”分笔成交数据、1分钟、5分钟、日线数据“,其他周期类型的数据都是根据这四种数据计算得来,因此,只需要下载这四种基础数据本地数据就是完整的。
1分钟,5分钟,日线, 5分钟数据补齐后,15分钟,60分钟不需要继续补充。
金字塔的历史数据补充采取点播模式,即补充当前图表打开的品种,系统会自动判断你上一次登陆数据与当前最新数据差多少,然后自动补最后这一段的,但是如果您是中间数据缺失,那么自动补数据功能就无效了,您就需要手工来补。自动补数据功能仅是补充您所图表上打开的品种,没有打开的则不会去补充,如果您需要全部的品种数据都齐全,那么只能通过手工补充数据。15分,60分的周期数据是由5分钟生成的,自定义分钟周期取决于您所使用的周期是否是5的整数倍,是的话取5分钟,否则取1分钟。
1.9K线图上,小数位显示少了
图形/坐标上,应是两位小数的品种只显示一位小数
金字塔在图形上的显示价格单位采取了智能模式,即千位只显示一位小数,万位则不显示,您可以在选中中进行关闭。工具菜单->选项->视图 然后将“价格/单位自动缩位显示”这个选项去掉即可。
1.10函数orderqueue,顺序下单
函数orderque,顺序下单
功能描述:有A和B两个单子,A在对列前面,B紧跟A。只有当A单子有以下情况,才会下委托单B(1)收到成交回报;(2)下单失败;(3)撤单(一旦队列下单不成交撤单后,再次委托会将委托追单排到最后)。
使用时请务必注意,在策略里的报单至少需要2笔以上委托单。
“交易---下单设置---程序化交易”选项中,有关于队列等待超时的等待规则设置
顺序下单超时等待N秒(0表示无限等待):设置后表示程序化交易时使用orderqueue函数队列的超时等待时间。
(1)顺序递交:当勾选本选项后,使用orderqueue指令报单时,如果前面的报单超过这个设置值而未成交或者未撤单时,就不再进行队列等待,而是直接报单出去。例如将超时等待设置为10秒,就表示排在队列第一个位置的动作(假设这个动作的名字是A)等待了10秒后,不管在它之前委托单是否成交或者撤销,动作A都将不再等待,而是直接委托出去。同理,此时,排在A后面的动作(单子B)开始10秒倒计时,等超时后,也会委托出去。
(2)之前报单完全成交后再顺序递交:勾选本选项后,只有在报单队列里的上一笔委托完全成交后才会委托报单下一笔。一旦上一笔交易出现委托失败或者撤单等情况,后面的委托队列会被完全清空。使用此项时请务必注意,在策略里的报单至少需要2笔以上委托单,如果只往队列报单一笔,那么金字塔将会在2秒钟之后才开始处理这一笔报单。
1.11"非主力合约持仓提醒"的功能
"非主力合约持仓提醒"的功能,点了今后不再提醒,现在想要这个提醒的功能。怎么办?
此设置在注册表里,注册表路径为HKEY_CURRENT_USER\Software\Weisoft\金字塔\MsgInfoDlg,修改以下设置
MainKeyReport 0 //0---提醒;1---不提醒
1.12 SETREGVAL函数设置的全局变量注册表路径是什么
HKEY_CURRENT_USER\Software\Weisoft\金字塔
1.13如何打开老的defalut(150).stk
记得先备份原来的Weisoft Stock\Document目录下的Default(150).stk文件
关闭金字塔
(1)在Weisoft Stock\Document\Backup这个目录下,存的都是策略备份
你可以找到一个你想恢复的最近的一个后缀为.BAK的文件
(2)复制粘贴到Weisoft Stock\Document目录下,修改文件名及后缀为Default(150).stk
1.14 主图K线不见了,如何调出
【金字塔使用技巧】---主图K线不见了,如何调出
在主图上,点鼠标右键→“插入内容/公式”,会看到如图所示的“公式选择器”里,选中左边“公式组”/系统→右边“公式列表”/MAIN,点确定,主图里就可以看到K线了。
1.15设置策略资金和开始时间
设置策略资金和开始时间
50万的资金设置从某一个时间开始,请问该如何设置?
1.设置分配的资金
交易系统编辑器里,“费率设置”---“交易费用”里,初始资金里设置50万
2.设置开始时间
K线图里,“右键 ——窗格属性”—“常规”里,指定开始时间
或者在程序的前面加一条语句时间限制 if date<1130304 then exit;
1.16为什么设置开始时间不同,会对信号位置有影响
为什么指定开始时间设置不同的话会对信号的位置有影响?我设置指定开始时间2013年 2月25日开始和2013年3月3日开始,会有不同的信号?一个在3月4日10:30分的K线有信号,另一个则没有?
答:肯定有影响的,原因在于你策略中需要比较多的k线才能确定信号。
比如你在策略中使用了ma(c,30),当k线数量少于30时,这个ma值是不对的,所以必须要大于30根k线后你的信号才能稳定。同样你使用“快速”功能时一定要小心,k线设置过小会导致信号变化。可以用下列方法来确定最小需要k线的数量,在“快速”中设置一个数a,用k线回放看一下信号变化情况,为了保险起见,一般对于新手要求一天内的信号不变化,那么这个a就可以。个人经验,不一定是真理,仅供参考。
1.17同一策略,为什么信号会不同
我有两个金字塔的实盘帐户在用,为什么信号都不同.
数据不一致引起的,参与运算的数据长短不同,会出现信号的不同.
就比方说,如果你的策略里有跨周期调用数据
1分钟取2小时跨周期指标,如果一个电脑上可以取到昨天的指标数据。而另一个电脑上只能取到前天的,不能取到昨天的数据。就会导致两者的信号不一致。这就是由两者使用的历史K线数不同引起的。
跨周期引用数据,目前是不会自动的补充数据的,需要您手工的保证有这些数据.
http://www.weistock.com/bbs/dispbbs.asp?boardid=16&Id=332问题4中的调试技巧,将公式运行时的一些关键变量记录下来,跟踪看看.
1.18账户栏的动态权益-保证金为什么不等于可用资金
动态权益-保证金-浮动盈亏=可用资金
工具-》选项-》常规里持仓成本计算盈亏勾不勾选会影响浮动盈亏的值。
新仓:勾不勾选持仓成本计算盈亏,浮动盈亏都不受影响。
昨仓:勾选持仓成本计算盈亏,浮动盈亏按照上一次的结算价计算,不勾选将按最初的开仓均价计算。
因此,勾选持仓成本计算盈亏,动态权益-保证金-浮动盈亏=可用资金。
不勾选持仓成本计算盈亏,浮动盈亏变了, 动态权益,保证金,浮动盈亏不变,结果会不相等。
...
二代码功能编写实现
2.1函数参数缺省值中间不能空缺
几乎所有的编程语言函数缺省值都是中间不能空缺的,只能从后面空缺;请仔细查看函数,不要杜撰参数。
拿后台程式化交易开多指令为例:错误示例-------tbuy(zd,1,mkt,'003028',’IF12’);以为只要使用了mkt指令后,价格就不需要填写了,这是错误的方法,(3)中给出了正确写法。
(1)正确写法:tbuy(zd,1,mkt);
后面的参数金字塔将自行按默认处理。
(2)正确写法:tbuy(zd,1,lmt,c,0) ;
后面的帐号和品种均按默认处理。
(3)错误写法:tbuy(zd,1,mkt,'003028',’IF12’)
中间的两个委托价格没有填写,金字塔会吧'003028', ’IF12’当做价格来处理,
正确写法:tbuy(zd,1,mkt,0,0,'003028',’IF12’) ;
7个参数一一对应。
2.2限定交易次数或者当天不平仓
【金字塔使用技巧】----限定一天交易次数
variable:num=0;// 全局变量,来控制当天交易次数
cs:=5;//限定一天最多交易5次
ma5:=ma(close,5);
ma20:=ma(close,20);
con1:=cross(ma5,ma20);
con2:=cross(ma20,ma5);
if cond2 and holding>0 then sell(1,1,market);
if cond1 and holding=0 and lossnum<5 then
begin
buy(1,1,market);
num:=num+1;
end
if time=closetime(0) then num:=0;// 商品期货,收盘的同时,num赋值为0
//收盘num不赋值为0,第二天就不再开仓了
【金字塔使用技巧】----当日亏损超过5次,则不再交易[图表程序化交易]
当日亏损交易次数超过5次,则不再开仓如何写?----图表交易
部分示例(1) :
variable:lossnum=0;// 全局变量,平仓时判断一下是盈利/亏损,若亏损lossnum就加1
cs:=5;//限定一天最多亏损5次
ma5:=ma(5,close);
ma20:=ma(20,close);
con1:=cross(ma5,ma20);
con2:=cross(ma20,ma5);
if cond2 and holding>0 then
begin
sell(1,1,thisclose);
if c<enterprice then lossnum:=lossnum+1;
end
if cond1 and holding=0 and lossnum<cs then buy(1,1,thisclose);
if time=closetime(0) then lossnum:=0;// 商品期货,收盘的同时,lossnum赋值为0
//收盘lossnum不赋值为0,第二天就不再开仓了
【金字塔使用技巧】----次交易日起卖出如何编写
[图表程序化交易] N分钟周期下,买入后,要求从次一个交易日起开始卖出(不能从下一根K线起),这个“次交易日起”条件如何实现?
variable:flag=0;// 全局变量,买开仓时赋值为1
if cond1 and holding=0 then
begin
buy(1,1,market);
flag:=1;
end
if cond2 and holding>0 and flag=0 then sell(1,1,thisclose);
if time=CLOSETIME(0) then flag:=0;//收盘的同时,flag赋值为0
2.5均线变色
均线变色
//5日均线,连续3个向上后(即今天的数值大于昨天的,连续3个),均线用红色显示,
//连续3个向下后,用绿色显示;
//如果数值有上有下,用白色显示。
mc:ma(close,5),colorwhite;
rmc:=ref(mc,1);
partline(all(mc>=rmc,3),mc,colorred);
partline(all(mc<=rmc,3),mc,colorgreen);
2.6之字高点连线OR低点连线
【金字塔使用技巧】----之字高点连线OR低点连线
//把之字每一个之字高点之间,连成线
//把之字每一个之字低点之间,连成线
//A:代表之字线
A:ZIG(4,0.5);
POLYLINE(cross(A,refx(A,1)),A,COLORRED,1,VTSOLID);//高点连线
POLYLINE(cross(refx(A,1),A),A,COLORgreen,1,VTSOLID);//低点连线
【金字塔使用技巧】----自己编写波段高价/低价
//波段高价-红色标出
//波段低价-绿色标出
A:=ZIG(4,0.1);
DRAWTEXT(cross(A,refx(A,1)),h+2*mindiff,NUMTOSTR(h,0),COLORRED);//波段高价-红色
DRAWTEXT(cross(refx(A,1),A),l,NUMTOSTR(l,0),COLORGREEN);//波段低价-绿色
2.7监控指数,对具体品种下单
[后台程序化交易] 监控指数
IF13,对具体合约IF01下单,注意事项 (1).监控里只用监控指数----如IF13
(2).注意下单价格
限价单委托:忌用CLOSE,因为这样会导致用指数的最新价下委托单;用DYNAINFO2( 7,'IF01')取股指01合约的最新价去下委托单,具体如下示例
//限价—优2个最小变动价挂单
tbuy(1,1,LMT, DYNAINFO2 (7,'IF01')+2*MINDIFF,0,'','IF01');
tbuy(1,1,MKT,0,0,'','IF01');//市价挂平仓单
2.9后台—平仓反手
[后台程序化交易] 平仓反手
ma5:ma(close,5);
ma15:ma(close,15);
//5日均线上穿15日均线,平空开多
if CROSS(ma5,ma15) and Tholding < 0 then
begin
Tsellshort(1, 0, mkt);
Tbuy(1, 1, mkt);
end
IF CROSS(ma5,ma15) AND Tholding = 0 THEN Tbuy(1, 1, mkt,0,0);
//5日均线下破10日均线,平多开空
if CROSS(ma15,ma5) and Tholding > 0 then
begin
Tsell(1, 0, mkt,0,0);
Tbuyshort(1, 1, mkt,0,0);
end
IF CROSS(ma15,ma5) AND Tholding = 0 THEN Tbuyshort(1, 1, mkt,0,0);
[后台程序化交易] 公式中发邮件,如何实现?
ma5:ma(close,5);
ma15:ma(close,15);
//5日均线上穿15日均线,平空开多
if CROSS(ma5,ma15) and Tholding < 0 then
begin
Tsellshort(1, 0, mkt);
Tbuy(1, 1, mkt);
if ISLASTBAR then SENDMAIL(1 ,'123456@QQ.COM','开多','平空开多');//发邮件
end
IF CROSS(ma5,ma15) AND Tholding = 0 THEN Tbuy(1, 1, mkt,0,0);
//5日均线下破10日均线,平多开空
if CROSS(ma15,ma5) and Tholding > 0 then
begin
Tsell(1, 0, mkt,0,0);
Tbuyshort(1, 1, mkt,0,0);
if ISLASTBAR then SENDMAIL(1 ,'123456@QQ.COM','开空','持仓变了-平多开空'); //发邮件
end
IF CROSS(ma15,ma5) AND Tholding = 0 THEN Tbuyshort(1, 1, mkt,0,0);
2.11TIME/CURRENTTIME/ DYNAINFO(207) 区别
【金字塔使用技巧】---- TIME 和 CURRENTTIME 区别
TIME:取周期时间;返回序列数据
CURRENTTIME:用户本地计算机系统时间;--返回常数
DYNAINFO(207):交易所时间;--返回常数
TIME返回值是一组序列值,在不同的K线上能看到不同的值。如果是9点开盘,1分钟周期的第一个K线就是090100,而5分钟则是090500。
CURRENTTIME返回值只有一个,永远都是计算机最新系统时间。DYNAINFO(207) 返回值只有一个,永远都是交易所最近一笔行情时间。如果用户需要精确的时间做某些事情,请使用CURRENTTIME或DYNAINFO(207)。图表程序化交易必须要使用一组序列数据,故尽量不要在图表程序化交易策略上使用返回常数的CURRENTTIME或DYNAINFO(207)。
如果使用CURRENTTIME请定期更新您的系统时间,保证时间的准确性,可在“工具->选项->升级和时间”进行更新。
2.12Holding,THolding,THolding2函数
Holding,THolding,THolding2的区别:
Holding:主要用在图表程序化交易中,得到[图表中当前显示品种(这里只有一个品种,叠加品种不算)]的虚拟持仓量,与帐户无关.多仓返回正数,空仓返回负数.在发出 Buy , Sell 等指令后,立即减去相应的持仓手数,不管指令最后有没有成交.要注意的是,图表程序化交易不支持锁仓,也就是如果 Holding 为正数(多仓)时,如果使用 BuyShort 指令开空单,是无效的.此时 Holding 值不会因 BuyShort 指令而改变.
THolding:主要在后台程序化交易中使用,得到[当前帐户的][所有监控品种的(可能同时监控几个品种,但因为用的是同一个交易策略,所以所有品种的持仓数量相同)]可用持仓量,不包括已委托挂单还未成交的量.多仓返回正数,空仓返回负数.所谓可用的持仓量,是指在 TBuy 指令发出后不会马上变化(因为此时还没有 TBuy 回来,所以这个量不会变化),只有成交后才会变化.TSell 指令发出后立即变化(因为这个量已经发到交易所去委托挂单了,不可再重复支配);撤单后恢复可用持仓;成交后 THolding 的值不变.
THolding2:主要在后台程序化交易中使用,得到[当前帐户的][所有监控品种的(可能同时监控几个品种,但因为用的是同一个交易策略,所以所有品种的持仓数量相同)]总共持仓量,包括已委托挂单还未成交的量.多仓返回正数,空仓返回负数. TBuy 指令发出后不会马上变化(因为此时还没有 TBuy 回来,所以这个量不会变化),只有成交后才会变化.TSell 指令发出后也不会变化(因为这个量虽然已经发到交易所去委托挂单了,但还没有成交);撤单后不影响总共持仓量;成交后增减相应持仓量.
2.13 TRIMPRICE函数
【金字塔使用技巧】---- TRIMPRICE函数
TRIMPRICE函数为数字整理函数,主要用于程序化交易的下单价格整理.该函数在调用时需要从系统中读取相关配置信息,所以该函数对系统资源消耗较大,尤其是在多核处理器优化时调用该函数,更是会导致系统的速度大幅降低.
一般该函数用于下单时对指定价格进行整理以避免下错单。
w:=mindiff*o;
kdj:=max(高点,o)+w;
kkj:=min(低点,o)-w;
if kd then
begin
平空:sellshort(holding<0,0,limitr,trimprice(kkj)); //平空
开多:buy(holding=0,asset,limitr,trimprice(kdj)); //开多
end
使用了IF...TEHN控制语句,只有在KD的条件满足时才执行trimprice函数的调用工作
2.14后台轮询模式
【金字塔使用技巧】----结合BARPOS和全局变量,控制是否开仓
运行环境:
//运行周期:1分钟
//运行模式:固定时间间隔,1秒轮询
//运行品种:IF1303
会多个策略对该品种下单,希望各策略的开平仓独立,每个策略管好自己的开平仓
策略简介:最高价突破EMA均线平空开多,最低价突破平多开空,有信号就下单。每根K线都只开平一次,开仓后当根K线后面的信号可以忽略
ss:=1; //手数
maa:ref(ema(c,10),1);//如果此处改为 ema(c,10) 会造成信号闪烁
buycond:=h>maa;
sellcond:=l<maa;
if holding>0 and sellcond then sell(1,ss,market);
if holding<0 and buycond then sellshort(1,ss,market);
if holding=0 and buycond then buy(1,ss,market);
if holding=0 and sellcond then buyshort(1,ss,market);
固定时间间隔,有信号就下单,信号闪烁情况下造成HOLDING值不稳定,故不能调用图表的HOLDING来控制仓位,必须使用后台程序化交易, 总体思路是用BARPOS和全局变量结合起来,控制是否开仓。
//序列模式运行
//t1_flag 0表示没有仓位,1表示持有多头,-1表示持有空头
//bar控制一根K线只能有一次开平仓
ss:=1; //手数
maa:ema(c,5);
buycond:=h>maa;
sellcond:=l<maa;
//平多
if extgbdata('t1_flag')>0 and sellcond and barpos>extgbdata('bar') then
begin
tsell(1,ss,mkt);
extgbdataset('t1_flag',0);
end
//平空
if extgbdata('t1_flag')<0 and buycond and barpos>extgbdata('bar') then
begin
tsellshort(1,ss,mkt);
extgbdataset('t1_flag',0);
end
//开多
if extgbdata('t1_flag')=0 and buycond then
begin
tbuy(1,ss,mkt);
extgbdataset('t1_flag',1);
extgbdataset('bar',barpos);
end
//开空
if extgbdata('t1_flag')=0 and sellcond then
begin
tbuyshort(1,ss,mkt);
extgbdataset('t1_flag',-1);
extgbdataset('bar',barpos);
end
全局变量使用注意事项:
策略运行过程中,手动平仓进行干预,请到"工具--数据--全局变量"里,将对应的全局变量清0,否则会引起开平仓混乱
论坛帖子http://www.weistock.com/bbs/dispbbs.asp?boardid=4&Id=48919
【金字塔使用技巧】----后台轮询模式允许加仓,但是同一K线内部同样信号只允许做一次
//结合BARPOS和全局变量,控制是否开仓
IF 开多条件 and barpos>EXTGBDATA( STKLABEL&'bar') then
begin
tbuy(1,1,mkt);
EXTGBDATASET( STKLABEL&'bar',BARPOS) ;
end
IF 加多条件 and barpos>EXTGBDATA( STKLABEL&'bar') then
begin
tbuy(1,1,mkt);
EXTGBDATASET( STKLABEL&'bar',BARPOS) ;
End
【金字塔使用技巧】----后台轮询,如何记录变量在最后一周期内的最大最小及开盘值
ma5:=ma(c,5);
//在新一根K线上记录初始化
if barpos>extgbdata('t') then
begin
extgbdataset('FIR',ma5);//记录开盘值
extgbdataset('MAX1',ma5);//记录最大
extgbdataset('MIN1',ma5);//记录最小
extgbdataset('t',barpos);
end
if barpos=extgbdata('t') then
begin
if ma5>extgbdata('MAX1') THEN extgbdataset('MAX1',ma5);
if ma5<extgbdata('MIN1') THEN extgbdataset('MIN1',ma5);
end
敲击键盘输入“12SEC” 或调用12秒线;
--------“S12”是调不出12秒线的, s30也是,因为和其他冲突了。
经过分析,找到了一个技巧,输入"S12." 或者"S30." 就可以了,这样就课避免其他冲突的。
显然程序是将输入字符串根据第一个字符s将后面的当数字处理。