欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件金字塔软件问题提交 → [求助]自定义函数:存在两次执行的问题。

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有4959人关注过本帖树形打印复制链接

主题:[求助]自定义函数:存在两次执行的问题。

帅哥哟,离线,有人找我吗?
yeyi
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:253 积分:1742 威望:0 精华:0 注册:2010/8/12 13:04:52
[求助]自定义函数:存在两次执行的问题。  发帖心情 Post By:2011/10/9 16:30:00 [只看该作者]

在公示中的代码如下(逐K线模式和日K线模式):

if ISLASTBAR THEN 
BEGIN
   LZZ:TEST1();
   LWJDK:=1;
END 

在自定义函数中:TEST1的源码如下

Function test1(Formula)
    '系统会在逐周期模式解释公式时的每个周期都会调用此函数一遍,因此设计时应该注重程序的执行效率,不要重复的执行一些没必要的代码
   
    Set wrd = CreateObject( "Word.Application")
    wrd.Visible = True
    wrd.Documents.Open "D:\Weisoft Stock\systemreport\test.txt"
    Set wrd = Nothing
    test1=10

End Function

 

结果每次执行

首先显示“已被锁定,不可编辑”,打开副本后;

有时会再一次执行打开步骤,又是“已被锁定,不可编辑”,打开副本

实际上自定义函数执行了两次,还是其他原因,比较困惑。

(我怀疑,实际上刚启动,第一次执行自定义函数,交互数据时它已经暗中打开,所以永远是已被锁定,我删除后重新启动也无法)

请求帮助:

1、解决不可编辑

2、有时两次打开的原因

 

 

 

[此贴子已经被作者于2011-10-9 16:39:46编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
admin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2011/10/9 17:34:50 [只看该作者]

试试用APPLICATION.MSGOUT输出消息看看。

如果仍旧两次调用,那么你要检查你的公式是否被两个地方使用,比如其他图表框架中使用,后台,预警,自定义数据刷新等等其他地方使用


 回到顶部
帅哥哟,离线,有人找我吗?
yeyi
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:253 积分:1742 威望:0 精华:0 注册:2010/8/12 13:04:52
  发帖心情 Post By:2011/10/9 20:46:46 [只看该作者]

一个问题没有解决,又出现一个问题。

在自定义函数中加了一个参数TEST1(MSNO);(MSNO=401,为数值数据),编译公式无论如何通不过。

试了TEST1(401),不行;TEST1(MSNO),不行;

重新设个值N:=401,TEST1(N) 也不行。提示错误。

只好将原来的自定义函数CU_MA2改成我需要测试的程序,将TEST1(MSNO)改成CU_MA2(MSNO),则通过编译,正常运行。

请斑竹求助!!!!

目前版本号2.703,

 

 

下面为自定义函数源码:

 

Function CU_MA2(Formula,cyc)
    '得到K线数据对象
 'Set History = Formula.ParentGrid.GetHistoryData()
 '若当前周期尚未到计算周期,不参与计算
 'if Formula.IndexData < cyc-1 then
 ' CU_MA2 = 0
 ' exit function
 'end if
 
 'DataCount = 0
    'for i = Formula.IndexData-cyc+1 to Formula.IndexData
     '累加收盘价
    ' DataCount = DataCount + history.close(i)
    'next
 'CU_MA2 = DataCount / cyc
    Set wrd = CreateObject( "Word.Application")
    wrd.Visible = True
             wrd.Documents.Open "D:\Weisoft Stock\systemreport\test.txt"
        Set wrd = Nothing
     CU_MA2 = 10
End Function

Function test1(Formula,cyc)
    '得到K线数据对象
 application.MsgOut("tttt")
    Set wrd = CreateObject( "Word.Application")
    wrd.Visible = True
             wrd.Documents.Open "D:\Weisoft Stock\systemreport\test.txt"
        Set wrd = Nothing
    test1=10

End Function

 


 回到顶部
帅哥哟,离线,有人找我吗?
26327756l
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:黑侠 帖子:676 积分:2548 威望:0 精华:3 注册:2011/4/13 16:18:50
  发帖心情 Post By:2011/10/10 10:03:09 [只看该作者]

这个问题 是因为多次执行了 公式指标。

你在公式指标中加入一句

MSGOUT( 1,'rrrrr' );

 

这样你就会在消息窗口中看到 多次的输出‘rrrrr’(在日线以上的模式里,每个几秒就会输出一次,在日线模式里,一分钟多会出现一次)。每执行一次指标,就会打开一次文本。这就是出现你说的“已被锁定,不可编辑”,因为在此之前已经打开了该文本。又再一次打开该文本,所以出现提示。因为该文本打开后,操作系统就会将该文件设为临界资源,临界资源不允许被多次写入方式打开。

 

总的来说问题出现就是 公式被多次执行了,导致了多次的打开文本,在没有关闭先前的文本窗口时,而出现了你说的“已被锁定,不可编辑”。

 

公式指标只在图表上运行时,根据刷新时间,每刷新一次执行一次公式指标。

在 图表程式化交易里 和 后台程式化交易 里运行时,设定好时间间隔,会好一些。

 


 回到顶部