지표 질문 - 페이지 4

 
SDC :

아니면 이와 같은 것입니까?

하지만 실제로 IndicatorCounted()를 사용해야 합니다. 이렇게 하면 표시기가 모든 개체를 한 번만 그리고 새 막대가 형성될 때 새 개체를 추가하는 대신 새 틱마다 모든 개체를 다시 그리기 때문입니다.

외부 bool에 대한 이 게시물과 다른 게시물은 저에게 다른 아이디어도 제공합니다. 감사합니다.

내 초점은 더 광범위해야 하지만 나는 멍청하기 때문에 코드의 한 부분에 집중하고 외부와 같은 다른 부분은 무시하는 경향이 있습니다.
나는 이제야 어레이에 들어가고 버퍼를 이해하는 데 큰 어려움을 겪었지만 최근에는 그것을 넘어서기 시작했습니다.

덕분에 이제 많은 새로운 아이디어도 얻을 수 있습니다.
 
SDC :


차트의 모든 막대에 코드를 적용하는 지표를 생성할 때 수행 중인 작업을 고려해야 합니다. 즉, 각 과거 막대에 대한 macd 지표 값을 가져와야 합니다.

원래 코드에서 다음을 수행했습니다.

마지막 매개변수 1은 차트의 Bar 1에 있던 macd의 값입니다. 현재 막대 이전의 막대는 bar 0으로 인덱싱됩니다.

분명히 당신은 전체 히스토리 차트에 대해 조건부 연산자에서 macd의 단일 값을 사용하고 싶지 않습니다.

macd를 각 막대와 동일한 막대 색인으로 색인화해야 하므로 예를 들어 막대 500에서 이것이 필요합니다.

지표가 알고리즘을 적용하는 막대 번호와 일치하도록 마지막 매개변수를 변경해야 합니다.

이것이 루프 내부에 필요한 이유입니다. 따라서 마지막 매개변수에 루프 주기 반복기를 사용할 수 있으므로 기록 차트의 각 막대에 대한 macd 값을 얻을 수 있습니다.

나는 그것이 상황을 조금 정리하는 데 도움이되기를 바랍니다.

맞아요.

그러나 if(val1 > 0 && fast > slow)와 같은 코드를 추가할 때 루프 외부에서 더 빠르고 느리게 선언할 때 작동하지 않습니다.

AHHHHH 시프트가 (i)이므로 루프 내부에서 필요합니다. OOOOPPPS LOL
 
Agent86 :
왜 for(int i = Bars-1 ? <----------------------- 막대는 배열처럼 인덱싱되며 첫 번째 막대는 1이 아닌 0입니다. 따라서 마지막 Bar는 Bars-1입니다.

그리고 이것이 for(int i = Bars ?? <----- 위 참조)보다 나은 이유는 무엇입니까?

조언 부탁드립니다 감사합니다


또한:

나는 이것이 지표/사용자 지정 지표뿐만 아니라 모든 사람에게 해당된다고 가정합니다. <--- 나와 WHRoeder : 논의된 내용은 매우 일반적인 문제입니다. 구체적인 것은 없습니다. 우리는 변수 선언과 할당 등에 대해 서로 이야기하고 있었습니다. wrt 루프.

 
diostar :

또한:


for(int i=Bars; i>=0; i--)는 내가 사용한 코드입니다.

for(int i=Bars-1; i>=0: i--) 제안

Bars = 현재 차트 의 막대 수 라고 생각했습니다. 적어도 사전에 따르면.

그래서 --i 나는 1002와 같은 가장 높은 막대 번호에서 카운트 다운하고 --i 실제로 -1까지 세고 있다고 생각했습니다.
왜냐하면 i>=0이므로 거짓이 되기 전에 실제로 -1까지 카운트다운해야 합니다. 0 이상이면 참이고 -1에 도달할 때까지 마지막으로 한 번 반복합니다.

적어도 그것이 효과가 있다고 생각한 방식입니까? 내가 잘못 ?

i=0이고 ++i이고 계산하면 마지막 막대까지 끝까지 계산할 것이라고 생각했습니다.

그러나 이 경우 Bars-1은 실제로 모든 닫기 Bar가 아니지만 실제로 아직 닫히지 않은 Bar[0]을 포함합니까?

Bars-1과 Bars의 차이점을 이해하고 있는지 잘 모르겠습니다. 단순히 Bars를 참조할 때 계산되지 않는 현재 Bar 0과 관련이 있습니까?

조언 부탁드립니다 감사합니다


 

예, 막대 0이 있기 때문에 막대는 막대 0을 포함하여 차트의 막대 수를 제공합니다.

따라서 작은 차트를 고려하십시오. 차트에는 막대[0]와 막대[1]의 막대가 2개뿐입니다.

Bars는 카운트를 제공하므로 Bars == 2

차트의 마지막 막대에서 시작하도록 지표를 적용하려는 경우

i=Bars를 시도할 수 있습니다.

우리가 알고 있듯이 Bars = 2이지만 bar[2]로 인덱싱된 막대가 없습니다. 마지막 막대는 Bar[1]입니다.

그래서 당신은 할 필요가 i=Bars-1

 
Agent86 :
for(int i=Bars; i>=0; i--)는 <--- 예를 들어 내가 사용한 코드입니다. 닫기[i], 닫기[막대]에서 닫기[0]까지 계산됩니다. i=Bars일 때 close[i]가 존재합니까?

for(int i=Bars-1; i>=0: i--) <--- 예를 들어 제안됩니다. 닫기[i], 닫기[바-1]에서 닫기[0]까지 계산됩니다. i=Bars -1 일 때 close[i]가 존재합니까?

Bars = 현재 차트의 막대 수라고 생각했습니다. 적어도 사전에 따르면. <---알았어

그래서 --i 나는 1002와 같은 가장 높은 막대 번호에서 카운트 다운하고 실제로 -1까지 세고 있다고 생각했습니다 . 닫기[1002], 닫기[-1]이 존재합니까?
왜냐하면 i>=0이므로 거짓이 되기 전에 실제로 -1까지 카운트다운해야 합니다. 0 이상이면 true이고 close[-1]에서 -1 <----에 도달할 때까지 마지막으로 한 번 반복하면 0을 반환합니다. 거짓이 아닙니다.

적어도 그것이 효과가 있다고 생각한 방식입니까? 내가 잘못 ? <--- 아래 참조 참조.

i=0이고 ++i이고 계산하면 마지막 막대까지 끝까지 계산할 것이라고 생각했습니다. <--- 순순히 그렇게 할 것입니다.

그러나 이 경우 Bars-1은 실제로 모든 닫기 Bar가 아니지만 실제로 아직 닫히지 않은 Bar[0]을 포함합니까? <---이 경우 종가는 현재 입찰 틱 가격을 반환합니다.

Bars-1과 Bars의 차이점을 이해하고 있는지 잘 모르겠습니다. 단순히 Bars를 참조할 때 계산되지 않는 현재 Bar 0과 관련이 있습니까? <--- 아래 참조 참조

조언 부탁드립니다 감사합니다 환영 합니다





이중 닫기[]
현재 차트의 각 막대에 대한 종가를 포함하는 계열 배열입니다.

시리즈 배열 요소는 역순으로, 즉 마지막 요소에서 첫 번째 요소로 인덱싱됩니다. 배열의 마지막인 현재 막대는 0으로 인덱싱됩니다. 차트에서 첫 번째인 가장 오래된 막대는 Bars -1로 인덱싱됩니다.
 
어떤 이유에서인지 버퍼가 이 주제를 약간 다르게 처리한다고 생각했습니다. 기술적으로 배열의 요소 수를 선언하지도 않았기 때문에 버퍼가 이미 이 문제를 해결했다고 생각했기 때문입니다.

어쨌든 나는 이것을 이해하고 의미가 있습니다. 감사합니다.

 
Agent86 :
나는 기술적으로 배열의 요소 수를 선언하지도 않았기 때문에 버퍼가 이 주제를 조금 다르게 처리했다고 생각하고 있었습니다. 그래서 버퍼가 이미 이 문제를 해결했다고 생각합니다.

어쨌든 나는 이것을 이해하고 의미가 있습니다. 감사합니다.



뭐??? 나는 당신이 실제로이 모든 것을 표시기 버퍼에 대해 언급하고 있다는 것을 몰랐습니다. 이제 다음에서 가져온 참조를 읽으십시오. https://www.mql5.com/en/articles/1500

(1) 표시기 버퍼 및 사용자 배열 - 둘 다 동일하고 다릅니다. & 사용자가 표시기 버퍼의 크기를 조정하지 않는 이유는 이미 해결된 것과 관련이 없습니다. 아래 참조 참조:

 double ExtMapBuffer1 [] ;

이것은 일반적인 배열입니다. 그러나 차원을 나타내지 않고 초기화를 수행하지 않습니다. 이 배열은 나중에 데이터 버퍼로 설정됩니다.

(2) 출력 및 입력의 표시기 버퍼(위의 데이터 버퍼)는 같아 보이지만 다를 수 있습니다.

 SetIndexBuffer ( 0 , ExtMapBuffer1 ) ;

이 함수는 배열을 버퍼 번호"바인드" 합니다. 즉, 표시된 번호의 버퍼가 데이터를 저장하기 위해 표시된 배열을 사용할 것임을 나타냅니다. 따라서 이 배열의 요소를 변경하면 버퍼 값이 변경됩니다. 실제로 배열은 데이터 버퍼입니다. 첫 번째 인수 는 바인딩되어야 하는 배열의 이름 입니다.


모든 것이 작동합니다. 이제 코드가 수행하는 작업을 살펴보겠습니다.

 for ( int i = 0 ; i < Bars ; i ++ )

데이터 버퍼의 모든 요소를 살펴 보기 위해 주기 사용합니다. 특정 막대가 버퍼의 각 요소에 해당 하므로 0 막대 (마지막 사용 가능)에서 시작하여 첫 번째 사용 가능한 막대로 끝나는 주기를 사용합니다. 영).

 {
   ExtMapBuffer1 [ i ] = MathRand () % 1001 ;
}

각 반복에서 카운터가 1씩 증가하고, 동시에 사용 가능한 마지막 막대 에서 첫 번째 막대로 이동하여 각 버퍼 요소(특정 막대에 해당) 에 0에서 1000 사이의 임의의 숫자를 할당합니다. 특정 버퍼 요소가 특정 막대에 어떻게 대응하는지 이해하기 어려운 경우 다음과 같은 방식으로 주기를 변경하고 터미널에서 결과를 확인하십시오.

 for ( int i = 0 ; i < Bars ; i ++ )
{
   ExtMapBuffer1 [ i ] = i ;
}
 
diostar :

이중 닫기[]
현재 차트의 각 막대에 대한 종가를 포함하는 계열 배열입니다.

시리즈 배열 요소는 역순으로, 즉 마지막 요소에서 첫 번째 요소로 인덱싱됩니다. 배열의 마지막인 현재 막대는 0으로 인덱싱됩니다. 차트에서 첫 번째인 가장 오래된 막대는 Bars -1로 인덱싱됩니다.

그렇군요 이제야 알겠네요 감사합니다
 
모두 감사합니다

지표에 대해 더 많이 알게 되면서 내가 사용하고 있는 디자인이 EA에서 사용하기에는 그다지 유용하지 않을 것이지만 시각적 및/또는 수동 사용에만 적합할 것 같습니다.

카운터가 1을 카운트다운하기 때문에-- 아마도 내가 특정 shift[i]만 참조하는 경우가 아니라면 이 방법을 사용하여 거래에 사용할 배열 개체를 참조하는 것은 좋지 않을 것입니다. 특정 막대에만 있는 거래 신호에 사용하려는 배열 요소 만 구체적으로 참조하는 방법.

그대로 사용하면 지표와 마찬가지로 전체 차트에서 거래가 발생할 수 있습니다.

그래서 이제 나는 그 값/시간/막대 등을 참조하기 위해 표시기에서 다양한 배열 요소를 참조하는 방법을 배울 것입니다.

도움을 주신 모든 분들께 감사드리며, iCustom 표시기를 만들고 EA에서 유용하게 만드는 방법에 대해 많은 생각을 하게 될 것입니다.