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

 
Roman :

메모리는 mql 코드에서 다음과 같이 할당됩니다.

mql의 문자열이 dll의 wichar_t*이기 때문에 out 및 할당된 메모리 에 대한 포인터로 전달됩니다.

아 어떻게 돌아가는지...

문자열의 구현을 모르고 추측할 수는 있지만 오류로 판단하면 문자열이 출력될 때 스택에 포인터가 생성되고 이 포인터는 0x00000000으로 초기화되고 dll에서 null 포인터를 안전하게 역참조합니다.

 
Vladimir Simakov :

아 어떻게 돌아가는지...

문자열의 구현을 모르고 추측할 수는 있지만 오류로 판단하면 문자열이 출력될 때 스택에 포인터가 생성되고 이 포인터는 0x00000000으로 초기화되고 dll에서 null 포인터를 안전하게 역참조합니다.

죄송합니다. StringInit 은((
 
Roman :

메모리는 mql 코드에서 다음과 같이 할당됩니다.

mql의 문자열이 dll의 wchar_t*이기 때문에 out 및 할당된 메모리 에 대한 포인터로 전달됩니다.

dll 자체를 파십시오. 아마도 거기에 무언가가있을 것입니다. 최근에 저는 mql에서 타사 C++/C# 응용 프로그램으로 데이터를 푸시하고 있는데 문제가 발생한 적이 없습니다.

 
Vladimir Simakov :

dll 자체를 파십시오. 아마도 거기에 무언가가있을 것입니다. 최근에 저는 mql에서 타사 C++/C# 응용 프로그램으로 데이터를 푸시하고 있는데 문제가 발생한 적이 없습니다.

dll에서는 모든 것이 간단하고 명확성을 위해 불필요한 부분이 제거되며 아이디어 자체가 표시됩니다.

 wchar_t * out        = L"";
const wchar_t * data = L"";

while (condition)
{
   data = getData();   //getData библиотечная функция возвращает const wchar_t*
   wcscpy( out , data);
}

결과 데이터를 콘솔에 출력하면 콘솔의 모든 라인이 간격과 결함 없이 명확하게 나타납니다.
wcscpy(out, data) 문제 시작을 통해 mql에 전달합니다.
그리고 내가 손으로 쓴 테스트 문자열을 통과하면

wchar_t* out         = L "" ;
const wchar_t* data = L "" ;

while (condition)
{
   data = L "{\"p\":\"2000\"}" ;   //проверочная строка
   wcscpy( out , data);
}

왜 문제가 없습니다.

흠, mql 의 문자열 유형 은 wchar_t*의 터미널 0을 고려합니까 ???

 

OnTimer() 이벤트 기능의 약간의 확장 제안

이때 EventSetTimer() 함수에 의해 호출 빈도가 설정되는 순간부터 OnTimer() 이벤트가 발생하기 시작합니다.

다음과 같은 고문이 있습니다.

 bool timer_set = false ;
int OnInit ()
{
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   EventKillTimer ();
}
//+------------------------------------------------------------------+
void OnTick ()
{
   if (!timer_set)
      {
         // -- имитация включения советника в какое-то
         // -- случайное время
         string time = TimeToString ( TimeTradeServer (), TIME_DATE | TIME_MINUTES | TIME_SECONDS );
         if ( TimeCurrent () >= D'2019.09.24 3:47:40' )
            {
               EventSetTimer ( 600 );
               timer_set = true ;
            }
      }
}
//+------------------------------------------------------------------+
void OnTimer ()
{
//---
   string time = TimeToString ( TimeTradeServer (), TIME_DATE | TIME_MINUTES | TIME_SECONDS );
   printf ( "Current time: %s" , time);
}
//+------------------------------------------------------------------+

다음과 같이 제공합니다.

QJ       0        07 : 53 : 10.369     test_timer (GBPUSD_i,D1)         2019.09 . 24 03 : 57 : 41    Current time: 2019.09 . 24 03 : 57 : 41
NF       0        07 : 53 : 11.246     test_timer (GBPUSD_i,D1)         2019.09 . 24 04 : 07 : 41    Current time: 2019.09 . 24 04 : 07 : 41

그러나 종종 신호의 발생을 확인하려면 다음 막대가 나타난 후 확인하는 것으로 충분합니다.

예를 들어 PERIOD_M15의 경우 막대가 00:15:00에 표시되고 EA는 00:29:59에만 확인할 수 있습니다.

저것들. 어드바이저의 시작 시간에 관계없이 다소 안정적이고 동일한 결과를 얻으려면

더 짧은 시간 동안 타이머를 설정하거나 OnTick()을 추가로 사용해야 합니다.

실험은 이것이 전략 테스터의 테스트 속도를 크게 늦추는 것으로 나타났습니다.

권하다:

OnTimer 이벤트 발생에 대한 카운트다운이 수행되는 초기 시간을 설정할 수 있는 기능을 추가합니다.

예를 들어, 일부 함수 EventSetTimerFrom (const datetime sinceDT)을 사용하면 새 막대 후 몇 초 후에 타이머 호출을 조정할 수 있습니다.

 
Roman :

dll에서는 모든 것이 간단하고 명확성을 위해 불필요한 부분이 제거되며 아이디어 자체가 표시됩니다.

결과 데이터를 콘솔에 출력하면 콘솔의 모든 라인이 간격과 결함 없이 명확하게 나타납니다.
wcscpy(out, data) 문제 시작을 통해 mql에 전달합니다.
그리고 내가 손으로 쓴 테스트 문자열을 통과하면

왜 문제가 없습니다.

흠, mql 의 문자열 유형 은 wchar_t*의 터미널 0을 고려합니까 ???

그리고 이 기능이 작동합니다

wcsncpy(out, data, wcslen(data));

그런데 삐뚤삐뚤하게, 줄 끝에 한 글자가 빠진 것 같고, 추가 대괄호 }가 나타났다가 사라집니다.
wcslen(데이터)+1
wcslen(데이터)+2
도움이 되지 않았고,
그리고 그것은 어떤 누출도 없이 오류 없이 구문 분석되었습니다.

mql 문자열에서 한 문자의 길이 또는 크기가 무엇인지 전혀 명확하지 않습니다.
확실히 문자열 유형에 어떤 종류의 오류가 있습니다.

그리고 가장 최근 기사 인 3.3 문자열 전송 및 수정에서 예제가 실수했을 가능성이 가장 큽니다.

_DLLAPI void fnReplaceString(wchar_t *text, wchar_t * from , wchar_t *to)
  {
   wchar_t *cp;
    
   //проверка параметров
   if (text==NULL || from ==NULL || to==NULL) return ;
   if (wcslen( from )!=wcslen(to))             return ;
   
   //поищем подстроку
   if ((cp=wcsstr(text, from ))==NULL)         return ;
   
   //заменим
   memcpy(cp,to,wcslen(to)* sizeof (wchar_t));   //в этой строке должен быть указатель sizeof (wchar_t * )
  }

아마도 터미널 코드의 어딘가에서 mql 문자열 변환은 포인터 없이 동일한 방식으로 작동합니다.

 
Maksim Emeliashin :

OnTimer 이벤트 발생에 대한 카운트다운이 시작되는 시작 시간을 설정합니다.

EventSetTimer를 다시 호출하여 직접 수행할 수 있습니다. 테스터가 아닌 계정에서 타이머는 유동적이며 지속적인 조정 이 필요합니다.

 
fxsaber :

EventSetTimer를 다시 호출하여 직접 수행할 수 있습니다. 테스터가 아닌 계정에서 타이머는 유동적이며 지속적인 조정 이 필요합니다.

고마워, 유용한 물건!

물론 그런 단순한 순간이 기본적으로 터미널에서 고려되지 않는다는 것은 매우 이상합니다.

 
Roman :

그리고 이 기능이 작동합니다

그런데 삐뚤삐뚤하게, 줄 끝에 한 글자가 빠진 것 같고, 추가 대괄호 }가 나타났다가 사라집니다.
wcslen(데이터)+1
wcslen(데이터)+2
도움이 되지 않았고,
그리고 그것은 어떤 누출도 없이 오류 없이 구문 분석되었습니다.

mql 문자열에서 한 문자의 길이 또는 크기가 무엇인지 전혀 명확하지 않습니다.
확실히 문자열 유형에 어떤 종류의 오류가 있습니다.

그리고 가장 최근 기사 인 3.3 문자열 전송 및 수정에서 예제가 실수했을 가능성이 가장 큽니다.

아마도 터미널 코드의 어딘가에서 mql 문자열 변환은 포인터 없이 동일한 방식으로 작동합니다.

getData() 발굴. 어딘가에 매복이 있는 것 같습니다.
 
Roman :

dll에서는 모든 것이 간단하고 명확성을 위해 불필요한 부분이 제거되며 아이디어 자체가 표시됩니다.

멋진 예가 있습니다. 그들은 모든 것을 제거하고 UB(문자열 리터럴 수정)를 남겼고 모두가 텔레파시를 해야 합니다. 어떤 종류의 합리적인 조언에 의존한다면 최소한의 작업 코드(양쪽 모두)를 제공하십시오. 그렇지 않으면 그것은 그저 잡담일 뿐입니다.