[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 264

 
Dmido >> :

Yeni başlayanlar için bizimle bir hafta gibi görünüyor, ardından size profesyonellere gideceğimiz son tarih)))


Son paylaşımlara göre...

hadi çözelim :) bağlamı belirtin.

 

Bağlam? basit...

Makale Öğreticiden düzenli bir program oluşturma ( https://book.mql4.com/en/build/index ).

Program <Inform.mqh> dosyasını içerir.

""""""

Uygun ayarlarla özel bir gösterge kullanılarak bilgileri görüntülemek için ayrı bir alt pencere oluşturulur. Bu göstergenin tek amacı bir alt pencere oluşturmaktır, bu nedenle göstergede herhangi bir hesaplama yapılmaz ve gösterge çizgilerinin çizilme amacı da ayarlanmaz. Inform.mq4 gösterge kodu şöyle görünebilir:

 //--------------------------------------------------------------------
// Inform.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
#property indicator_separate_window // Отдельное окно индикатора
//--------------------------------------------------------------------
int start () // Специальная функция start()
{
}
//--------------------------------------------------------------------

Genel durumda, programcı, kendi takdirine bağlı olarak, göstergeye gerekli kodu ekleyebilir, böylece ona ek özellikler kazandırabilir. Örneğin, gösterge alt penceresinin bir bölümünde gösterge çizgileri görüntülenebilir. Bu örnek, grafik nesnelerin görüntüleneceği pencerede basit bir gösterge kodu önerir.

""""

Peki, o zaman Inform dosyasının kodu. Ve hayatım boyunca, grafikte ondan nasıl sinyal alacağımı anlamıyorum ??? Program çizelgede komutlar veriyormuş gibi çalışıyor ama boş... Inform göstergesini ekleyip içine bir şeyler yazmam gerekiyor mu? Yoksa bir şekilde farklı mı?


Lütfen bana nasıl yapılacağını söyle

 
Dmido >> :

Lütfen bana nasıl yapılacağını söyle


Küçük bir teori ile başlayalım. Bir MQL programı ... bir programdır. Yani yapması söylenmeyen işlemleri yapamaz. "Program yürütme" Yardım bölümünde, Uzman/Göstergeye yeni bir onay işareti geldiğinde start() işlevinin yürütüldüğünü okuyabilirsiniz. Inform() işlevi start() işlevinden çağrılmazsa, yürütülmez. Şimdi bahsettiğiniz bölümdeki makaleyi daha fazla okuyoruz: Inform() işlevi, programda bir sonraki mesajı görüntülemek için gerekli olan herhangi bir yerden çağrılabilir. Onlar. bir mesaj göstermemiz gereken start() fonksiyonunda yazıyoruz

Inform(Mess_Number, Number, Value);
 
Doğal olarak Mess_Number, Number, Value değişkenleri önceden bildirilmeli ve bazı değerler atanmalıdır.
 

Açıklama için teşekkürler tabiki ama genellikle programdan çağrılıyor, ana gövdede yok ama diğer içeriklerde her yerde var ve mesaj göndererek çağrılıyor ama görüntülenmiyor(


örnek olarak, Close_All.mqh'den bir satır

 
if (İpucu==1) Price_Cls=Sor; // Satış emirleri için
Bilgilendir(12, Bilet); // Kapatma girişimiyle ilgili mesaj.

 
start () işlevi için kodunuzu yazın, analiz edeceğiz, aksi takdirde hiçbir şey hakkında tartışıyor gibi görünüyoruz
 
int start()                            // Спец. функция start
  {
        
   Terminal();                         // Функция учёта ордеров 
   Events();                           // Информация о событиях
   Trade(Criterion());                 // Торговая функция
   Inform(0);                          // Для перекрашивания объектов
   return;                             // Выход из start()
  }

Temelde ders kitabındakiyle aynıdır. Tüm aramalar dahil dosyalardan gelir.

Burada örneğin

 //--------------------------------------------------------------------
// Events.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция слежения за событиями.
// Глобальные переменные:
// Level_new            Новое значение минимальной дистанции
// Level_old            Предыдущее значение минимальной дистанции
// Mas_Ord_New[31][9]   Массив ордеров последний известный
// Mas_Ord_Old[31][9]   Массив ордеров предыдущий (старый)
//--------------------------------------------------------------- 2 --
int Events ( )                                // Пользовательская функция
   {
   bool Conc_Nom_Ord ;                      // Совпадение ордеров в ..
   //.. старом и новом массивах
//--------------------------------------------------------------- 3 --
   Level_new = MarketInfo ( Symbol ( ) , MODE_STOPLEVEL ) ; // Последн.известное
   if ( Level_old ! = Level_new )                // Новое не равно старому..
     {                                      // значит изменились условия
      Level_old = Level_new ;                  // Новое "старое значение"
      Inform ( 10 , Level_new ) ;                // Сообщение: новая дистанц.
     }
//--------------------------------------------------------------- 4 --
   // Поиск пропавших, поменявших тип, частично закрытых и переоткрытых
   for ( int old = 1 ; old < = Mas_Ord_Old [ 0 ] [ 0 ] ; old + + ) // По массиву старых
     {                                      // Исходим из того, что..
      Conc_Nom_Ord = false ;                  // ..ордера не совпадают
       //--------------------------------------------------------- 5 --
       for ( int new = 1 ; new < = Mas_Ord_New [ 0 ] [ 0 ] ; new + + ) //Цикл по массиву ..
         {                                  //..новых ордеров
         //------------------------------------------------------ 6 --
         if ( Mas_Ord_Old [ old ] [ 4 ] = = Mas_Ord_New [ new ] [ 4 ] ) // Совпал номер 
           {                                // Тип ордера стал ..
             if ( Mas_Ord_New [ new ] [ 6 ] ! = Mas_Ord_Old [ old ] [ 6 ] ) //.. другим
               Inform ( 7 , Mas_Ord_New [ new ] [ 4 ] ) ; // Сообщение: преобраз.:)
            Conc_Nom_Ord = true ;              // Ордер найден, ..
             break ;                          // ..значит выходим из ..
           }                                // .. внутреннего цикла
         //------------------------------------------------------ 7 --
                                           // Не совпал номер ордера
         if ( Mas_Ord_Old [ old ] [ 7 ] > 0 & &      // MagicNumber есть, совпал
            Mas_Ord_Old [ old ] [ 7 ] = = Mas_Ord_New [ new ] [ 7 ] ) //.. со старым
           {                //значит он переоткрыт или частично закрыт
                                             // Если лоты совпадают,.. 
             if ( Mas_Ord_Old [ old ] [ 5 ] = = Mas_Ord_New [ new ] [ 5 ] )
               Inform ( 8 , Mas_Ord_Old [ old ] [ 4 ] ) ; // ..то переоткрытие
             else                              // А иначе это было.. 
               Inform ( 9 , Mas_Ord_Old [ old ] [ 4 ] ) ; // ..частичное закрытие
            Conc_Nom_Ord = true ;                // Ордер найден, ..
             break ;                            // ..значит выходим из ..
           }                                  // .. внутреннего цикла
         }
       //--------------------------------------------------------- 8 --
       if ( Conc_Nom_Ord = = false )                // Если мы сюда дошли,..
         {                                      // ..то ордера нет:(
         if ( Mas_Ord_Old [ old ] [ 6 ] = = 0 )
            Inform ( 1 , Mas_Ord_Old [ old ] [ 4 ] ) ;    // Ордер Buy закрыт
         if ( Mas_Ord_Old [ old ] [ 6 ] = = 1 )
            Inform ( 2 , Mas_Ord_Old [ old ] [ 4 ] ) ;    // Ордер Sell закрыт
         if ( Mas_Ord_Old [ old ] [ 6 ] > 1 )
            Inform ( 3 , Mas_Ord_Old [ old ] [ 4 ] ) ;    // Отложен. ордер удалён
         }
     }
//--------------------------------------------------------------- 9 --
   // Поиск новых ордеров 
   for ( new = 1 ; new < = Mas_Ord_New [ 0 ] [ 0 ] ; new + + ) // По массиву новых орд.
     {
       if ( Mas_Ord_New [ new ] [ 8 ] > 0 )              //Это не новый,а переоткр
         continue ;                            //..или частично закрытый
      Conc_Nom_Ord = false ;                    // Пока совпадения нет
       for ( old = 1 ; old < = Mas_Ord_Old [ 0 ] [ 0 ] ; old + + ) // Поищем этот ордерок 
         {                                    // ..в массиве старых
         if ( Mas_Ord_New [ new ] [ 4 ] = = Mas_Ord_Old [ old ] [ 4 ] ) //Совпал номер..
           {                                            //.. ордера
            Conc_Nom_Ord = true ;                // Ордер найден, ..
             break ;                            // ..значит выходим из ..
           }                                  // .. внутреннего цикла
         }
       if ( Conc_Nom_Ord = = false )                // Если совпадения нет,..
         {                                    // ..то ордер новый :)
         if ( Mas_Ord_New [ new ] [ 6 ] = = 0 )
            Inform ( 4 , Mas_Ord_New [ new ] [ 4 ] ) ; // Ордер Buy открыт
         if ( Mas_Ord_New [ new ] [ 6 ] = = 1 )
            Inform ( 5 , Mas_Ord_New [ new ] [ 4 ] ) ; // Ордер Sell открыт
         if ( Mas_Ord_New [ new ] [ 6 ] > 1 )
            Inform ( 6 , Mas_Ord_New [ new ] [ 4 ] ) ; // Установлен отлож.ордер
         }
     }
//-------------------------------------------------------------- 10 --
   return ;
   }
//-------------------------------------------------------------- 11 --
 
Dmido >> :

Temelde ders kitabındakiyle aynıdır. Tüm aramalar dahil dosyalardan gelir.

Burada örneğin

Burada Inform, zamanın cehennemi olarak adlandırılır, ancak ekranda nasıl gösterileceği açık değildir .... mesajların da nereye gittiği (

 
Örnekteki Criterion() işlevine de sahip olduğunuzu anlıyorum. Ardından, ders kitabında belirtilen stratejiye göre bir pozisyon açma kriterleri tetiklenene kadar bekleyin - ve Inform() işlevinin çalışmasını hemen göreceksiniz. Peki ya da terminaldeki ilgili düğmeyle manuel olarak açın, ayrıca çalışması gerekir ...
 
Hayır, kendi kriterimi belirledim) o zaman tüm bunları başlatmak mantıklıydı, ancak orijinal olanla bile işe yaramadı (her şeyi yeniden yazmak zaten zor, ancak kriter emirleri düzgün bir şekilde açmak için gönderiyor, işlemler açılıyor) , olaylar meydana gelir ve çıktı 0 mesajdır .. .