보조지표 게시글

MetaTrader 4에서 활용 가능한 이상적인 지그재그 지표

첨부파일
10671.zip (2.71 KB, 다운로드 0회)



장점

  • 가장 강력한 기능인 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에서 이 지표를 사용할 경우.


즐겁게 사용하세요! 궁금한 점이 있으면 언제든지 질문해 주세요.

버그가 발견되면 꼭 알려주세요. 감사합니다.

연관 포스트

댓글 (0)