그리고 "두 소나무에서 길을 잃는 것"은 거의 불가능합니다(이 코드에서는 한 줄도 줄일 수 없습니다 :( )
start_time에서 이전에 로드된 틱을 고려해야 합니다. 그렇지 않으면 틱이 중복됩니다.
다음은 예입니다. 이 함수는 틱 기록 처리 클래스에서 가져온 마지막 틱을 반환하지만 코드에서 모든 것이 명확해질 것이라고 생각합니다.
int CTickHistory::LastTicks( MqlTick &_ticks[])
{
if (m_lasttick<= 0 ) return (- 1 ); //нет загруженной историиint n= CopyTicks (m_symbol,tk, COPY_TICKS_TRADE ,m_lasttick,TICKHISTORY_MAX_TICKS);
if (n>m_lastcount)
{
n= ArrayResize (_ticks,n-m_lastcount); //размер массива под новые тики
ArrayCopy(_ticks,tk,0,m_lastcount,n); //копирование только новых тиков//определим количество всех тиков, приходящихся на последний момент времени,//необходимое для отсечки загруженных тиков при следующем вызовеif (m_lasttick!=_ticks[n- 1 ].time_msc)
{
m_lasttick=_ticks[n- 1 ].time_msc;
m_lastcount= 1 ;
for ( int i=n- 2 ; i>= 0 ; i--)
{
if (_ticks[i].time_msc<m_lasttick) break ;
m_lastcount++;
}
} else m_lastcount+=n;
} else n= 0 ; //нет новых тиковreturn (n);
}
int copied= CopyTicks ( _Symbol ,tick_array,type, 0 ,ticks);
하나의 표시기(왼쪽 차트)는 OnCalculate() 함수에서 CopyTicks()를 요청하고 두 번째 표시기(오른쪽 차트)는 OnBookEvent() 함수에서 CopyTicks()를 요청합니다.
그리고 여기 사진이 있습니다:
눈금은 다음과 같이 표시됩니다. 인덱스가 "0"인 요소는 차트의 맨 아래에 있고 인덱스 "0"이 있는 요소의 눈금 시간이 가장 오래된 것입니다. 인덱스가 "29"인 요소는 가장 어린 틱 시간을 갖습니다. 우리가 가진 것: 적어도 이 그림에서 한 번에 두 가지 불일치를 발견했습니다. 아래는 첫 번째 예입니다.
나는 그것이 깊지 않다고 생각하지만 그들이 깊이에서 "움켜잡고" 있는 것을 봅니다.
왜 생각해?
표시기를 실행하고 직접 확인하십시오!
그리고 당신은 쓰여진 것을 읽습니까?
나는 그것을 읽었지만 이제 경매가 닫히고 시작될 것입니다. 틱이 다운로드되는 방향을 다시 확인합니다 (내 스크립트에서).
스크립트 에서 확인하지 않고 모스크바 시간 오후 8-9시에 RTS-9.16 시간에 표시기 를 실행해야 합니다(볼 수 있음)
그리고 틱 이 항상 깊이 복사되는 것은 아니지만 새 블록의 첫 번째 틱이 이전 블록의 시간과 함께 있는 경우에만 복사됩니다.
새로운 틱(블록)을 예상 할 수 있는 방법이 필요하고, 사실 이후에 복사하지 않는 것이 필요합니다.
스크립트를 실행하면 기록 에서 복사가 있기 때문에 모든 것이 잘 될 것입니다.
새 블록을 " 기다리지 " 않습니다.
스크립트에서 확인하지 않고 모스크바 시간 오후 8-9시에 RTS-9.16 시간에 표시기를 실행해야 합니다.
그리고 틱 이 항상 깊이 복사되는 것은 아니지만 새 블록의 첫 번째 틱이 이전 블록의 시간과 함께 있는 경우에만 복사됩니다.
새로운 틱(블록)을 예상 해야 하며 사실 이후에 복사하지 않아야 합니다.
표시기가 있으며 마지막 20-30 틱을 표시합니다. 나는 그것에 수표를 붙일 수 있다고 생각합니다. 비정상적인 시간에 틱 기록에서 히트에 대해 수신된 모든 틱을 확인합니다.
이것이 오래된 진드기라는 것이 알려져 있지 않기 때문에 수표를 "나사"할 수 없습니다 (나에게는 효과가 없었습니다).
어떤 기준으로 확인합니까? 이것은 표시기와 테이프가 나란히 배치된 경우에만 "눈"으로 볼 수 있습니다.
하지만 기다리는 데 시간이 오래 걸릴 것입니다 (그가 말했듯이 하나의 기호의 깊이에 복사됩니다)
결함은 두 가지 조건에서만 나타납니다.
1. 새로운 틱(차단)을 "기대"합니다.
2. 새 블록의 첫 번째 틱에 이전 블록의 이전 틱 시간이 있는 경우에만 깊이 "Tacked"됩니다.
이것이 오래된 진드기인지 알려지지 않았기 때문에 수표를 "고정"할 수 없습니다 (나에게는 효과가 없었습니다).
어떤 기준으로 확인합니까? 이것은 표시기와 테이프가 나란히 배치된 경우에만 "눈"으로 볼 수 있습니다.
하지만 기다리는 데 시간이 오래 걸릴 것입니다 (그가 말했듯이 하나의 기호의 깊이에 복사됩니다)
결함은 두 가지 조건에서만 나타납니다.
1. 새로운 틱(차단)을 "기대"합니다.
2. 새 블록의 첫 번째 틱에 이전 블록의 이전 틱 시간이 있는 경우에만 깊이 "Tacked"됩니다.
초과분을 차단하십시오 - 표시기의 계산 및 렌더링. 틱 배열을 가져오고 확인하는 것만 남겨주세요. 오류를 찾으려면(누구에게 상관없이) 가능한 한 코드를 단순화해야 합니다.
내 코드에 오류가 있으면 항상 표시됩니다.
따라서 표시기가 올바르게 작동합니다 (표의 데이터로 여러 번 확인했습니다)
이것은 중간 액체 기기에서 표시기를 실행하면 명확하게 알 수 있습니다.
그리고 "두 소나무에서 길을 잃는 것"은 거의 불가능합니다(이 코드에서는 한 줄도 줄일 수 없습니다 :( )
내 코드에 오류가 있으면 항상 표시됩니다.
따라서 표시기가 올바르게 작동합니다 (표의 데이터로 여러 번 확인했습니다)
이것은 중간 액체 기기에서 표시기를 실행하면 명확하게 알 수 있습니다.
그리고 "두 소나무에서 길을 잃는 것"은 거의 불가능합니다(이 코드에서는 한 줄도 줄일 수 없습니다 :( )
다음은 예입니다. 이 함수는 틱 기록 처리 클래스에서 가져온 마지막 틱을 반환하지만 코드에서 모든 것이 명확해질 것이라고 생각합니다.
틱 쿼리 모드 - 마지막 "틱" 틱 - 즉, 시간은 "0"입니다.
하나의 표시기(왼쪽 차트)는 OnCalculate() 함수에서 CopyTicks()를 요청하고 두 번째 표시기(오른쪽 차트)는 OnBookEvent() 함수에서 CopyTicks()를 요청합니다.
그리고 여기 사진이 있습니다:
눈금은 다음과 같이 표시됩니다. 인덱스가 "0"인 요소는 차트의 맨 아래에 있고 인덱스 "0"이 있는 요소의 눈금 시간이 가장 오래된 것입니다. 인덱스가 "29"인 요소는 가장 어린 틱 시간을 갖습니다. 우리가 가진 것: 적어도 이 그림에서 한 번에 두 가지 불일치를 발견했습니다. 아래는 첫 번째 예입니다.
다음은 예입니다. 이 함수는 틱 기록 처리 클래스에서 가져온 마지막 틱을 반환하지만 코드에서 모든 것이 명확해질 것이라고 생각합니다.
중복을 방지하는 코드는 다음과 같습니다.
COPY_TICKS_ALL을 COPY_TICKS_TRADE로 수정했으며 정상적으로 작동하는 것 같습니다.
하지만 다시 확인하겠습니다. :)
정적으로 피드를 볼 수 없습니다. 지워질 때까지 기다리겠습니다.