MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1413

 
Alexey Viktorov :

IntegerToString() 및 DoubleToString() 함수는 숫자를 함수에 전달되는 문자열로 나타냅니다. 여기 예에서

숫자 r만 문자열로 변환되고 문자열이 "추가"됩니다. 그러나 그 전에 r의 값이 변경됩니다.

질문을 잘 이해하지 못했지만 배열에서 짝수 요소만 선택해야 하는 경우에는 다음과 같이 주기를 빌드해야 합니다.


설명 감사합니다.

 
Alexey Viktorov :

IntegerToString() 및 DoubleToString() 함수는 숫자를 함수에 전달되는 문자열로 나타냅니다. 여기 예에서

이것은 숫자 r이 문자열로 변환되고 문자열이 "추가 "될 때 발생하는 일입니다. 그러나 그 전에 r의 값이 변경됩니다.



문자열 변수의 값을 "접는" 과정을 이해할 수 없습니다. 내 코드에 "접기" 문자열에 대한 2가지 옵션이 있습니다.

1. 현재 반복의 문자열 변수 값에 이전 반복의 동일한 문자열 변수 값이 추가됩니다.

2. 현재 반복에서 두 항 변수의 값이 추가됩니다. 즉, IntegerToString (r) + DoubleToString(LoY[r],4)

나는 당신이 첫 번째 옵션을 의미했다고 생각합니다.

하지만 .... 마지막 반복에서 IntegerToString(r) 의 값 = "0" , 현재 반복에서 = "1" 입니다. 추가 결과는 "01"이어야 합니다.

추가 전 현재 반복에서 IntegerToString(r) 값이 이전 값 0 에서 현재 1 로 변경되면 숫자의 두 자리 문자열 표현, 즉 "11"을 계속 얻습니다.

문자열 변수 DoubleToString(LoY[r],4)의 값이 동일한 알고리즘을 사용하여 추가되면 두 문자열을 추가한 결과는 1.61041.6105 유형의 값이어야 합니다.

그러나 어떤 이유로 Print()는 덧셈 결과를 다른 숫자로 인쇄합니다.
내가 이해하지 못하는 것.
다음은 문자열 변수의 값이 추가되는 방법에 대한 예입니다. "...... 그리고 문자열을 추가하면   DoubleToString(2.3, 1)+   DoubleToString(3.6, 1) 그러면 문자열로 2.33.6이 됩니다." 즉, 덧셈 이전에는 각 변수의 개수에 대한 문자열 표현이 2자로 구성되었고, 두 개의 문자열 변수를 더한 후에는 덧셈 결과가 4자 숫자의 문자열 표현 결과적으로 코드에 추가하면 문자 수가 두 배인 숫자를 얻지 못하는 이유는 무엇입니까?

 
Alexey Viktorov :


질문을 잘 이해하지 못했지만 배열에서 짝수 요소만 선택해야 하는 경우에는 다음과 같이 주기를 빌드해야 합니다.


사실 이게 제가 말하고자 하는 바입니다.... BLOCK N 2로 보완된 원본 코드입니다.

 int P1= 0 ;
double LoY[ 31 ];
void OnTick ()
{
if (P1== 0 )
{
for ( int r= 0 ; r< 31 ;r++)
{
LoY[r]= 1.6104 +(r* 2 )* 0.0001 ;
Print ( "-------------------------------------LoY[r]--------------=" ,  LoY[r]);
P1= 1 ;
}
}
//*************************************************************  Б Л О К    N 2
for ( int x= 0 ; x< 31 ;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
ArraySort (LoY, WHOLE_ARRAY , 0 ,MODE_ASCEND);
Print ( "---LoY[0]--" ,  X, "---LoY[1]--" ,  X,   "---LoY[2]--" ,  X,   "---LoY[3]--" ,  X,   "---LoY[4]--" ,  X, ................   "---LoY[30]--" ,  X );
}
}
}

두 번째 블록 에서 배열 요소의 값은 더 이상 첫 번째 블록에서와 같이 동일한 델타만큼 서로 다르지 않습니다. 이웃 요소 간의 델타는 다를 수 있으므로 첫 번째 블록에서 두 번째 블록으로 문자열을 연결하는 알고리즘은 적합하지 않습니다.

질문 어떤 언어 구성으로   MQL4에서   또는 기능   MQL4에서 위 코드 의 두 번째 블록 에서 루프 끝의 Print() 함수는 배열 요소의 모든 값이 채워진 상태로 한 번만 인쇄되며 한 줄에 위치하게 됩니다. 즉, 다음 형식을 취합니다

Print("---LoY[0]--", Х,   "---LoY[1]--"   , X ,     "---LoY[2]--"   , X ,     "---LoY[3]--"   , X ,     "---LoY[4]--"   , X , ...........     "---LoY[30]--"   , X );

나를 가혹하게 판단하지 마십시오. 그러나 두 번째 블록에서는 모든 것이 첫 번째 블록보다 훨씬 더 복잡하기 때문에 말로 설명을 이해할 수 있을지 확신할 수 없습니다.
도와 주셔서 감사합니다.

 

프로그래밍을 할 때 적어도 여행 초기에는 많은 일상적인 작업이 필요합니다. 아이디어를 생각하고 코드를 작성한 다음 디버그합니다. 때때로 디버깅은 다른 것보다 더 오래 걸립니다.

원래 계획이 작동하지 않는 경우가 종종 있습니다. 당신은 옳지 않은 순서대로 위에서 아래로 보기 시작합니다.

printf()를 어디에나 넣고 그것이 당신이 기대한 것인지 아닌지 확인하십시오. 따라서 코드가 작동하는 방식과 오류가 있는 위치를 빠르게 이해할 수 있습니다. 그렇지 않으면 이해가 오랫동안 올 것입니다.


내 상관은 없지만 아름답게 쓰려고 노력하십시오. 자신에게 맞는 스타일을 선택하고 고수하십시오. 괄호 안의 괄호는 첨부 파일을 볼 수 있도록 단계적으로 배치해야 합니다. 작업 사이에 공백을 사용하는 경우 모든 곳에서 사용하거나 그 반대의 경우에도 사용하지 마십시오.

 for ( int x= 0 ; x< 31 ;x++)

if (Bid < LoY[x] )

그러면 자신의 코드를 더 쉽게 읽을 수 있습니다.

------------------

두 번째 블록:

두 번째 블록에서 소문자 x와 대문자 X는 다른 변수이므로 코드가 원하는 대로 작동하지 않습니다.

순환이 아닌 외부에서 배열을 정렬하는 것이 바람직합니다.

Print에서 X를 여러 번 사용하므로 동일한 숫자를 여러 번 인쇄합니다.

------------------

코드로. 질문을 이해하기 어렵습니다. 어떻게 이해했는지 말씀드리겠습니다.

루프에서 Print를 작성하면 이 루프에서 수행한 반복만큼 많은 인쇄물을 얻을 수 있습니다. 한 번 출력해야 하는 경우 루프 뒤에 Print를 배치합니다.

동시에 정보를 수집하려면 각 반복의 값을 쓸 변수를 사용하십시오. 문자열 변수가 있으므로 모든 숫자를 문자열로 변환합니다.

Print 함수가 문자열을 받아들이기 때문에 문자열 변수가 있습니다.

무슨 일이야:

첫 번째 패스. 루프에 대한 첫 번째 패스 전에 빈 변수가 있습니다. string str= "" ;
다음으로 변수에 빈 값을 추가하고 "--LoY[" + IntegerToString (r)+ "]--, " + DoubleToString (LoY[r], 4 )+ ", " ;
여기서 r은 0이고 실제로 여러 줄을 추가합니다.

"--로이["+

정수로 문자열 (0)+

"]--, "+

DoubleToString (LoY[0], 4 )+

", " ;

두 번째 패스.

이 모든 것에 두 번째 요소에 대한 더 많은 정보를 추가합니다.

"--LoY[" + IntegerToString (1)+ "]--, " + DoubleToString (LoY[1], 4 )+ ", " ;

따라서 첫 번째 요소의 행은 더 이상 변경되지 않습니다.



목표를 어떻게 하느냐가 아니라 무엇을 필요로 하는지 설명하는 것이 좋습니다. 그렇지 않으면 코드에 대해 오랫동안 논의할 수 있지만 다른 방법으로 목표를 해결할 수 있습니다.

 
ANDREY :

문자열 변수의 값을 "접는" 과정을 이해할 수 없습니다. 내 코드에 "접기" 문자열에 대한 2가지 옵션이 있습니다.

1. 현재 반복의 문자열 변수 값에 이전 반복의 동일한 문자열 변수 값이 추가됩니다.

2. 현재 반복에서 두 항 변수의 값이 추가됩니다. 즉, IntegerToString (r) + DoubleToString(LoY[r],4)

나는 당신이 첫 번째 옵션을 의미했다고 생각합니다.

하지만 .... 마지막 반복에서 IntegerToString(r) 의 값 = "0" , 현재 반복에서 = "1" 입니다. 추가 결과는 "01"이어야 합니다.

추가 전 현재 반복에서 IntegerToString(r) 값이 이전 값 0 에서 현재 1 로 변경되면 숫자의 두 자리 문자열 표현, 즉 "11"을 계속 얻습니다.

문자열 변수 DoubleToString(LoY[r],4)의 값이 동일한 알고리즘을 사용하여 추가되면 두 문자열을 추가한 결과는 1.61041.6105 유형의 값이어야 합니다.

그러나 어떤 이유로 Print()는 덧셈 결과를 다른 숫자로 인쇄합니다.
내가 이해하지 못하는 것.
다음은 문자열 변수의 값이 추가되는 방법에 대한 예입니다. "...... 그리고 문자열을 추가하면   DoubleToString(2.3, 1)+   DoubleToString(3.6, 1) 그러면 문자열로 2.33.6이 됩니다." 즉, 덧셈 이전에는 각 변수의 개수에 대한 문자열 표현이 2자로 구성되었고, 두 개의 문자열 변수를 더한 후에는 덧셈 결과가 4자 숫자의 문자열 표현 결과적으로 코드에 추가하면 문자 수가 두 배인 숫자를 얻지 못하는 이유는 무엇입니까?

사실, 이것은 텍스트를 작성하는 것과 똑같은 방식으로 발생합니다. 먼저 빈 시트가 있습니다. 빈 줄이라고 하는 것이 더 좋습니다. 그런 다음 우리는 첫 번째 단어를 쓰고 두 번째 단어를 추가하는 식으로 진행합니다........ 그리고 텍스트에 숫자가 있으면 줄 문자로 씁니다. 즉, 숫자 2 + 5를 더하면 7이 되고 같은 숫자를 쓰면 먼저 2를 쓰고 5 옆에 ... 두 자리 숫자 25가 연속으로 쓰여집니다. 이것을 더 쉽게 설명하는 방법을 모릅니다.

원칙적으로 컴파일러 경고에 주의를 기울이지 않으면 예제에서 r 값을 문자열로 변환할 필요가 없습니다. 이 두 가지 옵션을 확인하십시오.

 Print ( "Test 1 " + ( string ) 1 + ( string ) 2 );
Print ( "Test 2 " + 1 + 2 );
 
Aleksei Stepanenko :


도움과 조언에 감사드립니다.

 
Alexey Viktorov :

사실, 이것은 텍스트를 작성하는 것과 똑같은 방식으로 발생합니다. 먼저 빈 시트가 있거나 빈 문자열이 더 좋습니다. 그런 다음 우리는 첫 번째 단어를 쓰고 두 번째 단어를 추가하는 식으로 진행합니다........ 그리고 텍스트에 숫자가 있으면 줄 문자로 씁니다. 즉, 숫자 2 + 5를 더하면 7이 되고 같은 숫자를 쓰면 먼저 2를 쓰고 5 옆에 ... 두 자리 숫자 25가 연속으로 쓰여집니다. 이것을 더 쉽게 설명하는 방법을 모릅니다.

원칙적으로 컴파일러 경고에 주의를 기울이지 않으면 예제에서 r 값을 문자열로 변환할 필요가 없습니다. 이 두 가지 옵션을 확인하십시오.

모두 감사합니다

 
ANDREY :

사실 이게 제가 말하고자 하는 바입니다.... BLOCK N 2로 보완된 원본 코드입니다.

두 번째 블록 에서 배열 요소의 값은 더 이상 첫 번째 블록에서와 같이 동일한 델타만큼 서로 다르지 않습니다. 이웃 요소 간의 델타는 다를 수 있으므로 첫 번째 블록에서 두 번째 블록으로 문자열을 연결하는 알고리즘은 적합하지 않습니다.

질문 어떤 언어 구성으로   MQL4에서   또는 기능   MQL4에서 위 코드 의 두 번째 블록 에서 루프 끝의 Print() 함수는 배열 요소의 모든 값이 채워진 상태로 한 번만 인쇄되며 한 줄에 위치하게 됩니다. 즉, 다음 형식을 취합니다.

Print("---LoY[0]--", Х,   "---LoY[1]--"   , X ,     "---LoY[2]--"   , X ,     "---LoY[3]--"   , X ,     "---LoY[4]--"   , X , ...........     "---LoY[30]--"   , X );

나를 가혹하게 판단하지 마십시오. 그러나 두 번째 블록에서는 모든 것이 첫 번째 블록보다 훨씬 더 복잡하기 때문에 말로 설명을 이해할 수 있을지 확신할 수 없습니다.
도와 주셔서 감사합니다.

루프를 반복할 때마다 배열을 정렬하는 이유는 무엇입니까? 결국, 배열의 0번째 요소의 값을 교체하고 정렬 후 배열의 끝으로 갔다면 첫 번째 값은 0이 되고 첫 번째 값은 두 번째 값이 됩니다. 따라서 배열의 첫 번째 요소 값을 건너뛰고 쓰레기를 얻습니다. 일반적으로 모든 코드에는 무언가가 포함되어 있습니다.

배열을 채울 첫 번째 블록이 필요한 이유는 무엇입니까? 원하는 값으로 즉시 배열을 채우고 채우고 정렬합니다. 사실, 줄을 채우고 인쇄하려면 다른 루프를 실행해야 합니다. ArrayPrint()가 mql4에서 구현되지 않은 것은 유감입니다... 그러나 이것은 실험이며 실제로는 배열 값을 인쇄할 필요가 없습니다.

 
Aleksei Stepanenko :

목표를 어떻게 하느냐가 아니라 무엇을 필요 로 하는지 설명하는 것이 좋습니다. 그렇지 않으면 코드에 대해 오랫동안 논의할 수 있지만 다른 방법으로 목표를 해결할 수 있습니다.

mql4(그리고 일부 mql5를 동시에 )를 학습하는 과정에서 다양한 코드를 작성합니다. 배열을 사용하는 코드를 포함합니다. 코드의 한 곳이나 다른 곳에서 배열 요소 의 값을 확인해야 하는 경우가 종종 있습니다. 루프에서 Print()를 사용하여 이 작업을 수행하는 방법을 배웠습니다. 그러나 이 경우 Print() 는 모든 반복에서 인쇄됩니다. 반복이 많으면 프로그램과 읽기 모두 불편하다. 배열 요소의 값이 있는 Print() 가 한 번만 인쇄되도록 Print() 를 루프 외부로 이동해야 한다고 올바르게 말했습니다. 나는 당신의 말보다 먼저 이것을 추측했습니다.

Print()를 루프에서 매우 빠르게 제거하는 방법을 배웠습니다. 이제 Print()가 배열 요소의 모든 값을 한 줄에 인쇄하도록 하는 방법을 배우려고 합니다.

그들은 이것이 내 코드의 첫 번째 블록과 관련하여 어떻게 수행되는지 설명했습니다. 일반적으로 이 기술을 이해했습니다. 이 방법의 세부 사항을 이해하기 위해 계속 머리를 쓰겠습니다.
그러나 내 코드의 두 번째 블록에서는 첫 번째 블록과 달리 두 번째 블록의 배열 요소 값 사이의 델타가 다르기 때문에 첫 번째 블록의 방법이 적합하지 않은 것 같습니다.
내가 옳고 첫 번째 블록의 방법이 두 번째 블록에 적합하지 않은 경우 첫 번째 블록에서 수행한 것과 동일한 작업이 수행되지만 이미 두 번째 블록과 관련하여 수행되는 방법을 보여주시면 감사하겠습니다.

두 번째 블록을 수정했습니다. Print() ArraySort()를 루프 밖으로 이동했습니다. Print() 에서 제거됨   당신을 오도하지 않도록 변수 X.

 int P1= 0 ;
double LoY[ 31 ];
void OnTick ()
{
if (P1== 0 )
{
for ( int r= 0 ; r< 31 ;r++)
{
LoY[r]= 1.6104 +(r* 2 )* 0.0001 ;
P1= 1 ;
}
}
//*************************************************************  Б Л О К    N 2
for ( int x= 0 ; x< 31 ;x++)
{
if (Bid < LoY[x] )
{
LoY[x]=Bid;
}
}
ArraySort (LoY, WHOLE_ARRAY , 0 ,MODE_ASCEND);
Print ( "-LoY[0]-" , (знач.эл.масс с инд. 0 ), "---LoY[1]--" ,  (знач.эл.масс с инд. 1 ),   "---LoY[2]--" ,  (знач.эл.масс с инд. 2 ),   "---LoY[3]--" ,  (знач.эл.масс с инд. 3 ),................   "---LoY[30]--" ,  (знач.эл.масс с инд. 30 ) );
}
 
Print ( "-LoY[0]-" , DoubleToString (LoY[ 0 ], 4 ), "---LoY[1]--" , DoubleToString (LoY[ 1 ], 4 ), "---LoY[2]--" , DoubleToString (LoY[ 2 ], 4 ), "---LoY[3]--" , DoubleToString (LoY[ 3 ], 4 ),................   "---LoY[30]--" ,   DoubleToString (LoY[ 30 ], 4 ) );

또는 별도의 배열 인쇄 기능을 만드십시오.

 void PrintArray( double &eArray)
   {
   string eStr= "" ;
   int eSize= ArraySize (eArray);
   for ( int i= 0 ; i<eSize; i++)
      {
      eStr+= IntegerToString (i)+ ": " + DoubleToString (eArray[i], 4 )+ ", " ;
      }
   Print (str);
   }

그리고 어디에서나 불러

PrintArray(LoY);