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; // 标记当前分钟,防止重复报警
}
}
}
分享给需要的朋友