
장점
- 가장 강력한 기능인 iBarShift를 사용하여 피크를 검색하는 데 필요한 모든 사이클을 완전히 교체합니다.
- 각 바마다 ZZ를 구축하는 데 필요한 모든 정보가 외부 코드에서도 접근 가능합니다.
- 중단된 피크가 없습니다.
- 피크를 찾는 효율적인 방법이 제공됩니다.
- 매우 빠릅니다.
- 히스토리 삽입 및 TF 전환 시에도 정확하게 작동합니다.
- EA에 사용하기에 완벽합니다.
단점
1. 메모리 요구 사항이 있습니다. 이 지표는 다른 유사한 구현에서 2개(또는 1개) 대신 5개의 버퍼를 사용합니다. 하지만 (제 생각에는) 장점 #6과 #7에 대한 좋은 가격입니다. 제가 본 빠른 지그재그들은 히스토리 삽입을 전체 재구성 없이 처리할 수 없습니다. 제 것은 효율적으로 처리합니다.
2. 추가적인 라인이 필요합니다. 이는 외부 코드에서 데이터를 가시화하기 위해 필요하지만, 이 라인은 절대 보이지 않아야 합니다.
원리:
ZZ는 채널링 원칙에 의해 그려집니다.
채널 너비는 포인트(XLab_ZZ) 또는 퍼센트(XLab_ZZP)로 정의할 수 있습니다.
피크 검색
extern int ChannelWidth = 100; #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_width1 3 datetime LastTime; int init() { LastTime = 0; return(0); } bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime) { if (dir < 0) { datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar); int i = iBarShift(Symbol(), 0, t); if (i == prevBar) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1); i = iBarShift(Symbol(), 0, t); } double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i); if (v == EMPTY_VALUE) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1); i = iBarShift(Symbol(), 0, t); v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i); } peak = v; peakBar = i; peakTime = t; } else if (dir > 0) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar); i = iBarShift(Symbol(), 0, t); if (i == prevBar) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1); i = iBarShift(Symbol(), 0, t); } v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i); if (v == EMPTY_VALUE) { t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1); i = iBarShift(Symbol(), 0, t); v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i); } peak = v; peakBar = i; peakTime = t; } else { return (false); } return (true); } int start() { if (LastTime == Time[0]) return (0); LastTime = Time[0]; double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1); double rdir = -dir; if (dir == EMPTY_VALUE) return (0); double v1, v2, v3, v4, v5; int i1, i2, i3, i4, i5; datetime t1, t2, t3, t4, t5; GetValue(dir, 1, 0, v1, i1, t1); GetValue(rdir, i1, 0, v2, i2, t2); GetValue(dir, i2, i1, v3, i3, t3); GetValue(rdir, i3, i2, v4, i4, t4); GetValue(dir, i4, i3, v5, i5, t5); SetPt("1", v1, t1); SetPt("2", v2, t2); SetPt("3", v3, t3); SetPt("4", v4, t4); SetPt("5", v5, t5); Print(v1, " ", v2, " ", v3, " ", v4, " ", v5, " ", i1, " ", i2, " ", i3, " ", i4, " ", i5); return(0); } void SetPt(string name, double price, datetime time) { ObjectCreate(name, OBJ_ARROW, 0, time, price); ObjectSet(name, OBJPROP_ARROWCODE, 108); ObjectSet(name, OBJPROP_PRICE1, price); ObjectSet(name, OBJPROP_TIME1, time); }
이 예시는 (바당 한 번) 현재 형성되는 첫 다섯 개의 피크를 표시하는 지표입니다.
주의! 이 코드는 0번째 바 모드가 활성화되면 잘못 작동할 수 있습니다.
0번째 바 모드:
DrawZeroBar 변수로 설정됩니다. 기본적으로 비활성화되어 있습니다.
이 옵션은 사용하지 않는 것이 좋습니다. 특히 EA에서 이 지표를 사용할 경우.
즐겁게 사용하세요! 궁금한 점이 있으면 언제든지 질문해 주세요.
버그가 발견되면 꼭 알려주세요. 감사합니다.