Here starts the weird behaviour of MQL managing strings returned from a DLL.
using the following code:
string buffer;
GetString( buffer, 30 );
the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.
Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.
but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.
At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...
하지만 OR 라인은 작동하지 않습니다. 왜냐하면 Hour가 22일 경우 첫 번째 부분인 "if(Hour()>=12"를 충족하고 스틸이 원할 때마다 거래되고 Buy/Sell 문으로 && TradeHour를 추가했기 때문입니다.) 내가 준 두 번째 예는 속임수에 있어야합니다. 나는 그것을 이해하지 못합니다.
EA에서 시간 거래 시간을 어떻게 설정합니까?
나는 이것을 시도하고 있었다;
int TradeHour;
if(Hour()17) TradeHour = false;
그러나 규칙을 따르지 않는 것 같습니다. 그것은 단지 언제든지 거래되며 내 매수/매도 명세서에 && TradeHour가 있습니다.
감사해요TradeHour를 정수 대신 부울로 정의해 보셨습니까?
bool TradeHour;
if ((Hour()17)){ TradeHour = false;}또한 추가 브래킷이 필요할 수 있습니다.
EA에서 시간 거래 시간을 어떻게 설정합니까?
나는 이것을 시도하고 있었다;
int TradeHour;
if(Hour()17) TradeHour = false;
그러나 규칙을 따르지 않는 것 같습니다. 그것은 단지 언제든지 거래되며 내 매수/매도 명세서에 && TradeHour가 있습니다.
감사해요어떻게 Hour()가 9보다 작고 17보다 클 수 있습니까? 또는(||)를 의미했나요?
럭스
어떻게 Hour()가 9보다 작고 17보다 클 수 있습니까? 또는(||)를 의미했나요? 럭스
굿포인트 럭스인테리어! 그것은 확실한 문제입니다. 나는 그것을 놓쳤다.
미안, 내 말은 ||
그리고 나는 이것을 시도하고 있었다;
//+---------거래 시간 변수------------------
// if (Hour() < StartHour) TradeHourS = false;
// if (Hour() > EndHour) TradeHourE = false;
따라서 StartHour=5이고 EndHour=17이면 해당 시간 내에만 거래해야 합니까?
그러나 그것은 여전히 언제든지 거래 ?? Strategy Tester 를 사용하는 것이 문제입니까?
도움말 파일에서 바로 예제를 사용하지 않는 이유는 무엇입니까?
bool is_siesta=false;
if(Hour()>=12 || Hour()<17)
is_siesta=true;
럭스
ac/c++ DLL 내보낸 함수 에서 문자열 반환
안녕하세요 여러분,
EA에서 구성 설정을 관리하는 기능 세트를 개발했습니다.
이러한 함수는 C++ DLL에서 내보내고 내보낸 각 함수에는 내 MQL4에서 요청한 대류를 호출하는 __stdcall이 있습니다.
함수가 EA에 문자열을 반환해야 할 때 문제가 발생합니다.
당연히 함수는 다음을 수행할 수 없습니다.
- 지역 변수에 대한 포인터 반환(변수가 범위를 벗어남)
- dll 전역 변수에 대한 포인터 반환(동시 액세스 문제)
- 힙 할당 문자열에 대한 포인터 반환(EA에서 호출할 메모리를 해제하는 함수 필요: 이 접근 방식이 마음에 들지 않음)
그래서 EA에서 문자열과 문자열 크기를 전달하기로 결정했습니다. 에스:
string buffer;
GetString( buffer, 30 );
[/CODE]
and from the c++ dll, something like this
void __stdcall GetString( LPTSTR buffer, int BufSize )
{
// Read a string from a some source
....
// -1 to take into account the terminating null character
StringCchCopy( buffer, BufSize-1, ReadStringFromASource );
}
[/CODE]
Here starts the weird behaviour of MQL managing strings returned from a DLL.
using the following code:
string buffer;
GetString( buffer, 30 );
the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.
Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.
Tried even:
[CODE]
string buffer = " "; // 'allocate' 30 blank characters
GetString( buffer, StringLen(buffer) );
but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.
At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...
[CODE]
CopyMemory( buffer, ReadStringFromASource, min(BufferSize,ReadStringFromASourceLength) );
종료 null 문자를 추가하지 않습니다.
그러나 MQL에서 호출하면 문자열이 전혀 반환되지 않습니다.
누군가가 답을 가지고 있습니까?
도움말 파일에서 바로 예제를 사용하지 않는 이유는 무엇입니까?
bool is_siesta=false;
if(Hour()>=12 || Hour()<17)
is_siesta=true;
예, 나는 그것을 시도했습니다.
부울 TradeHour=거짓;
if(Hour()>=12 || Hour()<17) TradeHour=true
하지만 OR 라인은 작동하지 않습니다. 왜냐하면 Hour가 22일 경우 첫 번째 부분인 "if(Hour()>=12"를 충족하고 스틸이 원할 때마다 거래되고 Buy/Sell 문으로 && TradeHour를 추가했기 때문입니다.) 내가 준 두 번째 예는 속임수에 있어야합니다. 나는 그것을 이해하지 못합니다.![](https://c.mql5.com/forextsd/smiles/frown.png)
도움말 파일에서 바로 예제를 사용하지 않는 이유는 무엇입니까?
bool is_siesta=false;
if(Hour()>=12 || Hour()<17)
is_siesta=true;
[/code]
Lux귀하의 목표가 12:00에서 17:00 사이에 거래하는 것이라면 다음을 수행하면 됩니다.
[암호]
bool TradingEnabled=거짓; // 전역 변수
...
...
TradingEnabled=거짓; // 모든 틱 실행을 재설정합니다.
if(시()>=12 && 시()<17)
TradingEnabled=참;
...
...
if( 거래 가능 )
{
// 여기에 거래 로직
}
...
...
귀하의 목표가 12:00에서 17:00 사이에 거래하는 것이라면 다음을 수행하면 됩니다.
bool TradingEnabled=false; // Global variable
...
...
TradingEnabled=false; // Reset every tic run
if(Hour()>=12 && Hour()<17)
TradingEnabled=true;
...
...
if( TradingEnabled )
{
// Trading logic here
}
...
...
나는 이것을 해서 똑같은 일을 하고 있지 않은가?;
if (Hour() 17) TradeHour = false;
의미, 시간이 12와 17 사이인 경우 TradeHour=true , 맞습니까?
(내 매수/매도 명세서에 && TradeHour 추가)
어떻게 Hour()가 9보다 작고 17보다 클 수 있습니까? 또는(||)를 의미했나요? 럭스
아, 그리고 나는 &&를 의미했습니다. 왜냐하면 당신의 권리 시간은 9보다 작고 17보다 클 수 없기 때문에 진술이 거짓이지만 Hour가 10이면 9보다 작지 않고 17보다 크지 않으므로 진술이 참이 됩니다.
그런 식으로 하면 MT4 구매가 혼란스러울 수 있습니다. 어쨌든 이 방법이 작동합니다.
int TradeHour;
TradeHour = ((Hour()>=StartHour) && (Hour()<EndHour));
감사해요