通过识别连续多根K线的“向上/向下”趋势状态,捕捉趋势转折点,并在转折时动态连接区间内的价格极值点,形成用于判断多空转换的绿色(波峰→波谷)和红色(波谷→波峰)趋势连线。

完整源码:
UP:=C>O OR (C<=O AND C>REF(C,1)) ;
DN:=C<O OR (C>=O AND C<REF(C,1));
// 向下信号-3K
TD0:=IF(REF(DN,1) AND REF(C,1)<REF(C,2) ,C<REF(C,1),1);
D1:=DN AND REF(DN,2) AND C<REF(C,2) AND O<REF(O,2) AND MAX(REF(C,1),REF(O,1))<REF(O,2) AND TD0;
D2:=DN AND C<REF(C,1) AND REF(D1,1);
// 向下信号-4K
TD1:=IF(REF(DN,2) AND REF(C,2)<REF(C,3), C<REF(C,2), 1) AND IF(REF(C,1)<REF(O,1), C<REF(C,1), 1);
D3:=DN AND REF(DN,3) AND C<REF(C,3) AND O<REF(O,3) AND MAX1(MAX(REF(C,1),REF(O,1)), MAX(REF(C,2),REF(O,2)))<REF(O,3) AND TD1;
D4:=DN AND C<REF(C,1) AND REF(D3,1);
// 向上信号-3K
TU0:=IF(REF(UP,1) AND REF(C,1)>REF(C,2) ,C>REF(C,1),1);
U1:=UP AND REF(UP,2) AND C>REF(C,2) AND O>REF(O,2) AND MIN(REF(C,1),REF(O,1))>REF(O,2) AND TU0;
U2:=UP AND C>REF(C,1) AND REF(U1,1);
// 向上信号-4K
TU1:=IF(REF(C,1)>REF(O,1), C>REF(C,1), 1) AND IF(REF(UP,2) AND REF(C,2)>REF(C,3), C>REF(C,2), 1);
U3:=UP AND REF(UP,3) AND C>REF(C,3) AND O>REF(O,3) AND MIN1(MIN(REF(C,1),REF(O,1)), MIN(REF(C,2),REF(O,2)))>REF(O,3) AND TU1;
U4:=UP AND C>REF(C,1) AND REF(U3,1);
// 汇总原始信号
DNSIGNAL:=D1 OR D2 OR D3 OR D4;
UPSIGNAL:=U1 OR U2 OR U3 OR U4;
// 转折信号(仅方向改变时)
PREVUPBARS:=BARSLAST(REF(UPSIGNAL,1));
PREVDNBARS:=BARSLAST(REF(DNSIGNAL,1));
TURNUP:=UPSIGNAL AND PREVDNBARS < PREVUPBARS; // 向下→向上
TURNDN:=DNSIGNAL AND PREVUPBARS < PREVDNBARS; // 向上→向下
// ———- 极值计算与锁定 ———-
ENT_HIGH:=MAX(C,O);
ENT_LOW:=MIN(C,O);
BUP:=BARSLAST(TURNUP); // 距上一次买信号
BDN:=BARSLAST(TURNDN); // 距上一次卖信号
// 计算区间极值(不含当前K线)
HIGHEST_VAL:=IF(TURNDN, REF(HHV(ENT_HIGH, BUP+1), 1), 0);
LOWEST_VAL :=IF(TURNUP, REF(LLV(ENT_LOW, BDN+1), 1), 0);
// 用VALUEWHEN锁定极值,直到下一次同向转折更新
HIGH_POINT:=VALUEWHEN(TURNDN, HIGHEST_VAL),NODRAW;
LOW_POINT :=VALUEWHEN(TURNUP, LOWEST_VAL),NODRAW;
REHIGH_POINT:=REF(HIGH_POINT,SUMBARS(TURNDN,1));
RELOW_POINT:=REF(LOW_POINT,SUMBARS(TURNUP,1));
// 绿线:波峰(HIGH_POINT) → 波谷(LOW_POINT)
// 红线:波谷(LOW_POINT) → 波峰(HIGH_POINT)
DRAWLINE1(TURNDN, HIGH_POINT, TURNUP, LOW_POINT, 0), LINETHICK2, COLORGREEN;
DRAWLINE1(TURNUP, LOW_POINT, TURNDN, HIGH_POINT, 0), LINETHICK2, COLORRED;
