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

本文探讨了在量化交易中如何避免同一K线周期内的重复下单和平仓问题,提供了使用MQL语言实现的具体方法,包括利用函数判断是否处于新的K线周期及如何控制交易频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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)
{
//函数内容................
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值