增加交易策略、交易指标、量化库代码等文件夹

This commit is contained in:
Win_home
2025-04-27 15:54:09 +08:00
parent ca3b209096
commit f57150dae8
589 changed files with 854346 additions and 1757 deletions

View File

@@ -0,0 +1,179 @@
//------------------------------------------------------------------------
// 简称: vip09
// 名称: vip09
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
//默认螺纹888 1小时
Numeric Length(20); //周期
Numeric Offset(2); //标准差倍数
Numeric X(0.5);
Numeric SS(0.01);
Numeric TRS(75);//移动止损止盈幅度 参数范围及步长: 5-1005
Numeric Fund(20000); //投入保证金;
Vars
Numeric Lots(0);
Series<Numeric> ma1;
Series<Numeric> UpLine; //上轨
Series<Numeric> DownLine; //下轨
Series<Numeric> MidLine; //中间线
Series<Numeric> Band;
Series<Numeric> cond1;
Series<Numeric> cond2;
Series<Numeric> cond3;
Series<Numeric> cond4;
Series<Numeric> kcond1;
Series<Numeric> kcond2;
Series<Numeric> kcond3;
Series<Numeric> kcond4;
//出场变量
Series<Numeric> MyPrice;//开仓价格
Series<Numeric> MyPrice2;//开仓价格
Series<Numeric> HighAfterEntry;//开仓后出现的最高价
Series<Numeric> LowAfterEntry;//开仓后出现的最低价
Series<Numeric> liQKA;
Series<Numeric> DliqPoint;
Series<Numeric> KliqPoint;
Series<Numeric> barcoutN;
Series<Numeric> bar_entry_count;
Series<Numeric> kaicang_kg;
Series<Numeric> BB;
Series<Numeric> WIDTH;
Plot plt1;
Plot plt2;
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
OnInit()
{
//与数据源有关
Range[0:DataCount-1]
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
//AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
plt1.figure(0); //plt_vol单独设置画板没有指定画板id,系统自动创建
plt2.figure(0);
}
}
//Bar更新事件函数参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
Lots = Max(1, Round(Fund/(O*ContractUnit*BigPointValue* MarginRatio/rollover), 0));
MidLine = AverageFC(Close,Length);
Band = StandardDev(Close,Length,2);
UpLine = MidLine + Offset * Band;
DownLine = MidLine - Offset * Band;
PlotNumeric("MidLine",cond1,cond1,White);
PlotNumeric("UpLine",cond2,cond2,red);
PlotNumeric("DownLine",cond3,cond3,Green);
//布林极限BB=(收盘价-布林下轨价格)/(布林上轨价格-布林下轨价格)
BB=((C-DownLine)/(UpLine-DownLine));
//WIDTH=(布林上轨值-布林下轨值)/布林平均值
WIDTH=((UpLine-DownLine)/MidLine);
plt1.line("BB",BB); //画线
plt2.line("WIDTH",WIDTH);
if(MarketPosition!=1 and H>=UpLine[1] and C[1]<UpLine[1] and BB[1]>X and WIDTH[1]>SS)
{
Buy(Lots,max(open,UpLine[1])); // 如果满足开多条件,则买入
LowAfterEntry = EntryPrice;//保存多头开仓价格;
kaicang_kg=1; // 标记已开仓
bar_entry_count=0; // 重置连续未开仓的Bar计数
barcoutN=0; //重置liQKA系数的计算
liQKA = 1;
}
if(MarketPosition!=-1 and L<=DownLine[1] and C[1]>DownLine[1] and BB[1]<X and WIDTH[1]>SS)
{
SellShort(Lots,min(open,DownLine[1])); // 如果满足开空条件,则卖空
HighAfterEntry = EntryPrice;//保存空头开仓价格;
kaicang_kg=1; // 标记已开仓
bar_entry_count=0; // 重置连续未开仓的Bar计数
barcoutN=0; //重置liQKA系数的计算
liQKA = 1;
}
if(kaicang_kg[1] ==1) // 如果在本周期内有开仓操作
{
bar_entry_count=bar_entry_count+1; // 将开仓计数器加一
}
Else
{
bar_entry_count=0; // 如果没有开仓,则将开仓计数器重置为 0
}
//移动出场
If(MarketPosition == 0) // 自适应参数默认值;
{
liQKA = 1;
barcoutN=0;
}Else if(bar_entry_count>barcoutN) //当有持仓的情况下liQKA会随着持仓时间的增加而逐渐减小即止损止盈幅度乘数的减少。
{
liQKA = liQKA - 0.1;
liQKA = Max(liQKA,0.3);
barcoutN=bar_entry_count;
}
Commentary("kaicang_kg[1]"+text(kaicang_kg[1]));
Commentary("bar_entry_count"+text(bar_entry_count));
Commentary("barcoutN"+text(barcoutN));
Commentary("liQKA"+text(liQKA));
// 记录开仓后的最高点和最低点
If(bar_entry_count > 0)
{
HighAfterEntry = Min(HighAfterEntry,High); // 空头止损,更新最低的最高价
LowAfterEntry = Max(LowAfterEntry,Low); // 多头止损,更新最高的最低价
}
if(MarketPosition>0)
{
DliqPoint = LowAfterEntry - (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
}
if(MarketPosition<0)
{
KliqPoint = HighAfterEntry + (Open*TRS/1000)*liQKA; //经过计算,这根吊灯出场线会随着持仓时间的增加变的越来越敏感;
}
If(KliqPoint[1]>0 and MarketPosition<0)PlotNumeric("KliqPoint[1]",KliqPoint[1]);
if(DliqPoint[1]>0 and MarketPosition>0)PlotNumeric("DliqPoint[1]",DliqPoint[1]);
// 持有多单时
If(MarketPosition >0 And bar_entry_count >0 And Low <= DliqPoint[1] and DliqPoint[1]>0 and DliqPoint[1]>0 and bar_entry_count>0)
{
Sell(0,Min(Open,DliqPoint[1]));
DliqPoint=0;
kaicang_kg=0;
}
// 持有空单时
If(MarketPosition <0 And bar_entry_count >0 And High >= KliqPoint[1] and KliqPoint[1]>0 and KliqPoint[1]>0 and bar_entry_count>0)
{
BuyToCover(0,Max(Open,KliqPoint[1]));
KliqPoint=0;
kaicang_kg=0;
}
}