오류, 버그, 질문 - 페이지 2591

 
Koldun Zloy :

그러나 복사된 문자열의 크기가 할당된 버퍼의 크기보다 크거나 작으면 어떻게 될까요?

less에 대해 걱정할 필요가 없다면 일반적으로 문자열 버퍼 는 항상 문자열 자체보다 약간 더 큽니다(그러나 이것은 사실이 아닙니다!)

그러나 더 많이 쓰면 터미널은 거의 확실히 충돌합니다.
그리고 충돌은 즉시 발생하지 않고 동적 메모리(배열 또는 문자열 버퍼의 재배포)로 다음 작업 중이거나 작업 종료 시 MQL 프로그램의 사용된 메모리가 시스템으로 반환될 때만 발생할 가능성이 높습니다.

 
Ilyas :

1. MQL 전용 유니코드에서는 문자 크기가 2바이트입니다.

2. string은 구조체(4바이트 버퍼 크기와 8바이트 포인터)


문자열에 복사는 다음과 같아야 합니다.

이것이 작동하지 않으면 다른 곳에서 오류를 찾아야 합니다.

예, 가장 간단한 기능

wcscpy(out, data);

그리고 문제를 일으킵니다. 선은 평평하게 복사되지만 큰 간격이 있습니다. 복사가 늦어지는 것입니다.
따라서 올바르게 사용하면 문제를 일으키는 다른 기능도 시도되었습니다.
모든 mutex, recursive_mutex, lock_guard는 간격 문제를 해결하지 못합니다.

그래서 더 이상 어디를 생각해야 할지 모르겠어 소켓에서 나오는 라인이 맞을 때부터 반복해서
결과 wchar_t* 문자열의 유형은 자동으로 그것이 유니코드 인코딩임을 의미하며 문자열의 각 문자는 2바이트(선택됨)와 같습니다.
그러나 어떻게 든 그것은 12바이트 문자열에 wchar_t * 8바이트 포인터의 올바른 복사본이 있을 것입니다.
아마도 OS의 비트가 여전히 어떻게 든 영향을 미칩니 까? 모든 것은 64비트 버전, Windows 및 Linux에서 테스트되었습니다.

 

간격이 무엇인지 확실하지 않습니까? 빈 줄?

모든 스레드에서 하나의 MQL 문자열 또는 다른 문자열로 쓰고 있습니까?

행에 데이터가 있고 처리/표시할 수 있다고 MQL 코드에서 언제 결정합니까?


모든 것이 잘못된 한 줄에 있는 경우 MQL 및 줄 변경 카운터에서 액세스할 수 있는 DLL 측의 중요한 섹션이 필요합니다.


MQL의 의사 코드

 #import ...
   bool LockValueIfChanged();
   void UnlockValue();
#import


while (!_IsStopped())
  {
   if (LockValueIfChanged())
     {
       Print ( Value );
      UnlockValue();
     }
  }

DLL

uint64_t last_mql_counter= 0 ;
uint64_t counter= 0 ;

bool LockValueIfChanged()
  {
   Lock(cs);

   if (last_mql_counter!=counter)
    {
     last_mql_counter=counter;
     return ( true );
    }

   Unlock(cs);
   return ( false );
  }

void UnlockValue()
  {
   Unlock(cs);
  }

Thread()
  {
   while ( running )
     {
      Lock(cs);

      Value = ...

      counter++;

      Unlock(cs);
     }
  }


이것은 대략적인 계획이며 MQL 측에서 줄 간격이 있습니다(모든 줄이 MQL로 수신되는 것은 아니며 일부 줄을 덮어쓰게 됩니다).

 
Ilyas :

간격이 무엇인지 확실하지 않습니까? 빈 줄?

모든 스레드에서 하나의 MQL 문자열 또는 다른 문자열로 쓰고 있습니까?

행에 데이터가 있고 처리/표시할 수 있다고 MQL 코드에서 언제 결정합니까?


모든 것이 잘못된 한 줄에 있는 경우 MQL 및 줄 변경 카운터에서 액세스할 수 있는 DLL 측의 중요한 섹션이 필요합니다.


MQL의 의사 코드

DLL


이것은 대략적인 계획이며 MQL 측에서 줄 간격이 있습니다(모든 줄이 MQL로 수신되는 것은 아니며 일부 줄을 덮어쓰게 됩니다).

예, 빈 줄이 화면에서 볼 수 있습니다.
예, 모든 스레드에서 하나의 MQL 라인으로. 즉석에서 문자열에 대한 변수를 생성하는 것도 문제이기 때문에.
라인이 어디에서 오는지, 즉 동적으로 얼마나 많은 소스가 포함될 것인지 미리 알 수 없는 경우.
크리티컬 섹션에 대한 생각도 있었고, MQL 측에서 어떻게든 읽기를 차단할 필요가 있다고 생각했습니다. 예를 들어 주셔서 감사합니다. 생각해보겠습니다.
그러나 여전히 문자열의 각 소스를 자체 변수로 수신하도록 권장하는 것으로 나타났습니다. 단일 MQL 문자열 변수가 아닙니다.
하나의 문자열 변수에서 모든 스레드에서 수신된 데이터로 작업하는 것이 더 편리합니다.
dll 측에 쓰기 잠금이 있으면 MQL 읽기에서 잠금이 필요하지 않습니다. 즉, MQL에서는 이러한 복사 구현이 고려됩니다.
그러나 한 스트림에서 문자열을 수신하더라도 여전히 공백이 있습니다!
그리고 올바른 매개변수와 함께 다른 복사 기능을 사용하면 간격이 없고 최소한 하나, 최소한 여러 개의 스트림이 있지만 문자별로 고르지 않은 행이 나타납니다.
잘못된 매개 변수를 사용하면 선이 짝수로 밝혀 지지만 흐르기 시작합니다.

파일:
458.png  71 kb
 
Ilyas :

less가 걱정할 필요가 없다면, 일반적으로 문자열 버퍼 는 항상 문자열 자체보다 약간 더 큽니다(그러나 이것은 사실이 아닙니다!)

그러나 더 많이 쓰면 터미널은 거의 확실히 충돌합니다.
그리고 충돌은 즉시 발생하지 않고 동적 메모리(배열 또는 문자열 버퍼의 재배포)로 다음 작업 중이거나 작업 종료 시 MQL 프로그램의 사용된 메모리가 시스템으로 반환될 때만 발생할 가능성이 높습니다.

그렇다면 왜 초보자에게 wcscpy 기능을 사용하라고 조언합니까?

더 안전한 기능도 있습니다: wcscpy_s, wmemcpy_s.

 

OnCalculate 핸들러에서 새로 형성된 각 막대 시간[0]의 시간이 SymbolInfoTick 함수를 사용하여 요청한 틱 시간보다 앞선 이유를 설명해 주십시오. 이론적으로 이미 time[0] 막대가 있는 경우 이를 생성한 틱이 있어야 하며 SymbolInfoTick 함수 는 항상 마지막으로 알려진 틱을 반환해야 합니다.

틱 바이 틱 모드의 테스터에서이 문제를 재현하는 표시기를 부착하고 있습니다.

 2019.10 . 12 16 : 51 : 53.667 2019.01 . 02 06 : 00 : 00    Time 2019.01 . 02 06 : 00 : 00 = 1546408800000 is ahead of tick:   1546297199572
2019.10 . 12 16 : 51 : 53.753 2019.01 . 02 06 : 01 : 00    Time 2019.01 . 02 06 : 01 : 00 = 1546408860000 is ahead of tick:   1546408830000
2019.10 . 12 16 : 51 : 54.315 2019.01 . 02 06 : 02 : 00    Time 2019.01 . 02 06 : 02 : 00 = 1546408920000 is ahead of tick:   1546408919000
2019.10 . 12 16 : 51 : 54.617 2019.01 . 02 06 : 03 : 00    Time 2019.01 . 02 06 : 03 : 00 = 1546408980000 is ahead of tick:   1546408979000

바의 모든 경계에 이러한 문제가 있습니다.

추신. 이 표시기는 또 다른 문제를 보여주기도 합니다. 틱을 계산하고 OnCalculate가 건너뛰지 않고 모든 틱에 대해 호출된다는 문서로 판단하면 틱 볼륨은 항상 틱 카운터와 일치해야 하지만 항상 그런 것은 아닙니다.
파일:
fake.mq5  2 kb
 
Stanislav Korotky :

OnCalculate 핸들러에서 새로 형성된 각 막대 시간[0]의 시간이 SymbolInfoTick 함수를 사용하여 요청한 틱 시간보다 앞선 이유를 설명해 주십시오. 이론적으로 이미 time[0] 막대가 있는 경우 이를 생성한 틱이 있어야 하며 SymbolInfoTick 함수 는 항상 마지막으로 알려진 틱을 반환해야 합니다.

틱 바이 틱 모드의 테스터에서이 문제를 재현하는 표시기를 부착하고 있습니다.

막대의 모든 경계에는 이 문제가 있습니다.

추신. 이 표시기는 또 다른 문제를 보여주기도 합니다. 틱을 계산하고 OnCalculate가 건너뛰지 않고 모든 틱에 대해 호출된다는 문서로 판단하면 틱 볼륨은 항상 틱 카운터와 일치해야 하지만 항상 그런 것은 아닙니다.

빌드번호 부탁드립니다

 
Slava :

빌드번호 부탁드립니다

2093

 
Stanislav Korotky :

2093

설명하신 문제는 빌드 2155에서 수정되었습니다.

 

편집기에서 강조 표시된 상수 SYMBOL_CHART_MODE_OLD 를 찾았습니다.

물론 ENUM_SYMBOL_CHART_MODE 에서는 그렇지 않습니다.

그것은 무엇입니까?

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно. Некоторые символы (как...
사유: