设为首页收藏本站

 找回密码
 注册
查看: 20116|回复: 32
打印 上一主题 下一主题

强悍的全局变量功能 [复制链接]

Rank: 5Rank: 5

精华
0
UID
32158
积分
731
帖子
176
主题
53
阅读权限
60
注册时间
2011-4-5
最后登录
2023-1-17
跳转到指定楼层
1#
发表于 2011-6-29 20:18:18 |只看该作者 |倒序浏览
关于特殊变量,大家可学习下“天才期市神话”的这个文章:


全自动的程序化交易必须解决以下三大难题:

⒈既要保证交易信号的及时性,又要做到信号不能反复;

⒉记录每一次系统开、平仓的价格,以及账户的持仓变动,以便进行加减头寸及资金管理的安排;

⒊在同一根K线上进行交易控制,实现跨周期数据引用,以便精确实现短线交易时机的把握。

通过三天的学习,依托交易开拓者软件全局变量的强大功能,我终于攻克了上述三大难关。

除了普通变量外,交易开拓者软件提供了三种特殊变量,它们分别是:

⒈序列变量:可以进行数据的回溯,从而实现条件、循环语句的应用;它的运行特点是每一根BAR依次执行,这不同于坊间文华等其它交易软件平台的一次性运算。而且,它的全部函数均提供了算法,不同于黑箱的做法,有利于校对和修改。

⒉引用型变量:可以通过用户函数的形式,进行一劳永逸式的编写,避免程序的冗余。

⒊全局变量:用于中间计算过程的记录和存取,可以实现同一根BAR上的仓位管理与开平仓价格记录。

假设我们需要记录当前BAR的动态仓位状态,使用普通变量、序列变量都是无法完成这项任务的,必须使用全局变量来实施控制,并配合A_SENDORDER函数来发出买卖指令。比如,我们当条件满足时,分别记录买卖仓位的动态变化后,采用SET GLOBALVAR(0,1),记录当前的仓位为1手多单,然后可以不断改写第一个全局变量的值,在需要读取操作的时候,我们采用cw=getglobvar(0)的方式来实时地取回。使用全局变量时一定要进行初始化的设置,这样在系统断线后,只要不关闭相关图表,重连后的数据依然可以保持正确。切记不可简单使用BARSTATS的状态来确认全局变量,以下的这个例子较好地表述了套利系统中全局变量的应用。

Params
Bool  bInitStatus(False);  // 初始化标志,修改初始仓位时需设置为True
Numeric EveryLots(1);    // 每次交易数量手数
Numeric LongEntryPrice(-100000); // 开多仓的触发价格
Numeric LongExitPrice(100000);  // 平多仓的触发价格
Numeric ShortEntryPrice(100000); // 开空仓的触发价格
Numeric ShortExitPrice(-100000); // 平空仓的触发价格
Numeric LongStartLots(0);    // 多仓的初始仓位(手数),必须是EveryLots的倍数
Numeric LongEndLots(0);     // 多仓的最大仓位(手数),必须是EveryLots的倍数
Numeric ShortStartLots(0);    // 空仓的初始仓位(手数),必须是EveryLots的倍数
Numeric ShortEndLots(0);     // 空仓的最大仓位(手数),必须是EveryLots的倍数
Numeric OffsetPoint(2);   // 委托价格的偏移值(点数)
Vars  
Numeric SpreadUpper;
Numeric SpreadLower;
Numeric longPosition;
Numeric shortPosition;
Bool bLongEntryCon;
Bool bShortEntryCon;
Bool bLongExitCon;
Bool bShortExitCon;
Bool bTimeCon;
Numeric Data0Lots(1);
Numeric Data1Lots(2);
Begin
longPosition = GetGlobalVar(0);
shortPosition = GetGlobalVar(1);
If (BarStatus == 0)
{
  If(longPosition == InvalidNumeric || bInitStatus)
  {
   longPosition = LongStartLots;
   SetGlobalVar(0,longPosition);
  }
  If(shortPosition == InvalidNumeric || bInitStatus)
  {
   shortPosition = ShortStartLots;
   SetGlobalVar(1,shortPosition);
  }
}Else If(BarStatus == 2 && A_AccountID!="")
{
  If(EveryLots < 1) Return;
  If(Data0.Q_AskPrice <= 0 || Data0.Q_BidPrice <= 0 || Data1.Q_AskPrice <= 0 || Data1.Q_BidPrice <= 0) Return;
  If(Data0.Q_BidPrice == Data0.Q_UpperLimit || Data0.Q_AskPrice == Data0.Q_LowerLimit) Return;
  If(Data1.Q_BidPrice == Data1.Q_UpperLimit || Data1.Q_AskPrice == Data1.Q_LowerLimit) Return;

  SpreadUpper = Data0.Q_AskPrice-Data1.Q_BidPrice;
  SpreadLower = Data0.Q_BidPrice-Data1.Q_AskPrice;

  bTimeCon = true;//Time>0.0903 ;//And (Time<0.1127 Or Time>0.1333) And Time<0.1456;
  bLongEntryCon = (SpreadUpper<=LongEntryPrice) && (Data0.Q_AskVol>=EveryLots && Data1.Q_BidVol>=EveryLots);
  bLongExitCon = (SpreadLower>=LongExitPrice) && (Data1.Q_AskVol>=EveryLots && Data0.Q_BidVol>=EveryLots);  
  bShortEntryCon = (SpreadLower>=ShortEntryPrice) && (Data1.Q_AskVol>=EveryLots && Data0.Q_BidVol>=EveryLots);
  bShortExitCon = (SpreadUpper<=ShortExitPrice) && (Data0.Q_AskVol>=EveryLots && Data1.Q_BidVol>=EveryLots);

  If(((bLongExitCon And bTimeCon And longPosition>0) Or longPosition>LongEndLots ))
  {
   Data0.A_SendOrder(Enum_Sell,Enum_Exit,Data0Lots,Data0.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
   Data1.A_SendOrder(Enum_Buy,Enum_Exit,Data1Lots,Data1.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
   SetGlobalVar(0,longPosition - EveryLots);
  }

  If(((bShortExitCon And bTimeCon And shortPosition>0) Or shortPosition>ShortEndLots ))
  {
   Data0.A_SendOrder(Enum_Buy,Enum_Exit,Data0Lots,Data0.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
   Data1.A_SendOrder(Enum_Sell,Enum_Exit,Data1Lots,Data1.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
   SetGlobalVar(1,shortPosition - EveryLots);
  }

  If((bLongEntryCon And bTimeCon And longPosition<LongEndLots))
  {
   Data0.A_SendOrder(Enum_Buy,Enum_Entry,Data0Lots,Data0.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
   Data1.A_SendOrder(Enum_Sell,Enum_Entry,Data1Lots,Data1.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
   SetGlobalVar(0,longPosition + EveryLots);
  }
  
  If(( bShortEntryCon And bTimeCon And shortPosition<ShortEndLots))
  {
   Data0.A_SendOrder(Enum_Sell,Enum_Entry,Data0Lots,Data0.Q_BidPrice-OffsetPoint*MinMove*PriceScale);
   Data1.A_SendOrder(Enum_Buy,Enum_Entry,Data1Lots,Data1.Q_AskPrice+OffsetPoint*MinMove*PriceScale);
   SetGlobalVar(1,shortPosition + EveryLots);
  }
}

Commentary("多头仓位="+Text(longPosition));
Commentary("空头仓位="+Text(shortPosition));
End
已有 1 人评分威望 收起 理由
shanzi168 + 2 很给力!

总评分: 威望 + 2   查看全部评分

微信公众号:tuwening

Rank: 3Rank: 3

精华
0
UID
33021
积分
123
帖子
26
主题
9
阅读权限
40
注册时间
2011-4-11
最后登录
2011-11-14
2#
发表于 2011-7-9 23:28:44 |只看该作者
很好的帖子 不要被埋没啊
成功的交易员都有自己的交易系统。
一把尺子闯天下。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
32158
积分
731
帖子
176
主题
53
阅读权限
60
注册时间
2011-4-5
最后登录
2023-1-17
3#
发表于 2011-7-10 07:47:31 |只看该作者
终于有人识货了
微信公众号:tuwening

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
73474
积分
1249
帖子
695
主题
30
阅读权限
60
注册时间
2011-10-22
最后登录
2015-11-6
4#
发表于 2012-4-29 07:05:18 |只看该作者
很好的帖子,强烈支持

使用道具 举报

Rank: 1

精华
0
UID
110144
积分
35
帖子
12
主题
1
阅读权限
10
注册时间
2012-4-23
最后登录
2013-8-19
5#
发表于 2012-6-1 09:51:40 |只看该作者
看不懂啊

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
31697
积分
671
帖子
137
主题
13
阅读权限
60
注册时间
2011-4-2
最后登录
2020-10-8
6#
发表于 2012-6-4 09:56:14 |只看该作者
好文,收藏

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
93332
积分
172
帖子
74
主题
22
阅读权限
40
注册时间
2012-1-17
最后登录
2017-11-22
7#
发表于 2012-6-12 13:59:18 |只看该作者
顶起来

使用道具 举报

Rank: 4

精华
0
UID
112065
积分
369
帖子
39
主题
9
阅读权限
50
注册时间
2012-8-15
最后登录
2015-7-8
8#
发表于 2012-9-23 17:38:43 |只看该作者

使用道具 举报

Rank: 2

精华
0
UID
112002
积分
53
帖子
13
主题
8
阅读权限
30
注册时间
2012-8-13
最后登录
2013-6-11
9#
发表于 2012-10-6 15:03:44 |只看该作者
好贴!!好清晰的思路。谢谢,收藏了。

使用道具 举报

Rank: 1

精华
0
UID
112463
积分
30
帖子
10
主题
0
阅读权限
10
注册时间
2012-9-11
最后登录
2013-7-31
10#
发表于 2012-11-21 21:30:54 |只看该作者
好文,参考学习。

使用道具 举报

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

bottom

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

GMT+8, 2024-5-11 18:44

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部