设为首页收藏本站

 找回密码
 注册
楼主: 文韦
打印 上一主题 下一主题

请教A函数的问题 [复制链接]

Rank: 5Rank: 5

精华
0
UID
116920
积分
625
帖子
530
主题
64
阅读权限
60
注册时间
2013-3-15
最后登录
2014-5-7
11#
发表于 2013-9-14 17:34:16 |只看该作者
可能你把代码框架,只用贴控制流程的语句,和SetGlobalVar(0,0)出现的位置。
可能这样会看的比较清楚。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
15246
积分
704
帖子
167
主题
74
阅读权限
60
注册时间
2010-8-17
最后登录
2021-9-5
12#
发表于 2013-9-17 12:44:13 |只看该作者
superwin 发表于 2013-9-14 09:00
公式每次加载的第一次运算,会从K线图上的第一根Bar开始运算,记录一下K线上每个Bar的历史状态,而后,都是 ...

还想请教一下
1、如在账户无法关联或读不出情况下,A_TotalPosition取值为0还是无效值?
2、第一个符合开仓条件的TICK来了后,发单,SetGlobalVar(0,1),如在第二个符合开仓条件的TICK来之前(假设第二个TICK间隔时间较长),出现短暂的断网再续现象(不重启软件),此时会不会执行初始化,if  (BarStatus==0)SetGlobalVar(0,0)?从而出现重复发单的现象

使用道具 举报

高级操盘手

「你若能信,在信之人,凡事皆能。」

Rank: 10Rank: 10Rank: 10

精华
0
UID
117005
积分
98549
帖子
1121
主题
14
阅读权限
200
注册时间
2013-3-18
最后登录
2022-10-29
13#
发表于 2013-9-17 16:38:13 |只看该作者
本帖最后由 superwin 于 2013-9-17 16:44 编辑

1、无效值。
2、会被初始化,此时,GetGlobalVar(0)为0,A_TotalPosition读取也为0,因为网络中断,没办法更新A_TotalPosition的值,所以,按你的代码,会重新满足开仓条件,会出现重复发单。
PS:这个问题在我刚学习用A函数的时候遇到过,我的解决方法是,用SetTBProfileString代替SetGlobalVar。


不要因为众生的愚疑,而带来了自己的烦恼。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
15246
积分
704
帖子
167
主题
74
阅读权限
60
注册时间
2010-8-17
最后登录
2021-9-5
14#
发表于 2013-9-17 19:30:36 |只看该作者
superwin 发表于 2013-9-17 16:38
1、无效值。
2、会被初始化,此时,GetGlobalVar(0)为0,A_TotalPosition读取也为0,因为网络中断,没办法 ...


If(Q_Last == 0 ||(Date!=Date[1] && high==low)) return;//
if (BarStatus==0)
{
       buysign==0;
       sellsign==0 ;
       SetTBProfileString(key,keybuysign,text(buysign));
       SetTBProfileString(key,keysellsign,text(sellsign));
}
Else
{
buysign=Value(GetTBProfileString(key,keybuysign);
sellsign=Value(GetTBProfileString(key,keysellsign);
}
//------------------------------------------------------------------------
if (BarStatus==2)
{
If(A_TotalPosition==0)   
{
     If(buycondition && buysign==0 )//符合开多仓条件
     {
       NewPrice=Q_AskPrice+ShiftUnit*MinMove*PriceScale; //计算开仓价格
       A_SendOrder(Enum_Buy,Enum_Entry,Lots,NewPrice);//发出开多仓指令
           SetTBProfileString(key,keybuysign,text(1));
     }
         //------------------------------------------------------------------------
        If(sellcondition && sellsign==0 )//符合开空仓条件
     {
       NewPrice=Q_BidPrice-ShiftUnit*MinMove*PriceScale; //计算开仓价格
       A_SendOrder(Enum_sell,Enum_Entry,Lots,NewPrice);//发出开多仓指令
           SetTBProfileString(key,keysellsign,text(1));
       }
}
}
这样能彻底解决重复发单问题么?红色部分我不确定是否一定要。

使用道具 举报

高级操盘手

「你若能信,在信之人,凡事皆能。」

Rank: 10Rank: 10Rank: 10

精华
0
UID
117005
积分
98549
帖子
1121
主题
14
阅读权限
200
注册时间
2013-3-18
最后登录
2022-10-29
15#
发表于 2013-9-17 21:53:07 |只看该作者
,如果初始化SetTBProfileString,那不是跟用SetGlobalVar一样的了,就没意义了。BarStatus==0部分可以全部去掉了,然后把buysign=Value(GetTBProfileString(key,keybuysign);
sellsign=Value(GetTBProfileString(key,keysellsign);这两句放在BarStatus==2下面即可,顺便发单SetTBProfileString后加上return;这样就强制返回重新GetTBProfileString,也就是发单后马上刷新变量buysign的值,这样就算重启软件,断线,写进数据库里的数据都不会变,也就不会重复发单了。


不要因为众生的愚疑,而带来了自己的烦恼。

使用道具 举报

高级操盘手

「你若能信,在信之人,凡事皆能。」

Rank: 10Rank: 10Rank: 10

精华
0
UID
117005
积分
98549
帖子
1121
主题
14
阅读权限
200
注册时间
2013-3-18
最后登录
2022-10-29
16#
发表于 2013-9-17 22:08:09 |只看该作者
  1. Params
  2.     .........
  3. Vars
  4.         .........
  5. Begin
  6.         ................
  7.         ................
  8.         ................
  9.     If(BarStatus==2)
  10.     {
  11.                 buysign=Value(GetTBProfileString(key,keybuysign));
  12.         sellsign=Value(GetTBProfileString(key,keysellsign));
  13.                 If(A_TotalPosition==0)   
  14.         {
  15.                         If(buycondition And buysign==0)
  16.                         {
  17.                 NewPrice=Q_AskPrice+ShiftUnit*MinMove*PriceScale;
  18.                                 SetTBProfileString(key,keybuysign,text(1));
  19.                                 A_SendOrder(Enum_Buy,Enum_Entry,Lots,NewPrice);
  20.                                 Return;
  21.                         }
  22.                         .....................
  23.                         .....................
  24.                 }
  25.         }
  26. End
复制代码
这里要注意的是,要先在数据库里建立好相应的块与键名键值,不然变量就一直会获取到无效值。还可以扩展一点,就是把A_BuyPosition、A_SellPosition等等账户实际信息SetTBProfileString备用,达到更灵活的操作


不要因为众生的愚疑,而带来了自己的烦恼。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
15246
积分
704
帖子
167
主题
74
阅读权限
60
注册时间
2010-8-17
最后登录
2021-9-5
17#
发表于 2013-9-18 07:51:10 |只看该作者
superwin 发表于 2013-9-17 22:08
这里要注意的是,要先在数据库里建立好相应的块与键名键值,不然变量就一直会获取到无效值。还可以扩展一点 ...

但在
If(buycondition And buysign==0)
  {......
中需要buysign==0赋值才好第一次发单啊,不需要初始化的时候給buysign0值么?

使用道具 举报

高级操盘手

「你若能信,在信之人,凡事皆能。」

Rank: 10Rank: 10Rank: 10

精华
0
UID
117005
积分
98549
帖子
1121
主题
14
阅读权限
200
注册时间
2013-3-18
最后登录
2022-10-29
18#
发表于 2013-9-18 08:07:56 |只看该作者
不是让你先在数据库里建立好相应的块与键名键值吗,你建立的时候键值设定为0,然后第一次发单以后SetTBProfileString为1,平仓后SetTBProfileString为0,只要交易一直连贯不中途变更,都不用管了,如果变更信号,就人工修正键值到相应数字即可。在我实盘中,除非人工关闭软件导致错过交易信号而没有SetTBProfileString改变键值,导致键值偏差而需要人工更改之外,运行数月都从来不用理过。


不要因为众生的愚疑,而带来了自己的烦恼。

使用道具 举报

高级操盘手

「你若能信,在信之人,凡事皆能。」

Rank: 10Rank: 10Rank: 10

精华
0
UID
117005
积分
98549
帖子
1121
主题
14
阅读权限
200
注册时间
2013-3-18
最后登录
2022-10-29
19#
发表于 2013-9-18 08:18:47 |只看该作者
SetTBProfileString可以把大量的数据放在里面处理,比如第一次开仓价格,第二次加仓价格,第三次加仓价格……,第一次开仓的止盈止损价格,第二次加仓的止盈止损价格……动态权益,持仓资金占用百分比……等等,然后可以GetTBProfileString调用出来而实现很多策略思路的扩展。


不要因为众生的愚疑,而带来了自己的烦恼。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
15246
积分
704
帖子
167
主题
74
阅读权限
60
注册时间
2010-8-17
最后登录
2021-9-5
20#
发表于 2013-9-18 08:26:32 |只看该作者
superwin 发表于 2013-9-18 08:07
不是让你先在数据库里建立好相应的块与键名键值吗,你建立的时候键值设定为0,然后第一次发单以后SetTBP ...

非常感谢,能否发一段代码

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-24 21:02

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部