文档没看完,不好意思直接问各位大虾了。
看
金字塔自动向QQ发送消息实例,公式可以加载VB函数,我自己VBS写了一个
Function GetPosition(sStrategy,sContract)
调试能通过
现在在公式系统里想调用函数 GetPosition,
PositionCount:=GetPosition('TEST','IF08');
编译没通过这句,是不是要先注册?
怎么注册呢?
使用公式编辑器上的,左边的自定义函数,右键“建立自定义函数”增加函数,然后把你上面的代码复制到向导生成的自定义函数体中。
依样画葫芦写了Function,结果后台预警系统表示GetPosition永远返回0,而且SetPosition根本不会写入仓位到文件,事实上连文件都没创建。
求指点。
Function GetPosition(Formula,sStrategy,sContract)
GetPosition=0
file = "Z:\" & sStrategy & "_" & sContract & ".txt"
Set fs = CreateObject("Scripting.FileSystemObject")
if fs.fileexists(file) then
Set a = fs.OpenTextFile(file, 1)
GetPosition = cint(a.ReadLine())
a.Close
end if
Set fs = Nothing
End Function
Function SetPosition(Formula,sStrategy,sContract,iPosition)
SetPosition=0
file = "Z:\" & sStrategy & "_" & sContract & ".txt"
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.OpenTextFile(file, 2, True)
a.WriteLine(iPosition)
a.Close
Set fs = Nothing
End Function
调用 APPLICATION.MSGOU 函数,打印消息输出,看看语句的执行情况
我在预警公式系统里调用函数是这么写的:
PositionCount:=GetPosition('TEST','IF08');
SetPosition('TEST','IF08',PositionCount);
结果:
1. application.msgout显示在预警模式下函数GetPosition被频繁调用,调用频率远大于1次每秒,汗!
2. GetPosition输出两个参数sStrategy和sContract值分别为1,2
3. SetPosition没有任何输出,正确的说法是整个预警系统在调用SetPosition后停止了,再也没有任何application.msgout
以下是引用Marcus在2012-7-31 13:39:05的发言:
我在预警公式系统里调用函数是这么写的:
PositionCount:=GetPosition('TEST','IF08');
SetPosition('TEST','IF08',PositionCount);
结果:
1. application.msgout显示在预警模式下函数GetPosition被频繁调用,调用频率远大于1次每秒,汗!
2. GetPosition输出两个参数sStrategy和sContract值分别为1,2
3. SetPosition没有任何输出,正确的说法是整个预警系统在调用SetPosition后停止了,再也没有任何application.msgout
修正最后一行,预警系统应该还在运行,只是没有任何application.msgout更新
PositionCount:=GetPosition('TEST','IF08');
SetPosition('TEST','IF08',PositionCount);
初步看了一下,是有问题的,因为金字塔的自定义函数只能传输数字,是不能传输字符串的
今天早上在V2.9上试验了一下,调用GetPosition(10,10000)
发现第一个参数的确被传进去了,是10,第二个参数丢失,也就sContract被设置为空。???
不明白怎么会这样的
另外,依旧无法SetPosition,文件也创建不了。
我的本意是只想在后台预警模式下记录当前策略的逻辑仓位,哪知道实现过程会这么波折。
用过全局变量,失败;用文件记录,失败;用自定义函数,参数不对又失败;
不了解内部运行框架无异于盲人摸象,不停地试错。
有几个问题:
1. 金字塔的后台预警,每个周期是否逐K线从头到尾运行一次?如果为真,我调用EXTGBDATA/SETGBDATA也是不是从头到尾读/写,相当于策略每个周期运行一次,然后最后才确定当前仓位?
2. 在提前N秒运行的模式下,N秒中每一秒都会逐K线头到尾运行一次么?如果信号不稳定,某秒开仓某秒平仓,金字塔怎么判断并最后选用那个周期的信号?注意如果每秒运行一次,每个周期逻辑仓位可能被反复擦写N次!这样很容易导致逻辑混乱。