초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 856

 
Алексей Барбашин :

흠.. 아마 API를 자세히 안봐서 그런 기능은 눈치채지 못했나보네요.... 그리고 아마 편할겁니다.

더 말씀해 주시겠습니까... 질문이 너무 .. 말도 안 됩니다... 어떻게 숫자(예: double)를 char 배열로 변환할 수 있습니까? 즉, 일부 API는 숫자가 포인터로 전달되어야 합니다. 포인터는 1차원 배열로 전달됩니다... 문자열의 경우에는 명확 하고 StringToShortArray 및 StringToCharArray 함수 가 제공되지만 숫자의 경우 여전히 바이트 배열(char)로 변환하는 방법을 알지 못합니다.

어쩌면 몇 가지 예?
 
. ... Rick D. ... . :
어쩌면 몇 가지 예?

우리는 아마 멀리 가지 않을 것입니다. 레지스트리 작업을 고려하십시오. 문자열 값과 숫자 값(문자열이 아님)을 모두 레지스트리에 넣을 수 있습니다. 레지스터에 숫자를 전달하고 포인터를 다시 얻는 것은 배열을 사용하여 수행됩니다(수정에 따라). 이 예가 효과가 있을까요?

 
pivomoe :

나는 틱의 역사를 공부합니다. 진드기가 나타났을 때 시장에서 무슨 일이 일어났는지 이해하는 것이 항상 가능한 것은 아닙니다.

SBER

i=987 2016.06.27 10:00:30.274 매도호가=133.91 입찰가=133.9 종가=133.9 거래량=50 TICK_FLAG_ASK

i=988 2016.06.27 10:00:30.280 매도=133.93 입찰가=133.9 마지막=133.9 거래량=50 TICK_FLAG_ASK

i=989 2016.06.27 10:00:30.280 매도호가=133.93 입찰가=133.9 종가=133.91 거래량=100 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY TICK_FLAG_SELL

i=990 2016.06.27 10:00:30.280 매도=133.93 입찰가=133.9 마지막=133.92 거래량=300 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY TICK_FLAG_SELL

i=991 2016.06.27 10:00:30.280 매도호가=133.93 입찰가=133.9 마지막=133.92 거래량=100 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY TICK_FLAG_SELL

i=992 2016.06.27 10:00:30.281 매도=133.94 입찰가=133.9 마지막=133.92 거래량=100 TICK_FLAG_ASK

1. TICK_FLAG_BUY 및 TICK_FLAG_SELL 플래그가 동시에 있는 이 신비한 틱은 무엇입니까? 나는 심지어 1 lot의 볼륨으로 그러한 진드기를 찾을 수있었습니다.

2. 틱 988에서. Ask=133.93 Bid=133.9 마지막 133.91은 989에서 어디에서 왔습니까?

3. 일반적으로 시장에서 무슨 일이 일어났습니까?

포럼의 "거래소 거래"섹션에서 별도의 스레드로 이러한 질문을 작성하는 것이 좋습니다.

간단히 말해서 틱에 매수 플래그와 매도 플래그가 동시에 있는 것을 보면 브로커의 서버가 업데이트되지 않았으며 방향을 알 수 없는 트랜잭션을 브로드캐스트한다는 의미입니다.

어떤 서버에서 틱을 보나요?
 
Vladimir Karputov :

질문을 다시 쓰거나 구두점을 표시하거나 더 나은 방법으로 사진에 무엇을, 어디에, 누구를 추가하십시오. 그렇지 않으면 익숙한 글자가 보이지만 그 의미와 생각을 이해할 수 없습니다.

여기 사진이 있습니다


 
Seric29 :

여기 사진이 있습니다


그렇다면 내 사진이 삽입된 이유는 무엇입니까(또는 브랜드가 지정된 캐시였습니까?)?

 
Seric29 :

여기 사진이 있습니다


지정: 터미널에서 직접 마우스를 이동하고 마우스 오른쪽 버튼을 클릭 하여 POSITION의 가격을 복사하시겠습니까?

 
Алексей Барбашин :

우리는 아마 멀리 가지 않을 것입니다. 레지스트리 작업을 고려하십시오. 문자열 값과 숫자 값(문자열이 아님)을 모두 레지스트리에 넣을 수 있습니다. 레지스터에 숫자를 전달하고 포인터를 다시 얻는 것은 배열을 사용하여 수행됩니다(수정에 따라). 그러한 예가 효과가 있습니까?

잡고 있다. 이해하실 거라 생각합니다.
파일:
TestReg.mq5  33 kb
 
. ... Rick D. ... . :
잡고 있다. 이해하실 거라 생각합니다.

원래의! 노조는 생각도 못했다. )))

이전 예제를 사용하여 메모리와 터미널의 충돌이 정확히 무엇에서 발생했는지 알아내려고 했습니다.

우선, 열린 레지스트리 키에 대한 포인터를 얻기 위해 배열을 포기했습니다. 즉, 방금 uint & phkResult를 API에 전달했습니다. 모든 것이 잘 진행되었으며 오류가 없었습니다. mql에 대한 문서에는 단순 유형이 참조로 전달될 수 있으며 API로 작업할 때 변수의 주소, 즉 포인터라고 명시되어 있습니다. 이 부분에서 모든 것이 잘되었습니다. NULL 매개 변수도 제자리에 반환되며 배열을 사용하지 않고 전달합니다.

다음으로 값 자체를 레지스트리에 전달하는 작업을 했습니다. 함수 설명에는 끝에 0이 있는 문자열을 전달해야 한다고 나와 있습니다. 그리고 문자열 유형 은 바로 그것이므로 첫 번째 버전에서는 방금 변수를 전달했습니다. 이를 기반으로 이전 버전에서는 이를 변경하지 않았습니다. 그러나 나는 배열을 실험하기로 결정하고 ushort 배열을 입력하고 원하는 값으로 채웠습니다. 함수에 전달될 때 매개변수 중 하나

uint RegSetValueExW(uint hKey, 문자열 lpValueName, uint 예약, uint dwType, ushort &lpData[], uint cbData);

전송된 데이터의 크기입니다. 귀하의 예에서는 다음과 같았습니다.

단위 cbData = (StringLen(값)+1)*2;

여기에서 모든 것이 명확합니다. 문자열의 길이를 취하고 "종료" 0을 추가하고 ushort 크기인 2바이트를 곱합니다.

다음과 같이 시도했습니다.

ushortData[];

StringToShortArray(값, 데이터);

단위 cbData = sizeof(데이터);

데이터 크기가 이전 예와 같지 않을 때 내가 얼마나 놀랐는지 상상해 보십시오!

배열의 크기를 확인해보니 StringLen(value)+1의 값과 완전히 일치하는데 데이터의 크기가 일치하지 않는데.. 아직도 이유를 모르겠다..

어쨌든.

문자열 변수를 참조로 포인터로 전달했기 때문에 원래 문제는 레지스트리에서 값을 가져오는 것으로 끝났습니다. 여기에서 충돌이 발생했습니다.

" 문자열 자체가 DLL에 전달되지 않고 이 구조 또는 참조가 전달되면 올바른 결과를 기대할 수 없습니다. 결국 시스템 DLL은 끝에 null 문자가 있는 정직한 문자열을 수락하지만 이것은 구조 " - 이것은 10년 전의 인용문으로 관련성을 잃지 않았습니다.

따라서 레지스트리 키 이름이나 매개변수의 문자열 값과 같은 문자열 상수 값을 전달할 때 모든 것이 올바르게 작동합니다. 그리고 참조로 문자열 변수를 전달할 때 내가 한 것처럼 인용문에 표시된 문제로 이어집니다. )))

수신된 크기에 대해서는 API 문서에 "아직 데이터가 있습니다" 오류가 발생하는 경우 루프에서 수신 버퍼의 크기를 늘리고 데이터를 다시 수신하는 예가 나와 있습니다.

글쎄, 이런 것.

도움을 주셔서 다시 한 번 감사드립니다! )))


 
Алексей Барбашин :

원래의! 노조는 생각도 못했다. )))

유니온 사용이 편리합니다. 생각할 필요가 없습니다. 상위 바이트는 어디에 있고 하위 바이트는 어디에 있습니다. Union은 REG_BINARY에도 사용할 수 있습니다. 데이터 구조를 설명하십시오. 그리고 구조체의 크기에 따른 바이트 배열과 함께 Union에 추가합니다. 그러나 나는 당신에게 그것이 정말로 필요하다고 생각하지 않습니다. 모든 데이터를 문자열로 변환하여 문자열로 저장할 수 있습니다.

이전 예제를 사용하여 메모리와 터미널의 충돌이 정확히 무엇에서 발생했는지 알아내려고 했습니다.

아마도 스택이 날아갔기 때문에 함수 설명에서 int 대신 long을 표시했습니다.

mql에 대한 문서에는 단순 유형이 참조로 전달될 수 있으며 API로 작업할 때 변수의 주소, 즉 포인터라고 명시되어 있습니다.

문서의 이 섹션에 대한 링크를 보낼 수 있습니까?

단위 cbData = sizeof(데이터);

ushort 배열을 전달하는 경우 uint cbData = ArraySize(Data) * 2가 필요합니다.

uchar 배열을 전달하는 경우 uint cbData = ArraySize(Data)입니다.

마지막 예에서는 Windows LPBYTE lpData와의 완전한 호환성을 위해 uchar 배열을 API 매개변수로 함수에 전달합니다.

맞습니다. 그러나 모든 데이터를 바이트 배열로 변환하기 위해 약간의 손놀림이 추가되었습니다.

수신된 크기에 대해서는 API 문서에 "데이터가 있습니다" 오류가 발생한 경우 루프에서 수신 버퍼의 크기를 늘리고 데이터를 다시 수신하는 예가 나와 있습니다.

마지막 코드를 보세요. 거기에서 구현에서 먼저 데이터의 크기를 구하라는 요청이 있고 그 다음 배열의 크기가 설정 되고 모든 데이터가 완전히 취해집니다.

 
. ... Rick D. ... . :

유니온 사용이 편리합니다. 생각할 필요가 없습니다. 상위 바이트는 어디에 있고 하위 바이트는 어디에 있습니다. Union은 REG_BINARY에도 사용할 수 있습니다. 데이터 구조를 설명하십시오. 그리고 구조체의 크기에 따른 바이트 배열과 함께 Union에 추가합니다. 그러나 나는 당신에게 그것이 정말로 필요하다고 생각하지 않습니다. 모든 데이터를 문자열로 변환하여 문자열로 저장할 수 있습니다.

아마도 스택이 날아갔기 때문에 함수 설명에서 int 대신 long을 표시했습니다.

문서의 이 섹션에 대한 링크를 보낼 수 있습니까?

ushort 배열을 전달하는 경우 uint cbData = ArraySize(Data) * 2가 필요합니다.

uchar 배열을 전달하는 경우 uint cbData = ArraySize(Data)입니다.

마지막 예에서는 Windows LPBYTE lpData와의 완전한 호환성을 위해 uchar 배열을 API 매개변수로 함수에 전달합니다.

맞습니다. 그러나 모든 데이터를 바이트 배열로 변환하기 위해 약간의 손놀림이 추가되었습니다.

마지막 코드를 보세요. 거기에서 구현에서 먼저 데이터의 크기를 구하라는 요청이 있고 그 다음 배열의 크기가 설정 되고 모든 데이터가 완전히 취해집니다.

다시 안녕!

이 주제에 대한 우리의 토론이 초보자뿐만 아니라 숙련된 프로그래머에게도 유용하기를 바랍니다.

롱에 관해서. 예, 이것은 내 실수이지만 처음에는 테스트가 int로 수행되었습니다. 저는 64비트 터미널을 사용하기 때문에 Long을 사용했습니다. 그러나 모든 것이 int와 잘 작동합니다.

포인터 정보. https://www.mql5.com/ru/docs/basis/types/this , https://www.mql5.com/ru/docs/runtime/imports 문서에 모든 것이 잘 설명되어 있다고 생각합니다.

나는 또한 sizeof에 대한 내 실수를 인정합니다. 우리는 교환을 위해 동적 배열을 사용합니다. 즉, 동적 배열의 경우 sizeof는 단순히 데이터 크기가 아닌 배열 자체의 크기를 반환합니다. https://www.mql5.com/ru/docs/basis/operations/ 다른

전체 데이터 양을 가져오는 방법에 대해. 예, 당신의 진실. 실제로 첫 번째 호출에서 함수는 매개변수에 배치된 데이터의 크기를 반환하므로 내가 작성한 루프 없이도 수행할 수 있습니다. 여기서 내가 읽은 데이터의 크기를 변수로 돌려준다고 해서 함수 설명을 잘못 이해한 것 같다.

다시 string으로 돌아가자.. 원칙적으로는 데이터를 받을 때 참조로 변수를 넘겨주는 것도 가능했지만, 먼저 최대 길이까지 어떤 값으로 초기화를 시켰다. 나에 관해서는 이것은 목발입니다. 왜냐하면 그런 다음이 라인에서 값 자체를 잘라야하기 때문입니다. 배열 버퍼에서 데이터를 가져오는 것이 더 나은 옵션입니다. 즉, 우리 솔루션이 제 생각에는 최고입니다.))).

문자열을 포인터로 전달하는 방법은 다음과 같습니다. https://www.mql5.com/ru/forum/103532/page2#comment_2983919

음, Andrey는 dll 작업에 대해 잘 알려줍니다. https://www.mql5.com/en/articles/96


귀하의 도움으로 레지스트리 작업뿐만 아니라 라이브러리 API 작업의 뉘앙스에 대한 주제를 완전히 밝힐 수 있었다고 생각합니다.

레지스트리 작업 클래스는 동일한 차트의 기기 간, 그리고 일반적으로 차트와 터미널 간에 데이터를 교환하는 데 매우 편리합니다.

어떻게든 포럼에서 그들은 이러한 목적으로 레지스트리를 사용하는 것이 전구로 못을 망치는 것과 같으며 가상 파일(매핑) 사용을 제안한다고 표현했습니다. 그러나 디스크에 기록되기 전의 레지스트리는 단지 가상 파일이기 때문에 나는 이에 동의하지 않습니다. REG_OPTION_VOLATILE 속성을 사용할 때 값은 항상 가상입니다. 예, 레지스트리에 세션 간 데이터를 저장하는 것은 매우 편리합니다. 임호.

Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
  • www.mql5.com
В MQL5 параметры простых типов можно передавать как по значению, так и по ссылке, в то время как параметры сложных типов всегда передаются по ссылке. Для указания компилятору на необходимость передачи параметра по ссылке, перед именем параметра ставится знак амперсанда Передача параметра по ссылке означает передачу адреса переменной, поэтому...
사유: