报价策略

概览

MqStrategy 是一种使用报价机制来管理市场持仓的策略。它基于当前持仓创建一个报价处理器,使其能够自适应地响应市场条件的变化。

主要组件

public class MqStrategy : Strategy
{
	private readonly StrategyParam<MarketPriceTypes> _priceType;
	private readonly StrategyParam<Unit> _priceOffset;
	private readonly StrategyParam<Unit> _bestPriceOffset;

	private QuotingProcessor _quotingProcessor;
}

策略参数

该策略允许自定义以下参数:

  • PriceType - 报价的市场价格类型(默认 跟随)
  • 价格偏移 - 与市场价格的偏移
  • BestPriceOffset - 报价更新的最小偏差(默认 0.1%)

策略初始化

OnStarted2 方法中,该策略订阅市场时间的变化:

protected override void OnStarted2(DateTime time)
{
	base.OnStarted2(time);

	// 订阅市场时间变化以更新报价
	Connector.CurrentTimeChanged += Connector_CurrentTimeChanged;
	Connector_CurrentTimeChanged(default);
}

管理报价处理器

当市场时间变化时,会调用 Connector_CurrentTimeChanged 方法,它管理报价处理器的创建和更新:

private void Connector_CurrentTimeChanged(TimeSpan obj)
{
	// 仅在当前处理器已停止或不存在时创建新处理器
	if (_quotingProcessor != null && _quotingProcessor.LeftVolume > 0)
		return;

	// 如果旧处理器存在,则释放其资源
	_quotingProcessor?.Dispose();
	_quotingProcessor = null;

	// 根据当前持仓确定报价方向
	var side = Position <= 0 ? Sides.Buy : Sides.Sell;

	// 创建新的报价行为
	var behavior = new MarketQuotingBehavior(
		PriceOffset,
		BestPriceOffset,
		PriceType
	);

	// 计算报价数量
	var quotingVolume = Volume + Math.Abs(Position);

	// 创建并初始化处理器
	_quotingProcessor = new QuotingProcessor(
		behavior,
		Security,
		Portfolio,
		side,
		quotingVolume,
		Volume, // 最大订单数量
		TimeSpan.Zero, // 无超时
		this, // 策略实现 ISubscriptionProvider
		this, // 策略实现 IMarketRuleContainer
		this, // 策略实现 ITransactionProvider
		this, // 策略实现 ITimeProvider
		this, // 策略实现 IMarketDataProvider
		IsFormedAndOnlineAndAllowTrading, // 检查交易权限
		true, // 使用订单簿价格
		true  // 订单簿为空时使用最后成交价
	)
	{
		Parent = this
	};

	// 订阅处理器事件以记录日志
	_quotingProcessor.OrderRegistered += order =>
		this.AddInfoLog($"订单 {order.TransactionId} 已以价格 {order.Price} 注册");

	_quotingProcessor.OrderFailed += fail =>
		this.AddInfoLog($"订单失败: {fail.Error.Message}");

	_quotingProcessor.OwnTrade += trade =>
		this.AddInfoLog($"成交已执行: {trade.Trade.Volume},价格 {trade.Trade.Price}");

	_quotingProcessor.Finished += isOk => {
		this.AddInfoLog($"报价成功完成: {isOk}");
		_quotingProcessor?.Dispose();
		_quotingProcessor = null;
	};

	// 启动处理器
	_quotingProcessor.Start();
}

资源释放

OnStopped 方法中,该策略会释放资源:

protected override void OnStopped()
{
	// 取消订阅以防止内存泄漏
	Connector.CurrentTimeChanged -= Connector_CurrentTimeChanged;

	// 如果当前处理器存在,则释放其资源
	_quotingProcessor?.Dispose();
	_quotingProcessor = null;

	base.OnStopped();
}

交易逻辑

  • 该策略应对市场时间变化
  • 报价方向是根据当前位置确定的:
    • 如果持仓 <= 0,则创建买入报价
    • 如果持仓 > 0,则创建卖出报价
  • 报价量的计算方式是基础量加上当前持仓的绝对值
  • QuotingProcessorMarketQuotingBehavior 一起用于报价

特征

  • 使用现代报价处理器而不是传统报价策略
  • 通过改变报价方向来自适应地响应位置变化
  • 支持配置各种报价参数(价格类型、偏移量、最小偏差)
  • 包括报价处理器事件的详细日志记录
  • 在停止策略和创建新处理器时,正确管理资源
  • 支持处理不同类型的市场价格(跟随价、最佳价、相反价等)