Vbs扩展
(以“=VBScript应用简介= 在各种高级语言中,熟悉和精通VB的人很多。VBScript 是 VB 的一个子集,它提供的各种语句和语法、常量和...”为内容创建页面) |
(→VBS示例4) |
||
| (未显示1个用户的2个中间版本) | |||
| 第125行: | 第125行: | ||
n=ubound(vbsbd) | n=ubound(vbsbd) | ||
'以下为比较法排序,降序排序后,最后一个数据vbsbd(n)为最大值 | '以下为比较法排序,降序排序后,最后一个数据vbsbd(n)为最大值 | ||
| − | for k=0 to n-1 | + | for k=0 to n-1 |
| − | + | for j=k+1 to n | |
| − | + | if vbsbd(k)>vbsbd(j) then | |
| − | + | x=vbsbd(k) | |
| − | + | vbsbd(k)=vbsbd(j) | |
| − | + | vbsbd(j)=x | |
| − | + | i=j | |
| − | + | end if | |
| − | + | next | |
next | next | ||
msgbox("最大波值发生在离最后时间的周期数为:" & cstr(i)) | msgbox("最大波值发生在离最后时间的周期数为:" & cstr(i)) | ||
| 第148行: | 第148行: | ||
3、VBS的代码中,i用于确定发生最大值的位置(一般可能发生多次,应使用数组),但输出到公式系统后,foxbfb居然不变,估计是因为foxbfb为常数的缘故,非数组变量不能与VBS相互传递?看来又得给wilson添加麻烦了。 | 3、VBS的代码中,i用于确定发生最大值的位置(一般可能发生多次,应使用数组),但输出到公式系统后,foxbfb居然不变,估计是因为foxbfb为常数的缘故,非数组变量不能与VBS相互传递?看来又得给wilson添加麻烦了。 | ||
4、公式可设计为某个时段,可在公式参数中体现,再对代码进行补充修正。 | 4、公式可设计为某个时段,可在公式参数中体现,再对代码进行补充修正。 | ||
| + | |||
| + | =VBS示例4= | ||
| + | 在逐行模式中,if语句是失效的(只判断最后一根的情况)。但有时确实希望在逐行中使用if,此时可以利用VBS来达到目的。 | ||
| + | 例如,我希望统计Macd指标的MACD每一段正负值的和,代码如下。 | ||
| + | DIFF : EMA(CLOSE,S) - EMA(CLOSE,P); | ||
| + | DEA : EMA(DIFF,M); | ||
| + | MACD : 2*(DIFF-DEA), COLORSTICK; | ||
| + | |||
| + | sumMacd:c,OwnerScale; | ||
| + | <% | ||
| + | dataCount = ffl.VarData("DataCount") | ||
| + | macd = ffl.VarData("macd") | ||
| + | nFirst = ffl.VarStartIndex("macd") | ||
| + | sumMacd = ffl.VarData("sumMacd") | ||
| + | idx = nFirst | ||
| + | nLast = UBound( macd ) | ||
| + | tmp = macd(nFirst) | ||
| + | for i = nFirst+1 to nLast | ||
| + | if (macd(i)*tmp<0 or i=nLast) then | ||
| + | for j = idx to i-1 | ||
| + | sumMacd(j) = tmp | ||
| + | next | ||
| + | tmp = macd(i) | ||
| + | idx = i | ||
| + | Else | ||
| + | tmp = tmp + macd(i) | ||
| + | end if | ||
| + | next | ||
| + | sumMacd(nLast)=sumMacd(nLast-1) | ||
| + | ffl.VarData("sumMacd") = sumMacd | ||
| + | %> | ||
2014年4月25日 (五) 07:04的最后版本
目录 |
[编辑] VBScript应用简介
在各种高级语言中,熟悉和精通VB的人很多。VBScript 是 VB 的一个子集,它提供的各种语句和语法、常量和变量、函数和过程的规则与VB完全相同,并且也提供了许多基本的计算、处理函数。VBScript 是标准的脚本语言,广泛应用于动态网页、大型电子商务系统、Windows系统管理等领域。因此,我们选用 VBScript 作为自己的公式脚本语言(之一),使其公式系统具有强大的计算能力、扩展能力和生命力。
我们采用嵌入脚本语言的方式引入VBScript,编制方法类似制作ASP、PHP动态网页。采用这种方式可以保持原有公式系统的兼容性,避免一些冲突(例如原条件函数IF与条件语句IF的关键字冲突)。另外,这种方式便于将来再引入新的脚本语言。
在公式引擎与VBScript之间需要通过变量转换在两套语言之间传递数据。传递通过FFL函数进行。
FFL对象现设计有两种属性:(将来会不断扩充)
FFL.VarData("变量名") 传递数组变量数据 FFL.VarStartIndex("变量名") 传递数组变量有效数值起始位置,若脚本处理过程中不改变变量有效数值起始位,则无须调用
[编辑] VBS应用例1
实例:达到利润目标后的止赢点计算 该实例综合应用了循环语句、条件语句和数组操作,请注意变量数据是怎样被转入、转出的。
背景:假定买入信号发生的条件是创200天新高,第一次达到条件时发出买入信号,略去随后的买入信号,利润目标是10%,达到目标发出卖出信号,这样的交易系统在原公式系统中无法实现,而用脚本语言就解决了这样的问题,请看代码:
{ 买入信号临时变量:收盘创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
' 遍历收盘价数组
for i = 0 to UBound( close )
sell( i ) = 0
' 若已买入而且未平仓略去随后的买入信号
if( lastbuyprice > 0 ) then
buy( i ) = 0
end if
'若满足买入条件取买入价,也用于设置开仓
if ( lastbuyprice = 0 ) AND (buy( i ) = 1) then
lastbuyprice = close( i )
end if
' 若已买入且满足卖出条件,产生卖出信号并平仓
if (lastbuyprice >0 ) AND ( close( i ) > ( 1.1 * lastbuyprice ) ) then
sell( i ) = 1
lastbuyprice = 0
end if
next
' 将VBScript变量转出为公式系统变量
FFL.VarData("BUY") = buy
FFL.VarData("SELL") = sell
%>
ENTERLONG: BUY;
EXITLONG: SELL;
有兴趣的用户可以将这段代码扩充为同时考虑最大损失、回落、横盘平仓点的情况。
类似地,运用脚本语言强大的语法、函数,当然也可以在技术指标、条件选股、五彩K线中实现原来不可想象的计算和处理。
[编辑] VB应用例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 )
for i = nFirst to nLast
ma(i)=ma(i)/p
next
' 判断最后一个数是否满足条件
if( ma(nLast) > n ) then
str = "大于3"
FFL.MsgBox(str)
end if
FFL.VarData("MA1")=ma
' 设置有效起始位置示例
FFL.VarStartIndex("ma1")=nFirst
%>
类似地,运用脚本语言强大的语法、函数,当然也可以在技术指标、条件选股、五彩K线中实现原来不可想象的计算和处理。
[编辑] VBS应用示例3
例如想编一个统记的指标: 求个股历史上股价每天波动的价位数值中出现最多的几个波动值。 例如 0001 从过去到现在每天涨跌0.21元占股价每天波动的价位数值出现的45%(最多)。
这在传统的公式编制中是较难实现的,但有了VBS接口,我们可以通过vbs编程来实现。 公式源代码如下:
foxbd:=high-low;
foxbfb:=0;
<%
vbsbd=ffl.vardata("foxbd")
i=ffl.vardata("foxbfb")
'n可用于确定最大值出现的比率,等等
n=ubound(vbsbd)
'以下为比较法排序,降序排序后,最后一个数据vbsbd(n)为最大值
for k=0 to n-1
for j=k+1 to n
if vbsbd(k)>vbsbd(j) then
x=vbsbd(k)
vbsbd(k)=vbsbd(j)
vbsbd(j)=x
i=j
end if
next
next
msgbox("最大波值发生在离最后时间的周期数为:" & cstr(i))
ffl.vardata("foxbd")=vbsbd
ffl.vardata("foxbfb")=i
%>
最大波动值:foxbd;
离本周期:foxbfb;
说明: 1、输出的实际最大值,在最后一个周期,为避免麻烦,可取消信息框msgbox。 2、VBS脚本中,排序采用了最笨的标准算法,如计算600601等则较慢,采用递归算法,速度将会大大提高。 3、VBS的代码中,i用于确定发生最大值的位置(一般可能发生多次,应使用数组),但输出到公式系统后,foxbfb居然不变,估计是因为foxbfb为常数的缘故,非数组变量不能与VBS相互传递?看来又得给wilson添加麻烦了。 4、公式可设计为某个时段,可在公式参数中体现,再对代码进行补充修正。
[编辑] VBS示例4
在逐行模式中,if语句是失效的(只判断最后一根的情况)。但有时确实希望在逐行中使用if,此时可以利用VBS来达到目的。 例如,我希望统计Macd指标的MACD每一段正负值的和,代码如下。
DIFF : EMA(CLOSE,S) - EMA(CLOSE,P);
DEA : EMA(DIFF,M);
MACD : 2*(DIFF-DEA), COLORSTICK;
sumMacd:c,OwnerScale;
<%
dataCount = ffl.VarData("DataCount")
macd = ffl.VarData("macd")
nFirst = ffl.VarStartIndex("macd")
sumMacd = ffl.VarData("sumMacd")
idx = nFirst
nLast = UBound( macd )
tmp = macd(nFirst)
for i = nFirst+1 to nLast
if (macd(i)*tmp<0 or i=nLast) then
for j = idx to i-1
sumMacd(j) = tmp
next
tmp = macd(i)
idx = i
Else
tmp = tmp + macd(i)
end if
next
sumMacd(nLast)=sumMacd(nLast-1)
ffl.VarData("sumMacd") = sumMacd
%>