以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  能够自定义函数再调用么  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=13377)

--  作者:Marcus
--  发布时间:2012/7/31 0:38:13
--  能够自定义函数再调用么
文档没看完,不好意思直接问各位大虾了。

金字塔自动向QQ发送消息实例,公式可以加载VB函数,我自己VBS写了一个
Function GetPosition(sStrategy,sContract)
调试能通过

现在在公式系统里想调用函数 GetPosition,
PositionCount:=GetPosition(\'TEST\',\'IF08\');

编译没通过这句,是不是要先注册?
怎么注册呢?

--  作者:guotx2010
--  发布时间:2012/7/31 8:16:19
--  
使用公式编辑器上的,左边的自定义函数,右键“建立自定义函数”增加函数,然后把你上面的代码复制到向导生成的自定义函数体中。
--  作者:Marcus
--  发布时间:2012/7/31 11:14:45
--  
依样画葫芦写了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


--  作者:admin
--  发布时间:2012/7/31 11:23:18
--  

调用 APPLICATION.MSGOU 函数,打印消息输出,看看语句的执行情况


--  作者: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
--  作者:Marcus
--  发布时间:2012/7/31 13:45:25
--  
 申明,现在用的还是 V2.75。
不知道是版本问题还是自己的用法有问题。

--  作者:Marcus
--  发布时间:2012/7/31 14:14:23
--  
以下是引用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更新
--  作者:admin
--  发布时间:2012/7/31 15:49:54
--  

PositionCount:=GetPosition(\'TEST\',\'IF08\');
SetPosition(\'TEST\',\'IF08\',PositionCount);

初步看了一下,是有问题的,因为金字塔的自定义函数只能传输数字,是不能传输字符串的


--  作者:Marcus
--  发布时间:2012/8/1 10:02:39
--  
 今天早上在V2.9上试验了一下,调用GetPosition(10,10000)
发现第一个参数的确被传进去了,是10,第二个参数丢失,也就sContract被设置为空。???
不明白怎么会这样的
另外,依旧无法SetPosition,文件也创建不了。


--  作者:Marcus
--  发布时间:2012/8/1 11:11:53
--  
我的本意是只想在后台预警模式下记录当前策略的逻辑仓位,哪知道实现过程会这么波折。
用过全局变量,失败;用文件记录,失败;用自定义函数,参数不对又失败;

不了解内部运行框架无异于盲人摸象,不停地试错。

有几个问题:
1. 金字塔的后台预警,每个周期是否逐K线从头到尾运行一次?如果为真,我调用EXTGBDATA/SETGBDATA也是不是从头到尾读/写,相当于策略每个周期运行一次,然后最后才确定当前仓位?
2. 在提前N秒运行的模式下,N秒中每一秒都会逐K线头到尾运行一次么?如果信号不稳定,某秒开仓某秒平仓,金字塔怎么判断并最后选用那个周期的信号?注意如果每秒运行一次,每个周期逻辑仓位可能被反复擦写N次!这样很容易导致逻辑混乱。