// 变量 ==========================================================================
Vars
Series<Numeric> L05;
// 事件 ===========================================================================
Events
OnInit()
{
PLT_ZT.setOption("L05", "horizontal-alignment", 0);
PLT_ZT.setOption("L05", "vertical-alignment", 1);
PLT_ZT.setOption("L05", "color", RGB(205, 0, 185));
}
// Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 ========================================
OnBar(ArrayRef<Integer> indexs)
{
// 计算指标 -------------------------------------------------------------------------------------------------------------------
Range[0:DataCount - 1]
{ // 相关代码 ----------------------
L05 = Round((LG + RKJ) / 2, 0);
If(BarStatus == 2 And LKJ >= 10) PLT_ZT.icon("下五", L05, "ICO12", Text(L05) + " 下五" );
If(LKJ >= 10) PLT_ZT.text("L05", L05, " " + Text(Round(L05, 0)) + " 下五");
Unplot("L05", 1);
}
}上边是所有包含 L05 代码,程序运行有时候莫名奇妙就卡死,报错在图表右上角弹出信息
出错:公式不支持同名指标L05
其他指标线和 L05 相似的有时候也发生这样报错.........
图表卡死就不动了得重新启动策略才行,为什么呀??
多个程序加载的时候 不能有同名指标
老师:
我就一个程序
同时运行了几个合约
一个合约一个图表
他们同时运行也不行吗
不确定,你上面发的公式并不能直接运行
我觉得不是它发的代码里面的问题
你说了多程序加载我就去试了一下,给里面没赋值的变量赋值了
可以直接画图
所以 并不是我猜的unplot的原因
问题应该出在没有发出来的代码里
你好,不是上来就报错,是运行中说不上什么时候,也说不上哪一条指标线或者图表输出的文字或图标在图表右上角输出报警信息:
出错:公式不支持同名指标...
// ==============================================================================
// 简称: DY202
// 名称: 多鱼量化 逻辑指示版
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
// ==============================================================================
// 参数 ===========================================================================
Params
Enum<Integer> SS([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 100]); // 委托数量
Enum<Integer> ZS([5, 10, 15, 20, 25, 30]); // 止损点数
Enum<Integer> ZY([5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 100, 150, 200, 250, 300]); // 止盈点数
Enum<Bool> KP([True, False]); // 量化看盘
// 变量 ==========================================================================
Vars
// 标志 变量 -------------------------------------------------
Global Integer BK(0); // 开仓标志 全局
Global Integer BP(0); // 平仓标志 全局
// 逻辑变量 指标信号判断 -----------------------------------
Bool PDKD; // 指标判断 开多逻辑
Bool PDKK; // 指标判断 开空逻辑
Bool PDPD; // 指标判断 平多逻辑
Bool PDPK; // 指标判断 平空逻辑
// 逻辑变量 开平仓 ------------------------------------------
Bool KD; // 开多逻辑
Bool KK; // 开空逻辑
Bool PD; // 平多逻辑
Bool PK; // 平空逻辑
Bool DS; // 多头止损逻辑
Bool KS; // 空头止损逻辑
Bool DY; // 多头止盈逻辑
Bool KY; // 空头止盈逻辑
// 实盘持仓 变量 --------------------------------------------
Position pos; // 实盘 持仓数据存储变量
Array<Fill> ACJ; // 实盘 成交信息存储数组
Global Integer ACS(0); // 实盘 当日交易次数
Global Integer ADC(0); // 实盘 多头持仓数量 全局
Global Integer AKC(0); // 实盘 空头持仓数量 全局
Global Numeric ZDY(0); // 实盘 最大盈亏点数 全局
Global Numeric ZDE(0); // 实盘 最大盈亏金额 全局
Global Numeric ADE(0); // 实盘 多头浮动盈亏金额
Global Numeric AKE(0); // 实盘 空头浮动盈亏金额
Numeric ADY(0); // 实盘 多头盈亏点数
Numeric AKY(0); // 实盘 空头盈亏点数
Numeric ADJ(0); // 实盘 多头持仓价格
Numeric AKJ(0); // 实盘 空头持仓价格
Numeric ADH(0); // 实盘 多单最大回撤百分比
Numeric AKH(0); // 实盘 空单最大回撤百分比
// 通道指标 变量 --------------------------------------------
Numeric ZQ; // 通道周期
Series<Numeric> HG; // 上轨 序列变量
Series<Numeric> LG; // 下轨 序列变量
Series<Numeric> DL; // 动力线 序列变量
Series<Numeric> KJJ; // K均价 序列变量
Series<Numeric> QS; // 趋势线 序列变量
Series<Numeric> JD; // 趋势线角度 序列变量
Series<Numeric> RKJ; // 日开价 序列变量
Series<Numeric> ZKJ; // 周开价 序列变量
Series<Numeric> YKJ; // 月开价 序列变量
Series<Numeric> HKJ; // 上涨空间 序列变量
Series<Numeric> LKJ; // 下跌空间 序列变量
Series<Numeric> H01; // 上一 序列变量
Series<Numeric> H02; // 上二 序列变量
Series<Numeric> H03; // 上三 序列变量
Series<Numeric> H04; // 上四 序列变量
Series<Numeric> H05; // 上五 序列变量
Series<Numeric> H06; // 上六 序列变量
Series<Numeric> H07; // 上七 序列变量
Series<Numeric> H08; // 上八 序列变量
Series<Numeric> H09; // 上九 序列变量
Series<Numeric> L01; // 下一 序列变量
Series<Numeric> L02; // 下二 序列变量
Series<Numeric> L03; // 下三 序列变量
Series<Numeric> L04; // 下四 序列变量
Series<Numeric> L05; // 下五 序列变量
Series<Numeric> L06; // 下六 序列变量
Series<Numeric> L07; // 下七 序列变量
Series<Numeric> L08; // 下八 序列变量
Series<Numeric> L09; // 下九 序列变量
// 画图变量 -------------------------------------------------
Plot PLT_ZT; // 主图信号
Plot PLT_XH; // 信号指示
// 菜单栏控件 变量 ------------------------------------------
Global String CD("菜单源"); // 订阅事件变量 标签等
Global String JZ("基准线"); // 订阅事件变量 下拉框
Global String DX("策略选择"); // 订阅事件变量 单选按钮
// 基准线价变量 ---------------------------------------------
Global String CLXZ("自动"); // 策略选择 全局
Global String JZX("周开"); // 基准线 全局
Series<Numeric> JZJ; // 基准价 序列变量
// 函数 ===========================================================================
Defs
// 开多函数 -------------------------------------------------------------------------------
Bool KDHS(Numeric JG, String ZS) // 参数: 开仓价格; 开仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_Buy(MainSymbol, SS, JG, orders, ZS, "", 0); // 开多头单
return ret;
} // 开多结束 ----------------------------------------------------------------------------
// 开空函数 -------------------------------------------------------------------------------
Bool KKHS(Numeric JG, String ZS) // 参数: 开仓价格; 开仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_SellShort(MainSymbol, SS, JG, orders, ZS, "", 0); // 开空头单
return ret;
} // 开空结束 -----------------------------------------------------------------------------
// 平多函数 -------------------------------------------------------------------------------
Bool PDHS(Integer SL, String ZS) // 参数: 平仓数量; 平仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_Sell(MainSymbol, SL, Q_BidPrice, orders, ZS, "", 0); // 平多头单
return ret;
} // 平多结束 -----------------------------------------------------------------------------
// 平空函数 -------------------------------------------------------------------------------
Bool PKHS(Integer SL, String ZS) // 参数: 平仓数量; 平仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_BuyToCover(MainSymbol, SL, Q_AskPrice, orders, ZS, "", 0); // 平空头单
return ret;
} // 平空结束 ----------------------------------------------------------------------------
// 计算最大盈利点数函数 -----------------------------------------------------------------
Numeric ZDYL(Numeric CCYK) // 参数: 实盘实时持仓盈亏点数
{
// 如果实时持仓盈亏点数 > 最大盈利点数; 最大盈利点数 = 实时持仓盈亏点数
If (CCYK > ZDY) ZDY = CCYK;
Return ZDY;
} // 计算最大盈利点数函数 结束----------------------------------------------------------
// 计算最大盈利金额函数 -----------------------------------------------------------------
Numeric ZDYE(Numeric CCYE) // 参数: 实盘实时持仓盈亏金额
{
// 如果实时持仓盈亏金额 > 最大盈利金额; 最大盈利金额 = 实时持仓盈亏金额
If (CCYE > ZDE) ZDE = CCYE;
Return ZDE;
} // 计算最大盈利金额函数 结束----------------------------------------------------------
// 事件 ===========================================================================
Events
// 初始化事件函数,策略运行期间,首先运行且只有一次 ===========================================
OnInit()
{
// 交易设置 -------------------------------------------------------------------------
SetOrderPriceOffset(3); // 设置委托价为叫买/卖价偏移3跳
SetConsecEntries(1); // 设置同方向只能开1次仓
SetBackBarMaxCount(2000); // 设置序列变量最大回溯bar数
// 周开多空填充颜色 设置 -----------------------------------------------------------
PLT_ZT.setOption("周开多头", "color", RGB(72, 18, 18));
PLT_ZT.setOption("周开空头", "color", RGB(18, 72, 18));
// 周开价多空涨跌幅度(跳数)字体 设置 ---------------------------------------------
PLT_ZT.setOption("多盈", "font-size", 13); // 设置字体大小为13号
PLT_ZT.setOption("空盈", "font-size", 13); // 设置字体大小为13号
PLT_ZT.setOption("多盈", "color", RGB(240, 85, 200)); // 设置字体颜色
PLT_ZT.setOption("空盈", "color", RGB(85, 240, 150)); // 设置字体颜色
PLT_ZT.setOption("多盈", "vertical-alignment", 2); // 竖直下对齐
PLT_ZT.setOption("空盈", "vertical-alignment", 0); // 竖直上对齐
// 隐藏部分指标标题显示信息 -------------------------------------------------------
PLT_ZT.setOption("上二", "no-text", true);
PLT_ZT.setOption("下二", "no-text", true);
PLT_ZT.setOption("上八", "no-text", true);
PLT_ZT.setOption("下八", "no-text", true);
// 设置信号图标竖直对齐 -----------------------------------------------------------
PLT_ZT.setOption("周开开多", "vertical-alignment", 1); // 竖直中间对齐
PLT_ZT.setOption("周开开空", "vertical-alignment", 1);
PLT_ZT.setOption("日开开多", "vertical-alignment", 1);
PLT_ZT.setOption("日开开空", "vertical-alignment", 1);
PLT_ZT.setOption("上二开多", "vertical-alignment", 1);
PLT_ZT.setOption("上二开空", "vertical-alignment", 1);
PLT_ZT.setOption("上五开多", "vertical-alignment", 1);
PLT_ZT.setOption("上五开空", "vertical-alignment", 1);
PLT_ZT.setOption("上八开多", "vertical-alignment", 1);
PLT_ZT.setOption("上八开空", "vertical-alignment", 1);
PLT_ZT.setOption("下二开多", "vertical-alignment", 1);
PLT_ZT.setOption("下二开空", "vertical-alignment", 1);
PLT_ZT.setOption("下五开多", "vertical-alignment", 1);
PLT_ZT.setOption("下五开空", "vertical-alignment", 1);
PLT_ZT.setOption("下八开多", "vertical-alignment", 1);
PLT_ZT.setOption("下八开空", "vertical-alignment", 1);
// ----------------------------------------------------------
PLT_ZT.setOption("上一12", "vertical-alignment", 1);
PLT_ZT.setOption("上二12", "vertical-alignment", 1);
PLT_ZT.setOption("上三12", "vertical-alignment", 1);
PLT_ZT.setOption("上四12", "vertical-alignment", 1);
PLT_ZT.setOption("上五12", "vertical-alignment", 1);
PLT_ZT.setOption("上六12", "vertical-alignment", 1);
PLT_ZT.setOption("上七12", "vertical-alignment", 1);
PLT_ZT.setOption("上八12", "vertical-alignment", 1);
PLT_ZT.setOption("上九12", "vertical-alignment", 1);
PLT_ZT.setOption("下一12", "vertical-alignment", 1);
PLT_ZT.setOption("下二12", "vertical-alignment", 1);
PLT_ZT.setOption("下三12", "vertical-alignment", 1);
PLT_ZT.setOption("下四12", "vertical-alignment", 1);
PLT_ZT.setOption("下五12", "vertical-alignment", 1);
PLT_ZT.setOption("下六12", "vertical-alignment", 1);
PLT_ZT.setOption("下七12", "vertical-alignment", 1);
PLT_ZT.setOption("下八12", "vertical-alignment", 1);
PLT_ZT.setOption("下九12", "vertical-alignment", 1);
// 设置末K指标价格标注 -----------------------------------------------------------
PLT_ZT.setOption("ZKJ", "horizontal-alignment", 0); // 水平左对齐
PLT_ZT.setOption("RKJ", "horizontal-alignment", 0);
PLT_ZT.setOption("HG", "horizontal-alignment", 0);
PLT_ZT.setOption("LG", "horizontal-alignment", 0);
PLT_ZT.setOption("H02", "horizontal-alignment", 0);
PLT_ZT.setOption("H05", "horizontal-alignment", 0);
PLT_ZT.setOption("H08", "horizontal-alignment", 0);
PLT_ZT.setOption("L02", "horizontal-alignment", 0);
PLT_ZT.setOption("L05", "horizontal-alignment", 0);
PLT_ZT.setOption("L08", "horizontal-alignment", 0);
PLT_ZT.setOption("C", "horizontal-alignment", 1); // 水平中间对齐
PLT_ZT.setOption("JZJ", "horizontal-alignment", 0);
PLT_ZT.setOption("盈亏★", "horizontal-alignment", 0);
PLT_ZT.setOption("盈亏", "horizontal-alignment", 0);
PLT_ZT.setOption("ZKJ", "vertical-alignment", 1); // 竖直中间对齐
PLT_ZT.setOption("RKJ", "vertical-alignment", 1);
PLT_ZT.setOption("HG", "vertical-alignment", 1);
PLT_ZT.setOption("LG", "vertical-alignment", 1);
PLT_ZT.setOption("H02", "vertical-alignment", 1);
PLT_ZT.setOption("H05", "vertical-alignment", 1);
PLT_ZT.setOption("H08", "vertical-alignment", 1);
PLT_ZT.setOption("L02", "vertical-alignment", 1);
PLT_ZT.setOption("L05", "vertical-alignment", 1);
PLT_ZT.setOption("L08", "vertical-alignment", 1);
PLT_ZT.setOption("C", "vertical-alignment", 1);
PLT_ZT.setOption("JZJ", "vertical-alignment", 1);
PLT_ZT.setOption("盈亏★", "vertical-alignment", 1);
PLT_ZT.setOption("盈亏", "vertical-alignment", 1);
PLT_ZT.setOption("ZKJ", "color", RGB(255, 105, 0)); // 颜色
PLT_ZT.setOption("RKJ", "color", RGB(255, 255, 0));
PLT_ZT.setOption("HG", "color", White);
PLT_ZT.setOption("LG", "color", White);
PLT_ZT.setOption("H02", "color", RGB(0, 158, 255));
PLT_ZT.setOption("H05", "color", RGB(0, 185, 185));
PLT_ZT.setOption("H08", "color", RGB(0, 98, 255));
PLT_ZT.setOption("L02", "color", RGB(0, 158, 255));
PLT_ZT.setOption("L05", "color", RGB(205, 0, 185));
PLT_ZT.setOption("L08", "color", RGB(0, 98, 255));
PLT_ZT.setOption("C", "color", RGB(255, 255, 0));
PLT_ZT.setOption("JZJ", "color", RGB(0, 255, 255));
PLT_ZT.setOption("盈亏", "font-size", 28); // 设置盈亏字体大小为28号
// 菜单栏 ---------------------------------------------------------------------------
SubscribeEvent(JZ); // 订阅事件 基准线 下拉框
SubscribeEvent(DX); // 订阅事件 策略选择 单选按钮
// -----------------------------------------------------------------------------------
PLT_ZT.toolBar(CD, "日期", DateToString(CurrentDate), "date"); // 日期
PLT_ZT.toolBar(CD, "时间", TimeToString(CurrentTime), "time"); // 时间
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Array<String> radio = ["平仓", "自动"]; // 策略选择
PLT_ZT.toolBar(DX, "策略选择", radio, 1, "radio"); // 策略选择 单选按钮
Array<String> content = ["趋势线", "上九", "上八", "上七", "上六", "上五", "上四", "上三", "上二", "上一", "周开价", "下一", "下二", "下三", "下四", "下五", "下六", "下七", "下八", "下九", "日开价"]; // 基准线
PLT_ZT.toolBar(JZ, " 基准线", content, 10); // 基准线 下拉框
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PLT_ZT.toolBar(CD, "基准价名", " = 基准价:", "label");
PLT_ZT.toolBar(CD, "基准价值", Text(0), "label");
PLT_ZT.toolBar(CD, "合约名称名", " 合约:", "label");
PLT_ZT.toolBar(CD, "合约名称值", MainSymbol, "label");
PLT_ZT.toolBar(CD, "最新价名", " 最新价:", "label");
PLT_ZT.toolBar(CD, "最新价值", Text(Q_Last) + " ", "label");
PLT_ZT.toolBar(CD, "持仓数量名", " 持仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(0), "label");
PLT_ZT.toolBar(CD, "交易次数名", " 交易次数:", "label");
PLT_ZT.toolBar(CD, "交易次数值", Text(0), "label");
PLT_ZT.toolBar(CD, "交易商名称", " " + A_BrokerName, "label");
// 量化看盘 -------------------------------------------------------------------------
If(KP)
{
PLT_XH.figure();
PLT_XH.setLayout(0, 12); // 布局在第0行第12列
PLT_XH.setCrossCells(12, 1); // 跨12行1列
PLT_XH.setOption("开仓标志", "horizontal-alignment", 0);
PLT_XH.setOption("平仓标志", "horizontal-alignment", 0);
PLT_XH.setOption("判断开多", "horizontal-alignment", 0);
PLT_XH.setOption("判断开空", "horizontal-alignment", 0);
PLT_XH.setOption("判断平多", "horizontal-alignment", 0);
PLT_XH.setOption("判断平空", "horizontal-alignment", 0);
PLT_XH.setOption("开多逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("开空逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("平多逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("平空逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("多头止损", "horizontal-alignment", 0);
PLT_XH.setOption("空头止损", "horizontal-alignment", 0);
PLT_XH.setOption("多头止盈", "horizontal-alignment", 0);
PLT_XH.setOption("空头止盈", "horizontal-alignment", 0);
}
} // 初始化事件函数 结束 =============================================================
// 在所有的数据源准备完成后调用,应用在数据源的设置等操作 =======================================
OnReady()
{
SetSlippage(Enum_Rate_PointPerHand, 3); // 设置滑点每手3跳
SetOrderMap2MainSymbol(); // 委托映射到主力
} // 数据源准备结束 =================================================================
// 在新bar的第一次执行之前调用一次,参数为新bar的图层数组 =======================================
OnBarOpen(ArrayRef<Integer> indexs)
{
BP = 0; // 平仓标志归0,每个Bar开盘时重置标志
BK = 0; // 开仓标志置0,每个Bar开盘时重置标志
} // BarOpen结束 ==================================================================
// Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 ========================================
OnBar(ArrayRef<Integer> indexs)
{
// 计算指标 -------------------------------------------------------------------------------------------------------------------
Range[0:DataCount - 1]
{
// 通道指标 计算-----------------------------------------------------------------------------------------------
ZQ = NthCon(Weekday <> REF(Weekday, 1), Weekday) + 1; // 周期,每周随着Bar推移的Bar数
ZKJ = Round(IIF(ZQ == 1, O, ZKJ), 0); // 周开价
RKJ = Round(IIF(TrueDate(0) <> TrueDate(1), O, RKJ), 0); // 日开价
HG = HighestFC(H, ZQ); // 上轨
LG = LowestFC(L, ZQ); // 下轨
DL = Round(DEMA(C, 3), 2); // 动力线 保留2位小数提高灵敏度,尽量避免DL[1]等于基准价情况
KJJ = Round((H + L+ C * 2) / 4, 0); // K均价
QS = DEMA(Round((H + L) / 2, 0), 20); // 趋势线
JD = Round(LinearRegAngle(QS, 2) * 180 / Pi, 0); // 趋势角度
HKJ = Round((HG - ZKJ) / minMove, 0); // 上涨空间 = 上轨 - 周开价
LKJ = Round((ZKJ - LG) / minMove, 0); // 下跌空间 = 周开价 - 下轨
// 网格线 计算-------------------------------------------------------------------------------------------------
H01 = Round(ZKJ + HKJ / 10 * 1 * minMove, 0); // 上一
H02 = Round(ZKJ + HKJ / 10 * 2 * minMove, 0); // 上二
H03 = Round(ZKJ + HKJ / 10 * 3 * minMove, 0); // 上三
H04 = Round(ZKJ + HKJ / 10 * 4 * minMove, 0); // 上四
H05 = Round((HG + ZKJ) / 2, 0); // 上五
H06 = Round(ZKJ + HKJ / 10 * 6 * minMove, 0); // 上六
H07 = Round(ZKJ + HKJ / 10 * 7 * minMove, 0); // 上七
H08 = Round(ZKJ + HKJ / 10 * 8 * minMove, 0); // 上八
H09 = Round(ZKJ + HKJ / 10 * 9 * minMove, 0); // 上九
L01 = Round(ZKJ - LKJ / 10 * 1 * minMove, 0); // 下一
L02 = Round(ZKJ - LKJ / 10 * 2 * minMove, 0); // 下二
L03 = Round(ZKJ - LKJ / 10 * 3 * minMove, 0); // 下三
L04 = Round(ZKJ - LKJ / 10 * 4 * minMove, 0); // 下四
L05 = Round((LG + ZKJ) / 2, 0); // 下五
L06 = Round(ZKJ - LKJ / 10 * 6 * minMove, 0); // 下六
L07 = Round(ZKJ - LKJ / 10 * 7 * minMove, 0); // 下七
L08 = Round(ZKJ - LKJ / 10 * 8 * minMove, 0); // 下八
L09 = Round(ZKJ - LKJ / 10 * 9 * minMove, 0); // 下九
// -----------------------------------------------------------------
If(JZX == "周开") JZJ = ZKJ; // 周开价
Else If(JZX == "日开") JZJ = RKJ; // 日开价
Else If(JZX == "上一") JZJ = H01; // 上一
Else If(JZX == "上二") JZJ = H02; // 上二
Else If(JZX == "上三") JZJ = H03; // 上三
Else If(JZX == "上四") JZJ = H04; // 上四
Else If(JZX == "上五") JZJ = H05; // 上五
Else If(JZX == "上六") JZJ = H06; // 上六
Else If(JZX == "上七") JZJ = H06; // 上七
Else If(JZX == "上八") JZJ = H06; // 上八
Else If(JZX == "上九") JZJ = H06; // 上九
Else If(JZX == "下一") JZJ = L01; // 下一
Else If(JZX == "下二") JZJ = L02; // 下二
Else If(JZX == "下三") JZJ = L03; // 下三
Else If(JZX == "下四") JZJ = L04; // 下四
Else If(JZX == "下五") JZJ = L05; // 下五
Else If(JZX == "下六") JZJ = L06; // 下六
Else If(JZX == "下七") JZJ = L07; // 下七
Else If(JZX == "下八") JZJ = L08; // 下八
Else If(JZX == "下九") JZJ = L09; // 下九
Else If(JZX == "趋势") JZJ = QS; // 趋势
If (True) // 指标画线 ------------------------------------------------------------------------------------------------------------------
{
PlotAuto("上轨", HG, HG, RGB(0, 128, 128), Enum_line, Enum_Broken); // 上轨画线
PlotAuto("上五", H05, H05, RGB(0, 185, 185), Enum_line, Enum_Solid); // 上五画线
PlotAuto("周开价", ZKJ, ZKJ, RGB(255, 85, 0), Enum_line, Enum_Broken, Enum_3Pix); // 周开价画线
PlotAuto("下五", L05, L05, RGB(205, 0, 205), Enum_line, Enum_Solid); // 下五画线
PlotAuto("下轨", LG, LG, RGB(128, 0, 128), Enum_line, Enum_Broken); // 下轨画线
If(JD > 0) PlotAuto("趋势线", QS, QS, RGB(255, 0, 127), Enum_line, Enum_Broken, Enum_2Pix); // 趋势上行画线 变色
If(JD < 0) PlotAuto("趋势线", QS, QS, RGB(85, 170, 0), Enum_line, Enum_Broken, Enum_2Pix); // 趋势下行画线 变色
If(JD == 0) PlotAuto("趋势线", QS, QS, RGB(0, 255, 255), Enum_line, Enum_Broken, Enum_2Pix); // 趋势下行画线 变色
PlotAuto("K均价", KJJ, KJJ, RGB(170, 225, 0), Enum_line, Enum_Solid); // K均价画线
PlotAuto("动力线", DL, DL, White, Enum_line, Enum_Solid); // 动力线画线
PlotAuto("日开价", RKJ, RKJ, RGB(255, 225, 0), Enum_Bar, Enum_Broken); // 日开价画线
If(HKJ >= 30 And H05[0] == H05[1]) PlotAuto("上八", H08, H08, RGB(0, 98, 255), Enum_Bar, Enum_Broken); // 上八画线
If(HKJ >= 30 And H05[0] == H05[1]) PlotAuto("上二", H02, H02, RGB(0, 158, 255), Enum_Bar, Enum_Broken); // 上二画线
If(LKJ >= 30 And L05[0] == L05[1]) PlotAuto("下二", L02, L02, RGB(0, 158, 255), Enum_Bar, Enum_Broken); // 下二画线
If(LKJ >= 30 And L05[0] == L05[1]) PlotAuto("下八", L08, L08, RGB(0, 98, 255), Enum_Bar, Enum_Broken); // 下八画线
// 周开多空颜色填充 -------------------------------------------------------------------------------------------------------------------
PLT_ZT.fillRgn("周开多头", DL >= ZKJ, L - 1, ZKJ + 1); // 周开多头颜色填充
PLT_ZT.fillRgn("周开空头", DL <= ZKJ, H + 1, ZKJ - 1); // 周开空头颜色填充
// 基于周开价多空涨跌幅度(跳数) ------------------------------------------------------------------------------------------------------
If((C - ZKJ) > 0) PLT_ZT.text("多盈", H, Text(Round((C - ZKJ) / minMove, 0))); // 多盈跳数
If((C - ZKJ) < 0) PLT_ZT.text("空盈", L, Text(Round((ZKJ - C) / minMove, 0))); // 空盈跳数
} // 指标画线 结束 -----------------------------------------------------------------------------------------------------------------------
If (True) // 画信号图标 开始--------------------------------------------------------------------------------------------------------------------------------------------------------------
{
If((ZKJ[0] == ZKJ[1] And DL[1] <= ZKJ[1] And DL[0] > ZKJ[0]) Or (ZKJ[0] <> ZKJ[1] And DL[0] > ZKJ[0])) PLT_ZT.icon("周开开多", ZKJ, "ICO3", Text(ZKJ) + " 周开开多");
If((ZKJ[0] == ZKJ[1] And DL[1] >= ZKJ[1] And DL[0] < ZKJ[0]) Or (ZKJ[0] <> ZKJ[1] And DL[0] < ZKJ[0])) PLT_ZT.icon("周开开空", ZKJ, "ICO1", Text(ZKJ) + " 周开开空");
If((RKJ[0] == RKJ[1] And DL[1] <= RKJ[1] And DL[0] > RKJ[0]) Or (RKJ[0] <> RKJ[1] And DL[0] > RKJ[0])) PLT_ZT.icon("日开开多", RKJ, "ICO10", Text(RKJ) + " 日开开多");
If((RKJ[0] == RKJ[1] And DL[1] >= RKJ[1] And DL[0] < RKJ[0]) Or (RKJ[0] <> RKJ[1] And DL[0] < RKJ[0])) PLT_ZT.icon("日开开空", RKJ, "ICO11", Text(RKJ) + " 日开开空");
If(HKJ >= 30 And DL[1] <= H02[1] And DL[0] > H02[0]) PLT_ZT.icon("上二开多", H02, "ICO10", Text(H02) + " 上二开多");
If(HKJ >= 30 And DL[1] >= H02[1] And DL[0] < H02[0]) PLT_ZT.icon("上二开空", H02, "ICO11", Text(H02) + " 上二开空");
If(HKJ >= 30 And DL[1] <= H05[1] And DL[0] > H05[0]) PLT_ZT.icon("上五开多", H05, "ICO10", Text(H05) + " 上五开多");
If(HKJ >= 30 And DL[1] >= H05[1] And DL[0] < H05[0]) PLT_ZT.icon("上五开空", H05, "ICO11", Text(H05) + " 上五开空");
If(HKJ >= 30 And DL[1] <= H08[1] And DL[0] > H08[0]) PLT_ZT.icon("上八开多", H08, "ICO10", Text(H08) + " 上八开多");
If(HKJ >= 30 And DL[1] >= H08[1] And DL[0] < H08[0]) PLT_ZT.icon("上八开空", H08, "ICO11", Text(H08) + " 上八开空");
If(LKJ >= 30 And DL[1] <= L02[1] And DL[0] > L02[0]) PLT_ZT.icon("下二开多", L02, "ICO10", Text(L02) + " 下二开多");
If(LKJ >= 30 And DL[1] >= L02[1] And DL[0] < L02[0]) PLT_ZT.icon("下二开空", L02, "ICO11", Text(L02) + " 下二开空");
If(LKJ >= 30 And DL[1] <= L05[1] And DL[0] > L05[0]) PLT_ZT.icon("下五开多", L05, "ICO10", Text(L05) + " 下五开多");
If(LKJ >= 30 And DL[1] >= L05[1] And DL[0] < L05[0]) PLT_ZT.icon("下五开空", L05, "ICO11", Text(L05) + " 下五开空");
If(LKJ >= 30 And DL[1] <= L08[1] And DL[0] > L08[0]) PLT_ZT.icon("下八开多", L08, "ICO10", Text(L08) + " 下八开多");
If(LKJ >= 30 And DL[1] >= L08[1] And DL[0] < L08[0]) PLT_ZT.icon("下八开空", L08, "ICO11", Text(L08) + " 下八开空");
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上一12", H01, "ICO12", Text(H01) + " 上一" );
If(BarStatus == 2 And HKJ >= 10) PLT_ZT.icon("上二12", H02, "ICO12", Text(H02) + " 上二" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上三12", H03, "ICO12", Text(H03) + " 上三" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上四12", H04, "ICO12", Text(H04) + " 上四" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上五12", H05, "ICO12", Text(H05) + " 上五" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上六12", H06, "ICO12", Text(H06) + " 上六" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上七12", H07, "ICO12", Text(H07) + " 上七" );
If(BarStatus == 2 And HKJ >= 10) PLT_ZT.icon("上八12", H08, "ICO12", Text(H08) + " 上八" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上九12", H09, "ICO12", Text(H09) + " 上九" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下一12", L01, "ICO12", Text(L01) + " 下一" );
If(BarStatus == 2 And LKJ >= 10) PLT_ZT.icon("下二12", L02, "ICO12", Text(L02) + " 下二" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下三12", L03, "ICO12", Text(L03) + " 下三" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下四12", L04, "ICO12", Text(L04) + " 下四" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下五12", L05, "ICO12", Text(L05) + " 下五" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下六12", L06, "ICO12", Text(L06) + " 下六" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下七12", L07, "ICO12", Text(L07) + " 下七" );
If(BarStatus == 2 And LKJ >= 10) PLT_ZT.icon("下八12", L08, "ICO12", Text(L08) + " 下八" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下九12", L09, "ICO12", Text(L09) + " 下九" );
// 删除历史 ----------------------------------------------------------------------------------------------------------
Unplot("上一12", 1);
Unplot("上二12", 1);
Unplot("上三12", 1);
Unplot("上四12", 1);
Unplot("上五12", 1);
Unplot("上六12", 1);
Unplot("上七12", 1);
Unplot("上八12", 1);
Unplot("上九12", 1);
Unplot("下一12", 1);
Unplot("下二12", 1);
Unplot("下三12", 1);
Unplot("下四12", 1);
Unplot("下五12", 1);
Unplot("下六12", 1);
Unplot("下七12", 1);
Unplot("下八12", 1);
Unplot("下九12", 1);
} // 画信号图标 结束 ---------------------------------------------------------------------------------------------------
If(BarStatus == 2) // 末K指标价格标注 ---------------------------------------------------------------------------------
{
// 末K指标价格标注 ----------------------------------------------------------------------------------------------
PLT_ZT.text("ZKJ", ZKJ, " " + Text(Round(ZKJ, 0)) + " 周开价");
PLT_ZT.text("RKJ", RKJ, " " + Text(Round(RKJ, 0)) + " 日开价");
PLT_ZT.text("HG", HG, " " + Text(Round(HG, 0)) + " 上轨");
PLT_ZT.text("LG", LG, " " + Text(Round(LG, 0)) + " 下轨");
If(HKJ >= 10) PLT_ZT.text("H05", H05, " " + Text(Round(H05, 0)) + " 上五");
If(LKJ >= 10) PLT_ZT.text("L05", L05, " " + Text(Round(L05, 0)) + " 下五");
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.text("H02", H02, " " + Text(Round(H02, 0)) + " 上二");
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.text("H08", H08, " " + Text(Round(H08, 0)) + " 上八");
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.text("L02", L02, " " + Text(Round(L02, 0)) + " 下二");
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.text("L08", L08, " " + Text(Round(L08, 0)) + " 下八");
PLT_ZT.text("C", C, Text(Round(C, 0)));
PLT_ZT.text("JZJ", JZJ[0], " ★ " + Text(Round(JZJ[0], 0)) + " 基准价 " + JZX);
// 删除标注历史 -----------------------------------------------------------------------------------------------------------------------------------------------
Unplot("ZKJ", 1);
Unplot("RKJ", 1);
Unplot("HG", 1);
Unplot("LG", 1);
Unplot("H02", 1);
Unplot("H05", 1);
Unplot("H08", 1);
Unplot("L02", 1);
Unplot("L05", 1);
Unplot("L08", 1);
Unplot("C", 1);
Unplot("JZJ", 1);
Unplot("盈亏★", 1);
Unplot("盈亏", 1);
} //末K指标价格标注 结束------------------------------------------------------------------------------------------------
If (True) // 小窗输出 ------------------------------------------------------------------------------------------------------
{
Commentary(" ================ ");
Commentary(" 本周Bar数: " + Text(ZQ));
Commentary(" Bar幅度: " + Text(Round((C - O) / minMove, 0)));
Commentary(" 趋势角度: " + Text(JD));
Commentary(" 上涨空间: " + Text(HKJ));
Commentary(" 上涨间隔: " + Text(Round(HKJ / 10, 0)));
Commentary(" 下跌空间: " + Text(LKJ));
Commentary(" 下跌间隔: " + Text(Round(LKJ / 10, 0)));
Commentary(" ================ ");
Commentary(" 价格单位: " + Text(PriceScale));
Commentary(" 最小变动: " + Text(minMove * priceScale));
Commentary(" 每点价值: " + Text(BigPointValue));
Commentary(" 合约乘数: " + Text(contractUnit));
Commentary(" 盈亏波动: " + Text(minMove * priceScale * contractUnit));
Commentary(" 保证金比率: " + Text(marginRatio));
Commentary(" ================ ");
Commentary(" 周期类型: " + Frequency);
} // 小窗输出 结束--------------------------------------------------------------------------------------------------------
} // 计算指标 结束 -----------------------------------------------------------------------------------------------------------
// 指标信号判断逻辑 ---------------------------------------------------------------------------------------------------------
If (True)
{
If(CLXZ == "平仓") // 平仓离场 --------------------------------------------------------------------------------------
{
PDPD = True; // 判断 平多逻辑
PDPK = True; // 判断 平空逻辑
} // 平仓离场 结束---------------------------------------------------------------------------------------------------------
// 自动 周初开 日初开 KJJ ---------------------------------------------------------------------------------------------------
Else If(CLXZ == "自动" And ((JZX == "周开" And ZKJ[0] <> ZKJ[1]) Or (JZX == "日开" And RKJ[0] <> RKJ[1])))
{
PDKD = KJJ[0] > JZJ[0]; // 判断 开多逻辑
PDKK = KJJ[0] < JZJ[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 周初开 日初开 结束 -----------------------------------------------------------------------------------------------
Else If(CLXZ == "自动") // 自动 趋势线/网格线 交叉策略 -----------------------------------------------------------------
{
PDKD = DL[1] <= JZJ[1] And DL[0] > JZJ[0]; // 判断 开多逻辑
PDKK = DL[1] >= JZJ[1] And DL[0] < JZJ[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 结束 ---------------------------------------------------------------------------------------------------------------
Else If(CLXZ == "自动" And HKJ >= 10) // 上涨空间 >= 20 自动 网格 上中线 ------------------------------------------
{
PDKD = H05[0] == H05[1] And DL[1] <= H05[1] And DL[0] > H05[0]; // 判断 开多逻辑
PDKK = H05[0] == H05[1] And DL[1] >= H05[1] And DL[0] < H05[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 网格 上中线 结束--------------------------------------------------------------------------------------------------
Else If(CLXZ == "自动" And LKJ >= 10) // 下跌空间 >= 20 自动 网格 下中线 ------------------------------------------
{
PDKD = L05[0] == L05[1] And DL[1] <= L05[1] And DL[0] > L05[0]; // 判断 开多逻辑
PDKK = L05[0] == L05[1] And DL[1] >= L05[1] And DL[0] < L05[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 网格 下中线 结束---------------------------------------------------------------------------------------------------
} // 指标信号判断结束-----------------------------------------------------------------------------------------------------------
// 实盘交易 当前Bar是最新Bar即实时行情 当前日期是交易日 当前时间是交易时间-------------------------------------------
If(BarStatus == 2 And IsTradingDay(Symbol, CurrentDate) And IsTradingTime(SystemDateTime)) // 实盘交易开始
{
// 实盘交易数据获取 ***********************************************************************************************
// 实盘持仓数据 ---------------------------------------------------------------------------------------------------------------------------------------------------
A_GetPosition(MainSymbol, pos, "", 0); // 获取指定合约持仓数据
ADC = pos.longCurrentVolume; // 多头当前持仓数量
AKC = pos.shortCurrentVolume; // 空头当前持仓数量
A_GetPreFills(MainSymbol, ACJ, TradingOpenDateTime(MainSymbol, SystemDateTime), 0, "", 0); // 当日历史成交
ACS = GetArraySize(ACJ); // 当日历史成交次数
PLT_ZT.toolBar(CD, "交易次数值", Text(Round(ACS / 2, 0)) + "", "label"); // 菜单栏实时刷新,当日历史累计开仓次数 = 当日历史成交次数 (开仓+平仓) / 2
// 实盘 持仓价格 ---------------------------------------------------------------------------------------------------------------------------------------------------
ADJ = Round(pos.longAvgPriceO, 0); // 多头持仓均价
AKJ = Round(pos.shortAvgPriceO, 0); // 空头持仓均价
// 实盘 盈亏金额 ---------------------------------
ADE = pos.longFloatProfitO; // 多头浮动盈亏
AKE = pos.shortFloatProfitO; // 空头浮动盈亏
// 实盘 盈亏点数 ---------------------------------------------------------------------------------------------------------------------------------------------------
ADY = Round(pos.longFloatProfitO / ContractUnit / minMove / SS, 0); // 实盘多头盈亏点数 = 买入持仓盈亏(成本价) / 乘数 / 每跳最小变动量 / 手数
AKY = Round(pos.shortFloatProfitO / ContractUnit / minMove / SS, 0); // 实盘空头盈亏点数 = 卖出持仓盈亏(成本价) / 乘数 / 每跳最小变动量 / 手数
// 实盘 最大回撤 ---------------------------------------------------------------------------------------------------------------------------------------------------
ADH = Round((ZDYL(ADY) - ADY) / ZDYL(ADY) * 100, 0); // 多头最大回撤百分比
AKH = Round((ZDYL(AKY) - AKY) / ZDYL(AKY) * 100, 0); // 空头最大回撤百分比
// 交易逻辑 *****************************************************************************************************
// 实盘 开仓逻辑 ------------------------------------------------------------------------------------------------------------
KD = ADC == 0 And AKC == 0 And BK == 0 And PDKD; // 实盘开多逻辑
KK = ADC == 0 And AKC == 0 And BK == 0 And PDKK; // 实盘开空逻辑
// 实盘 平仓逻辑 ------------------------------------------------------------------------------------------------------------
PD = ADC > 0 And BP == 0 And PDPD; // 实盘平多逻辑
PK = AKC > 0 And BP == 0 And PDPK; // 实盘平空逻辑
// 实盘 固定止损 逻辑 ------------------------------------------------------------------------------------------------------
DS = ADC > 0 And ADY <= -ZS; // 实盘多头止损逻辑 = 实盘多头盈亏点数<= - 止损点数
KS = AKC > 0 And AKY <= -ZS; // 实盘空头止损逻辑 = 实盘空头盈亏点数<= - 止损点数
// 实盘 固定止盈 逻辑 ------------------------------------------------------------------------------------------------------
DY = ADC > 0 And ADY >= ZY; // 实盘多头止盈逻辑 = 实盘多头盈亏点数 >= 止盈点数
KY = AKC > 0 And AKY >= ZY; // 实盘空头止盈逻辑 = 实盘空头盈亏点数 >= 止盈点数
// 实盘 交易指令 执行 ******************************************************************************************
// 平仓 ===================================================================
If(PD) // 平多仓 条件成立 -------------------------------------------------------------------------------------------------
{
PDHS(ADC, ("指标 平多 " + Text(ADE))); // 平多函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,准备下一次开仓
} // 平多结束 ---------------------------------------------------------------------------------------------------------------
If(PK) // 平空仓 条件成立 --------------------------------------------------------------------------------------------------
{
PKHS(AKC, ("指标 平空 " + Text(AKE))); // 平空函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,准备下一次开仓
} // 平空结束 ----------------------------------------------------------------------------------------------------------------
// 开仓 ====================================================================
If(KD) // 开多单 条件成立 --------------------------------------------------------------------------------------------------
{
KDHS(Q_AskPrice, ("指标 开多 " + Text(0))); // 开多函数
BK = 1; // 开仓标志置1,避免重复开仓
BP = 0; // 平仓标志BP置0,等待下一次平仓
} // 开多结束 ---------------------------------------------------------------------------------------------------------------
If(KK) // 开空单 条件成立 ---------------------------------------------------------------------------------------------------
{
KKHS(Q_BidPrice, ("指标 开空 " + Text(0))); // 开空函数
BK = 1; // 开仓标志置1,避免重复开仓
BP = 0; // 平仓标志BP置0,等待下一次平仓
} // 开空结束 ----------------------------------------------------------------------------------------------------------------
// 止损 ====================================================================
If(DS) // 多头止损 条件成立 ------------------------------------------------------------------------------------------------
{
PDHS(ADC, ("止损 平多 " + Text(ADE))); // 平多函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 多头止损结束 ----------------------------------------------------------------------------------------------------------
If(KS) // 空头止损 条件成立 ------------------------------------------------------------------------------------------------
{
PKHS(AKC, ("止损 平空 " + Text(AKE))); // 平空函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 空头止损结束 ----------------------------------------------------------------------------------------------------------
// 止盈 ====================================================================
If(DY) // 多头止盈 条件成立 ------------------------------------------------------------------------------------------------
{
PDHS(ADC, ("止盈 平多 " + Text(ADE))); // 平多函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 多头止盈结束 ----------------------------------------------------------------------------------------------------------
If(KY) // 空头止盈 条件成立 ------------------------------------------------------------------------------------------------
{
PKHS(AKC, ("止盈 平空 " + Text(AKE))); // 平空函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 空头止盈结束 -----------------------------------------------------------------------------------------------------------
} // 实盘交易 结束 -------------------------------------------------------------------------------------------------------------
// 菜单栏更新数据 -------------------------------------------------------------------------------------------------------------
If(True)
{
// ------------------------------------------------------------------------------------
PLT_ZT.toolBar(CD, "日期", DateToString(CurrentDate), "date");
PLT_ZT.toolBar(CD, "时间", TimeToString(CurrentTime), "time");
PLT_ZT.toolBar(CD, "基准价值", Text(JZJ[0]), "label"); // 工具栏显示验证
PLT_ZT.toolBar(CD, "最新价值", Text(Round(Q_Last, 0)), "label");
If(ADC > 0) // 实盘 持多仓 -----------------------------------------------------------
{
PLT_ZT.toolBar(CD, "持仓数量名", " 多仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(pos.longCurrentVolume), "label");
// ------------------------------------------------------------------------------------
Commentary(" 最大多盈: " + Text(ZDYL(ADY))); // 小窗输出
Commentary(" 实盘多盈: " + Text(ADY)); // 小窗输出
Commentary(" 最大回撤: " + Text(ADH)); // 小窗输出
} // 实盘 持多仓 结束-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If(AKC > 0) // 实盘 持空仓 ------------------------------------------------------------
{
PLT_ZT.toolBar(CD, "持仓数量名", " 空仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(pos.shortCurrentVolume), "label");
// -------------------------------------------------------------------------------------
Commentary(" 最大空盈: " + Text(ZDYL(AKY))); // 小窗输出
Commentary(" 实盘空盈: " + Text(AKY)); // 小窗输出
Commentary(" 最大回撤: " + Text(AKH)); // 小窗输出
} // 实盘 持空仓 结束-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If(ADC == 0 And AKC == 0) // 实盘 持仓为0 ----------------------------------------
{
PLT_ZT.toolBar(CD, "持仓数量名", " 持仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(0), "label");
} // 实盘 持仓为0 结束-------------------------------------------------------------------------------------------------------------------------------------------
} // 菜单栏更新数据结束 ----------------------------------------------------------------------------------------------------
// 量化看盘 --------------------------------------------------------------------------------------------------------------------
If(KP)
{
PLT_XH.text("00", 0, 0, "");
PLT_XH.text("10", 0, 100, "");
PLT_XH.text("开仓标志", 0, 96.5, "开仓 标志");
PLT_XH.text("平仓标志", 0, 89.5, "平仓 标志");
PLT_XH.text("判断开多", 0, 82.5, "判断 开多");
PLT_XH.text("判断开空", 0, 75.5, "判断 开空");
PLT_XH.text("判断平多", 0, 68.5, "判断 平多");
PLT_XH.text("判断平空", 0, 61.5, "判断 平空");
PLT_XH.text("开多逻辑", 0, 54.5, "开多 逻辑");
PLT_XH.text("开空逻辑", 0, 47.5, "开空 逻辑");
PLT_XH.text("平多逻辑", 0, 40.5, "平多 逻辑");
PLT_XH.text("平空逻辑", 0, 33.5, "平空 逻辑");
PLT_XH.text("多头止损", 0, 26.5, "多头 止损");
PLT_XH.text("空头止损", 0, 19.5, "空头 止损");
PLT_XH.text("多头止盈", 0, 12.5, "多头 止盈");
PLT_XH.text("空头止盈", 0, 05.5, "空头 止盈");
// --------------------------------------------------------------------------
If(BK == 1) PLT_XH.setOption("开仓标志", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("开仓标志", "color", RGB(205, 205, 205));
If(BP == 1) PLT_XH.setOption("平仓标志", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("平仓标志", "color", RGB(205, 205, 205));
If(PDKD) PLT_XH.setOption("判断开多", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断开多", "color", RGB(205, 205, 205));
If(PDKK) PLT_XH.setOption("判断开空", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断开空", "color", RGB(205, 205, 205));
If(PDPD) PLT_XH.setOption("判断平多", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断平多", "color", RGB(205, 205, 205));
If(PDPK) PLT_XH.setOption("判断平空", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断平空", "color", RGB(205, 205, 205));
If(KD) PLT_XH.setOption("开多逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("开多逻辑", "color", RGB(205, 205, 205));
If(KK) PLT_XH.setOption("开空逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("开空逻辑", "color", RGB(205, 205, 205));
If(PD) PLT_XH.setOption("平多逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("平多逻辑", "color", RGB(205, 205, 205));
If(PK) PLT_XH.setOption("平空逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("平空逻辑", "color", RGB(205, 205, 205));
If(DS) PLT_XH.setOption("多头止损", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("多头止损", "color", RGB(205, 205, 205));
If(KS) PLT_XH.setOption("空头止损", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("空头止损", "color", RGB(205, 205, 205));
If(DY) PLT_XH.setOption("多头止盈", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("多头止盈", "color", RGB(205, 205, 205));
If(KY) PLT_XH.setOption("空头止盈", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("空头止盈", "color", RGB(205, 205, 205));
} // 量化看盘 结束 ---------------------------------------------------------------------------------------------------------------
} // OnBar 结束 ===================================================================
// 成交更新事件函数,参数ordFill表示更新的成交结构体 ===========================================
OnFill(FillRef ordFill)
{
Alert(SymbolName + " " + MainSymbol + " 成交类型: " + ordFill.userNote + " 成交时间: " + Text(ordFill.fillDateTime)
+ " 委托价: " + Text(ordFill.price) + " 成交价: " + Text(ordFill.fillPrice) + " 委托量: " + Text(ordFill.volume)
+ " 成交量: " + Text(ordFill.fillVolume) + " 报单源: " + ordFill.createSource); // 输出到消息函数预警
} // 成交更新结束 ==================================================================
// 通用事件触发函数,参数evtName为事件名称,参数evtValue为事件内容 ===============================
OnEvent(StringRef evtName,MapRef<String,String> evtValue)
{
If(evtName == JZ) JZX = Mid(TextMap(evtValue), 7, 2); // 截取下拉框事件内容赋值给基准线全局变量JZX
If(evtName == DX) CLXZ = Mid(TextMap(evtValue), 7, 2); // 截取单选按钮事件内容赋值给策略选择全局变量CLXZ
} // 通用事件结束 ==================================================================
// ==============================================================================
// 编译版本 2025/10/27 1972
// 版权所有 FUDUOYU
// 版权声明 本策略由傅多鱼打造
// ==============================================================================你好,不是上来就报错,是运行中说不上什么时候,也说不上哪一条指标线或者图表输出的文字或图标在图表右上角输出报警信息:
出错:公式不支持同名指标...
下边是全部代码
// ==============================================================================
// 简称: DY202
// 名称: 多鱼量化 逻辑指示版
// 类别: 策略应用
// 类型: 用户应用
// 输出: Void
// ==============================================================================
// 参数 ===========================================================================
Params
Enum<Integer> SS([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 100]); // 委托数量
Enum<Integer> ZS([5, 10, 15, 20, 25, 30]); // 止损点数
Enum<Integer> ZY([5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 100, 150, 200, 250, 300]); // 止盈点数
Enum<Bool> KP([True, False]); // 量化看盘
// 变量 ==========================================================================
Vars
// 标志 变量 -------------------------------------------------
Global Integer BK(0); // 开仓标志 全局
Global Integer BP(0); // 平仓标志 全局
// 逻辑变量 指标信号判断 -----------------------------------
Bool PDKD; // 指标判断 开多逻辑
Bool PDKK; // 指标判断 开空逻辑
Bool PDPD; // 指标判断 平多逻辑
Bool PDPK; // 指标判断 平空逻辑
// 逻辑变量 开平仓 ------------------------------------------
Bool KD; // 开多逻辑
Bool KK; // 开空逻辑
Bool PD; // 平多逻辑
Bool PK; // 平空逻辑
Bool DS; // 多头止损逻辑
Bool KS; // 空头止损逻辑
Bool DY; // 多头止盈逻辑
Bool KY; // 空头止盈逻辑
// 实盘持仓 变量 --------------------------------------------
Position pos; // 实盘 持仓数据存储变量
Array<Fill> ACJ; // 实盘 成交信息存储数组
Global Integer ACS(0); // 实盘 当日交易次数
Global Integer ADC(0); // 实盘 多头持仓数量 全局
Global Integer AKC(0); // 实盘 空头持仓数量 全局
Global Numeric ZDY(0); // 实盘 最大盈亏点数 全局
Global Numeric ZDE(0); // 实盘 最大盈亏金额 全局
Global Numeric ADE(0); // 实盘 多头浮动盈亏金额
Global Numeric AKE(0); // 实盘 空头浮动盈亏金额
Numeric ADY(0); // 实盘 多头盈亏点数
Numeric AKY(0); // 实盘 空头盈亏点数
Numeric ADJ(0); // 实盘 多头持仓价格
Numeric AKJ(0); // 实盘 空头持仓价格
Numeric ADH(0); // 实盘 多单最大回撤百分比
Numeric AKH(0); // 实盘 空单最大回撤百分比
// 通道指标 变量 --------------------------------------------
Numeric ZQ; // 通道周期
Series<Numeric> HG; // 上轨 序列变量
Series<Numeric> LG; // 下轨 序列变量
Series<Numeric> DL; // 动力线 序列变量
Series<Numeric> KJJ; // K均价 序列变量
Series<Numeric> QS; // 趋势线 序列变量
Series<Numeric> JD; // 趋势线角度 序列变量
Series<Numeric> RKJ; // 日开价 序列变量
Series<Numeric> ZKJ; // 周开价 序列变量
Series<Numeric> YKJ; // 月开价 序列变量
Series<Numeric> HKJ; // 上涨空间 序列变量
Series<Numeric> LKJ; // 下跌空间 序列变量
Series<Numeric> H01; // 上一 序列变量
Series<Numeric> H02; // 上二 序列变量
Series<Numeric> H03; // 上三 序列变量
Series<Numeric> H04; // 上四 序列变量
Series<Numeric> H05; // 上五 序列变量
Series<Numeric> H06; // 上六 序列变量
Series<Numeric> H07; // 上七 序列变量
Series<Numeric> H08; // 上八 序列变量
Series<Numeric> H09; // 上九 序列变量
Series<Numeric> L01; // 下一 序列变量
Series<Numeric> L02; // 下二 序列变量
Series<Numeric> L03; // 下三 序列变量
Series<Numeric> L04; // 下四 序列变量
Series<Numeric> L05; // 下五 序列变量
Series<Numeric> L06; // 下六 序列变量
Series<Numeric> L07; // 下七 序列变量
Series<Numeric> L08; // 下八 序列变量
Series<Numeric> L09; // 下九 序列变量
// 画图变量 -------------------------------------------------
Plot PLT_ZT; // 主图信号
Plot PLT_XH; // 信号指示
// 菜单栏控件 变量 ------------------------------------------
Global String CD("菜单源"); // 订阅事件变量 标签等
Global String JZ("基准线"); // 订阅事件变量 下拉框
Global String DX("策略选择"); // 订阅事件变量 单选按钮
// 基准线价变量 ---------------------------------------------
Global String CLXZ("自动"); // 策略选择 全局
Global String JZX("周开"); // 基准线 全局
Series<Numeric> JZJ; // 基准价 序列变量
// 函数 ===========================================================================
Defs
// 开多函数 -------------------------------------------------------------------------------
Bool KDHS(Numeric JG, String ZS) // 参数: 开仓价格; 开仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_Buy(MainSymbol, SS, JG, orders, ZS, "", 0); // 开多头单
return ret;
} // 开多结束 ----------------------------------------------------------------------------
// 开空函数 -------------------------------------------------------------------------------
Bool KKHS(Numeric JG, String ZS) // 参数: 开仓价格; 开仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_SellShort(MainSymbol, SS, JG, orders, ZS, "", 0); // 开空头单
return ret;
} // 开空结束 -----------------------------------------------------------------------------
// 平多函数 -------------------------------------------------------------------------------
Bool PDHS(Integer SL, String ZS) // 参数: 平仓数量; 平仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_Sell(MainSymbol, SL, Q_BidPrice, orders, ZS, "", 0); // 平多头单
return ret;
} // 平多结束 -----------------------------------------------------------------------------
// 平空函数 -------------------------------------------------------------------------------
Bool PKHS(Integer SL, String ZS) // 参数: 平仓数量; 平仓注释
{
Array<Integer> orders; // 报单索引
Bool ret = A_BuyToCover(MainSymbol, SL, Q_AskPrice, orders, ZS, "", 0); // 平空头单
return ret;
} // 平空结束 ----------------------------------------------------------------------------
// 计算最大盈利点数函数 -----------------------------------------------------------------
Numeric ZDYL(Numeric CCYK) // 参数: 实盘实时持仓盈亏点数
{
// 如果实时持仓盈亏点数 > 最大盈利点数; 最大盈利点数 = 实时持仓盈亏点数
If (CCYK > ZDY) ZDY = CCYK;
Return ZDY;
} // 计算最大盈利点数函数 结束----------------------------------------------------------
// 计算最大盈利金额函数 -----------------------------------------------------------------
Numeric ZDYE(Numeric CCYE) // 参数: 实盘实时持仓盈亏金额
{
// 如果实时持仓盈亏金额 > 最大盈利金额; 最大盈利金额 = 实时持仓盈亏金额
If (CCYE > ZDE) ZDE = CCYE;
Return ZDE;
} // 计算最大盈利金额函数 结束----------------------------------------------------------
// 事件 ===========================================================================
Events
// 初始化事件函数,策略运行期间,首先运行且只有一次 ===========================================
OnInit()
{
// 交易设置 -------------------------------------------------------------------------
SetOrderPriceOffset(3); // 设置委托价为叫买/卖价偏移3跳
SetConsecEntries(1); // 设置同方向只能开1次仓
SetBackBarMaxCount(2000); // 设置序列变量最大回溯bar数
// 周开多空填充颜色 设置 -----------------------------------------------------------
PLT_ZT.setOption("周开多头", "color", RGB(72, 18, 18));
PLT_ZT.setOption("周开空头", "color", RGB(18, 72, 18));
// 周开价多空涨跌幅度(跳数)字体 设置 ---------------------------------------------
PLT_ZT.setOption("多盈", "font-size", 13); // 设置字体大小为13号
PLT_ZT.setOption("空盈", "font-size", 13); // 设置字体大小为13号
PLT_ZT.setOption("多盈", "color", RGB(240, 85, 200)); // 设置字体颜色
PLT_ZT.setOption("空盈", "color", RGB(85, 240, 150)); // 设置字体颜色
PLT_ZT.setOption("多盈", "vertical-alignment", 2); // 竖直下对齐
PLT_ZT.setOption("空盈", "vertical-alignment", 0); // 竖直上对齐
// 隐藏部分指标标题显示信息 -------------------------------------------------------
PLT_ZT.setOption("上二", "no-text", true);
PLT_ZT.setOption("下二", "no-text", true);
PLT_ZT.setOption("上八", "no-text", true);
PLT_ZT.setOption("下八", "no-text", true);
// 设置信号图标竖直对齐 -----------------------------------------------------------
PLT_ZT.setOption("周开开多", "vertical-alignment", 1); // 竖直中间对齐
PLT_ZT.setOption("周开开空", "vertical-alignment", 1);
PLT_ZT.setOption("日开开多", "vertical-alignment", 1);
PLT_ZT.setOption("日开开空", "vertical-alignment", 1);
PLT_ZT.setOption("上二开多", "vertical-alignment", 1);
PLT_ZT.setOption("上二开空", "vertical-alignment", 1);
PLT_ZT.setOption("上五开多", "vertical-alignment", 1);
PLT_ZT.setOption("上五开空", "vertical-alignment", 1);
PLT_ZT.setOption("上八开多", "vertical-alignment", 1);
PLT_ZT.setOption("上八开空", "vertical-alignment", 1);
PLT_ZT.setOption("下二开多", "vertical-alignment", 1);
PLT_ZT.setOption("下二开空", "vertical-alignment", 1);
PLT_ZT.setOption("下五开多", "vertical-alignment", 1);
PLT_ZT.setOption("下五开空", "vertical-alignment", 1);
PLT_ZT.setOption("下八开多", "vertical-alignment", 1);
PLT_ZT.setOption("下八开空", "vertical-alignment", 1);
// ----------------------------------------------------------
PLT_ZT.setOption("上一12", "vertical-alignment", 1);
PLT_ZT.setOption("上二12", "vertical-alignment", 1);
PLT_ZT.setOption("上三12", "vertical-alignment", 1);
PLT_ZT.setOption("上四12", "vertical-alignment", 1);
PLT_ZT.setOption("上五12", "vertical-alignment", 1);
PLT_ZT.setOption("上六12", "vertical-alignment", 1);
PLT_ZT.setOption("上七12", "vertical-alignment", 1);
PLT_ZT.setOption("上八12", "vertical-alignment", 1);
PLT_ZT.setOption("上九12", "vertical-alignment", 1);
PLT_ZT.setOption("下一12", "vertical-alignment", 1);
PLT_ZT.setOption("下二12", "vertical-alignment", 1);
PLT_ZT.setOption("下三12", "vertical-alignment", 1);
PLT_ZT.setOption("下四12", "vertical-alignment", 1);
PLT_ZT.setOption("下五12", "vertical-alignment", 1);
PLT_ZT.setOption("下六12", "vertical-alignment", 1);
PLT_ZT.setOption("下七12", "vertical-alignment", 1);
PLT_ZT.setOption("下八12", "vertical-alignment", 1);
PLT_ZT.setOption("下九12", "vertical-alignment", 1);
// 设置末K指标价格标注 -----------------------------------------------------------
PLT_ZT.setOption("ZKJ", "horizontal-alignment", 0); // 水平左对齐
PLT_ZT.setOption("RKJ", "horizontal-alignment", 0);
PLT_ZT.setOption("HG", "horizontal-alignment", 0);
PLT_ZT.setOption("LG", "horizontal-alignment", 0);
PLT_ZT.setOption("H02", "horizontal-alignment", 0);
PLT_ZT.setOption("H05", "horizontal-alignment", 0);
PLT_ZT.setOption("H08", "horizontal-alignment", 0);
PLT_ZT.setOption("L02", "horizontal-alignment", 0);
PLT_ZT.setOption("L05", "horizontal-alignment", 0);
PLT_ZT.setOption("L08", "horizontal-alignment", 0);
PLT_ZT.setOption("C", "horizontal-alignment", 1); // 水平中间对齐
PLT_ZT.setOption("JZJ", "horizontal-alignment", 0);
PLT_ZT.setOption("盈亏★", "horizontal-alignment", 0);
PLT_ZT.setOption("盈亏", "horizontal-alignment", 0);
PLT_ZT.setOption("ZKJ", "vertical-alignment", 1); // 竖直中间对齐
PLT_ZT.setOption("RKJ", "vertical-alignment", 1);
PLT_ZT.setOption("HG", "vertical-alignment", 1);
PLT_ZT.setOption("LG", "vertical-alignment", 1);
PLT_ZT.setOption("H02", "vertical-alignment", 1);
PLT_ZT.setOption("H05", "vertical-alignment", 1);
PLT_ZT.setOption("H08", "vertical-alignment", 1);
PLT_ZT.setOption("L02", "vertical-alignment", 1);
PLT_ZT.setOption("L05", "vertical-alignment", 1);
PLT_ZT.setOption("L08", "vertical-alignment", 1);
PLT_ZT.setOption("C", "vertical-alignment", 1);
PLT_ZT.setOption("JZJ", "vertical-alignment", 1);
PLT_ZT.setOption("盈亏★", "vertical-alignment", 1);
PLT_ZT.setOption("盈亏", "vertical-alignment", 1);
PLT_ZT.setOption("ZKJ", "color", RGB(255, 105, 0)); // 颜色
PLT_ZT.setOption("RKJ", "color", RGB(255, 255, 0));
PLT_ZT.setOption("HG", "color", White);
PLT_ZT.setOption("LG", "color", White);
PLT_ZT.setOption("H02", "color", RGB(0, 158, 255));
PLT_ZT.setOption("H05", "color", RGB(0, 185, 185));
PLT_ZT.setOption("H08", "color", RGB(0, 98, 255));
PLT_ZT.setOption("L02", "color", RGB(0, 158, 255));
PLT_ZT.setOption("L05", "color", RGB(205, 0, 185));
PLT_ZT.setOption("L08", "color", RGB(0, 98, 255));
PLT_ZT.setOption("C", "color", RGB(255, 255, 0));
PLT_ZT.setOption("JZJ", "color", RGB(0, 255, 255));
PLT_ZT.setOption("盈亏", "font-size", 28); // 设置盈亏字体大小为28号
// 菜单栏 ---------------------------------------------------------------------------
SubscribeEvent(JZ); // 订阅事件 基准线 下拉框
SubscribeEvent(DX); // 订阅事件 策略选择 单选按钮
// -----------------------------------------------------------------------------------
PLT_ZT.toolBar(CD, "日期", DateToString(CurrentDate), "date"); // 日期
PLT_ZT.toolBar(CD, "时间", TimeToString(CurrentTime), "time"); // 时间
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Array<String> radio = ["平仓", "自动"]; // 策略选择
PLT_ZT.toolBar(DX, "策略选择", radio, 1, "radio"); // 策略选择 单选按钮
Array<String> content = ["趋势线", "上九", "上八", "上七", "上六", "上五", "上四", "上三", "上二", "上一", "周开价", "下一", "下二", "下三", "下四", "下五", "下六", "下七", "下八", "下九", "日开价"]; // 基准线
PLT_ZT.toolBar(JZ, " 基准线", content, 10); // 基准线 下拉框
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PLT_ZT.toolBar(CD, "基准价名", " = 基准价:", "label");
PLT_ZT.toolBar(CD, "基准价值", Text(0), "label");
PLT_ZT.toolBar(CD, "合约名称名", " 合约:", "label");
PLT_ZT.toolBar(CD, "合约名称值", MainSymbol, "label");
PLT_ZT.toolBar(CD, "最新价名", " 最新价:", "label");
PLT_ZT.toolBar(CD, "最新价值", Text(Q_Last) + " ", "label");
PLT_ZT.toolBar(CD, "持仓数量名", " 持仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(0), "label");
PLT_ZT.toolBar(CD, "交易次数名", " 交易次数:", "label");
PLT_ZT.toolBar(CD, "交易次数值", Text(0), "label");
PLT_ZT.toolBar(CD, "交易商名称", " " + A_BrokerName, "label");
// 量化看盘 -------------------------------------------------------------------------
If(KP)
{
PLT_XH.figure();
PLT_XH.setLayout(0, 12); // 布局在第0行第12列
PLT_XH.setCrossCells(12, 1); // 跨12行1列
PLT_XH.setOption("开仓标志", "horizontal-alignment", 0);
PLT_XH.setOption("平仓标志", "horizontal-alignment", 0);
PLT_XH.setOption("判断开多", "horizontal-alignment", 0);
PLT_XH.setOption("判断开空", "horizontal-alignment", 0);
PLT_XH.setOption("判断平多", "horizontal-alignment", 0);
PLT_XH.setOption("判断平空", "horizontal-alignment", 0);
PLT_XH.setOption("开多逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("开空逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("平多逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("平空逻辑", "horizontal-alignment", 0);
PLT_XH.setOption("多头止损", "horizontal-alignment", 0);
PLT_XH.setOption("空头止损", "horizontal-alignment", 0);
PLT_XH.setOption("多头止盈", "horizontal-alignment", 0);
PLT_XH.setOption("空头止盈", "horizontal-alignment", 0);
}
} // 初始化事件函数 结束 =============================================================
// 在所有的数据源准备完成后调用,应用在数据源的设置等操作 =======================================
OnReady()
{
SetSlippage(Enum_Rate_PointPerHand, 3); // 设置滑点每手3跳
SetOrderMap2MainSymbol(); // 委托映射到主力
} // 数据源准备结束 =================================================================
// 在新bar的第一次执行之前调用一次,参数为新bar的图层数组 =======================================
OnBarOpen(ArrayRef<Integer> indexs)
{
BP = 0; // 平仓标志归0,每个Bar开盘时重置标志
BK = 0; // 开仓标志置0,每个Bar开盘时重置标志
} // BarOpen结束 ==================================================================
// Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 ========================================
OnBar(ArrayRef<Integer> indexs)
{
// 计算指标 -------------------------------------------------------------------------------------------------------------------
Range[0:DataCount - 1]
{
// 通道指标 计算-----------------------------------------------------------------------------------------------
ZQ = NthCon(Weekday <> REF(Weekday, 1), Weekday) + 1; // 周期,每周随着Bar推移的Bar数
ZKJ = Round(IIF(ZQ == 1, O, ZKJ), 0); // 周开价
RKJ = Round(IIF(TrueDate(0) <> TrueDate(1), O, RKJ), 0); // 日开价
HG = HighestFC(H, ZQ); // 上轨
LG = LowestFC(L, ZQ); // 下轨
DL = Round(DEMA(C, 3), 2); // 动力线 保留2位小数提高灵敏度,尽量避免DL[1]等于基准价情况
KJJ = Round((H + L+ C * 2) / 4, 0); // K均价
QS = DEMA(Round((H + L) / 2, 0), 20); // 趋势线
JD = Round(LinearRegAngle(QS, 2) * 180 / Pi, 0); // 趋势角度
HKJ = Round((HG - ZKJ) / minMove, 0); // 上涨空间 = 上轨 - 周开价
LKJ = Round((ZKJ - LG) / minMove, 0); // 下跌空间 = 周开价 - 下轨
// 网格线 计算-------------------------------------------------------------------------------------------------
H01 = Round(ZKJ + HKJ / 10 * 1 * minMove, 0); // 上一
H02 = Round(ZKJ + HKJ / 10 * 2 * minMove, 0); // 上二
H03 = Round(ZKJ + HKJ / 10 * 3 * minMove, 0); // 上三
H04 = Round(ZKJ + HKJ / 10 * 4 * minMove, 0); // 上四
H05 = Round((HG + ZKJ) / 2, 0); // 上五
H06 = Round(ZKJ + HKJ / 10 * 6 * minMove, 0); // 上六
H07 = Round(ZKJ + HKJ / 10 * 7 * minMove, 0); // 上七
H08 = Round(ZKJ + HKJ / 10 * 8 * minMove, 0); // 上八
H09 = Round(ZKJ + HKJ / 10 * 9 * minMove, 0); // 上九
L01 = Round(ZKJ - LKJ / 10 * 1 * minMove, 0); // 下一
L02 = Round(ZKJ - LKJ / 10 * 2 * minMove, 0); // 下二
L03 = Round(ZKJ - LKJ / 10 * 3 * minMove, 0); // 下三
L04 = Round(ZKJ - LKJ / 10 * 4 * minMove, 0); // 下四
L05 = Round((LG + ZKJ) / 2, 0); // 下五
L06 = Round(ZKJ - LKJ / 10 * 6 * minMove, 0); // 下六
L07 = Round(ZKJ - LKJ / 10 * 7 * minMove, 0); // 下七
L08 = Round(ZKJ - LKJ / 10 * 8 * minMove, 0); // 下八
L09 = Round(ZKJ - LKJ / 10 * 9 * minMove, 0); // 下九
// -----------------------------------------------------------------
If(JZX == "周开") JZJ = ZKJ; // 周开价
Else If(JZX == "日开") JZJ = RKJ; // 日开价
Else If(JZX == "上一") JZJ = H01; // 上一
Else If(JZX == "上二") JZJ = H02; // 上二
Else If(JZX == "上三") JZJ = H03; // 上三
Else If(JZX == "上四") JZJ = H04; // 上四
Else If(JZX == "上五") JZJ = H05; // 上五
Else If(JZX == "上六") JZJ = H06; // 上六
Else If(JZX == "上七") JZJ = H06; // 上七
Else If(JZX == "上八") JZJ = H06; // 上八
Else If(JZX == "上九") JZJ = H06; // 上九
Else If(JZX == "下一") JZJ = L01; // 下一
Else If(JZX == "下二") JZJ = L02; // 下二
Else If(JZX == "下三") JZJ = L03; // 下三
Else If(JZX == "下四") JZJ = L04; // 下四
Else If(JZX == "下五") JZJ = L05; // 下五
Else If(JZX == "下六") JZJ = L06; // 下六
Else If(JZX == "下七") JZJ = L07; // 下七
Else If(JZX == "下八") JZJ = L08; // 下八
Else If(JZX == "下九") JZJ = L09; // 下九
Else If(JZX == "趋势") JZJ = QS; // 趋势
If (True) // 指标画线 ------------------------------------------------------------------------------------------------------------------
{
PlotAuto("上轨", HG, HG, RGB(0, 128, 128), Enum_line, Enum_Broken); // 上轨画线
PlotAuto("上五", H05, H05, RGB(0, 185, 185), Enum_line, Enum_Solid); // 上五画线
PlotAuto("周开价", ZKJ, ZKJ, RGB(255, 85, 0), Enum_line, Enum_Broken, Enum_3Pix); // 周开价画线
PlotAuto("下五", L05, L05, RGB(205, 0, 205), Enum_line, Enum_Solid); // 下五画线
PlotAuto("下轨", LG, LG, RGB(128, 0, 128), Enum_line, Enum_Broken); // 下轨画线
If(JD > 0) PlotAuto("趋势线", QS, QS, RGB(255, 0, 127), Enum_line, Enum_Broken, Enum_2Pix); // 趋势上行画线 变色
If(JD < 0) PlotAuto("趋势线", QS, QS, RGB(85, 170, 0), Enum_line, Enum_Broken, Enum_2Pix); // 趋势下行画线 变色
If(JD == 0) PlotAuto("趋势线", QS, QS, RGB(0, 255, 255), Enum_line, Enum_Broken, Enum_2Pix); // 趋势下行画线 变色
PlotAuto("K均价", KJJ, KJJ, RGB(170, 225, 0), Enum_line, Enum_Solid); // K均价画线
PlotAuto("动力线", DL, DL, White, Enum_line, Enum_Solid); // 动力线画线
PlotAuto("日开价", RKJ, RKJ, RGB(255, 225, 0), Enum_Bar, Enum_Broken); // 日开价画线
If(HKJ >= 30 And H05[0] == H05[1]) PlotAuto("上八", H08, H08, RGB(0, 98, 255), Enum_Bar, Enum_Broken); // 上八画线
If(HKJ >= 30 And H05[0] == H05[1]) PlotAuto("上二", H02, H02, RGB(0, 158, 255), Enum_Bar, Enum_Broken); // 上二画线
If(LKJ >= 30 And L05[0] == L05[1]) PlotAuto("下二", L02, L02, RGB(0, 158, 255), Enum_Bar, Enum_Broken); // 下二画线
If(LKJ >= 30 And L05[0] == L05[1]) PlotAuto("下八", L08, L08, RGB(0, 98, 255), Enum_Bar, Enum_Broken); // 下八画线
// 周开多空颜色填充 -------------------------------------------------------------------------------------------------------------------
PLT_ZT.fillRgn("周开多头", DL >= ZKJ, L - 1, ZKJ + 1); // 周开多头颜色填充
PLT_ZT.fillRgn("周开空头", DL <= ZKJ, H + 1, ZKJ - 1); // 周开空头颜色填充
// 基于周开价多空涨跌幅度(跳数) ------------------------------------------------------------------------------------------------------
If((C - ZKJ) > 0) PLT_ZT.text("多盈", H, Text(Round((C - ZKJ) / minMove, 0))); // 多盈跳数
If((C - ZKJ) < 0) PLT_ZT.text("空盈", L, Text(Round((ZKJ - C) / minMove, 0))); // 空盈跳数
} // 指标画线 结束 -----------------------------------------------------------------------------------------------------------------------
If (True) // 画信号图标 开始--------------------------------------------------------------------------------------------------------------------------------------------------------------
{
If((ZKJ[0] == ZKJ[1] And DL[1] <= ZKJ[1] And DL[0] > ZKJ[0]) Or (ZKJ[0] <> ZKJ[1] And DL[0] > ZKJ[0])) PLT_ZT.icon("周开开多", ZKJ, "ICO3", Text(ZKJ) + " 周开开多");
If((ZKJ[0] == ZKJ[1] And DL[1] >= ZKJ[1] And DL[0] < ZKJ[0]) Or (ZKJ[0] <> ZKJ[1] And DL[0] < ZKJ[0])) PLT_ZT.icon("周开开空", ZKJ, "ICO1", Text(ZKJ) + " 周开开空");
If((RKJ[0] == RKJ[1] And DL[1] <= RKJ[1] And DL[0] > RKJ[0]) Or (RKJ[0] <> RKJ[1] And DL[0] > RKJ[0])) PLT_ZT.icon("日开开多", RKJ, "ICO10", Text(RKJ) + " 日开开多");
If((RKJ[0] == RKJ[1] And DL[1] >= RKJ[1] And DL[0] < RKJ[0]) Or (RKJ[0] <> RKJ[1] And DL[0] < RKJ[0])) PLT_ZT.icon("日开开空", RKJ, "ICO11", Text(RKJ) + " 日开开空");
If(HKJ >= 30 And DL[1] <= H02[1] And DL[0] > H02[0]) PLT_ZT.icon("上二开多", H02, "ICO10", Text(H02) + " 上二开多");
If(HKJ >= 30 And DL[1] >= H02[1] And DL[0] < H02[0]) PLT_ZT.icon("上二开空", H02, "ICO11", Text(H02) + " 上二开空");
If(HKJ >= 30 And DL[1] <= H05[1] And DL[0] > H05[0]) PLT_ZT.icon("上五开多", H05, "ICO10", Text(H05) + " 上五开多");
If(HKJ >= 30 And DL[1] >= H05[1] And DL[0] < H05[0]) PLT_ZT.icon("上五开空", H05, "ICO11", Text(H05) + " 上五开空");
If(HKJ >= 30 And DL[1] <= H08[1] And DL[0] > H08[0]) PLT_ZT.icon("上八开多", H08, "ICO10", Text(H08) + " 上八开多");
If(HKJ >= 30 And DL[1] >= H08[1] And DL[0] < H08[0]) PLT_ZT.icon("上八开空", H08, "ICO11", Text(H08) + " 上八开空");
If(LKJ >= 30 And DL[1] <= L02[1] And DL[0] > L02[0]) PLT_ZT.icon("下二开多", L02, "ICO10", Text(L02) + " 下二开多");
If(LKJ >= 30 And DL[1] >= L02[1] And DL[0] < L02[0]) PLT_ZT.icon("下二开空", L02, "ICO11", Text(L02) + " 下二开空");
If(LKJ >= 30 And DL[1] <= L05[1] And DL[0] > L05[0]) PLT_ZT.icon("下五开多", L05, "ICO10", Text(L05) + " 下五开多");
If(LKJ >= 30 And DL[1] >= L05[1] And DL[0] < L05[0]) PLT_ZT.icon("下五开空", L05, "ICO11", Text(L05) + " 下五开空");
If(LKJ >= 30 And DL[1] <= L08[1] And DL[0] > L08[0]) PLT_ZT.icon("下八开多", L08, "ICO10", Text(L08) + " 下八开多");
If(LKJ >= 30 And DL[1] >= L08[1] And DL[0] < L08[0]) PLT_ZT.icon("下八开空", L08, "ICO11", Text(L08) + " 下八开空");
// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上一12", H01, "ICO12", Text(H01) + " 上一" );
If(BarStatus == 2 And HKJ >= 10) PLT_ZT.icon("上二12", H02, "ICO12", Text(H02) + " 上二" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上三12", H03, "ICO12", Text(H03) + " 上三" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上四12", H04, "ICO12", Text(H04) + " 上四" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上五12", H05, "ICO12", Text(H05) + " 上五" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上六12", H06, "ICO12", Text(H06) + " 上六" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上七12", H07, "ICO12", Text(H07) + " 上七" );
If(BarStatus == 2 And HKJ >= 10) PLT_ZT.icon("上八12", H08, "ICO12", Text(H08) + " 上八" );
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.icon("上九12", H09, "ICO12", Text(H09) + " 上九" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下一12", L01, "ICO12", Text(L01) + " 下一" );
If(BarStatus == 2 And LKJ >= 10) PLT_ZT.icon("下二12", L02, "ICO12", Text(L02) + " 下二" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下三12", L03, "ICO12", Text(L03) + " 下三" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下四12", L04, "ICO12", Text(L04) + " 下四" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下五12", L05, "ICO12", Text(L05) + " 下五" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下六12", L06, "ICO12", Text(L06) + " 下六" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下七12", L07, "ICO12", Text(L07) + " 下七" );
If(BarStatus == 2 And LKJ >= 10) PLT_ZT.icon("下八12", L08, "ICO12", Text(L08) + " 下八" );
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.icon("下九12", L09, "ICO12", Text(L09) + " 下九" );
// 删除历史 ----------------------------------------------------------------------------------------------------------
Unplot("上一12", 1);
Unplot("上二12", 1);
Unplot("上三12", 1);
Unplot("上四12", 1);
Unplot("上五12", 1);
Unplot("上六12", 1);
Unplot("上七12", 1);
Unplot("上八12", 1);
Unplot("上九12", 1);
Unplot("下一12", 1);
Unplot("下二12", 1);
Unplot("下三12", 1);
Unplot("下四12", 1);
Unplot("下五12", 1);
Unplot("下六12", 1);
Unplot("下七12", 1);
Unplot("下八12", 1);
Unplot("下九12", 1);
} // 画信号图标 结束 ---------------------------------------------------------------------------------------------------
If(BarStatus == 2) // 末K指标价格标注 ---------------------------------------------------------------------------------
{
// 末K指标价格标注 ----------------------------------------------------------------------------------------------
PLT_ZT.text("ZKJ", ZKJ, " " + Text(Round(ZKJ, 0)) + " 周开价");
PLT_ZT.text("RKJ", RKJ, " " + Text(Round(RKJ, 0)) + " 日开价");
PLT_ZT.text("HG", HG, " " + Text(Round(HG, 0)) + " 上轨");
PLT_ZT.text("LG", LG, " " + Text(Round(LG, 0)) + " 下轨");
If(HKJ >= 10) PLT_ZT.text("H05", H05, " " + Text(Round(H05, 0)) + " 上五");
If(LKJ >= 10) PLT_ZT.text("L05", L05, " " + Text(Round(L05, 0)) + " 下五");
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.text("H02", H02, " " + Text(Round(H02, 0)) + " 上二");
If(BarStatus == 2 And HKJ >= 30) PLT_ZT.text("H08", H08, " " + Text(Round(H08, 0)) + " 上八");
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.text("L02", L02, " " + Text(Round(L02, 0)) + " 下二");
If(BarStatus == 2 And LKJ >= 30) PLT_ZT.text("L08", L08, " " + Text(Round(L08, 0)) + " 下八");
PLT_ZT.text("C", C, Text(Round(C, 0)));
PLT_ZT.text("JZJ", JZJ[0], " ★ " + Text(Round(JZJ[0], 0)) + " 基准价 " + JZX);
// 删除标注历史 -----------------------------------------------------------------------------------------------------------------------------------------------
Unplot("ZKJ", 1);
Unplot("RKJ", 1);
Unplot("HG", 1);
Unplot("LG", 1);
Unplot("H02", 1);
Unplot("H05", 1);
Unplot("H08", 1);
Unplot("L02", 1);
Unplot("L05", 1);
Unplot("L08", 1);
Unplot("C", 1);
Unplot("JZJ", 1);
Unplot("盈亏★", 1);
Unplot("盈亏", 1);
} //末K指标价格标注 结束------------------------------------------------------------------------------------------------
If (True) // 小窗输出 ------------------------------------------------------------------------------------------------------
{
Commentary(" ================ ");
Commentary(" 本周Bar数: " + Text(ZQ));
Commentary(" Bar幅度: " + Text(Round((C - O) / minMove, 0)));
Commentary(" 趋势角度: " + Text(JD));
Commentary(" 上涨空间: " + Text(HKJ));
Commentary(" 上涨间隔: " + Text(Round(HKJ / 10, 0)));
Commentary(" 下跌空间: " + Text(LKJ));
Commentary(" 下跌间隔: " + Text(Round(LKJ / 10, 0)));
Commentary(" ================ ");
Commentary(" 价格单位: " + Text(PriceScale));
Commentary(" 最小变动: " + Text(minMove * priceScale));
Commentary(" 每点价值: " + Text(BigPointValue));
Commentary(" 合约乘数: " + Text(contractUnit));
Commentary(" 盈亏波动: " + Text(minMove * priceScale * contractUnit));
Commentary(" 保证金比率: " + Text(marginRatio));
Commentary(" ================ ");
Commentary(" 周期类型: " + Frequency);
} // 小窗输出 结束--------------------------------------------------------------------------------------------------------
} // 计算指标 结束 -----------------------------------------------------------------------------------------------------------
// 指标信号判断逻辑 ---------------------------------------------------------------------------------------------------------
If (True)
{
If(CLXZ == "平仓") // 平仓离场 --------------------------------------------------------------------------------------
{
PDPD = True; // 判断 平多逻辑
PDPK = True; // 判断 平空逻辑
} // 平仓离场 结束---------------------------------------------------------------------------------------------------------
// 自动 周初开 日初开 KJJ ---------------------------------------------------------------------------------------------------
Else If(CLXZ == "自动" And ((JZX == "周开" And ZKJ[0] <> ZKJ[1]) Or (JZX == "日开" And RKJ[0] <> RKJ[1])))
{
PDKD = KJJ[0] > JZJ[0]; // 判断 开多逻辑
PDKK = KJJ[0] < JZJ[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 周初开 日初开 结束 -----------------------------------------------------------------------------------------------
Else If(CLXZ == "自动") // 自动 趋势线/网格线 交叉策略 -----------------------------------------------------------------
{
PDKD = DL[1] <= JZJ[1] And DL[0] > JZJ[0]; // 判断 开多逻辑
PDKK = DL[1] >= JZJ[1] And DL[0] < JZJ[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 结束 ---------------------------------------------------------------------------------------------------------------
Else If(CLXZ == "自动" And HKJ >= 10) // 上涨空间 >= 20 自动 网格 上中线 ------------------------------------------
{
PDKD = H05[0] == H05[1] And DL[1] <= H05[1] And DL[0] > H05[0]; // 判断 开多逻辑
PDKK = H05[0] == H05[1] And DL[1] >= H05[1] And DL[0] < H05[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 网格 上中线 结束--------------------------------------------------------------------------------------------------
Else If(CLXZ == "自动" And LKJ >= 10) // 下跌空间 >= 20 自动 网格 下中线 ------------------------------------------
{
PDKD = L05[0] == L05[1] And DL[1] <= L05[1] And DL[0] > L05[0]; // 判断 开多逻辑
PDKK = L05[0] == L05[1] And DL[1] >= L05[1] And DL[0] < L05[0]; // 判断 开空逻辑
PDPD = PDKK; // 判断 平多逻辑
PDPK = PDKD; // 判断 平空逻辑
} // 自动 网格 下中线 结束---------------------------------------------------------------------------------------------------
} // 指标信号判断结束-----------------------------------------------------------------------------------------------------------
// 实盘交易 当前Bar是最新Bar即实时行情 当前日期是交易日 当前时间是交易时间-------------------------------------------
If(BarStatus == 2 And IsTradingDay(Symbol, CurrentDate) And IsTradingTime(SystemDateTime)) // 实盘交易开始
{
// 实盘交易数据获取 ***********************************************************************************************
// 实盘持仓数据 ---------------------------------------------------------------------------------------------------------------------------------------------------
A_GetPosition(MainSymbol, pos, "", 0); // 获取指定合约持仓数据
ADC = pos.longCurrentVolume; // 多头当前持仓数量
AKC = pos.shortCurrentVolume; // 空头当前持仓数量
A_GetPreFills(MainSymbol, ACJ, TradingOpenDateTime(MainSymbol, SystemDateTime), 0, "", 0); // 当日历史成交
ACS = GetArraySize(ACJ); // 当日历史成交次数
PLT_ZT.toolBar(CD, "交易次数值", Text(Round(ACS / 2, 0)) + "", "label"); // 菜单栏实时刷新,当日历史累计开仓次数 = 当日历史成交次数 (开仓+平仓) / 2
// 实盘 持仓价格 ---------------------------------------------------------------------------------------------------------------------------------------------------
ADJ = Round(pos.longAvgPriceO, 0); // 多头持仓均价
AKJ = Round(pos.shortAvgPriceO, 0); // 空头持仓均价
// 实盘 盈亏金额 ---------------------------------
ADE = pos.longFloatProfitO; // 多头浮动盈亏
AKE = pos.shortFloatProfitO; // 空头浮动盈亏
// 实盘 盈亏点数 ---------------------------------------------------------------------------------------------------------------------------------------------------
ADY = Round(pos.longFloatProfitO / ContractUnit / minMove / SS, 0); // 实盘多头盈亏点数 = 买入持仓盈亏(成本价) / 乘数 / 每跳最小变动量 / 手数
AKY = Round(pos.shortFloatProfitO / ContractUnit / minMove / SS, 0); // 实盘空头盈亏点数 = 卖出持仓盈亏(成本价) / 乘数 / 每跳最小变动量 / 手数
// 实盘 最大回撤 ---------------------------------------------------------------------------------------------------------------------------------------------------
ADH = Round((ZDYL(ADY) - ADY) / ZDYL(ADY) * 100, 0); // 多头最大回撤百分比
AKH = Round((ZDYL(AKY) - AKY) / ZDYL(AKY) * 100, 0); // 空头最大回撤百分比
// 交易逻辑 *****************************************************************************************************
// 实盘 开仓逻辑 ------------------------------------------------------------------------------------------------------------
KD = ADC == 0 And AKC == 0 And BK == 0 And PDKD; // 实盘开多逻辑
KK = ADC == 0 And AKC == 0 And BK == 0 And PDKK; // 实盘开空逻辑
// 实盘 平仓逻辑 ------------------------------------------------------------------------------------------------------------
PD = ADC > 0 And BP == 0 And PDPD; // 实盘平多逻辑
PK = AKC > 0 And BP == 0 And PDPK; // 实盘平空逻辑
// 实盘 固定止损 逻辑 ------------------------------------------------------------------------------------------------------
DS = ADC > 0 And ADY <= -ZS; // 实盘多头止损逻辑 = 实盘多头盈亏点数<= - 止损点数
KS = AKC > 0 And AKY <= -ZS; // 实盘空头止损逻辑 = 实盘空头盈亏点数<= - 止损点数
// 实盘 固定止盈 逻辑 ------------------------------------------------------------------------------------------------------
DY = ADC > 0 And ADY >= ZY; // 实盘多头止盈逻辑 = 实盘多头盈亏点数 >= 止盈点数
KY = AKC > 0 And AKY >= ZY; // 实盘空头止盈逻辑 = 实盘空头盈亏点数 >= 止盈点数
// 实盘 交易指令 执行 ******************************************************************************************
// 平仓 ===================================================================
If(PD) // 平多仓 条件成立 -------------------------------------------------------------------------------------------------
{
PDHS(ADC, ("指标 平多 " + Text(ADE))); // 平多函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,准备下一次开仓
} // 平多结束 ---------------------------------------------------------------------------------------------------------------
If(PK) // 平空仓 条件成立 --------------------------------------------------------------------------------------------------
{
PKHS(AKC, ("指标 平空 " + Text(AKE))); // 平空函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,准备下一次开仓
} // 平空结束 ----------------------------------------------------------------------------------------------------------------
// 开仓 ====================================================================
If(KD) // 开多单 条件成立 --------------------------------------------------------------------------------------------------
{
KDHS(Q_AskPrice, ("指标 开多 " + Text(0))); // 开多函数
BK = 1; // 开仓标志置1,避免重复开仓
BP = 0; // 平仓标志BP置0,等待下一次平仓
} // 开多结束 ---------------------------------------------------------------------------------------------------------------
If(KK) // 开空单 条件成立 ---------------------------------------------------------------------------------------------------
{
KKHS(Q_BidPrice, ("指标 开空 " + Text(0))); // 开空函数
BK = 1; // 开仓标志置1,避免重复开仓
BP = 0; // 平仓标志BP置0,等待下一次平仓
} // 开空结束 ----------------------------------------------------------------------------------------------------------------
// 止损 ====================================================================
If(DS) // 多头止损 条件成立 ------------------------------------------------------------------------------------------------
{
PDHS(ADC, ("止损 平多 " + Text(ADE))); // 平多函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 多头止损结束 ----------------------------------------------------------------------------------------------------------
If(KS) // 空头止损 条件成立 ------------------------------------------------------------------------------------------------
{
PKHS(AKC, ("止损 平空 " + Text(AKE))); // 平空函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 空头止损结束 ----------------------------------------------------------------------------------------------------------
// 止盈 ====================================================================
If(DY) // 多头止盈 条件成立 ------------------------------------------------------------------------------------------------
{
PDHS(ADC, ("止盈 平多 " + Text(ADE))); // 平多函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 多头止盈结束 ----------------------------------------------------------------------------------------------------------
If(KY) // 空头止盈 条件成立 ------------------------------------------------------------------------------------------------
{
PKHS(AKC, ("止盈 平空 " + Text(AKE))); // 平空函数
BP = 1; // 平仓标志BP置1,避免重复平仓
BK = 0; // 开仓标志置0,等待下一次开仓
} // 空头止盈结束 -----------------------------------------------------------------------------------------------------------
} // 实盘交易 结束 -------------------------------------------------------------------------------------------------------------
// 菜单栏更新数据 -------------------------------------------------------------------------------------------------------------
If(True)
{
// ------------------------------------------------------------------------------------
PLT_ZT.toolBar(CD, "日期", DateToString(CurrentDate), "date");
PLT_ZT.toolBar(CD, "时间", TimeToString(CurrentTime), "time");
PLT_ZT.toolBar(CD, "基准价值", Text(JZJ[0]), "label"); // 工具栏显示验证
PLT_ZT.toolBar(CD, "最新价值", Text(Round(Q_Last, 0)), "label");
If(ADC > 0) // 实盘 持多仓 -----------------------------------------------------------
{
PLT_ZT.toolBar(CD, "持仓数量名", " 多仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(pos.longCurrentVolume), "label");
// ------------------------------------------------------------------------------------
Commentary(" 最大多盈: " + Text(ZDYL(ADY))); // 小窗输出
Commentary(" 实盘多盈: " + Text(ADY)); // 小窗输出
Commentary(" 最大回撤: " + Text(ADH)); // 小窗输出
} // 实盘 持多仓 结束-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If(AKC > 0) // 实盘 持空仓 ------------------------------------------------------------
{
PLT_ZT.toolBar(CD, "持仓数量名", " 空仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(pos.shortCurrentVolume), "label");
// -------------------------------------------------------------------------------------
Commentary(" 最大空盈: " + Text(ZDYL(AKY))); // 小窗输出
Commentary(" 实盘空盈: " + Text(AKY)); // 小窗输出
Commentary(" 最大回撤: " + Text(AKH)); // 小窗输出
} // 实盘 持空仓 结束-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If(ADC == 0 And AKC == 0) // 实盘 持仓为0 ----------------------------------------
{
PLT_ZT.toolBar(CD, "持仓数量名", " 持仓数量:", "label");
PLT_ZT.toolBar(CD, "持仓数量值", Text(0), "label");
} // 实盘 持仓为0 结束-------------------------------------------------------------------------------------------------------------------------------------------
} // 菜单栏更新数据结束 ----------------------------------------------------------------------------------------------------
// 量化看盘 --------------------------------------------------------------------------------------------------------------------
If(KP)
{
PLT_XH.text("00", 0, 0, "");
PLT_XH.text("10", 0, 100, "");
PLT_XH.text("开仓标志", 0, 96.5, "开仓 标志");
PLT_XH.text("平仓标志", 0, 89.5, "平仓 标志");
PLT_XH.text("判断开多", 0, 82.5, "判断 开多");
PLT_XH.text("判断开空", 0, 75.5, "判断 开空");
PLT_XH.text("判断平多", 0, 68.5, "判断 平多");
PLT_XH.text("判断平空", 0, 61.5, "判断 平空");
PLT_XH.text("开多逻辑", 0, 54.5, "开多 逻辑");
PLT_XH.text("开空逻辑", 0, 47.5, "开空 逻辑");
PLT_XH.text("平多逻辑", 0, 40.5, "平多 逻辑");
PLT_XH.text("平空逻辑", 0, 33.5, "平空 逻辑");
PLT_XH.text("多头止损", 0, 26.5, "多头 止损");
PLT_XH.text("空头止损", 0, 19.5, "空头 止损");
PLT_XH.text("多头止盈", 0, 12.5, "多头 止盈");
PLT_XH.text("空头止盈", 0, 05.5, "空头 止盈");
// --------------------------------------------------------------------------
If(BK == 1) PLT_XH.setOption("开仓标志", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("开仓标志", "color", RGB(205, 205, 205));
If(BP == 1) PLT_XH.setOption("平仓标志", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("平仓标志", "color", RGB(205, 205, 205));
If(PDKD) PLT_XH.setOption("判断开多", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断开多", "color", RGB(205, 205, 205));
If(PDKK) PLT_XH.setOption("判断开空", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断开空", "color", RGB(205, 205, 205));
If(PDPD) PLT_XH.setOption("判断平多", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断平多", "color", RGB(205, 205, 205));
If(PDPK) PLT_XH.setOption("判断平空", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("判断平空", "color", RGB(205, 205, 205));
If(KD) PLT_XH.setOption("开多逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("开多逻辑", "color", RGB(205, 205, 205));
If(KK) PLT_XH.setOption("开空逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("开空逻辑", "color", RGB(205, 205, 205));
If(PD) PLT_XH.setOption("平多逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("平多逻辑", "color", RGB(205, 205, 205));
If(PK) PLT_XH.setOption("平空逻辑", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("平空逻辑", "color", RGB(205, 205, 205));
If(DS) PLT_XH.setOption("多头止损", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("多头止损", "color", RGB(205, 205, 205));
If(KS) PLT_XH.setOption("空头止损", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("空头止损", "color", RGB(205, 205, 205));
If(DY) PLT_XH.setOption("多头止盈", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("多头止盈", "color", RGB(205, 205, 205));
If(KY) PLT_XH.setOption("空头止盈", "color", RGB(255, 0, 127));
Else PLT_XH.setOption("空头止盈", "color", RGB(205, 205, 205));
} // 量化看盘 结束 ---------------------------------------------------------------------------------------------------------------
} // OnBar 结束 ===================================================================
// 成交更新事件函数,参数ordFill表示更新的成交结构体 ===========================================
OnFill(FillRef ordFill)
{
Alert(SymbolName + " " + MainSymbol + " 成交类型: " + ordFill.userNote + " 成交时间: " + Text(ordFill.fillDateTime)
+ " 委托价: " + Text(ordFill.price) + " 成交价: " + Text(ordFill.fillPrice) + " 委托量: " + Text(ordFill.volume)
+ " 成交量: " + Text(ordFill.fillVolume) + " 报单源: " + ordFill.createSource); // 输出到消息函数预警
} // 成交更新结束 ==================================================================
// 通用事件触发函数,参数evtName为事件名称,参数evtValue为事件内容 ===============================
OnEvent(StringRef evtName,MapRef<String,String> evtValue)
{
If(evtName == JZ) JZX = Mid(TextMap(evtValue), 7, 2); // 截取下拉框事件内容赋值给基准线全局变量JZX
If(evtName == DX) CLXZ = Mid(TextMap(evtValue), 7, 2); // 截取单选按钮事件内容赋值给策略选择全局变量CLXZ
} // 通用事件结束 ==================================================================
// ==============================================================================
// 编译版本 2025/10/27 1972
// 版权所有 FUDUOYU
// 版权声明 本策略由傅多鱼打造
// ==============================================================================哥 我加载你的代码 没有显示错误哎
难怪你之前不发全部 真的好长哇
不是上来就报错
上来就报错我就排查原因了
是运行一段时间不知道什么时候
也不一定那一个plt画的图标或者输出的文字报错
导致我查不到原因…
方便的话加个微信
FUDUOYU9200
plot画的话 是不是应该用plot.clear擦除

😀我试试