飞狐公式系统指南.docx
《飞狐公式系统指南.docx》由会员分享,可在线阅读,更多相关《飞狐公式系统指南.docx(15页珍藏版)》请在冰豆网上搜索。
飞狐公式系统指南
一、与分析家公式系统的比较
飞狐交易师V1.2的公式系统几乎完全涵盖了分析家V4.x的公式系统,但微有区别:
◇除扩展数据函数EXTDATA外,飞狐公式系统与分析家公式系统在源码上几乎完全兼容,直接支持分析家扩展程序调用DLL;
◇在线型修饰函数和颜色函数前,必须用“,”号(半角逗号)与输出指标的公式分开;
◇颜色函数为真正的COLOR(rrggbb)格式,符合习惯,而分析家的是COLOR(bbggrr)格式
◇因黑色可能为底色,COLORBLACK不起作用,请用COLOR101010等深灰色代替;
◇除定向加密公式外,可直接导入分析家V3.x输出的公式文件,包括密码加密和完全加密的公式;
飞狐交易师V1.2的公式系统提供了许多特有的强大扩展:
◇在公式中可嵌入VB脚本,轻易实现循环语句、条件语句、数组操作、函数、过程等高级语言的语法和语句,使其具有强大的计算能力、扩展能力、生命力;
◇DLL扩展程序调用的参数可不限数量,且每个参数都可为数值或序列;(分析家最多只能4个,且其中只能有1个序列参数)
◇输出的指标线数目没有限制;(分析家不能超过16条)
◇公式中可定义多达16个参数;(分析家最多只能4个)
◇许多函数的参数可以为序列变量;(如COST(N),LONGCROSS(X,N)的第二个参数等,分析家的这些函数参数只能为常数)
◇绘图函数根据K线所有数据进行条件判断画线;(分析家只在K线可见范围内进行条件判断画线,实际上存在缺线现象)
◇提供DRAWNUMBER(COND,PRICE,NUMBER,PRECISION)、DRAWYITEXT(COND,PRICE,CODE,TYPE)等飞狐特有绘图函数;
◇提供LYEAR、LMONTH、LDAY、LSOLARTERM、ZQDMNUM、ZQDMSUM、NUMBERSUM(NUMBER,N)、KGUA(TYPE,N)、GANZHI(DATETIME,TYPE)、WUXING(X,TYPE)、WXGX(WX1,WX2)、WXLD(JI,LD)、WXSS(WX,SS)、DZGX(DZ1,DZ2)、DZXH(DZ1,DZ2,DZ3,DZ4)等飞狐特有的易理函数;
二、嵌入式VB脚本
在各种高级语言中,熟悉和精通VB的人无疑是最多的。
VBScript是VB的一个子集,它提供的各种语句和语法、常量和变量、函数和过程的规则与VB完全相同,并且也提供了许多基本的计算、处理函数。
VBScript是标准的脚本语言,广泛应用于动态网页、大型电子商务系统、Windows系统管理等领域。
因此,『飞狐交易师』选用VBScript作为自己的公式脚本语言(之一),使其公式系统具有强大的计算能力、扩展能力和生命力。
『飞狐交易师』采用嵌入脚本语言的方式引入VBScript,编制方法类似制作ASP、PHP动态网页。
采用这种方式可以保持原有公式系统的兼容性,避免一些冲突(例如原条件函数IF与条件语句IF的关键字冲突)。
另外,这种方式便于将来再引入新的脚本语言,这就大大提升了『飞狐交易师』公式系统的扩展性和生命力。
VBScript所能进行的计算、处理能力非常强大,甚至可进行文件操作等,所以,只要是想得到的计算,都应该能够实现。
类似编制ASP、PHP动态网页,可在公式中多处嵌入脚本(用<%...%>括起即可),可在脚本中定义函数、过程供脚本自己调用。
VBScript接口
由于『飞狐交易师』原公式系统处理变量的方式与VBScript不同,因此,需要通过变量转换在两套语言之间传递数据。
『飞狐交易师』为此设计提供了一种对象:
FFL(FoxTraderFORMulaLanguage『飞狐交易师』公式语言对象)供VBScript调用,通过赋值语句转入、转出『飞狐交易师』公式系统的变量,或者提供其它控制,如信息提示等。
FFL对象现设计有三种接口:
(将来会不断扩充)
FFL.VarData("变量名")
传递数组变量数据
FFL.VarStartIndex("变量名")
传递数组变量有效数值起始位置,若脚本处理过程中不改变变量有效数值起始位,则无须调用
FFL.MsgBox(strMsg)
显示信息提示对话框,strMsg为字符串类型的变量或常量
实例
1、交易系统:
背景:
假定买入信号发生的条件是创200天新高,第一次达到条件时发出买入信号,略去随后的买入信号,利润目标是10%,最大亏损是8%,达到止赢止损点发出止损卖出信号,这样的交易系统在原公式系统中无法实现,而用脚本语言就解决了这样的问题。
该实例综合应用了循环语句、条件语句和数组操作,请注意变量数据是怎样被转入、转出的。
请看代码:
{买入信号临时变量:
收盘创200天新高}
BUY:
=CLOSE=HHV(CLOSE,200);
{初始化卖出信号临时数组变量给下面的脚本用,任意赋给一个有效数值起始位置为0的数组变量即可,注意,若SELL:
=0则表示SELL为数值而非数组}
SELL:
=BUY;
{初始化收盘价临时数组变量给下面的脚本用}
CLOSEPRICE:
=CLOSE;
{用<%......%>嵌入脚本语言,类似编写ASP}
<%
'将公式系统变量转入VBScript
close=FFL.VarData("CLOSEPRICE")
buy=FFL.VarData("BUY")
sell=FFL.VarData("SELL")
'该变量保存买入价,也表示开仓、平仓状态。
如为0则表示空仓(平仓)
lastbuyprice=0
'遍历数组
fori=0toUBound(close)
sell(i)=0
'若已买入而且未平仓略去随后的买入信号
if(lastbuyprice>0)then
buy(i)=0
endif
'若满足买入条件取买入价,也用于设置开仓
if(lastbuyprice=0)AND(buy(i)=1)then
lastbuyprice=close(i)
endif
'若已买入且满足卖出条件,产生卖出信号并平仓
if(lastbuyprice>0)AND((close(i)>(1.1*lastbuyprice))OR(close(i)<(0.92*lastbuyprice)))then
sell(i)=1
lastbuyprice=0
endif
next
'将VBScript变量转出为公式系统变量
FFL.VarData("BUY")=buy
FFL.VarData("SELL")=sell
%>
ENTERLONG:
BUY;
EXITLONG:
SELL;
有兴趣的用户可以将这段代码扩充为同时考虑回落、横盘平仓点的情况。
2、技术指标
背景:
在达到某个条件时弹出信息提示对话框,请注意公式参数和常数变量是怎样被转入VB脚本中的。
请看代码:
(已设置一参数P缺省5,2,60)
MA1:
MA(C,P);
N:
=3;
<%
p=FFL.VarData("p")
n=FFL.VarData("n")
ma=FFL.VarData("MA1")
nFirst=FFL.VarStartIndex("ma1")
nLast=UBound(ma)
fori=nFirsttonLast
ma(i)=ma(i)/p
next
'判断最后一个数是否满足条件
if(ma(nLast)>n)then
str="大于3"
MsgBox(str)
endif
FFL.VarData("MA1")=ma
'设置有效起始位置示例
FFL.VarStartIndex("ma1")=nFirst
%>
类似地,运用脚本语言强大的语法、函数,当然也可以在技术指标、条件选股、五彩K线中实现原来不可想象的计算和处理。
指标函数
COST(X)支持序列数组
ZIG类函数支持序列数组:
函数:
ZIG(X,N)
参数:
X为序列数组或常数,为常数时表示0:
开盘价,1:
最高价,2:
最低价,3:
收盘价,N为常数
返回:
返回序列数组
说明:
当序列或K线变化量超过N%时转向
示例:
ZIG(3,5)表示收盘价的5%的ZIG转向
ZIG(MA(C,20),5)表示20日平均线的5%的ZIG转向
函数:
PEAK(X,N,M)
参数:
X为序列数组或常数,N为常数,M为大于等于1的整数
返回:
返回序列数组
说明:
表示之字转向ZIG(X,N)的前M个波峰的数值
示例:
PEAK(1,5,1)表示%5最高价ZIG转向的上一个波峰的数值
PEAK(MA(C,20),5,1)表示均线的5%的ZIGVAR转向的上一个波峰的数值
函数:
PEAKBARS(X,N,M)
参数:
X为序列数组或常数,N为常数,M为大于等于1的整数
返回:
返回序列数组
说明:
表示之字转向ZIG(X,N)的前M个波峰到当前的周期数
示例:
PEAKBARS(0,5,1)表示%5开盘价ZIG转向的上一个波峰到当前的周期数
PEAKBARS(MA(C,20),5,1)表示线的5%的ZIGVAR转向的上一个波峰到当前的周期数
函数:
TROUGH(X,N,M)
参数:
X为序列数组或常数,N为常数,M为大于等于1的整数
返回:
返回序列数组
说明:
表示之字转向ZIG(X,N)的前M个波谷的数值
示例:
TROUGH(2,5,2)表示%5最低价ZIG转向的前2个波谷的数值
TROUGH(MA(C,20),5,2)表示均线的5%的ZIGVAR转向的前2个波谷的数值
函数:
TROUGHBARS(X,N,M)
参数:
X为序列数组或常数,N为常数,M为大于等于1的整数
返回:
返回序列数组
说明:
表示之字转向ZIG(X,N)的前M个波谷到当前的周期数
示例:
TROUGHBARS(2,5,2)表示%5最低价ZIG转向的前2个波谷到当前的周期数
TROUGHBARS(MA(C,20),5,2)表示均线的5%的ZIGVAR转向的前2个波谷到当前的周期数
这样扩展后,ZIG类函数可用于判断RSI等指标的M头W底。
绘图函数
DRAWNUMBER(COND,PRICE,NUMBER,PRECISION)
说明:
当COND条件满足时,在PRICE位置书写数字NUMBER(可以为常数或数组序列),PRECISION为精度(取值范围0-3),即显示到小数点后PRECISION位。
该函数可用于显示指标数值。
例如:
DRAWNUMBER(CLOSE/OPEN>1.05,HIGH,(CLOSE-OPEN)/OPEN*100,1)表示当日涨幅大于5%时在最高价位置显示涨幅(相对于开盘价的百分比,取一位小数);
DRAWYITEXT(COND,PRICE,CODE,TYPE)
说明:
在图形上显示干支、64卦文字。
当COND条件满足时,在PRICE位置书写TYPE类型的CODE的对应文字。
TYPE为常数,取0--1,分别表示显示的是干支、64卦,CODE为对应的代码。
例如:
DRAWYITEXT(CLOSE/OPEN>1.05,LOW,GANZHI(DATE,0,2),0)表示当日涨幅大于5%时在最低价位置显示日干支;
DRAWYITEXT(REF(CLOSE,2)>REF(OPEN,2)ANDREF(CLOSE,1)>REF(OPEN,1)ANDCLOSE>OPEN,LOW,KGUA(1,1),1)表示连续三阳线时在最低价位置显示K线卦象。
易理函数
函数:
LDAY
参数:
无
返回:
返回有效值范围为(1-30).
说明:
取得该周期的农历日期。
示例:
函数:
LMONTH
返回:
无
参数:
返回有效值范围为(1-12)
说明:
取得该周期的农历月份。
函数:
LYEAR
参数:
无
返回:
返回有效值范围为(1970-2038)
说明:
取得该周期的农历年份。
函数:
LSOLARTERM(X)
参数:
X为序列变量,格式与DATE同,有效值范围为(700101-1341231),表示19700101-20341231
返回:
返回有效值范围为(0-24).0表示该周期不在节气日中,1-24分别表示小寒、大寒、立春、雨水、惊蛰、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、寒露、霜降、立冬、小雪、大雪、冬至
说明:
取得该周期所在的二十四节气。
示例:
LSOLARTERM(DATE)表示求当前周期节气
ZQDMNUM
用法:
ZQDMNUM
返回:
返回证券代码数,如0001返回1,600001返回600001,指数返回0
ZQDMSUM
用法:
ZQDMSUM
返回:
返回证券代码各位数字之和,如0001返回1,600001返回7,指数返回3
NUMBERSUM(NUMBER,N)
参数:
NUMBER为待计算的数据,N表示小数点后取几位
返回:
各位数字之和
说明:
各位数字之和
示例:
NUMBERSUM(CLOSE,2)则收盘价为9.53时返回17
函数:
GANZHI(DATE,TIME,TYPE)
参数:
DATE为数组或常数,有效值范围(年月日80010100-130123123)
TIME为数组或常数,有效值范围(时分秒000000-235959)
TYPE为常数,取0--3,分别表示计算的是年、月、日、时的干支
返回:
返回六十甲子代码,有效值范围为(0-59),依次表示甲子、乙丑.....癸亥
说明:
取得日期的年、月、日、时的干支代码
示例:
GANZHI(DATE,0,2)取得该周期的日干支代码
GANZHI(DATE,TIME,3)取得该周期的时干支代码
GANZHI(1010901,0,0)取得2001年9月1日的年干支代码
这样:
MOD(GANZHI(DATE,0,2),10)即可得到该周期的对应的日天干代码。
0-9分别表示甲、乙...癸
MOD(GANZHI(DATE,0,1),12)即可得到该周期的对应的月地支代码。
0-11分别表示子、丑...亥
INTPART(GANZHI(DATE,0,2)/10)即可得到该周期的旬代码(0-5),依次表示甲子旬、…、.甲寅旬
(5-INTPART(GANZHI(DATE,0,2)/10))*2即可得到该周期的第一个旬空地支代码
(5-INTPART(GANZHI(DATE,0,2)/10))*2+1即可得到该周期的第二个旬空地支代码
WUXING(X,TYPE)
参数:
TYPE为常数,取0--2,分别表示计算的是天干、地支、八卦对应的五行,X为对应的代码,数组或常数
返回:
返回五行代码,有效值范围为(0-4),依次表示金水木火土
说明:
取得天干、地支、八卦对应的五行代码
示例:
WUXING(MOD(GANZHI(DATE,0,2),12),1)取得该周期的日地支对应的五行代码
WXGX(WX1,WX2)
参数:
WX1,WX2为五行代码的数组或常数,有效值范围为(0-4),依次表示金水木火土
返回:
返回五行生克关系代码,有效值范围为(0-3),依次表示WX1无关WX2、WX1生WX2、WX1克X2、WX1反克WX2
说明:
取得五行相生相克反克的关系
示例:
WUXING(0,1)返回1,表示金生水
五行序数的相生次序:
0-1-2-3-4-0
五行序数的相克次序:
0-2-4-1-3-0
五行序数的反克次序:
0-3-1-4-2-0
WXLD(JI,LD)
参数:
LD为五行四季力度代码,有效值范围为(4-0),依次表示旺(4)、相(3)、休
(2)、囚
(1)、死(0);
JI为四季数代码,有效值范围为(0-4),依次表示春、夏、秋、冬、四季土
返回:
返回五行代码,依次表示金水木火土
说明:
取得不同时间的力度(旺相休囚死)对应的五行代码
示例:
WXLD(0,4)=2,表示春季木旺
WXSS(WX,SS)
参数:
WX为五行代码的数组或常数,SS五行盛衰十二阶段代码,有效值范围为(0-11),依次表示绝、胎、养、长生、沐浴、冠带、临官、帝旺、衰、病、死、墓
返回:
地支代码,0-11分别表示子、丑...亥
说明:
取得五行盛衰十二阶段(原生旺死绝)对应的地支代码
示例:
WXSS(1,0)返回2,金绝于寅
DZGX(DZ1,DZ2)
参数:
DZ1,DZ2为地支代码的数组或常数,有效值范围为(0-11)
返回:
返回地支关系代码,有效值范围为(0-5),依次表示无关(0)、DZ1生DZ2
(1)、DZ1克DZ2
(2)、相冲(3)、相害(4)、DZ1刑DZ2(5)
说明:
地支间的关系
示例:
DZGX(0,6)返回3,表示子与午冲
DZXH(DZ1,DZ2,DZ3,DZ4)
参数:
DZ1,DZ2,DZ3,DZ4为地支代码的数组或常数,有效值范围为(0-11),若求六合,则DZ3为-1,DZ4除算申子辰化合成水局外为-1
返回:
返回合成的无行代码,有效值范围为(-1-4),-1表示无相合关系
说明:
地支间的相合关系
示例:
DZXH(0,1,-1,-1)返回4,表示子丑合而化土
DZXH(8,0,4,-1)返回1,表示申子辰化合成水局
KGUA(TYPE,N)
参数:
TYPE取爻次序,为0表示以第一个周期为初爻,当前周期为上爻,不为0则反之
N为所取的周期数,为0取3个周期,不为0表示取6个周期
返回:
K线卦象,若N为0,返回八卦代码(1-8),否则返回六十四卦代码(11-88),请参考易卦代码表
说明:
取得K线卦象
示例:
KGUA(1,1)以当前周期为初爻,取6个周期组成的某个六十四卦
升为阳,跌为阴,平盘则相对前收盘(如果也相等?
)
反日k线:
若改为阳线为阴爻,阴线为阳爻,则可写成99-KGUA(1,1)
附:
易卦代码表
将八纯卦及64别卦按先天数编排:
乾
(1)、兑
(2)、离(3)、震(4)、巽(5)、坎(6)、艮(7)、坤(8)
天
(1)、泽
(2)、火(3)、雷(4)、风(5)、水(6)、山(7)、地(8)
譬如上卦为艮,就7,下卦为乾,就1,这样,山天大畜就可以用71来表示,所以64卦的最大范围为坤卦纯卦,为88,纯乾卦为最小,为11
"乾为天"(11),"天泽履"(12),"天火同人"(13),"天雷无妄"(14),"天风姤"(15),"天水讼"(16),"天山"(17),"天地否"(18),
"泽天夬"(21),"兑为泽"(22),"泽火革"(23),"泽雷随"(24),"泽风大过"(25),"泽水困"(26),"泽山咸"(27),"泽地萃"(28),
"火天大有"(31),"火泽睽"(32),"离为火"(33),"火雷噬嗑"(34),"火风鼎"(35),"火水未济"(36),"火山旅"(37),"火地晋"(38),
"雷天大壮"(41),"雷泽归妹"(42),"雷火丰"(43),"震为雷"(44),"雷风恒"(45),"雷水解"(46),"雷山小过"(47),"雷地豫"(48),
"风天小畜"(51),"风泽中孚"(52),"风火家人"(53),"风雷益"(54),"巽为风"(55),"风水涣"(56),"风山渐"(57),"风地观"(58),
"水天需"(61),"水泽节"(62),"水火既济"(63),"水雷屯"(64),"水风井"(65),"坎为水"(66),"水山蹇"(67),"水地比"(68),
"山天大畜"(71),"山泽损"(72),"山火贲"(73),"山雷颐"(74),"山风蛊"(75),"山水蒙"(76),"艮为山"(77),"山地剥"(78),
"地天泰"(81),"地泽临"(82),"地火明夷"(83),"地雷复"(84),"地风升"(85),"地水师"(86),"地山谦"(87),"坤为地"(88),
三、DLL扩展程序调用接口
分析家现有的DLL接口只能调用4个参数,其中只能有一个序列,飞狐对分析家DLL调用接口信息数据结构进行了扩展,使扩展程序调用的参数不限数量,且每个参数都可为数值或序列。
<%
/////////////////////////////////////////////////////////////////////////////
//调用接口信息数据结构
typedefstructtagCALCINFO
{
DWORDm_dwSize;//结构大小
DWORDm_dwVersion;//调用软件版本
DWORDm_dwSerial;//调用软件序列号
char*m_strStkLabel;//股票代码
BOOLm_bIndex;//大盘
intm_nNumData;//数据数量(pData,pDataEx,pResultBuf数据数量)
STKDATA*m_pData;//常规数据,注意:
当m_nNumData==0时可能为NULL
STKDATAEx*m_pDataEx;//扩展数据,分笔成交买卖盘,注意:
可能为NULL
intm_nParam1Start;//参数1有效位置
float*m_pfParam1;//调用参数1
float*m_pfParam2;//调用参数2
float*m_pfParam3;//调用参数3
float*m_pfParam4;//调用参数3
float*m_pResultBuf;//结果缓冲区
intm_dataType;//数据类型
float*m_pfFinData;//财务数据
//以上与分析家兼容,所以沿用其结构和名称
//以下为FoxTrader扩展
DWORDm_dwReserved;//保留,将来用于设置标志
intm_nNumParam;//调用参数数量
CALCPARAM*m_pCalcParam;//调用参数数组
}CALCINFO;
/////////////////////////////////////////////////////////////
//调用参数项结构
typedefstructtagCALCPARAM
{
union{
float*m_pfParam;//