资源加载中... loading...

求助:如何防止同一根K线上不停的下买单和卖单

Author: xionglonghui, Created: 2021-09-20 09:10:57, Updated:

由于受麦语言本身的局限性, 不得不把策略用JS重新实现.

自从用JS重新实现麦语言策略,发现了好多问题,实盘运行中, 发现同一根K线上, 由于波动性, 会来回 1-2次的买卖.导致亏损. 而在麦语言里一句AUTOFILTER; 就搞定了. 完全不用管, 在实时模型里,也不会在同一根K线上来回下单.

请问一下,麦语言里是如何设计避免这种情况的, 大致的逻辑思路是怎样的?

或者: 我用JS 有什么办法防止同一个K线上不做二次买入和卖出. 有想用时间戳解决,发现成交的订单里没有时间戳, 下单用JS自带的Date.parse(new Date()) 下单的时间, 如果碰到未下单成功,或者下单了未成交的单, 又如何解决? 逻辑思路是怎样的?


More

xionglonghui 还是有问题, 用下面的代码, 是可以防止同一根K线上不会因为一点波动 在同一根K线上不停的买卖造成亏损. 但是又有 新问题, 就是同一根K线平多后,想立马反手做空, 它被限制了, 必须等到下一根K线才会开空仓. 或者平空后,想在同一根K线上反手做多, 也被限制了, 必须等到下一根K线开始才能开仓, 往往错过了最佳买入点. 代码如下: if (before_record_time != now_records.Time) //上一根的K线时间不等于这根K线的时间错, 则为不同的K线 { // 这里写开平仓的业务逻辑, 就可以不在同一根K线上反复开平仓了 } 我的解决办法如下: 之前是一个变量存储上一根的K线时间戳. 现在改成2个变量存储. 一个做多方向的时间戳 duo_before_record_time 一个做空方向的时间戳 kong_before_record_time 做多的时候用这个限制一下, 同一根K线, 平仓后不开相同方向的仓 代码如下: if (duo_before_record_time != now_records.Time) //上一根的K线时间不等于这根K线的时间错, 则为不同的K线 { // 这里写开平仓的业务逻辑, 就可以不在同一根K线上反复开平仓了 } 做空的时候, 也限制一下, 在同一根K线上平仓后不开相同反向的仓 if (kong_before_record_time != now_records.Time) //上一根的K线时间不等于这根K线的时间错, 则为不同的K线 { // 这里写开平仓的业务逻辑, 就可以不在同一根K线上反复开平仓了 } 这样同一根K线在平仓后, 在符合开仓条件的情况,可以立马开相反方向的仓位. 但是不会开相同方向的仓位. (即使符合开仓条件, 在同一根K线上也不会开了) 我的问题希望对后来的朋友也有所帮助.

小草 工单回复你了

凉心良意 K线横轴是时间,应该用时间解决吧。

xionglonghui 代码如下: if (before_record_time != now_records.Time) //上一根的K线时间不等于这根K线的时间错, 则为不同的K线 { // 这里写开平仓的业务逻辑, 就可以不在同一根K线上反复开平仓了 }

xionglonghui 发现有更好的解决办法, 先声明一个变量, 用于存每次的下单时候的当前最新K线的时间戳 (无论做多做空开仓平仓,只要下单都存这个变量覆盖), 然后判断上一次开平仓的时间戳 不等于 现在这根最新K线的时间戳, 即可完美解决.. 之前的方法有bug, 比如第一根K线开仓了, 第二根K线暴跌, 但是不会平仓, 一定要等到第三根K线才会去平仓. 用最新的对比上一次开平仓的K线时间戳和现在最新K线的时间戳, 可以完美解决问题..

xionglonghui 顺便说一下, 用 exchange.GetOrders().length>0 确定好了没有未成交的订单, 再存下单时间.

xionglonghui 摸索了好一阵, 终于解决了, 代码如下: if ( Math.abs(before_order_time - now_records.Time)/1000 > now_period ) //上一次下单的时间戳减去现在K线的时间戳, 除以1000是为了获得秒数, 取两者差的绝对值, 如果大于周期的秒数, 就不在同一根K线上. //需要自己设置变量before_order_time, 每次下单存一下下单的时间戳. before_order_time = Date.parse(new Date()); //把现在的时间戳记录一下 //周期数的秒数,是通过 var now_period = _C(exchange.GetPeriod); // 获取当前的周期, 例如5分钟, 15分钟, 1天, 返回的结果数为秒.

夏天不打你 应该可以通过K线数据里面的时间戳来进行拦截。判断是相同的时间戳不下单即可。