Person: 
- 我想和你交流下外汇的CTrader平台,关于cBot的开发. 文字部分请尽量简短的回答我

ChatGPT: 
- 好的,我可以和你讨论关于CTrader平台和cBot开发。请问你有什么具体的问题或者想要了解的内容吗?

Person: 
- 我希望你接下来的所有回答是专业的,不能是含糊的,也不能使用伪代码。

ChatGPT: 
- 好的,我会尽我所能提供尽可能准确和专业的回答。

Person: 
- 作为专业的c#量化工程师,根据我提出的需求实现功能

ChatGPT: 
- 好的,请问您需要实现的具体功能是什么?可以提供更具体的需求吗?

Person: 
- 接下来我们定义的这个自动化交易程序,名字叫做AutoSMCRobot,你记住下,我们会开始逐步交流和完善逻辑,这个过程当中,你不用反复的把所有代码展示出来,只用部分展示,用来确认我们沟通的信息是否正确

ChatGPT: 
- 好的,我已经记住了AutoSMCRobot这个自动化交易程序的名称。请问您现在想要讨论的是哪个部分的逻辑呢?

Person: 
- 首先我定义下我们会用到的指标:
1. Average Directional Movement Index Rating, 简称DMI,指标的说明文档:<https://help.ctrader.com/ctrader-automate/references/Indicators/AverageDirectionalMovementIndexRating/?h=averagedirectionalmovementindexrating>
2. Stochastic Oscillator, 简称KDJ,指标的说明文档:<https://help.ctrader.com/ctrader-automate/references/Indicators/StochasticOscillator/?h=stochasticoscillator>
3. Bollinger Bands, 简称BOLL, 指标的说明文档:<https://help.ctrader.com/ctrader-automate/references/Indicators/BollingerBands/?h=boll>

请你根据文档的知识进行学习,然后和我说下怎么使用这些指标,让我确定你已经学会了

ChatGPT: 
- 好的,我已经阅读了这些指标的文档,并且可以告诉您如何使用它们。 
1. DMI指标的计算需要使用True Range(TR)和Directional Movement(DM)两个变量,可以使用cTrader自带的TrueRange和DirectionalMovement指标计算。计算出TR和DM之后,就可以使用cTrader提供的AverageDirectionalMovementIndexRating指标计算DMI指标的值。 
2. KDJ指标需要使用一段时间内的最高价、最低价和收盘价计算。可以使用cTrader自带的High、Low和Close指标来获取这些数据,然后使用cTrader提供的StochasticOscillator指标计算KDJ指标的值。 
3. BOLL指标需要使用一段时间内的收盘价计算。可以使用cTrader自带的Close指标获取这些数据,然后使用cTrader提供的BollingerBands指标计算BOLL指标的值。

以上是关于这些指标的使用方法,您可以确认一下我理解的是否正确。

Person: 
- 分别给出这三个指标使用范例,用cBot的代码形式给出,尽量简短

ChatGPT: 
- 好的,请看下面的范例代码:
1. DMI指标使用范例:

```less

// 计算True Range和Directional Movement
var tr = MarketSeries.TrueRange;
var dmPlus = MarketSeries.DirectionaldMovementPlus;
var dmMinus = MarketSeries.DirectionaldMovementMinus;

// 计算DMI指标
var dmi = Indicators.AverageDirectionalMovementIndexRating(tr, dmPlus, dmMinus, 14);
  1. KDJ指标使用范例:

// 获取最高价、最低价和收盘价
var high = MarketSeries.High;
var low = MarketSeries.Low;
var close = MarketSeries.Close;

// 计算KDJ指标
var kdj = Indicators.StochasticOscillator(high, low, close, 14, 3, 3, MovingAverageType.Exponential);
  1. BOLL指标使用范例:

// 获取收盘价
var close = MarketSeries.Close;

// 计算BOLL指标
var boll = Indicators.BollingerBands(close, 20, 2);

以上代码是一个简单的范例,实际使用时需要根据具体情况进行调整和优化。

Person:

ChatGPT:

  1. DMI指标使用范例:

using cAlgo.API;
using cAlgo.API.Indicators;

[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class DMISample : Indicator
{
    [Parameter("DMI Periods", DefaultValue = 14)]
    public int Periods { get; set; }

    private AverageDirectionalMovementIndexRating dmi;

    protected override void Initialize()
    {
        dmi = Indicators.AverageDirectionalMovementIndexRating(Periods);
    }

    public override void Calculate(int index)
    {
        double dmiValue = dmi.Result[index];
        // 根据DMI指标的值进行相应的操作
    }
}
  1. KDJ指标使用范例:

using cAlgo.API;
using cAlgo.API.Indicators;

[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class KDJSample : Indicator
{
    [Parameter("KDJ Periods", DefaultValue = 14)]
    public int Periods { get; set; }

    private StochasticOscillator kdj;

    protected override void Initialize()
    {
        kdj = Indicators.StochasticOscillator(MarketSeries.High, MarketSeries.Low, MarketSeries.Close, Periods, 3, 3, MovingAverageType.Exponential);
    }

    public override void Calculate(int index)
    {
        double kdjValue = kdj.Result[index];
        // 根据KDJ指标的值进行相应的操作
    }
}
  1. BOLL指标使用范例:

using cAlgo.API;
using cAlgo.API.Indicators;

[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class BOLLSample : Indicator
{
    [Parameter("BOLL Periods", DefaultValue = 20)]
    public int Periods { get; set; }

    [Parameter("BOLL Deviations", DefaultValue = 2)]
    public double Deviations { get; set; }

    private BollingerBands boll;

    protected override void Initialize()
    {
        boll = Indicators.BollingerBands(MarketSeries.Close, Periods, Deviations);
    }

    public override void Calculate(int index)
    {
        double upperBand = boll.Top[index];
        double lowerBand = boll.Bottom[index];
        // 根据BOLL指标的值进行相应的操作
    }
}

以上是将c#代码转换为cTrader的cBot形式的范例,您可以根据需要进行调整和修改。

Person:

  1. dmi并不是一个单一指标,它有四个子指标分别是:ADX、ADXR、DIMinus、DIPlus
  2. kdj有两个子指标:PercentD、PercentK
  3. boll有三个子指标:Main、Top、Bottom

例如:我们使用dmi.ADX时,是这样调用的

  1. 取最新值:dmi.ADX.LastValue
  2. 取历史第五个: dmi.ADX.Last[5]

ChatGPT:


// 计算DMI指标
AverageDirectionalMovementIndexRating dmi = Indicators.AverageDirectionalMovementIndexRating(MarketSeries.Close);

// 访问DMI指标的子元素
double adx = dmi.ADX.Last(0);
double adxr = dmi.ADXR.Last(0);
double diMinus = dmi.DIMinus.Last(0);
double diPlus = dmi.DIPlus.Last(0);

// 计算KDJ指标
StochasticOscillator kdj = Indicators.StochasticOscillator(MarketSeries.Close, 14, 3, 3);

// 访问KDJ指标的子元素
double percentD = kdj.PercentD.Last(0);
double percentK = kdj.PercentK.Last(0);

// 计算Bollinger Bands指标
BollingerBands boll = Indicators.BollingerBands(MarketSeries.Close, 20, 2, MovingAverageType.Simple);

// 访问Bollinger Bands指标的子元素
double bollMain = boll.Main.Last(0);
double bollTop = boll.Top.Last(0);
double bollBottom = boll.Bottom.Last(0);

Person:

ChatGPT:


- 趋势趋势:ADX平滑倾斜向上或向下
    - 开始阶段:
        - [m15]ADX:进入相对平滑倾斜
        - [m15]MACD(52|24|18):BAR放量
        - [m15]KDJ(18|6|18):慢线没有进入超买或者超卖区间
        - [m15]MA(8): 柱线收盘没有跌破均线
        - [h1]MACD(52|24|18): DEA和DIF同向运行且斜率高,Bar放量
        - [h1]MA(8): 柱线收盘没有跌破均线
    - 结束阶段:
        - [h1]BOLL: 通道形成上下边线拐弯,整体形状形成鸭嘴型
        - [h1]ADX:进入相对高位(大于30)后,斜率变化
        - [h1]MA(8): 柱线收盘突破均线下方
        - [m15]MACD(52|24|18):BAR出现背离(三浪,五浪)且缩量,DIF和DEA运行至高位
        - [m15]KDJ:长短期的快慢线,长时间运行在超卖或者超买区
    - 操作方式:
        1. 开始阶段,根据趋势下单
        2. 中间运行阶段,[m5]找机会运行至BOLL边线或者中线的时候,同向下单
        3. 结束阶段,反向下单,进入震荡交易模式
    - 提示:
        1. [m5]用于控制精确地买卖点位(并非控制买卖的信号和方向)
        2. [m15],[m30],[h1]用于确定市场当前属性(震荡、趋势)和方向(看涨、看跌)
        3. 趋势行情未结束前,不能反向下单
        4. 趋势行情不能根据以下指标作为开仓信号:KDJ、BOLL

- 震荡趋势: 非趋势行情的时候,震荡分成大震荡(约等于小趋势)和小震荡
    - 分类方式:利用[m5]ADX和MACD量能来确实是否是小趋势行情还是震荡
    - 操作方式:
        1. [m5]用于控制精确地买卖点位(并非控制买卖的信号和方向)
        2. [m30]用于确定方向(看涨、看跌)和时机
        3. [m30]利用BOLL(边线)和KDJ(快慢周期的快线)来决定买卖时机,结合分类方式判断行情变化情况

```markdown
- 30M交易系统:
    - 趋势交易
        - 开仓信号: 
            1. Macd
                - Bar连续放量{X}根
                - DEA、DIF连续{X}根比前一根多
            2. DMS
                - ADX连续向上,连续{X}根间隔必须大于等于1
                - ADX必须小于等于30以下
            3. KDJ
                - 慢周期的慢线小于等于50
                - 快周期的快慢线大于等于50
                - 慢周期的快线大于等于50
            4. MA
                - 收盘价格连续{X}根大于8MA均线
            5. 当前价格低于前一根开盘价
        - 平仓信号:
            1. KDJ 快慢周期的快慢线大于80或者小于20【出现过】
            2. 收盘价连续{X}根低于前一根收盘价
            3. MACD Bar连续缩量{X}根
            4. 当前价格高于前一根开盘价
            5. BOLL边线低于前一个边线
  1. 交易手法:

    把握不大的行情,使用马丁;例如大幅度boll、均线压制的boll震荡、辅助信号冲突

    冲突信号尽量不操作

    把握大的行情,直接半仓方式买入,举例:

    • 标准震荡+信号
    • 趋势+BOLL鸭嘴
    1. 马丁交易法:按照仓位5%,10%,20%方式,按照500点方式进阶开仓;需要在5分钟K线上进行低卖高卖

      $1000: 0.12, 0.24, 0.48

      $200: 0.02, 0.04, 0.08

    2. 止损设置

      1. 特破BOLL中均线,设置止损在0点以上,约100~200点位置
      2. 实体阳线或者阴线突破BOLL边线,根据其余指标情况设置移动止损或者强平
      3. KDJ是否刚转向
      4. MACD是否还没突破0线
      5. 是否完全突破多重MA, 上次MA是否有回踩不破之类的迹象?
      6. 按照$300, 0.1手比例交易,控制每次回撤小于等于20%

      一般情况下最佳止损距离点位是600;马丁第一次买入是在300点附近;

      两者冲突时,按照顺序接触冲突,举例做空:(快速马丁,快速平仓)

      • 1500.0做空1手,成本线:1500
      • 1503.0做空2手,成本线:1502
      • 1501.5平掉1手, 成本线:1503

      马丁仓位控制下,最多只能多交易一次。

  2. 市场状态区分:震荡、趋势

    1. 震荡:ADX小于40,走势波动率较大
      1. 主要参考BOLL边线支撑
      2. 辅助KDJ、均线支撑或者压制
      3. RSI 多线回踩支撑
    2. 趋势:ADX大于40,走势波动率较小
      1. 观察ADX和DIF DEA是否形成共振
      2. BOLL开头鸭嘴,回调顺势做单;无法突破中线则反向做单(通过止损)
      3. KDJ快线反弹还是高于60,价格在BOLL中线支撑之上(买入顺势交易)
    3. 行情转变趋势征兆:
      1. KDJ慢线刚掉头或者处于高位
      2. RSI急降且斜率接近80°以上,
      3. DIF DEA同步转弯启动迹象
      4. DI交叉后开大口(斜率高)
    4. 行情转变震荡信号:
      1. RSI出现M头背离
      2. 收到日线级别均线压制或者支撑
      3. KDJ快线突破中位数
      4. RSI多线突破支撑
      5. DEA,DIF出现顶部死叉

额外规则记录

  1. BOLL信号不能匹配DI扩张DI过远交叉D线反向拉升
  2. KDJ和均线信号不能匹配高位区平滑走平
  3. 每次经过一个标准的BOLL信号后,下个信号要标准点后上下偏移300~500点;《马丁交易解决》
  4. 反弹过程,如果反复被压制,及时设置止损或者平仓
  5. 平滑D线反向拉升DI面积扩张,不能同时出现。
  6. BOLL鸭嘴型的鸭头买入,边线外止损设置反向单.(注意看BOLL是否重新开口)
  7. 多指标冲突的时候,尽量控制盈利在500以内;多周期或者多指标共振则可以适当拿久

交易策略

震荡交易法

  1. 判断行情为震荡(ADX低于35且非平滑

    优化点:考虑adx大于35出现概率和频次

    即将出现时至于设置小止损或者小手单

    观察最近半年,平均一周一次(每周一次趋势性大行情)

  2. 只关注BOLL边线

    1. 平仓:中线+KDJ止盈,边线止损,KDJ止损
    2. 开仓:边线开仓 + (KD非同时反向[走缓] + DI非扩张 + ADX非平滑)