Bar上平仓后满足开仓条件不再开仓

在K1这根Bar上达到了平仓条件已经平仓,但是平仓后满足开仓条件。造成开仓—平仓—开仓循环( 假锁现象,至少重复10多次,交易费攀升), 如何实现平仓后的Bar不再开仓?
每Bar的时间周期内,能够TICK多次。
问题一:程序每TICK就下一次单,如何防止重复下单呢?
====================
 
问题二:比如,我在1.3600下了单,当他涨到1.3620,没平,之后返回来到1.3600,还会再下一个单的,这个单是多余的,我希望在1.3590到1. 3610之间都不下单了,如何办到?但是如果平了1.3600这个单的话可以再下。
或者你可以加上函数模块
bool isNewBar()
{ static datetime TimeBar=0;
bool flag=false;
if(TimeBar!=Time[0])
{
TimeBar=Time[0];
flag=true;
}
return (flag);
}
 
 
//============================
  请问如何控制1根k柱内只下单一次?
在一个k线内会反复下单-平单-再下单-再平单。
对于循环,有点不明白,比如一根15分钟的k柱,循环的tick会走多少次?。。
如何控制一根k线内只下一次单?
想到用数组控制,
int a;
double order[];
a=Bars;
order[a]=0.0;
之后判断是否满足开仓条件(开仓条件增加一条,order[a]==0),如果满足,开仓,并且,
order[a]=1
可是,还是不好用,很困惑,望高手指点!先谢谢了!
//根据仓位类型获取最后一次的交易时间
datetime GetLastTrade(int type)
{
  datetime lastTrade = 0;
  int i;
  for (i = 0; i < OrdersTotal(); i++)
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      continue;
    }
    if (OrderSymbol() != Symbol())
    {
      continue;
    }
    if (OrderType() != type)
    {
      continue;
    }
    if (lastTrade < OrderOpenTime())
    {
      lastTrade = OrderOpenTime();
    }
  }
  if (lastTrade == 0)
  {
    for (i = 0; i < OrdersHistoryTotal(); i++)
    {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      {
        continue;
      }
      if (OrderSymbol() != Symbol())
      {
        continue;
      }
      if (OrderType() != type)
      {
        continue;
      }
      if (lastTrade < OrderOpenTime())
      {
        lastTrade = OrderOpenTime();
      }
    }
  }
  return (lastTrade);
}
//判断如下
//仅举例说明买入情形 卖出情形自己做
if (GetLastTrade(OP_BUY) < iTime(Symbol(), PERIOD_M15, 0))
{
  //不在当前15分钟的K柱之内 可以下单
}
else
{
  //不可下单
}
 
=================
MQL是面向过程的语言,不能在一个函数内部声明另一个函数。你必须将 GetLastTrade这一段单独声明在start init等函数之外。
 
---------------------------dmgy的方法
static datetime openTime;
if(Time[0] != openTime)
{
//不在此柱内
......
openTime = Time[0];
}
else
{
//在同一柱内
}
-------------------dmgy的方法结束-----------------------------------
顺便说一句dmgy的方法不可取 理由是判断不正确且依赖于图表的周期
正确的用法是这样的
int start()
{
//.............你自己的代码
//然后这里是判断代码
  if (GetLastTrade(OP_BUY) < iTime(Symbol(), PERIOD_M15, 0))
  {
  //不在当前15分钟的K柱之内 可以下单
  }
  else
  {
  //不可下单
  }
}
//然后这里是GetLastTrade函数的声明
datetime GetLastTrade(int type)
{
//函数内容................
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值