MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1754

 
상황은 다음과 같습니다. 히스토리에 있는 막대의 인덱스는 변수 X에 저장되며, 새로운 막대가 나타나면 시프트가 발생하므로 X가 이미 다른 막대를 가리키는 것으로 알려져 있습니다. 그것을 고치는 방법? 아이디어는 다음과 같습니다. 각각의 새 막대에 대해 카운터(count++)를 늘리고 X에 추가합니다. 따라서 X는 오프셋에 관계없이 항상 동일한 막대를 가리킵니다. 그런데 문제가 있는데, EA를 초기화할 때 첫 번째 현재 막대를 고려하지 않을 필요가 있는데, 초기 count 값이 -1이면 해결하기 쉬울 것이라고 생각합니다. 즉, 증가 후 현재 막대에서 count는 "0"과 같을 것이고 이미 다음 새 막대에서(초기화 후 1 bar로 첫 번째 이동이 발생한 경우) "1"과 같을 것입니다. 어떻게 생각하나요? 어쩌면 나는 전혀 그렇게 생각하지 않습니까?
 
Nerd Trader # :
상황은 다음과 같습니다. 히스토리에 있는 막대의 인덱스는 변수 X에 저장되며, 새로운 막대가 나타나면 시프트가 발생하므로 X가 이미 다른 막대를 가리키는 것으로 알려져 있습니다. 그것을 고치는 방법? 아이디어는 다음과 같습니다. 각각의 새 막대에 대해 카운터(count++)를 늘리고 X에 추가합니다. 따라서 X는 오프셋에 관계없이 항상 동일한 막대를 가리킵니다. 그런데 문제가 있는데, EA를 초기화할 때 첫 번째 현재 막대를 고려하지 않을 필요가 있는데, 초기 count 값이 -1이면 해결하기 쉬울 것이라고 생각합니다. 즉, 증가 후 현재 막대에서 count는 "0"과 같을 것이고 이미 다음 새 막대에서(초기화 후 1 bar로 첫 번째 이동이 발생한 경우) "1"과 같을 것입니다. 어떻게 생각하나요? 어쩌면 나는 전혀 그렇게 생각하지 않습니까?

이것이 지표라면 충분합니다.

 bool    ArraySetAsSeries (
   const void &  array[],     // массив по ссылке
   bool          flag         // true означает обратный порядок индексации
   );

사용된 모든 배열 및 표시기 버퍼에 적용됩니다.

그런 다음 0 막대는 Rates_total-1이 됩니다.

ArraySetAsSeries - Операции с массивами - Справочник MQL4
ArraySetAsSeries - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArraySetAsSeries - Операции с массивами - Справочник MQL4
 
Nerd Trader # :
상황은 다음과 같습니다. 히스토리에 있는 막대의 인덱스는 변수 X에 저장되며, 새로운 막대가 나타나면 시프트가 발생하므로 X가 이미 다른 막대를 가리키는 것으로 알려져 있습니다. 그것을 고치는 방법? 아이디어는 다음과 같습니다. 각각의 새 막대에 대해 카운터(count++)를 늘리고 X에 추가합니다. 따라서 X는 오프셋에 관계없이 항상 동일한 막대를 가리킵니다. 그런데 문제가 있는데, EA를 초기화할 때 첫 번째 현재 막대를 고려하지 않을 필요가 있는데, 초기 count 값이 -1이면 해결하기 쉬울 것이라고 생각합니다. 즉, 증가 후 현재 막대에서 count는 "0"과 같을 것이고 이미 다음 새 막대에서(초기화 후 1 bar로 첫 번째 이동이 발생한 경우) "1"과 같을 것입니다. 어떻게 생각하나요? 어쩌면 나는 전혀 그렇게 생각하지 않습니까?
       datetime x=время нужного бара;
       int index= iBarShift ( _Symbol , 0 ,x);
 
MakarFX # :
왜 그런 동결?
 
Alexey Viktorov # :
왜 그런 동결?
나에게 더 쉽다)
 
MakarFX # :
나에게 더 쉽다)

그러나 프로세서는 더 무겁습니다 ...

 
Alexey Viktorov # :

그러나 프로세서는 더 무겁습니다 ...

어떤 기능이 어떤 부하를 전달하는지 모르겠습니다. 어딘가에서 그것에 대해 읽을 수 있습니까?
 
Nerd Trader # :
상황은 다음과 같습니다. 히스토리에 있는 막대의 인덱스는 변수 X에 저장되며, 새로운 막대가 나타나면 시프트가 발생하므로 X가 이미 다른 막대를 가리키는 것으로 알려져 있습니다. 그것을 고치는 방법? 아이디어는 다음과 같습니다. 각각의 새 막대에 대해 카운터(count++)를 늘리고 X에 추가합니다. 따라서 X는 오프셋에 관계없이 항상 동일한 막대를 가리킵니다. 그런데 문제가 있는데, EA를 초기화할 때 첫 번째 현재 막대를 고려하지 않을 필요가 있는데, 초기 count 값이 -1이면 해결하기 쉬울 것이라고 생각합니다. 즉, 증가 후 현재 막대에서 count는 "0"과 같을 것이고 이미 다음 새 막대에서(초기화 후 1 bar로 첫 번째 이동이 발생한 경우) "1"과 같을 것입니다. 어떻게 생각하나요? 어쩌면 나는 전혀 그렇게 생각하지 않습니까?

거기 아니야. 어드바이저/인디케이터를 로드할 때 터미널 내부에 있는 경우 입력이나 외부 또는 터미널 외부 전역 변수가 아닌 한 X에는 아무 것도 없으므로 먼저 무언가를 작성해야 합니다. 그런 다음 총 막대 수의 변화를 계산하는 것은 어리석은 일입니다(새 막대의 모양을 고려하여). 이와 같이

날짜 시간 BarTime;

FlagNewBar= false ;
if (BarTime!= iTime ( NULL , 0 , 0 ))
{
 BarTime= iTime ( NULL , 0 , 0 );
 FlagNewBar= true ;
}
if (FlagNewBar== true )
{
// И когда тру, делаем что нужно делать когда появился новый бар, 
//на следующем тике флаг нового бара будет ложь, так как БарТайм время все время существования нулевого бара будет равным
}
 

인사말. 말해 주세요. 초기화 또는 틱 중에 MT5에서 테스트를 정의하는 방법은 무엇입니까?

지금까지 OnDeinit() 함수를 호출하기 직전에 호출되는 OnTester() 만 찾았습니다.

 
@Alexey Viktorov @MakarFX 흥미롭고 매우 적합한 솔루션입니다. 고맙습니다.

@Valeriy Yastremskiy X 인덱스도 OnInit()에 배치됩니다. 내 코드는 다음과 같습니다.
last_time = iTime ( NULL , 0 , 0 );

   if (last_time > bar.time_open){
    bar.time_open = last_time;
    coint++;//стартовое значение -1
  }
나에 관해서는 FlagNewBar의 조건이 중복됩니다.