MQL5 언어를 처음부터 자가 학습 - 페이지 43

 
Реter Konow :
물론 기본적으로 당신은 진지한 발걸음을 내디뎠습니다. 당신은 기능을 마스터하고 사용하기 시작했습니다. 물론 축하해야 합니다!)

이 속도로, 당신은 곧 후행에 도달합니다 ...

다룬 자료를 통합하는 동안 for 및 while 루프도 공부하기 시작했습니다. 후행은 먼 미래이지만 독학 계획의 필수 항목입니다.

안부 인사를 전합니다. 블라디미르.

 
MrBrooklin :

...

대체로 스크립트는 올바르게 작성되었습니다. Period_learning 의 0 값은 고려하지 않지만 그렇지 않으면 좋습니다.

함수에 인수와 계산을 추가하여 작업의 의미를 "포화"해야 합니다. 이제 한 변수를 다른 변수로 바꾸거나 아무 작업도 하지 않고 값을 반환하기 때문입니다. 함수를 사용하는 예로서 이 옵션은 괜찮지만 실제로는 스크립트에 해결할 수 있는 작업이 있어야 하는데 이 예에서는 그렇지 않습니다.

따라서 나는 이 스크립트를 확장하고 복잡하게 만들거나 함수 계산이 풍부하고 if-else 조건의 작은 트리를 사용하여 보다 의미 있고 새로운 스크립트를 작성하고 작성할 것을 제안합니다.

그가 해결할 수 있는 문제에 대해 생각해 보십시오.



 
Реter Konow :
대체로 스크립트는 올바르게 작성되었습니다. Period_learning의 0 값은 고려하지 않지만 그렇지 않으면 좋습니다.

함수에 인수와 계산을 추가하여 작업의 의미를 "포화"해야 합니다. 이제 한 변수를 다른 변수로 바꾸거나 아무 작업도 하지 않고 값을 반환하기 때문입니다. 함수를 사용하는 예로서 이 옵션은 괜찮지만 실제로는 스크립트에 해결할 수 있는 작업이 있어야 하며 이 예에서는 그렇지 않습니다.

따라서 나는 이 스크립트를 확장하고 복잡하게 만들거나 함수 계산이 풍부하고 if-else 조건의 작은 트리를 사용하여 보다 의미 있고 새로운 스크립트를 작성하고 작성할 것을 제안합니다.

그가 해결할 수 있는 문제에 대해 생각해 보십시오.

글쎄요. Peter, 스크립트를 복잡하게 만들고 함수 내부에 if-else 조건부 연산자를 적용하는 방법에 대해 생각하겠습니다.

안부 인사를 전합니다. 블라디미르.

 

좋은 하루와 좋은 분위기 모두!

계속해서 MQL5 프로그래밍 언어를 공부하고 있습니다. Peter Konov의 팁을 고려하여 이 주제의 참가자가 한 작업을 계속 실행하는 수정된 스크립트 코드를 게시합니다. 스크립트는 모든 모드에서 테스트되었습니다. 문제가 확인되지 않았습니다. 우선 최소한의 입력 매개변수를 적용했습니다. 스크립트 코드는 영어로 작성되었으며 코드에 대한 주석은 자료의 동화를 용이하게 하기 위해 러시아어로 작성되었습니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생이 볼 수 있는 프레젠테이션에서 모든 것을 설명하려고 했습니다.

안부 인사를 전합니다. 블라디미르.

 //+------------------------------------------------------------------+
//|                                                Learning_MQL5.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright    "Copyright 2020, MetaQuotes Software Corp."
#property link          "https://www.mql5.com"
#property description "Скрипт подводит итог обучения языку программирования MQL5. В зависимости от"
#property description "входных параметров печатает во вкладке \"Эксперт\" торгового терминала два"
#property description "сообщения на русском языке: \"Я выучу язык MQL5!\" или \"Я не выучу язык MQL5!\""
#property description "Код скрипта написан на основе примера, приведенного Valeriy Yastremskiy на сайте"
#property description "MQL5, в теме \"Самообучение языку MQL5 с полного нуля\"."
#property description "======================================================"
#property description "Ссылка на пример https://www.mql5.com/ru/forum/352460/page30#comment_18646826"
//---
#property version      "1.00"                //версия скрипта 1.00
//---
#property script_show_inputs                //выводить окно со свойствами перед запуском скрипта 
//--- Зададим входные параметры скрипта:
input ushort Period_learning= 500 ;         //Полный период обучения (в днях)
input ushort Days_passed= 10 ;               //Сколько дней прошло с начала обучения (в днях)
input bool    Patience= true ;               //Терпение (true - достаточно; false - не достаточно)
//--- Зададим глобальные переменные:
//переменная enough_time (достаточно времени), где bool - логическое значение: истина (true) или ложь (false)
bool enough_time;
//переменная enough_patience (достаточно терпения), где bool - логическое значение: истина (true) или ложь (false)
bool enough_patience;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart () //старт работы скрипта
  {
   /* Зададим условие для работы скрипта. Если:
      1. значение функции "имею время" будет равно значению истина (true)
      2. и значение функции "имею терпение" будет равно значению истина (true)
   */
   if (have_time()== true && have_patience()== true )
     {
       Print ( "Я выучу язык MQL5!" );     //выводим сообщение "Я выучу язык MQL5!"
     }
   else //в противном случае
     {
       Print ( "Я не выучу язык MQL5!" ); //выводим сообщение "Я не выучу язык MQL5!"
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Функция "имею_время"
bool have_time()                 //создаём функцию "имею_время" и присвоим тип данных bool
  {
   /* Если:
      1. значение входного параметра Period_learning больше нуля
      2. и значение входного параметра Days_passed больше или равно значения входного параметра Period_learning
   */
   if (Period_learning> 0 && Days_passed>=Period_learning)
      enough_time= true ;           //то тогда значение enough_time (достаточно времени) будет равно истине (true)
   return (enough_time);           //возвращаем значение "достаточно времени" в функцию "имею время"
  }
//--- Функция "имею_терпение"
bool have_patience()             //создаём функцию "имею_терпение" и присвоим тип данных bool
  {
   enough_patience=Patience;     //задаём для переменной enough_patience (достаточно терпения) значение равное
                                 //входному параметру "Терпение" (Patience): истина или ложь
   return (enough_patience);       //возвращаем значение "достаточно терпения" в функцию "имею терпение"
  }
//+------------------------------------------------------------------+
 
MrBrooklin :

좋은 하루와 좋은 분위기 모두!

계속해서 MQL5 프로그래밍 언어를 공부하고 있습니다. Peter Konov의 팁을 고려하여 이 주제의 참가자가 한 작업을 계속 실행하는 수정된 스크립트 코드를 게시합니다. 스크립트는 모든 모드에서 테스트되었습니다. 문제가 확인되지 않았습니다. 우선 최소한의 입력 매개변수를 적용했습니다. 스크립트 코드는 영어로 작성되었으며 코드에 대한 주석은 자료의 동화를 용이하게 하기 위해 러시아어로 작성되었습니다. 이 대본에서는 앞서 약속한 대로 프로그래밍 학교 1학년 학생이 볼 수 있는 프레젠테이션에서 모든 것을 설명하려고 했습니다.

안부 인사를 전합니다. 블라디미르.

박쥐에서 한 가지 실수를 바로잡으면 완벽할 것입니다.

요점은 have_time() 함수에 구조적 오류가 있다는 것입니다. 힌트를 주세요:

조건의 본문이 중괄호로 묶이지 않으면 조건 자체는 그 뒤의 첫 번째 줄에만 적용됩니다. 조건 본문에 대괄호가 없으므로 본문의 항목은 충분합니다_time =true; 뒤에 오는 반환과 관련이 없으며 항상 마지막 충분 시간 값을 반환합니다. 조건이 거짓이더라도 변수가 참 값을 갖기 전에 return은 참을 반환합니다.

그것을 고칠 방법에 대해 생각하십시오.

추신 이것이 스크립트이고 한 번만 작동한다는 사실에도 불구하고 오류는 여전히 있습니다.

추신 또한 전역 변수는 초기값으로 초기화해야 하며 초기화되지 않은 변수가 2개 있습니다. 이것은 "반 오류"입니다.
 
Реter Konow :
박쥐에서 한 가지 실수를 바로잡으면 완벽할 것입니다.

요점은 have_time() 함수에 구조적 오류가 있다는 것입니다. 힌트를 주세요:

조건의 본문이 중괄호로 묶이지 않으면 조건 자체는 그 뒤의 첫 번째 줄에만 적용됩니다. 조건 본문에 대괄호가 없으므로 본문의 항목은 충분합니다_time =true; 뒤에 오는 반환과 관련이 없으며 항상 마지막 충분 시간 값을 반환합니다. 조건이 거짓이더라도 변수가 참 값을 갖기 전에 return은 참을 반환합니다.

그것을 고칠 방법에 대해 생각하십시오.

추신 이것이 스크립트이고 한 번만 작동한다는 사실에도 불구하고 오류는 여전히 있습니다.

추신 또한 전역 변수는 초기값으로 초기화해야 하며 초기화되지 않은 변수가 2개 있습니다. 이것은 "반 오류"입니다.

함수와 관련하여 다음과 같은 코드를 작성할 필요가 있다고 가정합니다.

 //--- Функция "имею_время"
bool have_time()                 //создаём функцию "имею_время" и присвоим тип данных bool
  {
   /* Если:
      1. значение входного параметра Period_learning больше нуля
      2. и значение входного параметра Days_passed больше или равно значения входного параметра Period_learning
   */
   if (Period_learning> 0 && Days_passed>=Period_learning)
     {
      enough_time= true ;         //то значение enough_time (достаточно времени) будет равно истине (true)
     }
   else                         //в противном случае 
     {
      enough_time= false ;        //значение enough_time (достаточно времени) будет равно ложь (false)
     }
   return (enough_time);          //возвращаем значение "достаточно времени" в функцию "имею время"
  }
안부 인사를 전합니다. 블라디미르.
 
MrBrooklin :

함수와 관련하여 다음과 같은 코드를 작성할 필요가 있다고 가정합니다.

안부 인사를 전합니다. 블라디미르.
권리!
 
Реter Konow :
박쥐에서 한 가지 실수를 바로잡으면 완벽할 것입니다.

요점은 have_time() 함수에 구조적 오류가 있다는 것입니다. 힌트를 주세요:

조건의 본문이 중괄호로 묶이지 않으면 조건 자체는 그 뒤의 첫 번째 줄에만 적용됩니다. 조건 본문에 대괄호가 없으므로 본문의 항목은 충분합니다_time =true; 뒤에 오는 반환과 관련이 없으며 항상 마지막 충분 시간 값을 반환합니다. 조건이 거짓이더라도 변수가 참 값을 갖기 전에 return은 참을 반환합니다.

그것을 고칠 방법에 대해 생각하십시오.

추신 이것이 스크립트이고 한 번만 작동한다는 사실에도 불구하고 오류는 여전히 있습니다.

추신 또한 전역 변수는 초기값으로 초기화해야 하며 초기화되지 않은 변수가 2개 있습니다. 이것은 "반 오류"입니다.

전역 개체는 기본 생성자로 초기화 됩니다. 프리미티브(우리의 경우 문자열을 제외한 모든 유형) 유형의 경우 이는 0입니다. 그러나 스택에 할당된 메모리(변수 읽기)의 경우 초기화가 수행되지 않습니다. 따라서 전역 변수는 초기화할 수 없습니다. 이 경우 변수는 0과 같습니다. 그러나 초기화 부족(동시에 컴파일러 경고를 피하기 위해 즉시 익숙해지십시오. 물론 수행 중인 작업을 명확하게 알고 있지 않는 한) - 초기화되지 않은 변수를 읽으면 정의되지 않은 동작으로 이어지기 때문에 이것은 이미 더 심각합니다. 예를 들어, 이 코드는 릴리스 및 디버그 빌드에서 다르게 동작하며, 컴파일러 버전이나 최적화 설정을 변경할 때 동작이 변경되지 않을 것이라고 누구도 보장할 수 없습니다.

 int Test( bool condition, int in ){
   int ret;
   if (condition) ret= in ;
   return ret;
}

void OnStart()
{
   for ( int i= 0 ;i< 5 ;Print(Test( false ,i++)));
}
 
Реter Konow :

"...P.S.S. 그리고 전역변수는 초기값으로 초기화 해야 하는데 초기화 안된 변수가 2개 있습니다. 이건 "세미오류" 입니다..."

Peter, 하지만 전역 변수 에 관해서는 전역 변수가 미리 미리 결정되어야 한다는 문헌을 아직 찾지 못했습니다. 이 주제에 대한 지식을 높일 수 있는 출처에 대한 링크가 있습니까? MQL5 참조에는 초기화에 대한 명시적 표시가 없습니다 . 다음은 해당 참조에서 발췌한 것입니다.

bool 유형 숫자 표현이 각각 1 또는 0인 논리값 true (true) 또는 false (false)를 저장하도록 설계되었습니다.

예:

부울 a = true ;
부울 b = 거짓 ;
부울 c = 1 ;

내부 표현은 1바이트 크기의 정수입니다. 논리 표현식에서 bool 유형 대신 다른 정수 또는 실수 유형 또는 이러한 유형의 표현식을 사용하는 것이 허용되며 컴파일러는 오류를 생성하지 않습니다. 이 경우 값 0은 false로 해석되고 다른 모든 값은 true로 해석됩니다.

안부 인사를 전합니다. 블라디미르.
 
Vladimir Simakov :

전역 개체는 기본 생성자로 초기화 됩니다. 프리미티브(우리의 경우 문자열을 제외한 모든 유형) 유형의 경우 이는 0입니다. 그러나 스택에 할당된 메모리(변수 읽기)의 경우 초기화가 수행되지 않습니다. 따라서 전역 변수는 초기화할 수 없습니다. 이 경우 변수는 0과 같습니다. 그러나 초기화 부족(동시에 컴파일러 경고를 피하기 위해 즉시 익숙해지십시오. 물론 수행 중인 작업을 명확하게 알고 있지 않는 한) - 초기화되지 않은 변수를 읽으면 정의되지 않은 동작으로 이어지기 때문에 이것은 이미 더 심각합니다. 예를 들어 이 코드는 릴리스 및 디버그 빌드에서 다르게 동작하며 컴파일러 버전이나 최적화 설정을 변경할 때 그 동작이 변경되지 않을 것이라고 누구도 보장할 수 없습니다.

이것은 확실히 유익하지만 명확성을 위해 전역 변수를 명시적으로 초기화하는 것이 바람직합니다. 예를 들어, mql4에서 변수/배열은 선언될 때 전혀 초기화되지 않을 수 있지만 여전히 초기 0을 얻습니다. ))