等级: 新手上路
- 注册:
- 2023-11-7
- 曾用名:
|
//------------------------------------------------------------------------
// 简称:AloneMA_V5
// 名称:AloneMA_V5
// 类别: 交易指令
// 类型: 用户应用
//------------------------------------------------------------------------
Params
//参数定义
Integer N(60); //设置均线周期
Integer TradeLock(1); //是否加载交易,1-是,0-否;
Integer OpenVol(1); //开仓手数;
Integer ISound(1); //语音提醒开关,1-开启,0为关闭;
Integer MAXVOL(30000);//加仓最大额度;V3版新增;
Integer MaxRisk(1000); //最大单笔亏损额度,V4版新增;
//V5设定推荐参数值,以便适用于10W资金做多品种组合,品种推荐一手保证金小于1万,持仓量前十品种组合回测。
GlobalVars
//全局变量定义
NumericSeries MA1;
NumericSeries MAH;
NumericSeries MAL;
NumericSeries KType;
NumericArray DMADATEC;
NumericArray DMADATEH;
NumericArray DMADATEL;
Numeric RangRisk;
Numeric CoverPrice;
Numeric StartVOL;
Vars
//局部变量定义
BoolSeries Buylock(False);
BoolSeries Selllock(False);
Numeric ProfitPer;
Numeric MoveCoverPrice;
Numeric HHV;
Numeric LLV;
Numeric AddVol;
Begin
//策略执行区
// V2版新增,取日线的5日均线做过滤条件,5日均线以上不做空,5日均线以下不做多。
DMADATEC = HisData(Enum_Data_Close,Enum_Period_Day,1);
Numeric DMA = iMA(DMADATEC,5);
PlotNumeric("DMA",DMA,Blue);
//V3版新增,取前三天 日K线的最高和最低点;
DMADATEH = HisData(Enum_Data_High,Enum_Period_Day,1);
DMADATEL = HisData(Enum_Data_Low,Enum_Period_Day,1);
Numeric DMAH = iHHV(DMADATEH,3,1);
Numeric DMAL = iLLV(DMADATEL,3,1);
//V3版新增,按最大持仓资金自动计算加仓手数;
StartVOL = IntPart(MAxVOL/(SeatMargin*close*ContractUnit));
//定义前期的高低点,做移动止损;
HHV = HighestFC(High[1],20);
LLV = LowestFC(Low[1],20);
//V5推荐15分钟周期,此处前期高低点参数由30调整为20;
//定义,绘制管道线
MA1 = AverageFC(C,N);
MAH = AverageFC(H,N);
MAL = AverageFC(L,N);
PlotNumeric("MA",MA1);
PlotNumeric("UP",MAH);
PlotNumeric("DN",MAL);
//定义K线颜色和类型,管道线以上为红色,以下为绿色,穿插为黄色。
If(l>MAH)
{
ColorBar(Red);
KType=1;
}
else If(h<MAL)
{
ColorBar(green);
KType=2;
}
Else{
ColorBar(yellow);
KType=3;
}
//定义开仓条件
Buylock = (KType[1]==1 && KType[2]==1 && KType[3]<>1); //开多单条件;
Selllock = (KType[1]==2 && KType[2]==2 && KType[3]<>2); //开空单条件;
//V5剔除掉 前两根K线的高低判断;
//若加载交易,目前空仓,符合开多条件则开多单,符合开空条件则开空单;开仓时前三个K线高低点设置为一号止损位。
If(TradeLock ==1)
{
If(MarketPosition == 0)
{
If(Buylock && Open>DMA )
{
Buy(OpenVol,Open);
RangRisk=Abs(Open-Low[3]);
CoverPrice = Open - RangRisk;
if(ISound == 1)
{
Alert(SymbolName+"多单开仓");
}
}
If(Selllock && open<DMA)
{
SellShort(OpenVol,Open);
RangRisk=Abs(Open-High[3]);
CoverPrice = Open + RangRisk;
if(ISound == 1)
{
Alert(SymbolName+"空单开仓");
}
}
}
If(MarketPosition ==1 ) // 如果目前是多头持仓
{
//V4版本新增计算当前多单最大浮盈收益率,最大收益率超过10%,按最大浮盈收益率减掉10%,做跟踪止损;
ProfitPer = IntPart(((HighestSinceLastEntry -LastEntryPrice)/(LastEntryPrice*SeatMargin))*100); //计算当前的收益率 跟最近一次开仓的最高价为相比
If(ProfitPer >=10) //如果利润大于10%
{
CoverPrice = LastEntryPrice + IntPart((LastEntryPrice*SeatMargin * (Max(IntPart(ProfitPer/5)-2,0)*5/100))); //计算收益率回调10%的价位
}
//按单笔亏损上限,计算加仓手数,不超过单品种持仓上限
AddVol=IntPart(MaxRisk / ((Max(DMAH,HHV)-Max(Max(MA1,LLV),CoverPrice)) *BigPointValue*ContractUnit));
//根据单笔最大亏损计算加仓手数 最大亏损/一手亏损 (开仓位—止损位)*合约乘数*一跳的价值
StartVOL = Min(AddVol,StartVOL);
If(CurrentEntries==1 && h>Max(DMAH,HHV) && StartVOL >0 )
// 如果已经建过仓位 ,而且 当前最高价过了前高,V3版本的加仓最大手数 ,当前利润<5% , 谨慎加仓,如果开仓后利润快速达到5%,则不再开仓
// V5去掉利润超过5%不加仓的过滤条件
{
Buy(StartVOL,Max(DMAH,Open)); //按照 3天的最高价 和开盘价取最大值开开仓
if(ISound == 1)
{
Alert(SymbolName+"多单加仓");
}
}
MoveCoverPrice = Max(Max(MA1,LLV),CoverPrice); //移动平仓位 取N移动平均线,30根K线最低值 ,和收益回调10%价位 取最大值
If(L<MoveCoverPrice && BarsSinceLastEntry>=1 && HighestSinceLastEntry<>High ) //价格小于移动平仓位 而且 已经开过仓 //V5 修复一个BUG,避免K线急拉,实际交易中被平仓。
{
Sell(0,Max(MoveCoverPrice,Low)); //按照移动平仓位 和当前K线最低价 取最大值平仓
if(ISound == 1)
{
Alert(SymbolName+"多单平仓");
}
}
}
If(MarketPosition ==-1 )
{
//计算当前空单最大浮盈收益率,,最大收益率超过10%,按最大浮盈收益率减掉10%,做跟踪止损;
ProfitPer = IntPart(((LastEntryPrice-LowestSinceLastEntry)/(LastEntryPrice*SeatMargin))*100);
If(ProfitPer >=10)
{
CoverPrice = LastEntryPrice - IntPart((LastEntryPrice*SeatMargin * (Max(IntPart(ProfitPer/5)-2,0)*5/100)));
}
//按单笔亏损上限,计算加仓手数,不超过单品种持仓上限
AddVol=IntPart(MaxRisk / ((Min(Min(MA1,HHV),CoverPrice)-(Min(DMAL,LLV))) *BigPointValue*ContractUnit));
StartVOL = Min(AddVol,StartVOL);
If( CurrentEntries==1 && L<Min(DMAL,LLV) && StartVOL >0 )
{
SellShort(StartVOL,Min(DMAL,Open));
if(ISound == 1)
{
Alert(SymbolName+"空单加仓");
}
}
MoveCoverPrice = Min(Min(MA1,HHV),CoverPrice);
If(H>MoveCoverPrice && BarsSinceLastEntry>=1 && LowestSinceLastEntry<>Low ) //V5 修复一个BUG,避免K线急拉,实际交易中被平仓。
{
BuyToCover(0,Min(MoveCoverPrice,High));
if(ISound == 1)
{
Alert(SymbolName+"空单平仓");
}
}
}
}
End
补充内容 (2024-5-14 21:22):
能否帮忙转换下 |
|