거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Twitter에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
조회수:
30
평가:
(61)
게시됨:
idealzz.mq5 (7.33 KB) 조회
idealzzp.mq5 (7.33 KB) 조회
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

가장 간단한 원리의 초고속 지그재그.

매달린 정점이 없습니다. 시간 최적화된 정점 찾기 지원.

완벽한 지그재그

장점:

  1. 계산에서 가장 무거운 기능인 정점 검색을 위한 불필요한 루프를 완전히 대체하는 iBarShift가 ArrayBSearch로 대체되어 표시기가 MQL4 아날로그보다 훨씬 더 효율적으로 작동합니다;
  2. 각 막대에 필요한 모든 정보는 기록의 어느 순간에나 사용할 수 있을 뿐만 아니라 전문가 어드바이저도 기록의 어느 순간에나 사용할 수 있습니다;
  3. 매달린 상단이 없습니다;
  4. 지표 값을 검색하지 않고도 효율적으로 고점을 검색할 수 있습니다;
  5. 매우 빠른 작업;
  6. 히스토리 삽입 및 기간 전환의 올바른 처리;
  7. 전문가 어드바이저에서 작업하는 데 필수 불가결.

단점:

  1. 메모리 비용. 지그재그를 올바르게 그리려면 2 개의 버퍼가 필요하며 (1 개로는 충분하지 않으며 끊김이 발생 함) 여기서는 5 개의 버퍼가 사용됩니다. 6의 장점으로 완전히 보상됩니다 (임호). 정의상 빠른 지그재그는 두 개의 버퍼에서 기록 삽입을 올바르게 처리할 수 없습니다.
  2. 추가 선 그리기. 전문가 어드바이저가 볼 수 있도록 해야 합니다. 어떤 상황에서도 보이지 않아야 하는 크기의 값입니다.

원칙:

설정에 설정된 것보다 큰 풀백에서 새 무릎이 만들어지기 시작합니다. 포인트(IdealZZZ) 또는 퍼센트(IdealZZZP) 단위로 설정할 수 있습니다.

정점 찍기:

input int ChannelWidth=100;

#property indicator_chart_window

datetime LastTime;
int ZZHandle;
//+------------------------------------------------------------------+
//| 사용자 지정 표시기 초기화 기능 |
//+------------------------------------------------------------------+
void OnInit()
  {
   LastTime = 0;
   ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth);
  }
//+------------------------------------------------------------------+
//| GetValue|
//+------------------------------------------------------------------+
bool GetValue(double dir,int bar,int prevBar,double &peak,
             int &peakBar,datetime &peakTime,const datetime &T[])
  {
   if(dir<0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else if(dir>0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else
     {
      return(false);
     }

   return(true);
  }
//+------------------------------------------------------------------+
//| GetValue|
//+------------------------------------------------------------------+
void SetPt(string name,double price,datetime time)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,time,price);
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108);
   ObjectSetDouble(0,name,OBJPROP_PRICE,price);
   ObjectSetInteger(0,name,OBJPROP_TIME,time);
  }
//+------------------------------------------------------------------+
//| 사용자 지정 표시기 반복 함수 |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &T[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(LastTime==T[0]) return(rates_total);
   LastTime=T[0];

   ArraySetAsSeries(T,true);

   double dir_[1];
   if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total;
   double dir=dir_[0];
   double rdir=-dir;

   if(dir==EMPTY_VALUE) return(rates_total);

   double v1,v2,v3,v4,v5;
   int    i1,i2,i3,i4,i5;
   datetime t1,t2,t3,t4,t5;

   if(
      GetValue(dir,1,0,v1,i1,t1,T) && 
      GetValue(rdir,i1,0,v2,i2,t2,T) && 
      GetValue(dir,i2,i1,v3,i3,t3,T) && 
      GetValue(rdir,i3,i2,v4,i4,t4,T) && 
      GetValue(dir,i4,i3,v5,i5,t5,T)
      )
     {
      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);
     }
   else
     {
      Print("Seems to be error available...");
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

이 예는 모든 막대(막대당 한 번)가 마지막 5개의 정점(현재 형성되지 않은 정점 포함)을 표시하는 표시기입니다.

경고. 제로 바 모드가 활성화된 경우 코드가 올바르게 작동하지 않을 수 있습니다.

제로 바 모드:

코드에서 DrawZeroBar 변수에 의해 켜집니다. 기본적으로 꺼져 있습니다. 켜지 않는 것이 좋습니다. 전문가 어드바이저에서 표시기를 사용하는 경우 사용하지 않는 것이 좋습니다.

사용하세요 :) . 단점이 발견되면 알려주세요.

MetaQuotes Ltd에서 러시아어로 번역함.
원본 코드: https://www.mql5.com/ru/code/925

Corrected Average (CA) Corrected Average (CA)

A.Uhl에 의한 보정 평균 표시기("최적 이동 평균"이라고도 함).

차트_기간_변경자 차트_기간_변경자

기본 시간대 전환을 위한 간단한 스크립트입니다. 주요 목적은 단축키를 통한 전환의 편의성입니다.

일중 3배 성능 일중 3배 성능

세 개의 십자가를 설정하고 지정된 시간(설정 가능)부터 시작하여 일일 백분율 성과를 모니터링합니다.

CDatetimeMsc CDatetimeMsc

CDateTime 밀리초 확장 + 날짜 시간 감독 변수 확장