价格预警事件

Vars Global String zcbj("支撑报警");// 支撑预警事件名 Global String ylbj("压力报警");// 压力预警事件名 Global Bool zckg(False);// 支撑报警开关(默认关闭) Global Bool ylkg(False);// 压力报警开关(默认关闭) Global Numeric zcjg(-1);// 支撑预警价格(默认-1,未设置) Global Numeric yljg(-1);// 压力预警价格(默认-1,未设置) Global Integer fz(-1);// 分钟标记(防同一分钟重复触发报警) Plot plt; // ************************ 初始化:订阅预警事件 ************************ Events OnInit() { // 订阅支撑、压力预警事件,让程序响应工具栏操作 SubscribeEvent(zcbj); SubscribeEvent(ylbj); } // ************************ 事件处理:开关切换+价格赋值 ************************ OnEvent(StringRef evtName, MapRef<String, String> evtValue) { // 支撑报警:切换开关+获取输入价格+推送状态提示 if(evtName == zcbj) { zckg = !zckg; zcjg = Value(evtValue["支撑价"]); PushStatusMsg(IIFString(zckg, "支撑价" + evtValue["支撑价"] + "报警开", "")); } // 压力报警:切换开关+获取输入价格+推送状态提示 if(evtName == ylbj) { ylkg = !ylkg; yljg = Value(evtValue["压力价"]); PushStatusMsg(IIFString(ylkg, "压力价" + evtValue["压力价"] + "报警开", "")); } } // ************************ 核心逻辑:工具栏创建+价格触及报警触发 ************************ OnBar(ArrayRef<Integer> indexs) { // 每日首个Bar创建支撑/压力价输入工具栏(默认值为当前收盘价,支持数字输入) if(BarsSinceToday() == 0) { plt.toolBar(zcbj, "支撑价", text(C), "numinput"); plt.toolBar(ylbj, "压力价", text(C), "numinput"); } // 预警触发辅助变量 integer sjsj = Hour * 60 + Minute; // 当前时间转分钟数(时*60+分) Bool ylcf = CrossOver(C,yljg) Or CrossOver(yljg,C); // 现价是否触及压力价 Bool zccf = CrossOver(C,zcjg) Or CrossOver(zcjg,C); // 现价是否触及支撑价 // 报警触发条件:实时Bar + 当前分钟未触发过报警(防重复) if( BarStatus == 2 And sjsj != fz) { // 支撑价预警:开关开启 + 现价触及支撑价 if(zckg == True And zccf) { Alert(SymbolName+"支撑价格" + Text(zcjg) + "=现价" + Text(C) + IIFString(C > C[5], "涨速", "跌速") + Text((Max(C , C[5]) - Min(C, C[5])) / Min(C, C[5]) * 100, 2) + "%" ); fz = sjsj; // 标记当前分钟,防止重复报警 } // 压力价预警:开关开启 + 现价触及压力价 if(ylkg == True And ylcf) { Alert(SymbolName+"压力价格" + Text(yljg) + "=现价" + Text(C) + IIFString(C > C[5], "涨速", "跌速") + Text((Max(C , C[5]) - Min(C, C[5])) / Min(C, C[5]) * 100, 2) + "%" ); fz = sjsj; // 标记当前分钟,防止重复报警 } } } 分享给需要的朋友