路路发智能交易研发中心

 找回密码
 立即注册
查看: 2450|回复: 0

TB编程教程 A函数下单撤单和全局变量操作

[复制链接]

管理员

MT4软件工程师

Rank: 9Rank: 9Rank: 9

积分
6521
帖子
2771
主题
2761
QQ
发表于 2015-5-9 19:22:48 | 显示全部楼层 |阅读模式
TB编程教程 A函数下单撤单和全局变量操作
本例在每天收盘前N分钟的时候自动撤掉超级图表中商品的挂单,并全部平仓。通过A_SendOrder进行下单,A_DeleteOrder进行撤单,并使用全局变量记录Tick计数和撤单标志。
  1. Params
  2.     Numeric offSet(1);                    // 委托价格偏移,为了保证成交
  3.     Numeric BeforeMins(5);                // 收盘前几分钟开始操作
  4. Vars
  5.     Numeric tempPos; // 仓位
  6.     Numeric DeleteOrderTickCounter;
  7.     Numeric HasSendOrder(0);
  8. Begin
  9.     If(BarStatus == 0)
  10.     {
  11.         DeleteOrderTickCounter = 9999;
  12.         HasSendOrder = 0;
  13.         SetGlobalVar(0,DeleteOrderTickCounter);
  14.         SetGlobalVar(1,HasSendOrder);
  15.     }Else
  16.     {
  17.         DeleteOrderTickCounter = GetGlobalVar(0);
  18.         HasSendOrder = GetGlobalVar(1);
  19.     }

  20.     If(CurrentTime > (0.1459 - 0.0001*(BeforeMins-1)) && BarStatus == 2 && HasSendOrder == 0)
  21.     {
  22.         If(Data0.Close != InvalidNumeric && Data0.A_GetOpenOrderCount()>0) // 商品0全部撤单
  23.         {
  24.             Data0.A_DeleteOrder();
  25.             DeleteOrderTickCounter = 1;
  26.         }
  27.         If(Data1.Close != InvalidNumeric && Data1.A_GetOpenOrderCount()>0) // 商品1全部撤单
  28.         {
  29.             Data1.A_DeleteOrder();
  30.             DeleteOrderTickCounter = 1;
  31.         }
  32.         If(Data2.Close != InvalidNumeric && Data2.A_GetOpenOrderCount()>0) // 商品2全部撤单
  33.         {
  34.             Data2.A_DeleteOrder();
  35.             DeleteOrderTickCounter = 1;
  36.         }
  37.         DeleteOrderTickCounter = DeleteOrderTickCounter + 1;
  38.         SetGlobalVar(0,DeleteOrderTickCounter);

  39.         If(DeleteOrderTickCounter < 5) Return; // 撤单后需要延迟几个Tick才平仓

  40.         tempPos = Data0.A_BuyPosition();
  41.         If(tempPos > 0) // 平多单
  42.         {
  43.             Data0.A_SendOrder(Enum_Sell,Enum_Exit,tempPos,Data0.Q_BidPrice-offSet*Data0.MinMove*Data0.PriceScale);
  44.         }
  45.         tempPos = Data0.A_SellPosition();
  46.         If(tempPos > 0) //平空单
  47.         {
  48.             Data0.A_SendOrder(Enum_Buy,Enum_Exit,tempPos,Data0.Q_AskPrice+offSet*Data0.MinMove*Data0.PriceScale);
  49.         }

  50.         tempPos = Data1.A_BuyPosition;
  51.         If(tempPos > 0) // 平多单
  52.         {
  53.             Data1.A_SendOrder(Enum_Sell,Enum_Exit,tempPos,Data1.Q_BidPrice-offSet*Data1.MinMove*Data1.PriceScale);
  54.         }
  55.         tempPos = Data1.A_SellPosition;
  56.         If(tempPos > 0) //平空单
  57.         {
  58.             Data1.A_SendOrder(Enum_Buy,Enum_Exit,tempPos,Data1.Q_AskPrice+offSet*Data1.MinMove*Data1.PriceScale);
  59.         }

  60.         tempPos = Data2.A_BuyPosition;
  61.         If(tempPos > 0) // 平多单
  62.         {
  63.             Data2.A_SendOrder(Enum_Sell,Enum_Exit,tempPos,Data2.Q_BidPrice-offSet*Data2.MinMove*Data2.PriceScale);
  64.         }
  65.         tempPos = Data2.A_SellPosition;
  66.         If(tempPos > 0) //平空单
  67.         {
  68.             Data2.A_SendOrder(Enum_Buy,Enum_Exit,tempPos,Data2.Q_AskPrice+offSet*Data2.MinMove*Data2.PriceScale);
  69.         }
  70.         HasSendOrder = 1;
  71.         SetGlobalVar(1,HasSendOrder);
  72.     }
  73. End
复制代码

注意事项:
  • 本例是以国内商品期货交易所收市时间举例,股指期货或其他市场需调整写法。
  • 本例假设撤单后5个Tick委托状态能同步成功,实际情况中因网络延时等原因并不一定能够保证成功。




外汇智能交易,成就财富梦想!
回复

使用道具 举报

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

本版积分规则


MT4编程培训|EA定制开发|QQ在线咨询|路路发智能交易研发中心

GMT+8, 2025-1-7 05:46 , Processed in 0.151795 second(s), 26 queries .

© 2009-2022 520EA.com EA668.com

快速回复 返回顶部 返回列表