MQL5 dilini sıfırdan kendi kendine öğrenme - sayfa 43

 
Реter Konow :
Temelde, elbette, ileriye doğru ciddi bir adım attınız - elbette tebrik etmeniz gereken işlevlerde ustalaştınız ve kullanmaya başladınız!)

Bu oranda, yakında takipte olacaksınız ...

İşlenen materyali pekiştirirken for ve while döngülerini de incelemeye başladım. Takip, uzak bir gelecekte olmasına rağmen, kendi kendine çalışma planında zorunlu bir maddedir.

Saygılarımla, Vladimir.

 
MrBrooklin :

...

Genel olarak, komut dosyası doğru yazılmıştır. Period_learning'in sıfır değerini hesaba katmaz, ancak bunun dışında iyidir.

İşlerinin anlamını "doldurmak" için işlevlere argümanlar ve hesaplamalar eklemek gerekir, çünkü artık bir değişkeni başka bir değişkenle değiştirirler veya onunla hiçbir şey yapmadan bir değer döndürürler. İşlevlerin kullanımına bir örnek olarak, bu seçenek uygundur, ancak gerçekte, komut dosyasının bu örnekte olmayan çözülebilir bir görevi olmalıdır.

Bu nedenle, ya bu betiği genişletmeyi ve karmaşıklaştırmayı ya da daha anlamlı, fonksiyonlar açısından zengin ve küçük bir if-else koşulları ağacıyla yeni bir tane bulup yazmayı öneriyorum.

Hangi sorunu çözebileceğini düşün.



 
Реter Konow :
Genel olarak, komut dosyası doğru yazılmıştır. Period_learning'in sıfır değerini hesaba katmaz, ancak bunun dışında iyidir.

İşlerinin anlamını "doldurmak" için işlevlere argümanlar ve hesaplamalar eklemek gerekir, çünkü artık bir değişkeni başka bir değişkenle değiştirirler veya onunla hiçbir şey yapmadan bir değer döndürürler. İşlevlerin kullanımına bir örnek olarak, bu seçenek uygundur, ancak gerçekte, komut dosyasının bu örnekte olmayan çözülebilir bir görevi olmalıdır.

Bu nedenle, ya bu betiği genişletmeyi ve karmaşıklaştırmayı ya da daha anlamlı, fonksiyonlar açısından zengin ve küçük bir if-else koşulları ağacıyla yeni bir tane bulup yazmayı öneriyorum.

Hangi sorunu çözebileceğini düşün.

Peter, senaryoyu karmaşıklaştırmanın ve fonksiyon içinde if-else koşullu bir operatör uygulamanın nasıl mümkün olacağını düşüneceğim.

Saygılarımla, Vladimir.

 

Herkese iyi günler ve iyi bir ruh hali!

MQL5 programlama dilini öğrenmeye devam ediyorum. Peter Konov'un ipuçlarını dikkate alarak, bu konudaki katılımcılar tarafından bir görevin yürütülmesinin devamı olan değiştirilmiş komut kodunu gönderiyorum. Komut dosyası tüm modlarda test edildi. Herhangi bir sorun tespit edilmedi. Başlangıç olarak, minimum sayıda giriş parametresi uyguladım. Komut dosyası kodu İngilizce olarak yazılmıştır ve materyalin özümsenmesini kolaylaştırmak için koda yapılan yorumlar Rusça'dır. Bu senaryoda, daha önce söz verdiğim gibi, bir programlama okulunun 1. sınıf öğrencisinin erişebileceği bir sunumda her şeyi açıklamaya çalıştım.

Saygılarımla, Vladimir.

 //+------------------------------------------------------------------+
//|                                                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 :

Herkese iyi günler ve iyi bir ruh hali!

MQL5 programlama dilini öğrenmeye devam ediyorum. Peter Konov'un ipuçlarını dikkate alarak, bu konudaki katılımcılar tarafından bir görevin yürütülmesinin devamı olan değiştirilmiş komut kodunu gönderiyorum. Komut dosyası tüm modlarda test edildi. Herhangi bir sorun tespit edilmedi. Başlangıç olarak, minimum sayıda giriş parametresi uyguladım. Komut dosyası kodu İngilizce olarak yazılmıştır ve materyalin özümsenmesini kolaylaştırmak için koda yapılan yorumlar Rusça'dır. Bu senaryoda, daha önce söz verdiğim gibi, bir programlama okulunun 1. sınıf öğrencisinin erişebileceği bir sunumda her şeyi açıklamaya çalıştım.

Saygılarımla, Vladimir.

Bir hatayı hemen düzeltin ve mükemmel olacak.

Mesele şu ki, have_time() işlevinde yapısal bir hata var. Bana bir ipucu ver:

Koşulun gövdesi kaşlı ayraçlar içinde değilse, koşulun kendisi yalnızca ondan sonraki ilk satır için geçerlidir. Koşul gövdenizin parantezleri olmadığından, gövdedeki giriş yeterli_zaman =true; onu takip eden dönüşle ilgili değildir, bu her zaman son yeterli_zaman değerini döndürür. Koşul yanlış olsa bile, ancak bundan önce değişken doğru değerini almış olsa bile, dönüşün doğru olacağı ortaya çıktı.

Nasıl düzelteceğinizi düşünün.

not Bunun bir komut dosyası olmasına ve yalnızca bir kez çalışmasına rağmen, hata hala orada.

not Ayrıca, global değişkenler ilk değerle başlatılmalıdır ve başlatılmamış 2 değişkeniniz var. Bu bir "yarı hata"dır.
 
Реter Konow :
Bir hatayı hemen düzeltin ve mükemmel olacak.

Mesele şu ki, have_time() işlevinde yapısal bir hata var. Bana bir ipucu ver:

Koşulun gövdesi kaşlı ayraçlar içinde değilse, koşulun kendisi yalnızca ondan sonraki ilk satır için geçerlidir. Koşul gövdenizin parantezleri olmadığından, gövdedeki giriş yeterli_zaman =true; onu takip eden dönüşle ilgili değildir, bu her zaman son yeterli_zaman değerini döndürür. Koşul yanlış olsa bile, ancak bundan önce değişken doğru değerini almış olsa bile, dönüşün doğru olacağı ortaya çıktı.

Nasıl düzelteceğinizi düşünün.

not Bunun bir komut dosyası olmasına ve yalnızca bir kez çalışmasına rağmen, hata hala orada.

not Ayrıca, global değişkenler ilk değerle başlatılmalıdır ve başlatılmamış 2 değişkeniniz var. Bu bir "yarı hata"dır.

İşlevle ilgili olarak, kodu şöyle yazmanın gerekli olduğunu varsayıyorum:

 //--- Функция "имею_время"
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);          //возвращаем значение "достаточно времени" в функцию "имею время"
  }
Saygılarımla, Vladimir.
 
MrBrooklin :

İşlevle ilgili olarak, kodu şöyle yazmanın gerekli olduğunu varsayıyorum:

Saygılarımla, Vladimir.
Doğru!
 
Реter Konow :
Bir hatayı hemen düzeltin ve mükemmel olacak.

Mesele şu ki, have_time() işlevinde yapısal bir hata var. Bana bir ipucu ver:

Koşulun gövdesi kaşlı ayraçlar içinde değilse, koşulun kendisi yalnızca ondan sonraki ilk satır için geçerlidir. Koşul gövdenizin parantezleri olmadığından, gövdedeki giriş yeterli_zaman =true; onu takip eden dönüşle ilgili değildir, bu her zaman son yeterli_zaman değerini döndürür. Koşul yanlış olsa bile, ancak bundan önce değişken doğru değerini almış olsa bile, dönüşün doğru olacağı ortaya çıktı.

Nasıl düzelteceğinizi düşünün.

not Bunun bir komut dosyası olmasına ve yalnızca bir kez çalışmasına rağmen, hata hala orada.

not Ayrıca, global değişkenler ilk değerle başlatılmalıdır ve başlatılmamış 2 değişkeniniz var. Bu bir "yarı hata"dır.

Global nesneler, varsayılan bir kurucu ile başlatılır . İlkel (bizim durumumuzda, dize hariç her şey) türleri için bu 0'dır. Ancak yığında tahsis edilen bellek (okunan değişkenler) için başlatma yapılmaz. Bu nedenle, global değişkenler başlatılamaz, bu durumda sıfıra eşit olacaklarını unutmayın. Ancak başlatma eksikliği (aynı zamanda, derleyici uyarılarından kaçınmak için hemen alışın , tabii ki, ne yaptığınızı açıkça bilmiyorsanız) - başlatılmamış bir değişkeni okumak tanımsız davranışa yol açtığı için bu zaten daha ciddi. Örneğin, bu kod yayın ve hata ayıklama yapılarında farklı davranır ve hiç kimse derleyici sürümünü veya optimizasyon ayarlarını değiştirdiğinizde davranışının da değişmeyeceğini garanti edemez:

 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. Ayrıca, global değişkenler başlangıç değeriyle başlatılmalı ve başlatılmamış 2 değişkeniniz var. Bu bir "yarı hata"..."

Peter, ancak global değişkenlere gelince , literatürde global değişkenlerin önceden belirlenmesi gerektiğini henüz bulamadım. Bu konudaki bilginizi artırmak için bir kaynağa bağlantınız var mı? MQL5 Referansında başlatma hakkında açık bir gösterge yoktur , işte ondan bir alıntı:

Bool türü, sayısal gösterimi sırasıyla 1 veya 0 olan true (true) veya false (false) mantıksal değerlerini depolamak için tasarlanmıştır .

Örnekler:

bool a = doğru ;
bool b = yanlış ;
bool c = 1 ;

Dahili gösterim, 1 bayt boyutunda bir tamsayıdır. Unutulmamalıdır ki mantıksal ifadelerde bool türü yerine başka tamsayı veya gerçek tür veya bu tür ifadelerin kullanılmasına izin verilir, derleyici hata üretmeyecektir. Bu durumda sıfır değeri yanlış, diğer tüm değerler doğru olarak yorumlanacaktır.

Saygılarımla, Vladimir.
 
Vladimir Simakov :

Global nesneler, varsayılan bir kurucu ile başlatılır . İlkel (bizim durumumuzda, dize hariç her şey) türleri için bu 0'dır. Ancak yığında tahsis edilen bellek (okunan değişkenler) için başlatma yapılmaz. Bu nedenle, global değişkenler başlatılamaz, bu durumda sıfıra eşit olacaklarını unutmayın. Ancak başlatma eksikliği (aynı zamanda, derleyici uyarılarından kaçınmak için hemen alışın , tabii ki, ne yaptığınızı açıkça bilmiyorsanız) - başlatılmamış bir değişkeni okumak tanımsız davranışa yol açtığı için bu zaten daha ciddi. Örneğin, bu kod yayın ve hata ayıklama yapılarında farklı davranır ve hiç kimse derleyici sürümünü veya optimizasyon ayarlarını değiştirdiğinizde davranışının da değişmeyeceğini garanti edemez:

Bu kesinlikle bilgilendiricidir, ancak netlik için genel değişkenleri açıkça başlatmak istenir. Örneğin, mql4'te değişkenler/diziler bildirildiğinde hiç başlatılamayabilir, ancak yine de ilk sıfır alırlar. ))