2넨 : "옵션"에 대한 추가 정보. 이제 극한값을 전환하기 위한 조건 중 하나는 낮은 전류가 낮은 전류보다 ExtDeviation 포인트보다 더 높다는 것입니다(높은 경우와 유사). 필요한 경우 코드를 통해 다른 옵션을 쉽게 구현할 수 있습니다. 글쎄요, klot 다음으로, 저는 ZigZag에 대한 저의 현재 관심이 전적으로 귀하의 개발에 대한 관심에서 비롯된 것이라고 덧붙이고 싶습니다.
다른 지그재그의 특징에 대한 질문. 이 지그재그의 주요 징후는 모든 것이 한 번에 완료되고, 이력 데이터는 극한값이 고정된 경우에만, 이 극값 이후의 데이터에 대해서만 다시 검토된다는 것입니다. 즉, 꽤 빨라야 합니다. 드로잉 기능은 물론 극한 고정 기준에 따라 다르지만 여기서는 다양한 옵션을 쉽게 구현할 수 있습니다. 예를 들어, 이전 이동의 백분율로 전환하고, 높음이 낮음에서 멀리 이동하고(각각 높음에서 낮음), 스위치를 평균 막대 크기에 연결하는 옵션을 이미 만들었습니다.
23:58:23에 히스토리가 아직 펌핑되지 않았으며 23:58:25까지 1개의 마지막 막대가 펌핑되었음을 알 수 있습니다. 그리고 2006.10.31 23:58:26까지만 모든 중간 막대가 다운로드되었습니다. 개발자에게 질문: 이것이 표준 스왑 순서입니까? 그렇다면 요점은 무엇입니까? 현재 시세를 조기에 확보하는 것이 바람직함은 자명하다. 그러나 일정 기간 동안 역사에 구멍이 계획적으로 존재한다는 것은 본질적으로 이 시간에 대한 지표의 보장 실패를 의미합니다. 히스토리가 완전히 로드될 때까지 사용자 가 지표 계산을 연기하는 것이 더 안전하지 않습니까? 아니면 적어도 전체 교체 후에 다시 초기화합니까?
Klot , 흥미로운 옵션입니다.
지그재그 변형이 흥미로운 결과를 나타내면 개발에 사용할 수 있습니까?
물론 할 수 있습니다. 저는 관심을 가지고 개발을 따르고 귀하의 작업을 정말 좋아합니다.
"옵션"에 대한 추가 정보. 이제 극한값을 전환하기 위한 조건 중 하나는 낮은 전류가 낮은 전류보다 ExtDeviation 포인트보다 더 높다는 것입니다(높은 경우와 유사). 필요한 경우 코드를 통해 다른 옵션을 쉽게 구현할 수 있습니다.
글쎄요, klot 다음으로, 저는 ZigZag에 대한 저의 현재 관심이 전적으로 귀하의 개발에 대한 관심에서 비롯된 것이라고 덧붙이고 싶습니다.
그 안에 당신의 지그재그를 외부 지그재그로 포함시켰습니다. 안정적인 작동 버전이 나오면 바로 변경하겠습니다.
//+------------------------------------------------------------------+ //| CZigZag.mq4 | //| Copyright © 2006, Candid | //| likh@yandex.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Candid" #property link "likh@yandex.ru" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Navy //---- indicator parameters extern int ExtDepth=12; extern int ExtDeviation=5; //extern int ExtBackstep=3; int shift; double res=0; int i; double CurMax,CurMin; int CurMaxPos,CurMinPos; int CurMaxBar,CurMinBar; double hPoint; double mhPoint; double EDev; int MaxDist,MinDist; bool FirstRun; bool AfterMax,AfterMin; int BarTime; //---- indicator buffers double ZigZag[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_SECTION); //---- indicator buffers mapping SetIndexBuffer(0,ZigZag); SetIndexEmptyValue(0,0.0); //---- indicator short name IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+")"); FirstRun = true; //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int fBar; if (FirstRun) { hPoint = 0.5*Point; mhPoint = -hPoint; EDev = (ExtDeviation+0.5)*Point; AfterMax = true; AfterMin = true; fBar = Bars-1; CurMax = High[fBar]; CurMaxBar = 1; CurMin = Low[fBar]; CurMinBar = 1; MaxDist = 0; MinDist = 0; BarTime = 0; FirstRun = false; } //---- fBar = Bars-counted_bars-1; if (fBar > Bars-2) fBar = Bars-2; for(shift=fBar; shift>=0; shift--) { if (BarTime!=Time[shift]) { BarTime=Time[shift]; if (res > hPoint ) { MaxDist = Bars-CurMaxBar-shift+1; MinDist = Bars-CurMinBar-shift+1; if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) { if (AfterMax) { AfterMax = false; AfterMin = true; CurMaxBar = CurMinBar+1; CurMaxPos = Bars-CurMaxBar; CurMax = High[CurMaxPos]; for (i=CurMaxPos-1;i>=shift;i--) { if (High[i] > CurMax+hPoint) { CurMaxBar = Bars-i; CurMax = High[i]; } } // for (i=CurMaxPos-1;i>=shift;i--) ZigZag[Bars-CurMaxBar] = CurMax; } else { // if (AfterMax) AfterMin = false; AfterMax = true; CurMinBar = CurMaxBar+1; CurMinPos = Bars-CurMinBar; CurMin = Low[CurMinPos]; for (i=CurMinPos-1;i>=shift;i--) { if (Low[i] < CurMin-hPoint) { CurMinBar = Bars-i; CurMin = Low[i]; } } // for (i=CurMinPos-1;i>=shift;i--) ZigZag[Bars-CurMinBar] = CurMin; } // else if (AfterMax) } // if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) } // if (res > hPoint ) } // if (BarTime!=Time[0]) if (AfterMax) { res = Low[shift]-CurMin; if (res < mhPoint) { ZigZag[Bars-CurMinBar] = 0; CurMin = Low[shift]; CurMinBar = Bars-shift; ZigZag[Bars-CurMinBar] = CurMin; } // if (res < mhPoint) } // if (AfterMax) if (AfterMin) { res = CurMax-High[shift]; if (res < mhPoint) { ZigZag[Bars-CurMaxBar] = 0; CurMax = High[shift]; CurMaxBar = Bars-shift; ZigZag[Bars-CurMaxBar] = CurMax; } // if (res < mhPoint) } // if (AfterMin) } // for(shift=fBar; shift>=0; shift--) //---- return(0); } //+------------------------------------------------------------------+다른 지그재그의 특징에 대한 질문. 이 지그재그의 주요 징후는 모든 것이 한 번에 완료되고, 이력 데이터는 극한값이 고정된 경우에만, 이 극값 이후의 데이터에 대해서만 다시 검토된다는 것입니다. 즉, 꽤 빨라야 합니다. 드로잉 기능은 물론 극한 고정 기준에 따라 다르지만 여기서는 다양한 옵션을 쉽게 구현할 수 있습니다. 예를 들어, 이전 이동의 백분율로 전환하고, 높음이 낮음에서 멀리 이동하고(각각 높음에서 낮음), 스위치를 평균 막대 크기에 연결하는 옵션을 이미 만들었습니다.
발생한 의심을 명확히 하기 위해 다음 Print를 코드에 삽입했습니다.
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift] =",높음[시프트],",낮음[시프트]=",낮음[시프트]);그 후 터미널이 닫히고 몇 분 후에 다시 시작되었습니다. 다음은 로그 스니펫입니다.
23:58:23에 히스토리가 아직 펌핑되지 않았으며 23:58:25까지 1개의 마지막 막대가 펌핑되었음을 알 수 있습니다. 그리고 2006.10.31 23:58:26까지만 모든 중간 막대가 다운로드되었습니다.
개발자에게 질문: 이것이 표준 스왑 순서입니까? 그렇다면 요점은 무엇입니까? 현재 시세를 조기에 확보하는 것이 바람직함은 자명하다. 그러나 일정 기간 동안 역사에 구멍이 계획적으로 존재한다는 것은 본질적으로 이 시간에 대한 지표의 보장 실패를 의미합니다. 히스토리가 완전히 로드될 때까지 사용자 가 지표 계산을 연기하는 것이 더 안전하지 않습니까? 아니면 적어도 전체 교체 후에 다시 초기화합니까?