金融总结八---多头/空头平仓/开仓

本文解释了期货交易中的关键概念,包括开仓、平仓、持仓、多头和空头等。详细介绍了这些术语的含义及如何操作,帮助读者更好地理解期货交易流程。
多头/空头平仓/开仓
开仓、平仓、持仓、多头和空头是什么意思?
  开仓也叫建仓,是指投资者新买入或新卖出一定数量的股指期货合约。如果投资者将这份股指期货合约保留到最后交易日,他就必须通过现金交割来了结这笔期货交易。
  平仓,是指期货投资者买入或者卖出与其所持期货合约的品种、数量以及交割月份相同但交易方向相反的股指期货合约,了结股指期货交易的行为。
  股指期货投资者在开仓之后尚没有平仓的合约,叫做未平仓合约,也叫持仓。开仓之后股指期货投资者有两种方式了结股指期货合约:或者选择平仓,或者持有至最后交易日并进行现金交割。
  投资者买入股指期货合约后所持有的持仓叫做多头持仓,简称多头;卖出股指期货合约后所持有的持仓叫做空头持仓,简称空头。持有多头的投资者认为股指期货合约价格会涨,所以会买进;相反,持有空头的投资者认为股指期货合约价格会下跌,所以才卖出。
  比如,某投资者在2006年12月15日开仓买进0701沪深300股指期货10手(张),成交价为1400点,这时,他就有了10手多头持仓。到12月17日,该投资者见期货价格上涨了,于是在1415点的价格卖出平仓6手0701股指期货合约,成交之后,该投资者的实际持仓就只有4手多头持仓了。


多头开仓是指投资者新买入一定数量的期货合约。投资者可以在合约到期前选择提前平仓;如果持有合约至最后交易日,就必须通过现金交割来了结这笔期货交易。
多头平仓:与空头平仓相对,多头平仓指持仓量减少,但持仓量的增加绝对值小于现量,且为主动卖盘;
空头平仓指持仓量减少,但持仓量的增加绝对值小于现量,且为主动买盘。
例如:假设以三个人作为交易对手,其中甲有多头持仓5手,乙有空头持仓5手,丙没有持仓;若乙想平仓了结部分持仓,则挂出买入平仓3手,丙认为大盘会涨,则挂出,买入开仓2手,在此时甲也想平仓了结,则以现价(买入价)挂出卖出平仓5手成交,盘面会显示:多平(多头平仓),现手成交量10手,仓差为-6。如果是空头平仓则是把甲作为主动挂出平仓单,乙随后再平仓即可。
在此,我们首先要明确一点,那就是无论买入转让还是买入订立,都显示多头;无论卖出转让还是卖出订立,都显示空头。
如果说上面的例子不是很清楚的话,可以这样认为:多头平仓是指空单持有者是以主动买入的方式在卖一价买入转让,而不是以排队的方式在买一价买入转让。简单的理解就是:多头平仓平掉的是空单。
如果有大量的多头平仓,会导致价格暂时上涨,短线高手可以适当做多,但要快进快出,防止主力使用假象迷惑散户,形成被套的仓单。
空头平仓指持仓量减少,但持仓量的增加绝对值小于现量,且为主动买盘。例:假设以三个人作为交易对手,其中甲有多头持仓5手,乙有空头持仓5手,丙没有持仓;若甲想平仓了结部分持仓,则挂出卖出平仓3手,丙认为大盘会跌,则挂出卖出开仓2手,在此时乙也想平仓了结,则以现价(卖出价)挂出买入平仓5手成交,盘面会显示:空平(空头平仓),现手成交量10手,仓差为-6。如果是多头平仓则是把乙作为主动挂出平仓单,甲随后再平仓即可。
空头开仓是指投资者新卖出一定数量的期货合约。投资者可以在合约到期前选择提前平仓;如果持有合约至最后交易日,就必须通过现金交割来了结这笔期货交易。

//该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric FastLength(5); //快线周期 Numeric SlowLength(20); //慢线周期 Vars NumericSeries AvgValue1; //快线周期均值 NumericSeries AvgValue2; //慢线周期均值 Begin //---------------------变量赋值---------------------// AvgValue1 = Ma(Close,FastLength); //快线周期均值 AvgValue2 = Ma(Close,SlowLength); //慢线周期均值 PlotNumeric("MA1",AvgValue1); PlotNumeric("MA2",AvgValue2); //---------------------策略---------------------// If(BKVol == 0 && AvgValue1 > AvgValue2) { BPK(1); //当前无仓且快线周期的均线高于慢线周期的均线,开仓1手 } //---------------------策略---------------------// If(SKVol == 0 && AvgValue1 < AvgValue2) { SPK(1); //当前无仓且快线周期的均线低于慢线周期的均线,开仓1手 } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric AvgLen(3); //boll均线周期参数 Numeric Disp(16); //boll平移参数 Numeric SDLen(12); //boll标准差周期参数 Numeric SDev(2); //boll通道倍数参数 Vars Numeric TPrice; //关键价格 NumericSeries AvgVal; //中轨 NumericSeries SDmult; //通道距离 NumericSeries DispTop; //通道高点 NumericSeries DispBottom; //通道低点 Begin //---------------------变量赋值---------------------// //平移boll通道计算 TPrice = Close; //关键价格 AvgVal = Ma(TPrice,AvgLen); SDmult = Std(TPrice,SDLen) * SDev; DispTop = AvgVal[Disp] + SDmult; DispBottom = AvgVal[Disp] - SDmult; //系统入场 If(BKVol == 0 && SKVol == 0) { If(Close >= DispTop) { BK(1); } Else If(Close <= DispBottom) { SK(1); } } //系统出场 If(BKVol > 0 && BarsSinceEntry > 0) { If(Close <= DispBottom) { SP(BKVol); } } If(SKVol > 0 && BarsSinceEntry > 0) { If(Close >= DispTop) { BP(SKVol); } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Tick;//设置回测数据类型 Params Numeric AvgLen(20); //高低点均线计算周期 Numeric AbsDisp(5); //高低点均线前移周期 Numeric ExitBar(5); //止损周期参数,该周期以前中轨止损,以后外轨止损 Vars NumericSeries UpperAvg; //通道上轨 NumericSeries LowerAvg; //通道下轨 NumericSeries ExitAvg; //通道中轨 NumericSeries RangeLeadB; NumericSeries RangeLeadS; NumericSeries MedianPrice; //K线中点 NumericSeries Range1; //K线振幅 Begin //---------------------变量赋值---------------------// Range1 = High - Low; //K线振幅 UpperAvg = Ma(High[AbsDisp],AvgLen); //计算AvgLen周期内,AbsDisp周期前高点的均值 LowerAvg = Ma(Low[AbsDisp],AvgLen); //计算AvgLen周期内,AbsDisp周期前低点的均值 MedianPrice = (High + Low) * 0.5; //计算K线中点 ExitAvg = Ma(MedianPrice[AbsDisp],AvgLen); //计算AvgLen周期内,AbsDisp周期前K线中点的均值 RangeLeadB = MedianPrice > High[1] && Range1 > Range1[1]; //当根K线满足中点大于前一根K线高点且振幅大于上一根振幅 RangeLeadS = MedianPrice < Low[1] && Range1 > Range1[1]; //当根K线满足中点小于前一根K线低点且振幅大于上一根振幅 PlotNumeric("Lineu",UpperAvg); //输出通道上轨 PlotNumeric("LineM",ExitAvg); //输出通道中轨 PlotNumeric("Lingd",LowerAvg); //输出通道下轨 //系统入场 If(BKVol == 0 && SKVol == 0) //无持仓 { If(RangeLeadB == 1 && Close > UpperAvg) { BK(1); //当根K线满足RangeLeadB条件,且当根收盘价大于当根通道上轨,开仓1手 } If(RangeLeadS == 1 && Close < LowerAvg) { SK(1); //当根K线满足RangeLeadS条件,且当根收盘价小于当根通道下轨,开仓1手 } } //系统出场 If(BKVol > 0 && BarsSinceEntry > 0) //持有仓且开仓后一根K线以后 { If(BarsSinceEntry <= ExitBar) //开仓后ExitBar根K线内 { If(Close <= ExitAvg) { SP(BKVol); //收盘价小于等于中轨,平全部持仓 } } Else If(BarsSinceEntry > ExitBar) //否则开仓后ExitBar根K线以后 { If(Close <= UpperAvg - MinPrice) { SP(BKVol); //收盘价小于等于上轨减最小变动价位,平全部持仓 } } } If(SKVol > 0 && BarsSinceEntry > 0) //持有仓且开仓后一根K线以后 { If(BarsSinceEntry <= ExitBar) //开仓后ExitBar根K线内 { If(Close >= ExitAvg) { BP(SKVol); //收盘价大于等于中轨,平全部持仓 } } Else If(BarsSinceEntry > ExitBar) //否则开仓后ExitBar根K线以后 { If(Close >= LowerAvg + MinPrice) { BP(SKVol); //收盘价大于等于下轨加最小变动价位,平全部持仓 } } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric LEFast(5); //多头入场短均线周期参数 Numeric LESlow(20); //多头入场长均线周期参数 Numeric LXFast(3); //多头出场短均线周期参数 Numeric LXSlow(10); //多头出场长均线周期参数 Numeric SEFast(5); //空头入场短均线周期参数 Numeric SESlow(20); //空头入场长均线周期参数 Numeric SXFast(3); //空头出场短均线周期参数 Numeric SXSlow(10); //空头出场长均线周期参数 Vars NumericSeries MALEFast; //多头入场短均线 NumericSeries MALESlow; //多头入场长均线 NumericSeries MALXFast; //多头出场短均线 NumericSeries MALXSlow; //多头出场长均线 NumericSeries MASEFast; //空头入场短均线 NumericSeries MASESlow; //空头入场长均线 NumericSeries MASXFast; //空头出场短均线 NumericSeries MASXSlow; //空头出场长均线 Begin //---------------------变量赋值---------------------// MALEFast = Ma(Close,LEFast); //多头入场短均线 MALESlow = Ma(Close,LESlow); //多头入场长均线 MALXFast = Ma(Close,LXFast); //多头出场短均线 MALXSlow = Ma(Close,LXSlow); //多头出场长均线 MASEFast = Ma(Close,SEFast); //空头入场短均线 MASESlow = Ma(Close,SESlow); //空头入场长均线 MASXFast = Ma(Close,SXFast); //空头出场短均线 MASXSlow = Ma(Close,SXSlow); //空头出场长均线 //---------------------策略---------------------// //多头入场 If(BKVol == 0 && CurrentBar >= 100) { If(MALEFast > MALESlow && MALXFast > MALXSlow && High >= High[1] && Vol > 0) { BK(1); //两组均线均成多头排列时且当前价高于上根BAR最高价入场 } } //多头出场 If(BKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(MALXFast < MALXSlow) { SP(BKVol); //小周期多头均线组合成空头排列出场 } } //---------------------策略---------------------// //空头入场 If(SKVol == 0 && CurrentBar >= 100) { If(MASEFast < MASESlow && MASXFast < MASXSlow && Low <= Low[1] && Vol > 0) { SK(1); //两组均线均成空头排列时且当前价低于上根BAR最低价入场 } } //空头出场 If(SKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(MASXFast > MASXSlow) { BP(SKVol); //小周期空头均线组合成多头排列出场 } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric FastMA(4); //MACD短周期值 Numeric SlowMA(10); //MACD长周期值 Numeric AvgMA(16); //MACD慢线周期值 Numeric ATRLen(10); //ATR周期值 Numeric EATRPcnt(1); //入场通道波动率过滤数值 Numeric XATRPcnt(1); //出场通道波动率过滤数值 Vars Numeric Con1; //上穿条件 Numeric Con2; //下穿条件 NumericSeries MACDLine; //MACD快线 NumericSeries SignalLine; //MACD慢线 NumericSeries ZeroLine; //0轴 NumericSeries AATR; //ATR波动率 NumericSeries UpTrend; //多头趋势变量 NumericSeries DnTrend; //空头趋势变量 NumericSeries BuySetup; //买入控制条件 NumericSeries SellSetup; //卖出控制条件 NumericSeries CTrendLow; //普通数值型序列变量 NumericSeries CTrendHigh; //普通数值型序列变量 NumericSeries SignalFlag; //普通数值型序列变量 NumericSeries UpperBand; //买入触发价 NumericSeries LowerBand; //卖出触发价 NumericSeries ExitBand; //出场触发价 Begin //---------------------变量赋值---------------------// MACDLine = Ema(Close,FastMA)- Ema(Close,SlowMA); //计算MACD快线 SignalLine = Ema(MACDLine,AvgMA); //计算MACD慢线 AATR = AvgTrueRange(ATRLen); //计算ATR波动率 ZeroLine = 0; //零轴 //---------------------策略---------------------// Con1 = CrossUp(SignalLine,ZeroLine); //慢线上穿零轴 If(Con1 == 1) //当慢线上穿零轴时候,定义为多头趋势 { UpTrend = 1; SignalFlag = 0; DnTrend = 0; SellSetup = 0; } If(UpTrend == 1) //多头趋势时记录当前最低价以及设置入场条件 { If(SignalFlag == 0) { BuySetup = 1; CTrendLow = Low; } If(MACDLine < SignalLine && Low < CTrendLow[1]) //MACD均线空头排列时候,且当前价格更低时更新最低价 { CTrendLow = Low; } } If(BuySetup[1] == 1 && BuySetup[2] == 0) //多头满足入场条件设定入场价格以及出场价格 { UpperBand = Close[1] + (EATRPcnt * AATR[1]); ExitBand = Close[1] - (XATRPcnt * AATR[1]); } //多头系统入场 If(BuySetup == 1 && BKVol == 0 && SKVol == 0 ) //做 { If(Close >= UpperBand) { BK(1); BuySetup = 0; //持有单时不再满足入场条件 SignalFlag = 1; } } //多头系统出场 If(BKVol > 0 && BarsSinceEntry > 0) { If(DnTrend == 1) { SP(BKVol); //多头趋势不在时,多头出场 } Else If(Close <= CTrendLow - MinPrice && CTrendLow - MinPrice >= ExitBand) //持有单后低于入场最低价格出场 { SP(BKVol); } Else If(Close <= Exitband) { SP(BKVol); //持有单后低于出场价格出场 } } //---------------------策略---------------------// Con2 = CrossDown(SignalLine,ZeroLine); //慢线下穿零轴 If(Con2 == 1) //当慢线下穿零轴时候,定义为空头趋势 { UpTrend = 0; BuySetup = 0; SignalFlag = 0; DnTrend = 1; } If(DnTrend ==1) { If(SignalFlag == 0) //空头趋势时记录当前最低价以及设置入场条件 { SellSetup = 1; CTrendHigh = High; } If(MACDLine > SignalLine && High > CTrendHigh[1]) //当MACD均线多头排列时候,且当前价格更高时更新最高价 { CTrendHigh = High; } } If(SellSetup[1] == 1 && SellSetup[2] == 0) //空头满足入场条件设定入场价格以及出场价格 { LowerBand = Close[1] - (EATRPcnt * AATR[1]); ExitBand = Close[1] + (XATRPcnt * AATR[1]); } PlotNumeric("LowerBand",AATR); //空头系统入场 If(SellSetup == 1 && BKVol == 0 && SKVol == 0 ) //做 { If(Close <= LowerBand) { SK(1); SellSetup = 0; //持有单时不再满足入场条件 SignalFlag = 1; } } //空头系统出场 If(SKVol > 0 && BarsSinceEntry > 0) { If(UpTrend == 1) { BP(SKVol); //空头趋势不在时,空头出场 } Else If(Close>= CTrendHigh + MinPrice && CTrendHigh + MinPrice <= ExitBand) //持有单后高于出场价格出场 { BP(SKVol); } Else If(Close >= ExitBand) { BP(SKVol); //持有单后低于入场最低价格出场 } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric Length1(50); //长周期区间参数 Numeric Length2(30); //短周期区间参数 Numeric IPS(4); //保护止损波动率参数 Numeric ATRVal(10); //波动率参数 Vars Numeric L1; //较大的区间参数 Numeric L2; //较小的区间参数 NumericSeries ATR; //真实波幅 NumericSeries Upperband; //上轨 NumericSeries Lowerband; //下轨 NumericSeries Exitlong; //区间最低价 NumericSeries Exitshort; //区间最高价 NumericSeries ProtectStopL; //定义简单数值型序列变量 NumericSeries ProtectStopS; //定义简单数值型序列变量 Begin //---------------------变量赋值---------------------// ATR = AvgTrueRange(ATRVal); //定义ATR L1 = Max(Length1,Length2); //出场周期选择较大的区间参数 L2 = Min(Length1,Length2); //出场周期选择较小的区间参数 Upperband = HV(High,L1); //长周期最高价区间 Lowerband = LV(Low,L1); //长周期最低价区间 Exitlong = LV(Low,L2); //短周期最低价区间 Exitshort = HV(High,L2); //短周期最高价区间 //---------------------策略---------------------// //多头系统入场 If(BKVol == 0 && SKVol == 0 &&Close >= Upperband + MinPrice && Vol > 0) { BK(1); //价格大于长周期最高价区间入场做 ProtectStopL = Entryprice - IPS * ATR; } //多头系统出场 If(BKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(Close <= ProtectStopL && ProtectStopL >= Exitlong) { SP(BKVol); //价格低于入场价以下一定ATR幅度止损 } Else If(Close <= Exitlong - MinPrice) { SP(BKVol); //价格低于短周期最低价区间出场 } } //---------------------策略---------------------// //空头系统入场 If(BKVol == 0 && SKVol == 0 && Close <= Lowerband - MinPrice && Vol > 0) { SK(1); //价格低于长周期最低价区间入场做 ProtectStopS = Entryprice + IPS * ATR; } //空头系统出场 If(SKVol > 0 && BarsSinceEntry> 0 && Vol > 0) { If(Close >= ProtectStopS && ProtectStopS <= Exitshort) { BP(SKVol); //价格高于入场价以上一定ATR幅度止损 } Else If(Close >= Exitshort + MinPrice) { BP(SKVol); //价格高于短周期最高价区间出场 } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric Length(10); //均线参数 Numeric Constt(12); //通道倍数 Numeric ChanPcnt(5); //入场参数 Numeric BuyN(5); //多头入场触发条件有效K线周期 Numeric SellN(5); //空头入场触发条件有效K线周期 Numeric StopN(4); //低点止损参数 Vars NumericSeries TPrice; //关键价格 NumericSeries KCU; //通道上轨 NumericSeries KCL; //通道下轨 NumericSeries ChanRng; //通道宽度 NumericSeries AvgVal; //通道中轨 NumericSeries AvgRange; //真实波动均值(ATR) NumericSeries Setbar; NumericSeries Setbar1; NumericSeries CountL; //触发单周期变量 NumericSeries CountS; //触发单周期变量 NumericSeries HH; //多头触发单价位 NumericSeries LL; //空头触发单价位 NumericSeries LStopLine; //止损线 NumericSeries SStopLine; //止损线 NumericSeries Con; NumericSeries Con2; Begin //---------------------变量赋值---------------------// //指标计算 TPrice = Close; //关键价格,可以换成中位价等 AvgVal = Ma(TPrice,Length); //计算均线 默认10周期 AvgRange = Ma(TrueRange,Length); //计算真实波动均值(ATR)默认10周期 KCU = AvgVal + AvgRange * Constt / 10; //计算通道上轨=均线+1.2倍的10周期真实波动值 KCL = AvgVal - AvgRange * Constt / 10; //计算通道下轨=均线-1.2倍的10周期真实波动值 ChanRng = (KCU - KCL) / 2; //通道宽度/2 CountL = CountL + 1; //每经过1根K线CountL+1,用于判断信号取消的变量,上穿上轨后,默认参数:开仓点仅挂单5根K线 CountS = CountS + 1; //每经过1根K线CountL+1,用于判断信号取消的变量,下穿下轨后,默认参数:开仓点仅挂单5根K线 Con = CrossUp(TPrice,KCU); //bool变量con,当价格上穿上轨时为真 If(Con == 1) { SetBar = High; CountL = 0; HH = SetBar + (ChanRng * ChanPcnt / 10); //当con为真时,计算开仓线hh,CountL重置为0 SetBar1 = Low; CountS = 0; LL = SetBar1 - (ChanRng * ChanPcnt / 10); } //---------------------策略---------------------// //多头系统入场 If( BKVol == 0 && SKVol == 0 ) { If(TPrice > KCU && CountL <= BuyN && TPrice >= HH) { BK(1); //当价格上穿上轨,且在BuyN根K线内>=HH时,买入开仓1手 } } //多头系统出场 Con2 = CrossDown(Close,AvgVal); //bool变量con,当价格下穿轨道中轨时为真 LStopLine = LLV(Low[1],StopN); If(BKVol > 0 && BarsSinceEntry > 0) { If(Con2 == 1) { SP(BKVol); //价格下穿轨道中轨时平全部持仓 } If(Low <= LStopLine) { SP(BKVol); //价格小于N周期低点平全部持仓 } } //---------------------策略---------------------// //空头系统入场 If( BKVol == 0 && SKVol == 0 ) { If(TPrice < KCL && CountS <= SellN &&TPrice <= LL) { SK(1); //当价格下穿下轨,且在SellN根K线内<LL时,卖出开仓1手 } } //空头系统出场 Con2 = CrossUp(Close,AvgVal); //bool变量con,当价格上穿轨道中轨时为真 SStopLine = HHV(High[1],StopN); If(SKVol > 0 && BarsSinceEntry > 0) { If(Con2 == 1) { BP(SKVol); //价格上穿轨道中轨时平全部持仓 } If(High >= SStopLine) { BP(SKVol); //价格大于N周期高点平全部持仓 } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric AvgLength(25); //计算WOBV的ma周期值 Vars Numeric Con; //中间变量 Numeric Con2; //中间变量 NumericSeries WOBV; //WOBV指标变量 NumericSeries SSMA; //WOBV指标均值变量 NumericSeries BuySetup; //开标识 NumericSeries SellSetup; //开标识 NumericSeries LEPrice; //多头触发线 NumericSeries SEPrice; //空头触发线 NumericSeries Con3; //中间变量 NumericSeries Con4; //中间变量 Begin //---------------------变量赋值---------------------// //WOBV指标计算 If(High - Low <> 0) { WOBV = WOBV + (((Close - Open) / (High - Low)) * Vol); //计算波动加权后的OBV,WOBV } SSMA = Ma(WOBV,AvgLength); //计算WOBV的MA //触发条件计算 Con = CrossUp(WOBV,SSMA); If(Con == 1) { BuySetup = 1; LEPrice = High; SellSetup = 0; } Con2 = CrossDown(WOBV,SSMA); If(Con2 == 1) { BuySetup = 0; SellSetup = 1; SEPrice = Low; } //---------------------策略---------------------// //做标识初始化 If(BKVol > 0) BuySetup = 0; //多头系统入场 If(BKVol == 0 && SKVol == 0) { If(BuySetup && Close >= LEPrice + MinPrice) { BK(1); } } //多头系统出场 Con3 = CrossDown(WOBV,SSMA); If(BKVol > 0 && BarsSinceEntry > 0) { If(Con3 == 1) { SP(BKVol); } } //---------------------策略---------------------// //做标识初始化 If(SKVol > 0) SellSetup = 0; //空头系统入场 If(BKVol == 0 && SKVol == 0) { If(SellSetup &&Close <= SEPrice - MinPrice) { SK(1); } } //空头系统出场 Con4 = CrossUp(WOBV,SSMA); If(SKVol > 0 && BarsSinceEntry > 0) { If(Con4 == 1) { BP(SKVol); } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric ATRs(3); //几倍ATR止盈 Numeric ATRLength(10); //ATR周期 Vars Numeric ATRVal; //ATR(平均真实波幅) NumericSeries WAvgPrice; //K线加权均值 NumericSeries Resistance; //阻力线 NumericSeries Support; //支撑线 NumericSeries MyExitPrice; //开仓BAR根据当时的ATR计算出的止盈价 Begin //---------------------变量赋值---------------------// //计算当前K线的加权均值、阻力线和支撑线 WAvgPrice = (High + Low + (Close * 2)) / 4; Resistance = (WAvgPrice * 2) - Low; Support = (WAvgPrice * 2) - High; PlotNumeric("Resistance",Resistance[1]); PlotNumeric("Support",Support[1]); //计算ATR ATRVal = AvgTrueRange(ATRLength); //---------------------策略---------------------// //多头开仓 If(BKVol == 0 && SKVol == 0 && High >= Resistance + MinMove * PriceScale && Vol > 0) { BK(1); } //计算止盈价 //多头开仓时根据开仓BAR的ATR计算止盈价 If(BKVol > 0 && BarsSinceEntry == 0) { MyExitPrice = EntryPrice + ATRVal * ATRs; } //多头平仓 If(BKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(Close >= MyExitPrice) { SP(BKVol); //止盈出场 KText(Close >= MyExitPrice,0,High,Red,"止盈出场"); } Else If(Close <= Support - MinMove * PriceScale) { SP(BKVol); //反向突破止损出场 KText(Close <= Support - MinMove * PriceScale,0,High,Green,"反转出场"); } } //---------------------策略---------------------// //空头开仓 If(BKVol == 0 && SKVol == 0 && Low <= Support - MinMove * PriceScale && Vol > 0) { SK(1); } //计算止盈价 //空头开仓时根据开仓BAR的ATR计算止盈价 If(SKVol > 0 && BarsSinceEntry == 0) { MyExitPrice = EntryPrice - ATRVal * ATRs; } //空头平仓 If(SKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(Close <= MyExitPrice) { BP(SKVol); //止盈出场 KText(Close <= MyExitPrice,0,High,Red,"止盈出场"); } Else If(Close >= Resistance + MinMove * PriceScale) { BP(SKVol); //反向突破止损出场 KText(Close >= Resistance + MinMove * PriceScale,0,High,Green,"反转出场"); } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric Length(5); //强弱指标和通道计算的周期值 Numeric Stop_Len(5); //止损通道的周期值 Numeric ProfitFactor(3); //止盈相对止损的倍数 Numeric EntryStrength(95); //强弱指标的进场值 Vars Numeric X; //循环控制变量 Numeric UpCloses; //收盘价上涨累计值 Numeric DnCloses; //收盘价下跌累计值 Numeric SumChange; //收盘价变动累计值 NumericSeries CloseChange; //收盘价变动值 NumericSeries MarketStrength; //市场强弱指标 NumericSeries Momentum1; //当前Bar相对前4根BAR的动量 NumericSeries Momentum2; //前4根BAR相对前8根BAR的动量 NumericSeries HH; //N周期高点 NumericSeries HH1; //N周期高点 NumericSeries HH2; //N周期高点 NumericSeries LL; //N周期低点 NumericSeries LL1; //N周期低点 NumericSeries LL2; //N周期低点 NumericSeries StopLoss; //止损位 NumericSeries ProfitTarget; //止盈位 Begin //---------------------变量赋值---------------------// //计算市场强弱指标 CloseChange = Close - Close[1]; UpCloses = 0; DnCloses = 0; For X = 0 To Length - 1 { //收盘价上涨计入涨幅累计 If(CloseChange[X] > 0) { UpCloses = UpCloses + CloseChange[X]; } //否则计入跌幅累计 Else { DnCloses = DnCloses + CloseChange[X]; } } //计算周期内涨跌 SumChange = Sum(CloseChange,Length); //周期内上涨,计算上涨强度,0-100之间 If(SumChange >= 0) { MarketStrength = SumChange / UpCloses * 100; } //周期内下跌,计算下跌强度,0-100之间 Else { MarketStrength = SumChange / Abs(DnCloses) * 100; } //计算动量 Momentum1 = Close - Close[4]; Momentum2 = Close[4] - Close[8]; //---------------------策略---------------------// //计算周期高低点,多头开仓突破用 HH = HHV(High,Length); //最高价 LL1 = LLV(Low,Length); //最低价 //计算周期低点,多头开仓后止损用 LL2 = LLV(Low,Stop_Len); //多头开仓条件 If(BKVol == 0 && SKVol == 0 && MarketStrength >= EntryStrength && Momentum1 >= 0 && Momentum2 < 0 && Close >= HH && Vol > 0) { BK(1); //记录开仓BAR的周期低点作为止损位 StopLoss = LL2; //根据止损位计算止盈位 ProfitTarget = EntryPrice + (EntryPrice - StopLoss) * ProfitFactor; } //多头平仓条件 If(BKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(Close >= ProfitTarget) //最新价>=止盈价 { SP(BKVol); } Else If(Close <= StopLoss) //最新价<=止损价 { SP(BKVol); } Else If(MarketStrength <= -1 * EntryStrength && Momentum1 < 0 && Momentum2 >= 0 && Close <= LL1) { SP(BKVol); } } //---------------------策略---------------------// //计算周期高低点,空头开仓突破用 HH1 = HHV(High,Length); //最高价 LL = LLV(Low,Length); //最低价 //计算周期高点,空头开仓后止损用 HH2 = HHV(High,Stop_Len); //空头开仓条件 If(BKVol == 0 && SKVol == 0 && MarketStrength <= -1 * EntryStrength && Momentum1 <= 0 && Momentum2 > 0 && Close <= LL && Vol > 0) { SK(1); //记录开仓BAR的周期高点作为止损位 StopLoss = HH2; //根据止损位计算止盈位 ProfitTarget = EntryPrice - (StopLoss - EntryPrice) * ProfitFactor; } //空头平仓条件 If(SKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(Close <= ProfitTarget) //最新价<=止盈价位 { BP(SKVol); } Else If(Close >= StopLoss) //最新价>=止损价位 { BP(SKVol); } Else If(MarketStrength >= EntryStrength && Momentum1 > 0 && Momentum2 <= 0 && Close >= HH1) { BP(SKVol); } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric FastMALength(5); //动能计算中的快均线周期 Numeric SlowMALength(20); //动能计算中的慢均线周期 Numeric TrendMALength(50); //趋势线计算中的周期数 Numeric ExitStopN(3); //求高低点的bar数值 Vars NumericSeries TrendMA; //趋势线 NumericSeries PriceOsci; //均线动能 NumericSeries ExitL; //多头出场价格 NumericSeries ExitS; //空头出场价格 NumericSeries BV; //BKVol的状态记录 NumericSeries SV; //SKVol的状态记录 Begin //---------------------变量赋值---------------------// TrendMA = Ma(Close,TrendMALength); //计算TrendMALength周期收盘价的平均值 PriceOsci = PriceOscillator(Close,FastMALength,SlowMALength); //计算FastMALength,SlowMALength周期收盘价的快慢周期震荡值 ExitL = LLV(Low,ExitStopN); //计算ExitStopN周期内最低价的最小值 ExitS = HHV(High,ExitStopN); //计算ExitStopN周期内最高价的最大值 PlotNumeric("TrendMA",TrendMA); //输出趋势线 PlotLine("PriceOsci",PriceOsci,Red,Linethick1,2,0); //输出均线动能 //---------------------策略---------------------// //多头入场 If(BKVol == 0 && TrendMA <> 0) //无多头持仓且当根趋势线不等于0 { //当根K线的最新价高于当根的趋势线,当根K线的动能相对于上根为增强且动能为负 If(Close > TrendMA && PriceOsci <= 0 && PriceOsci > PriceOsci[1] && Vol > 0) { BK(1); //开仓1手 } } //多头出场 If(BKVol > 0 && BV[1] > 0 ) //持有仓 { //当根K线的动能相对于上根为减弱,价格跌破多头出场价,成交量大于0 If(PriceOsci < PriceOsci[1] && Close <= ExitL && Vol > 0) { SP(BKVol); //平全部仓 } } BV = BKVol; //---------------------策略---------------------// //空头入场 If(SKVol == 0 && TrendMA <> 0) //无空头持仓且当根趋势线不等于0 { //当根K线的最新价低于当根的趋势线,当根K线的动能相对于上根为减弱且动能为正 If(Close < TrendMA && PriceOsci >= 0 && PriceOsci < PriceOsci[1] && Vol > 0) { SK(1); //开仓1手 } } //空头出场 If(SKVol > 0 && SV[1] > 0 ) //持有仓 { //当根K线的动能相对于上根为增强,价格突破空头出场价,成交量大于0 If(PriceOsci > PriceOsci[1] && Close >= ExitS && Vol > 0) { BP(SKVol); //平全部仓 } } SV = SKVol; End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric AvgLen1(6); Numeric AvgLen2(12); Numeric AvgLen3(28); Numeric RLength(4); Vars NumericSeries Avg1; //指数移动平均1 NumericSeries Avg2; //指数移动平均2 NumericSeries Avg3; //指数移动平均3 NumericSeries BuyCon1; //做条件之一 NumericSeries SellCon1; //做条件之一 NumericSeries LongStopPrice; //多头跟踪止损价 NumericSeries ShortStopPrice; //空头跟踪止损价 NumericSeries Range1; //K线幅度 NumericSeries RangeL; NumericSeries RangeS; Begin //---------------------变量赋值---------------------// Avg1 = Ema(Close,AvgLen1); Avg2 = Ema(Close,AvgLen2); Avg3 = Ema(Close,AvgLen3); Range1=High - Low; //定义K线幅度 //在图表上划出指数移动平均线 PlotNumeric("Avg1",Avg1); PlotNumeric("Avg2",Avg2); PlotNumeric("Avg3",Avg3); //---------------------策略---------------------// //Avg1向上穿过Avg2为买入条件之一 BuyCon1 = CrossUp(Avg1,Avg2); If(BuyCon1 && Avg2 > Avg3 && Vol > 0) BK(1); //BuyCon1满足且Avg2大于Avg3时,开仓1手 If(BKVol > 0 && BarsSinceEntry > 0 && Avg1 < Avg2 && Vol > 0) SP(BKVol); //Avg1小于Avg2多头出场 //多头进场后设置跟踪止损价 RangeL= Ma(Range1,RLength); If(BKVol > 0 && BarsSinceEntry == 0) { LongStopPrice = Low - RangeL; } Else If(BKVol > 0 && BarsSinceEntry > 0) { LongStopPrice = LongStopPrice + (Low - LongStopPrice) * 0.25; } If(BKVol > 0 && BarsSinceEntry > 0 &&Close <= LongStopPrice && Vol > 0) { SP(BKVol);//向下跌破跟踪止损价多头出场 } //---------------------策略---------------------// //Avg1向下穿过Avg2为卖出条件之一 SellCon1 = CrossDown(Avg1,Avg2); If(SellCon1 && Avg2 < Avg3 && Vol > 0) SK(1); //SellCon1满足且Avg2小于Avg3时,开仓1手 If(SKVol > 0 && BarsSinceEntry > 0 && Avg1 > Avg2 && Vol > 0) BP(SKVol); //Avg1大于Avg2空头出场 //空头进场后记录跟踪止损价 RangeS = Ma(Range1,RLength); If(SKVol > 0 && BarsSinceEntry == 0) { ShortStopPrice = High + RangeS; } Else If(SKVol > 0 && BarsSinceEntry > 0) { ShortStopPrice = ShortStopPrice - (ShortStopPrice - High) / 3; } If(SKVol > 0 && BarsSinceEntry > 0 && Close >= ShortStopPrice && Vol > 0) { BP(SKVol); //向上突破跟踪止损价空头出场 } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric MomLen(5); //VWM参数 Numeric AvgLen(20); //VWM参数 Numeric ATRLen(5); //ATR参数 Numeric ATRPcnt(5); //入场价格波动率参数 Numeric SetupLen(5); //条件持续有效K线数 Vars NumericSeries VWM; //定义VWM NumericSeries ATRValue; //ATR NumericSeries LEPrice; //多头价格 NumericSeries SEPrice; //空头价格 NumericSeries BullSetup; //多头势力 NumericSeries BearSetup; //空头势力 NumericSeries LSetup; //多头标志 NumericSeries SSetup; //空头标志 Begin //---------------------变量赋值---------------------// VWM = XAverage(Vol * Momentum(Close,MomLen),AvgLen); //定义VWM ATRValue = AvgTrueRange(ATRLen); //ATR BullSetup = CrossUp(VWM,0); //VWM上穿零轴定义多头势 BearSetup = CrossDown(VWM,0); //VWM下穿零轴定义空头势 //---------------------策略---------------------// If(BullSetup == 1) //多头势开始计数并记录当前价格 { LSetup = 0; LEPrice = Close; } Else { LSetup = LSetup[1] + 1; //每过一根BAR计数 } //多头系统入场 If(CurrentBar > AvgLen && BKVol == 0 && SKVol == 0 ) { If(Close >= LEPrice + (ATRPcnt / 10 * ATRValue) && LSetup <= SetupLen && LSetup >= 1 && Vol > 0) { BK(1); //当多头势满足且在SetupLen的BAR数目内,当价格达到入场价格后,开仓1手 } } //多头系统出场 If(BKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(BearSetup == 1) { SP(BKVol); //空头势平掉单 } } //---------------------策略---------------------// If(BearSetup == 1) //空头势开始计数并记录当前价格 { SSetup = 0; SEPrice = Close; } Else { SSetup = SSetup[1] + 1; //每过一根BAR计数 } //空头系统入场 If(CurrentBar > AvgLen && BKVol == 0 && SKVol == 0 ) { If(Close <= SEPrice - (ATRPcnt / 10 * ATRValue) && SSetup <= SetupLen && SSetup >= 1 && Vol > 0) { SK(1); //当空头势满足且在SetupLen的BAR数目内,当价格达到入场价格后,开仓1手 } } //空头系统出场 If(SKVol > 0 && BarsSinceEntry > 0 && Vol > 0) { If(BullSetup == 1) { BP(SKVol); //多头势平掉单 } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric BollingerLengths(50); //布林通道参数 Numeric Offset(125); //布林通道参数 Numeric RocCalcLength(30); //过滤器参数 Numeric LiqLength(50); //自适应出场均线参数 Vars Numeric Band; NumericSeries MidLine; //布林通道中轨 NumericSeries UpBand; //布林通道上轨 NumericSeries DnBand; //布林通道下轨 NumericSeries RocCalc; //过滤器 NumericSeries LiqDays(50); //自适应出场均线的参数 NumericSeries LiqPoint; //自适应的出场均线 Begin //---------------------变量赋值---------------------// //布林通道中轨 MidLine = Ma(Close,BollingerLengths); Band = Std(Close,BollingerLengths); //布林通道上轨 UpBand = MidLine + Offset / 100 * Band; //布林通道下轨 DnBand = MidLine - Offset / 100 * Band; //画线 PlotNumeric("MidLine",MidLine); PlotNumeric("upBand",UpBand); PlotNumeric("dnBand",DnBand); //进场过滤器 RocCalc = Close - Close[RocCalcLength - 1]; //自适应出场均线 If(MarketPosition == 0) { LiqDays = LiqLength; } Else { LiqDays = LiqDays - 1; LiqDays = Max(LiqDays,10); } LiqPoint = Ma(Close,LiqDays); //画线 PlotNumeric("liqPoint",LiqPoint); //---------------------策略---------------------// If(BKVol == 0 && RocCalc > 0 && Close >= UpBand) { BK(1); //满足过滤条件,且价格突破布林通道上轨,开仓1手 } If(BKVol > 0 && BarsSinceEntry >= 1 && LiqPoint < UpBand && Close <= LiqPoint) { SP(BKVol); //持有单时,自适应出场均线低于布林通道上轨,且价格下破自适应出场均线,平全部单 } //---------------------策略---------------------// If(SKVol == 0 && RocCalc < 0 && Close <= DnBand) { SK(1); //满足过滤条件,且价格突破布林通道下轨,开仓1手 } If(SKVol > 0 && BarsSinceEntry >= 1 && LiqPoint > DnBand && Close >= LiqPoint) { BP(SKVol); //持有单时,自适应出场均线高于布林通道下轨,且价格上破自适应出场均线,平全部单 } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric CeilingAmt(60); //自适应参数的上限 Numeric FloorAmt(20); //自适应参数的下限 Numeric BolBandTrig(2); //布林通道参数 Vars Numeric Band; Numeric LookBackDays(20); //自适应参数 Numeric YesterDayVolatility; //昨日市场波动 Numeric DeltaVolatility; //市场波动的变动率 NumericSeries TodayVolatility; //当日市场波动 NumericSeries BuyPoint; //自适应唐奇安通道上轨 NumericSeries SellPoint; //自适应唐奇安通道下轨 NumericSeries LiqPoint; //自适应出场均线 NumericSeries MidLine; //布林通道中轨 NumericSeries UpBand; //布林通道上轨 NumericSeries DnBand; //布林通道下轨 Begin //---------------------变量赋值---------------------// TodayVolatility = Stdp(Close,30); //当日市场波动 YesterDayVolatility = TodayVolatility[1]; //昨日市场波动 //市场波动的变动率 DeltaVolatility = (TodayVolatility - YesterDayVolatility) / TodayVolatility; //计算自适应参数 LookBackDays = LookBackDays * (1 + DeltaVolatility); LookBackDays = Round(LookBackDays,0); LookBackDays = Min(LookBackDays,CeilingAmt); LookBackDays = Max(LookBackDays,FloorAmt); //自适应布林通道中轨 MidLine = Ma(Close,LookBackDays); Band = Std(Close,LookBackDays); //自适应布林通道上轨 UpBand = MidLine + BolBandTrig * Band; //自适应布林通道下轨 DnBand = MidLine - BolBandTrig * Band; //自适应唐奇安通道上轨 BuyPoint = HHV(High,LookBackDays); //自适应唐奇安通道下轨 SellPoint = LLV(Low,LookBackDays); //自适应出场均线 LiqPoint = MidLine; //---------------------策略---------------------// If(BKVol == 0 && Close[1] > UpBand && Close >= BuyPoint) { BK(1); //没有单时,昨日收盘价大于布林通道上轨,且当日最新价大于唐奇安通道上轨,开仓1手 } If(BKVol > 0 && Close[1] < DnBand && Close <= SellPoint) { SP(BKVol); //持有单时,昨日收盘价小于布林通道下轨,且当日最新价小于唐奇安通道下轨,平全部单 } If(BKVol > 0 && BarsSinceEntry >= 1 && Close <= LiqPoint) { SP(BKVol); //持有单时,价格小于自适应出场均线,平全部单 } //---------------------策略---------------------// If(SKVol == 0 && Close[1] < DnBand && Close <= SellPoint) { SK(1); //没有单时,昨日收盘价小于布林通道下轨,且当日最新价小于唐奇安通道下轨,开仓1手 } If(SKVol > 0 && Close[1] > UpBand && Close >= BuyPoint) { BP(SKVol); //持有单时,昨日收盘价大于布林通道上轨,且当日最新价大于唐奇安通道上轨,平全部单 } If(SKVol > 0 && BarsSinceEntry >= 1 && Close >= LiqPoint) { BP(SKVol); //持有单时,价格大于自适应出场均线,平全部单 } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric AvgLength(40); //三价均线参数 Numeric ATRLength(40); //真实波幅参数 Vars NumericSeries MovAvgVal; //三价均线 NumericSeries UpBand; //通道上轨 NumericSeries DnBand; //通道下轨 NumericSeries LiquidPoint; //出场条件 Begin //---------------------变量赋值---------------------// //三价均线 MovAvgVal = Ma((High + Low + Close) / 3,AvgLength); //通道上轨 UpBand = MovAvgVal + AvgTrueRange(ATRLength); //通道下轨 DnBand = MovAvgVal - AvgTrueRange(ATRLength); //出场条件 LiquidPoint = MovAvgVal; //画线 PlotNumeric("movAvgVal",MovAvgVal); PlotNumeric("upBand",UpBand); PlotNumeric("dnBand",DnBand); //---------------------策略---------------------// If(BKVol == 0 && MovAvgVal > MovAvgVal[1] && Close >= UpBand) { BK(1); //三价均线向上,且价格上破通道上轨,开仓1手 } If(BKVol > 0 && BarsSinceEntry >= 1 && Close <= LiquidPoint) { SP(BKVol); //持有单时,价格下破三价均线,平全部单 } //---------------------策略---------------------// If(SKVol == 0 && MovAvgVal < MovAvgVal[1] && Close <= DnBand) { SK(1); //三价均线向下,且价格下破通道下轨,开仓1手 } If(SKVol > 0 && BarsSinceEntry >= 1 && Close >= LiquidPoint) { BP(SKVol); //持有单时,价格上破三价均线,平全部单 } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric SwingTrendSwitch(20); //潮汐指数小于此值为震荡市,否则为趋势市 Numeric SwingPrcnt1(5); //震荡市开仓参数1 Numeric SwingPrcnt2(75); //震荡市开仓参数2 Numeric ATRLength(10); //真实波幅参数 Numeric BollingerLengths(50); //布林通道参数 Numeric NumStdDevs(2); //布林通道参数 Numeric TrendLiqLength(50); //趋势市时进场单的出场均线参数 Vars Numeric Band; NumericSeries CmiVal; //潮汐指数 NumericSeries BuyEasierDay; //宜买市 NumericSeries SellEasierDay; //宜卖市 NumericSeries MyATR; //真实波幅 NumericSeries MidLine; //布林通道中轨 NumericSeries UpBand; //布林通道上轨 NumericSeries DnBand; //布林通道下轨 NumericSeries TrendLokBK; NumericSeries TrendLokSP; NumericSeries KeyOfDay; //关键价格 NumericSeries SwingBKPt; //震荡市的买触发价格 NumericSeries SwingSPPt; //震荡市的卖触发价格 NumericSeries TrendBKPt; //趋势市的买触发价格 NumericSeries TrendSPPt; //趋势市的卖触发价格 NumericSeries SwingProtStop; //震荡市时进场单的出场触发价格 NumericSeries TrendProtStop; //趋势市时进场单的出场触发价格 NumericSeries SwingEntry; //震荡市时进场标识 Begin //---------------------变量赋值---------------------// //计算潮汐指数用以区分震荡市与趋势市 CmiVal = Abs(Close - Close[29]) / (HHV(High,30) - LLV(Low,30)) * 100; TrendLokBK = Ma(Low,3); TrendLokSP= Ma(High,3); //关键价格 KeyOfDay = (High + Low + Close) / 3; //震荡市中收盘价大于关键价格为宜卖市,否则为宜买市 BuyEasierDay = 0; SellEasierDay = 0; If(Close[1] > KeyOfDay[1]) { SellEasierDay = 1; } If(Close[1] <= KeyOfDay[1]) { BuyEasierDay = 1; } //计算震荡市的进场价格 MyATR = AvgTrueRange(ATRLength); If(BuyEasierDay == 1) { SwingBKPt = Open + SwingPrcnt1 / 10 * MyATR[1]; SwingSPPt = Open - SwingPrcnt2 / 100 * MyATR[1]; } If(SellEasierDay == 1) { SwingBKPt = Open + SwingPrcnt2 / 100 * MyATR[1]; SwingSPPt = Open - SwingPrcnt1 / 10 * MyATR[1]; } SwingBKPt = Max(SwingBKPt,TrendLokBK[1]); SwingSPPt = Min(SwingSPPt,TrendLokSP[1]); //计算趋势市的进场价格 MidLine = Ma(Close,BollingerLengths); Band = Std(Close,BollingerLengths); UpBand = MidLine + NumStdDevs * Band; DnBand = MidLine - NumStdDevs * Band; TrendBKPt = UpBand; TrendSPPt = DnBand; //---------------------策略---------------------// //多头震荡市 If(CmiVal < SwingTrendSwitch) { If(BKVol == 0 && Close >= SwingBKPt) { BK(1); SwingEntry = 1; } If(BKVol > 0 && BarsSinceEntry >= 1 && Close <= SwingSPPt) { SP(BKVol); SwingEntry =0; } } SwingProtStop = 3 * MyATR; TrendProtStop = Ma(Close,TrendLiqLength); //多头趋势市 If(CmiVal >= SwingTrendSwitch) { //震荡市时进场单在趋势市的出场 If(SwingEntry == 1) { If(BKVol > 0 && BarsSinceEntry >= 1 && Close <= (EntryPrice - SwingProtStop)) { SP(BKVol); SwingEntry = 0; } } //趋势市时进出场 If(SwingEntry ==0) { If(BKVol == 0 && BarsSinceExit >= 1 && Close >= TrendBKPt) { BK(1); } If(BKVol > 0 && BarsSinceEntry >= 1 && Close <= Max(TrendSPPt,TrendProtStop)) { SP(BKVol); } } } //---------------------策略---------------------// //空头震荡市 If(CmiVal < SwingTrendSwitch) { If(SKVol == 0 && Close <= SwingSPPt) { SK(1); SwingEntry = 1; } If(SKVol > 0 && BarsSinceEntry >= 1 && Close >= SwingBKPt) { BP(SKVol); SwingEntry = 0; } } SwingProtStop = 3 * MyATR; TrendProtStop = Ma(Close,TrendLiqLength); //空头趋势市 If(CmiVal >= SwingTrendSwitch) { //震荡市时进场单在趋势市的出场 If(SwingEntry == 1) { If(SKVol > 0 && BarsSinceEntry >= 1 && Close >= (EntryPrice + SwingProtStop)) { BP(SKVol); SwingEntry = 0; } } //趋势市时进出场 If(SwingEntry == 0) { If(SKVol == 0 && BarsSinceExit >= 1 && Close <= TrendSPPt) { SK(1); } If(SKVol > 0 && BarsSinceEntry >= 1 && Close >= Min(TrendBKPt,TrendProtStop)) { BP(SKVol); } } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Min;//设置回测数据类型 Params Numeric RiskRatio(1); //百分比参数 Numeric ATRLength(20); //平均波动周期 ATR Length Numeric boLength(20); //短周期 BreakOut Length Numeric fsLength(55); //长周期 FailSafe Length Numeric teLength(10); //离市周期 Trailing Exit Length Vars NumericSeries AvgTR; //ATR Numeric AN; //AN值 Numeric TotalEquity; //按最新收盘价计算出的总资产 Numeric TurtleUnits; //交易单位 NumericSeries DonchianHi; //唐奇安通道上轨,延后1个Bar NumericSeries DonchianLo; //唐奇安通道下轨,延后1个Bar NumericSeries fsDonchianHi; //唐奇安通道上轨,延后1个Bar,长周期 NumericSeries fsDonchianLo; //唐奇安通道下轨,延后1个Bar,长周期 Numeric ExitHighestPrice; //离市时判断需要的N周期最高价 Numeric ExitLowestPrice; //离市时判断需要的N周期最低价 NumericSeries PreBreakoutFailure; //前一次突破是否失败 Begin //---------------------变量赋值---------------------// AvgTR = XAverage(TrueRange,ATRLength); //真实波幅平均值 AN = AvgTR[1]; //一个周期前真实波幅 TotalEquity = MoneyTot; //权益 TurtleUnits = (TotalEquity * RiskRatio / 100) / (AN * ContractUnit()); //开仓数量 TurtleUnits = IntPart(TurtleUnits); //对小数取整 DonchianHi = Highest(High[1],boLength); //一个周期前boLength周期最高价 DonchianLo = Lowest(Low[1],boLength); //一个周期前boLength周期最低价 fsDonchianHi = Highest(High[1],fsLength); //一个周期前fsLength周期最高价 fsDonchianLo = Lowest(Low[1],fsLength); //一个周期前fsLength周期最低价 ExitHighestPrice = Highest(High[1],teLength);//一个周期前teLength周期最高价 ExitLowestPrice = Lowest(Low[1],teLength); //一个周期前teLength周期最低价 //当不使用过滤条件,或者使用过滤条件且条件为PreBreakoutFailure为True进行后续操作 //---------------------策略---------------------// If(BKVol == 0 && SKVol == 0 && PreBreakoutFailure == 0) { //突破开仓 If(Close > DonchianHi && TurtleUnits >= 1) { BK(TurtleUnits); } } //长周期突破开仓 Failsafe Breakout point If(BKVol == 0 && SKVol == 0) { If(Close > fsDonchianHi && TurtleUnits >= 1) { BK(TurtleUnits); } } If(BKVol > 0) //有仓的情况 { If(Close < ExitLowestPrice) { SP(BKVol); } Else { If(Isnull( BKPrice)== 0 && TurtleUnits >= 1) { If(Close >= BKPrice + 0.5 * AN) //以最新价为标准,判断增仓 { BK(TurtleUnits); } } //止损指令 If(Close <= BKPrice - 2 * AN) //止损 { SP(BKVol); } } } //---------------------策略---------------------// If(BKVol == 0 && SKVol == 0 && PreBreakoutFailure == 0) { //突破开仓 If(Close< DonchianLo && TurtleUnits >= 1) { SK(TurtleUnits); } } //长周期突破开仓 Failsafe Breakout point If(BKVol == 0 && SKVol == 0) { If(Close < fsDonchianLo && TurtleUnits >= 1) { SK(TurtleUnits); } } If(SKVol > 0) //有仓的情况 { If(Close > ExitHighestPrice) { BP(SKVol); } Else { If(Isnull(SKPrice)== 0 && TurtleUnits >= 1) { If(Close <= SKPrice - 0.5 * AN) //以最新价为标准,判断增仓 { SK(TurtleUnits); } } //止损指令 If(Close >= SKPrice + 2 * AN) //止损 { BP(SKVol); } } } End //该模型仅仅用来示范如何根据指标编写简单的模型 //用户需要根据自己交易经验,进行修改后再实际应用!!! Setting AddTimes:1;//设置建仓次数 Review_Data:Null;//设置回测数据类型 Params Numeric FastLength(5); //快线周期 Numeric SlowLength(20); //慢线周期 Vars NumericSeries AvgValue1; //快线周期均值 NumericSeries AvgValue2; //慢线周期均值 Begin //---------------------变量赋值---------------------// AvgValue1 = Ma(Close,FastLength); //快线周期均值 AvgValue2 = Ma(Close,SlowLength); //慢线周期均值 PlotNumeric("MA1",AvgValue1); PlotNumeric("MA2",AvgValue2); //---------------------策略---------------------// If(BKVol == 0 && AvgValue1 > AvgValue2) { BPK(1); //当前无仓且快线周期的均线高于慢线周期的均线,开仓1手 } //---------------------策略---------------------// If(SKVol == 0 && AvgValue1 < AvgValue2) { SPK(1); //当前无仓且快线周期的均线低于慢线周期的均线,开仓1手 } End 请综合上述代码,请给我一个比较完善的交易代码
10-08
//+------------------------------------------------------------------+ //| MACD_Quantitative_EA.mq4 | //| Copyright 2025, Expert Advisor Developer | //| https://yourwebsite.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Your Name" #property link "https://yourwebsite.com/" #property version "1.00" #property strict // 输入参数 input int FastEMA = 12; // 快速EMA周期 input int SlowEMA = 26; // 慢速EMA周期 input int SignalSMA = 9; // 信号线周期 input double LotSize = 0.1; // 固定交易手数 input int StopLoss = 100; // 止损点数 input int TakeProfit = 200; // 止盈点数 input int TrailingStart = 50; // 启动跟踪止损的盈利点数 input int TrailingStop = 30; // 跟踪止损点数 input bool UseTrailingStop = true; // 是否启用跟踪止损 input bool UseMACDAreaSignal = true; // 是否启用MACD面积缩小信号 input bool UseMACDAreaClose = true; // 是否启用MACD面积扩大平仓 input double MinMACDArea = 0.0001; // MACD最小有效面积 input int AreaLookback = 5; // 面积回溯周期 input int MaxTrendBars = 8; // 趋势末端最大连续上涨/下跌根数 input int DivergenceLookback = 20; // 背离检测周期 input int CrossAngleLookback = 3; // MACD交叉角度检测周期 input double DistanceThreshold = 0.0002; // MACD线与信号线最小距离 input int AccelerationLookback = 5; // 加速度计算周期 // 全局变量 int ticket = 0; //+------------------------------------------------------------------+ //| 初始化函数 | //+------------------------------------------------------------------+ int OnInit() { Print("MACD量化交易EA已加载"); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 主函数 OnTick | //+------------------------------------------------------------------+ void OnTick() { if (OrdersTotal() > 0) { if (UseMACDAreaClose) CheckMACDAreaClose(); // 检查MACD面积是否扩大,决定是否平仓 ManageTrailingStop(); // 管理跟踪止损 } if (OrdersTotal() == 0) { int signal = 0; // 1. 基础金叉/死叉 signal = GetMACDSignal(); if (signal == 0 && UseMACDAreaSignal) signal = GetMACDAreaSignal(); // 如果没有金叉/死叉,再判断面积缩小信号 if (signal == 0) signal = GetMACDTrendSignal(); // 最后判断趋势延续信号 if (signal == 0) signal = DetectMACDTopBottom(); // 判断顶部/底部信号 if (signal == 0) signal = DetectMACDCombinedDivergence(); // 加入背离信号 if (signal == 0) signal = IsMACDPeakOrValley(); // 加入柱形态信号 if (signal == 1) OpenBuyOrder(); // 做 else if (signal == -1) OpenSellOrder(); // 做 } } //+------------------------------------------------------------------+ //| 获取MACD金叉/死叉信号 | //+------------------------------------------------------------------+ int GetMACDSignal() { double macdMain = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, 0); double macdSignal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 1, 0); double macdPrevMain = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, 1); double macdPrevSignal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 1, 1); // 金叉:当前MACD线上穿信号线 if (macdPrevMain < macdPrevSignal && macdMain > macdSignal) { if (IsMACDCrossWithSteepAngle() && GetMACDLineDistanceFromSignal() > DistanceThreshold) return 1; } // 死叉:当前MACD线下穿信号线 if (macdPrevMain > macdPrevSignal && macdMain < macdSignal) { if (IsMACDCrossWithSteepAngle() && GetMACDLineDistanceFromSignal() > DistanceThreshold) return -1; } return 0; } //+------------------------------------------------------------------+ //| 获取MACD面积缩小信号(优化版:连续5根K线) | //+------------------------------------------------------------------+ int GetMACDAreaSignal() { double hist[5] = {0, 0, 0, 0, 0}; // 显式初始化 for (int i = 0; i < 5; i++) { hist[i] = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, i); } // 做信号:负柱状图连续缩小(下跌动能减弱) bool shrinkingNegative = true; for (int i = 0; i < 4; i++) { if (MathAbs(hist[i]) >= MathAbs(hist[i + 1])) { shrinkingNegative = false; break; } } if (shrinkingNegative && hist[0] < 0 && hist[1] < 0 && hist[2] < 0 && hist[3] < 0 && hist[4] < 0) return 1; // 做信号:正柱状图连续缩小(上涨动能减弱) bool shrinkingPositive = true; for (int i = 0; i < 4; i++) { if (hist[i] <= hist[i + 1]) { shrinkingPositive = false; break; } } if (shrinkingPositive && hist[0] > 0 && hist[1] > 0 && hist[2] > 0 && hist[3] > 0 && hist[4] > 0) return -1; return 0; // 无信号 } //+------------------------------------------------------------------+ //| 获取MACD趋势信号(在0轴上方未跌破则继续做,反之做) | //+------------------------------------------------------------------+ int GetMACDTrendSignal() { double hist[5] = {0, 0, 0, 0, 0}; // 显式初始化 for (int i = 0; i < 5; i++) { hist[i] = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, i); } // 多头趋势:所有MACD柱都在0轴上方,且未跌破 bool allAboveZero = true; for (int i = 0; i < 5; i++) { if (hist[i] <= 0) { allAboveZero = false; break; } } if (allAboveZero) return 1; // 空头趋势:所有MACD柱都在0轴下方,且未上穿 bool allBelowZero = true; for (int i = 0; i < 5; i++) { if (hist[i] >= 0) { allBelowZero = false; break; } } if (allBelowZero) return -1; return 0; // 无趋势信号 } //+------------------------------------------------------------------+ //| 判断MACD是否出现顶部/底部形态(连续上涨/下跌后反转) | //+------------------------------------------------------------------+ int DetectMACDTopBottom() { int trendBars = CountMACDBarTrend(); double currentHist = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, 0); double prevHist = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, 1); // 顶部:连续上涨超过阈值,且当前柱反转 if (currentHist > 0 && prevHist > 0 && currentHist < prevHist && trendBars >= MaxTrendBars) return -1; // 底部:连续下跌超过阈值,且当前柱反转 if (currentHist < 0 && prevHist < 0 && currentHist > prevHist && trendBars >= MaxTrendBars) return 1; return 0; } //+------------------------------------------------------------------+ //| 检测MACD面积与价格背离 | //+------------------------------------------------------------------+ int DetectMACDAreaDivergence() { double priceHigh = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, DivergenceLookback, 0)); double priceLow = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, DivergenceLookback, 0)); double areaHigh = CalculateMACDArea(DivergenceLookback); double areaLow = CalculateMACDArea(DivergenceLookback); // 顶部背离:价格创新高,但MACD面积未创新高 if (Bid > priceHigh && areaHigh < CalculateMACDArea(DivergenceLookback - 5)) return -1; // 底部背离:价格创新低,但MACD面积未创新低 if (Ask < priceLow && areaLow > CalculateMACDArea(DivergenceLookback - 5)) return 1; return 0; } //+------------------------------------------------------------------+ //| 检测MACD柱连续上涨/下跌与价格背离 | //+------------------------------------------------------------------+ int DetectMACDBarDivergence() { double priceHigh = iHigh(NULL, 0, iHighest(NULL, 0, MODE_HIGH, DivergenceLookback, 0)); double priceLow = iLow(NULL, 0, iLowest(NULL, 0, MODE_LOW, DivergenceLookback, 0)); int trendBars = CountMACDBarTrend(); // 顶部背离:价格创新高,但MACD连续上涨根数未创新高 if (Bid > priceHigh && trendBars < DivergenceLookback - 3) return -1; // 底部背离:价格创新低,但MACD连续下跌根数未创新低 if (Ask < priceLow && trendBars < DivergenceLookback - 3) return 1; return 0; } //+------------------------------------------------------------------+ //| 检测MACD面积和根数双重背离(最强信号) | //+------------------------------------------------------------------+ int DetectMACDCombinedDivergence() { int areaSignal = DetectMACDAreaDivergence(); int barSignal = DetectMACDBarDivergence(); if (areaSignal == -1 && barSignal == -1) return -1; // 双重顶部背离 if (areaSignal == 1 && barSignal == 1) return 1; // 双重底部背离 return 0; } //+------------------------------------------------------------------+ //| 检测MACD柱是否出现“山峰”或“谷底”形态(动能衰竭) | //+------------------------------------------------------------------+ int IsMACDPeakOrValley(int lookback = 5) { double hist[5] = {0, 0, 0, 0, 0}; // 显式初始化 for (int i = 0; i < 5; i++) hist[i] = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, i); // 山峰形态(中间最高) if (hist[1] < hist[2] && hist[2] > hist[3] && hist[0] < hist[2]) return 1; // 谷底形态(中间最低) if (hist[1] > hist[2] && hist[2] < hist[3] && hist[0] > hist[2]) return -1; return 0; } //+------------------------------------------------------------------+ //| 判断MACD线与信号线交叉是否角度陡峭 | //+------------------------------------------------------------------+ bool IsMACDCrossWithSteepAngle(int lookback = 3) { double angle = 0; for (int i = 0; i < lookback - 1; i++) { double currentMain = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, i); double currentSignal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 1, i); double nextMain = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, i + 1); double nextSignal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 1, i + 1); angle += MathAbs(currentMain - currentSignal) - MathAbs(nextMain - nextSignal); } return MathAbs(angle) > 0.0001; } //+------------------------------------------------------------------+ //| 计算MACD线与信号线之间的平均距离(用于衡量趋势强度) | //+------------------------------------------------------------------+ double GetMACDLineDistanceFromSignal(int lookback = 5) { double sum = 0; for (int i = 0; i < lookback; i++) { double macd = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, i); double signal = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 1, i); sum += MathAbs(macd - signal); } return sum / lookback; } //+------------------------------------------------------------------+ //| 计算MACD柱的变化加速度(即面积变化速率) | //+------------------------------------------------------------------+ double GetMACDHistogramAcceleration(int lookback = 5) { double acc = 0; double hist[5] = {0, 0, 0, 0, 0}; // 显式初始化 for (int i = 0; i < lookback; i++) { hist[i] = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, i); } for (int i = 0; i < lookback - 2; i++) { double delta1 = hist[i] - hist[i+1]; double delta2 = hist[i+1] - hist[i+2]; acc += delta1 - delta2; } return acc; } //+------------------------------------------------------------------+ //| 判断MACD线是否刚刚穿越 0 轴(趋势强度信号) | //+------------------------------------------------------------------+ int IsMACDLineCrossZero() { double macdMain0 = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, 0); double macdMain1 = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 0, 1); if (macdMain1 < 0 && macdMain0 > 0) return 1; // 从下向上穿越 if (macdMain1 > 0 && macdMain0 < 0) return -1; // 从上向下穿越 return 0; } //+------------------------------------------------------------------+ //| 判断MACD柱状图连续上涨/下跌的根数 | //+------------------------------------------------------------------+ int CountMACDBarTrend(int maxBars = 20) { int count = 0; double prevHist = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, 0); for (int i = 1; i < maxBars; i++) { double currentHist = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, i); if ((prevHist > 0 && currentHist > prevHist) || (prevHist < 0 && currentHist < prevHist)) { count++; prevHist = currentHist; } else break; } return count; } //+------------------------------------------------------------------+ //| 计算MACD面积(Histogram的累计值) | //+------------------------------------------------------------------+ double CalculateMACDArea(int bars = 5) { double area = 0; for (int i = 0; i < bars; i++) { double hist = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, i); area += hist; } return area; } //+------------------------------------------------------------------+ //| 判断MACD面积是否连续缩小(用于趋势衰减判断) | //+------------------------------------------------------------------+ bool IsMACDAreaShrinking(int bars = 5) { double areas[]; ArrayResize(areas, bars); for (int i = 0; i < bars; i++) { areas[i] = 0; for (int j = 0; j <= i; j++) { double hist = iMACD(NULL, 0, FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, 2, j); areas[i] += hist; } } // 多头:面积持续缩小(正值减少) if (areas[0] > 0) { for (int i = 0; i < bars - 1; i++) if (MathAbs(areas[i]) <= MathAbs(areas[i + 1])) return false; return true; } // 空头:面积持续缩小(负值减少) else if (areas[0] < 0) { for (int i = 0; i < bars - 1; i++) if (MathAbs(areas[i]) <= MathAbs(areas[i + 1])) return false; return true; } return false; } //+------------------------------------------------------------------+ //| 检查MACD面积是否缩小(用于平仓) | //+------------------------------------------------------------------+ void CheckMACDAreaClose() { for (int i = 0; i < OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) continue; if (OrderSymbol() != Symbol()) continue; double currentArea = CalculateMACDArea(AreaLookback); if (currentArea == 0) continue; int type = OrderType(); if (type == OP_BUY) { // 单:MACD面积缩小 + 持续下降趋势 if (MathAbs(currentArea) < MinMACDArea || IsMACDAreaShrinking(AreaLookback)) { if (!OrderClose(OrderTicket(), OrderLots(), Bid, 3, clrRed)) Print("平仓失败,错误码: ", GetLastError()); else Print("【MACD面积衰减】平仓 @ ", DoubleToStr(Bid, Digits)); } } if (type == OP_SELL) { // 单:MACD面积缩小 + 持续下降趋势 if (MathAbs(currentArea) < MinMACDArea || IsMACDAreaShrinking(AreaLookback)) { if (!OrderClose(OrderTicket(), OrderLots(), Ask, 3, clrRed)) Print("平仓失败,错误码: ", GetLastError()); else Print("【MACD面积衰减】平仓 @ ", DoubleToStr(Ask, Digits)); } } } } //+------------------------------------------------------------------+ //| 开单 | //+------------------------------------------------------------------+ void OpenBuyOrder() { double sl = Ask - StopLoss * Point; double tp = Ask + TakeProfit * Point; ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "MACD Buy", 0, 0, clrGreen); if (ticket < 0) Print("开仓失败,错误码: ", GetLastError()); else Print("【开仓】价格: ", DoubleToStr(Ask, Digits), " 止损: ", DoubleToStr(sl, Digits), " 止盈: ", DoubleToStr(tp, Digits)); } //+------------------------------------------------------------------+ //| 开单 | //+------------------------------------------------------------------+ void OpenSellOrder() { double sl = Bid + StopLoss * Point; double tp = Bid - TakeProfit * Point; ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "MACD Sell", 0, 0, clrRed); if (ticket < 0) Print("开仓失败,错误码: ", GetLastError()); else Print("【开仓】价格: ", DoubleToStr(Bid, Digits), " 止损: ", DoubleToStr(sl, Digits), " 止盈: ", DoubleToStr(tp, Digits)); } //+------------------------------------------------------------------+ //| 管理跟踪止损 | //+------------------------------------------------------------------+ void ManageTrailingStop() { for (int i = 0; i < OrdersTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS)) continue; if (OrderSymbol() != Symbol()) continue; double openPrice = OrderOpenPrice(); double currentPrice = (OrderType() == OP_BUY) ? Bid : Ask; double profitPoints = (OrderType() == OP_BUY) ? (currentPrice - openPrice) / Point : (openPrice - currentPrice) / Point; if (UseTrailingStop && profitPoints >= TrailingStart) { double newStopLoss = 0; if (OrderType() == OP_BUY) newStopLoss = currentPrice - TrailingStop * Point; else newStopLoss = currentPrice + TrailingStop * Point; if (newStopLoss != OrderStopLoss()) { if (!OrderModify(OrderTicket(), openPrice, newStopLoss, OrderTakeProfit(), 0, clrGreen)) Print("跟踪止损更新失败,错误码: ", GetLastError()); else Print("【跟踪止损更新】新止损: ", DoubleToStr(newStopLoss, Digits)); } } } } 将K线形态加入这个代码里面
07-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值