MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1188

 
Ivan_Invanov :
Genel olarak, cevabınıza bakılırsa, programın nasıl çalıştığını gerçekten anlamıyorsunuz. Bu aptalca bir soru gibi görünüyor. Evet, önceki yorumcunun durduğunu düşündüğü gibi. Sadece diğer dillerde programlama deneyiminden yola çıkarak, vücudunu bir döngü içinde çalıştırdığını ve bir olay geldiğinde onun içine daldığını düşünüyorum. Program gövdesini bir döngüde çalıştırıyorsa, bu, programın neden bu şekilde yazıldığını açıklar.

"New tick" olayı geldiğinde, program OnTick() işleyicisinde başlar, sonuna kadar çalışır ve durur. Yeni bir kene gelişiyle, her şey baştan tekrar eder. Programın yürütülmesi sırasında bir sonraki onay işareti geldiyse ve program bir önceki onay işaretini işlemeyi henüz tamamlamadıysa (hala çalışıyorsa), bu işaret atlanır.

MQL programları döngülü değildir. Üç giriş noktası vardır - OnInit(), OnDeinit() ve OnTick()

Başlangıçta OnInit() yürütülür, ardından onay geldiğinde OnTick() ve tamamlandığında OnDeinit() yürütülür.

Başka işleyiciler de var. Ancak, birinden onu burada kopyalamasını istemektense , yardımı açmanız sizin için daha iyidir.

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

Merhaba. Göstergem üzerinde çalışırken, terminali yeniden başlatırken bir kilitlenme buldum. Bu hatayı temel alarak, test etmek için küçük bir kaynak yaptım:

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private :
   string symbol;
   ENUM_TIMEFRAMES timeframe;

public :  
  Loader(): symbol( Symbol ()), timeframe(Period()) 
  {
     Print ( __FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString (timeframe));
     ResetLastError ();
     Print ( __FUNCTION__ + " bars: " + ( string ) iBars (symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
     Print ( __FUNCTION__ + " Error: " + ( string ) GetLastError ());
     Print ( __FUNCTION__ + " bars (2): " + ( string ) iBars ( Symbol (), Period ())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
//--- indicator buffers mapping
  loader = new Loader();
//---
   return ( INIT_SUCCEEDED );
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
   delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[]
) {
   return (rates_total);
}

Bu örnek çizelgeye atılırsa (veya bu, sistem başlatıldıktan sonra terminalin ilk açılışıysa), o zaman her şey yolunda gider. Günlük şunları söylüyor:

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 Yükleyici::Yükleyici çubukları: 140433

2020.06.24 21:05:50.773 Yükleyici::YükleyiciHatası: 0

2020.06.24 21:05:50.773 Yükleyici::Yükleyici çubukları (2): 140433


Ancak bu göstergeyle terminali yeniden başlatırsam bir hata alıyorum:

2020.06.24 21:07:34.963 Yükleyici::Yükleyici sembolü: EURUSD zaman çerçevesi: PERIOD_H1

2020.06.24 21:07:34.963 Yükleyici::Yükleyici çubukları: 0

2020.06.24 21:07:34.963 Yükleyici::YükleyiciHatası: 4401

2020.06.24 21:07:34.964 Yükleyici::Yükleyici çubukları (2): 140433

Sembol ve zaman çerçevesi normal olarak başlatıldı

2020.06.24 21:07:34.963 Yükleyici::Yükleyici sembolü: EURUSD zaman çerçevesi: PERIOD_H1

Ama iBars(sembol, timeframe) nedense 0 veriyor

2020.06.24 21:07:34.963 Yükleyici::Yükleyici çubukları: 0

Bu, 4401 hatasıyla sonuçlanır.

Ancak iBars(Symbol(), Period()) harika çalışıyor.

2020.06.24 21:07:34.964 Yükleyici::Yükleyici çubukları (2): 140433

Günlük mesajlarına göre symbol = Symbol() ve timeframe = Period() olmasına rağmen (terminali yeniden başlatırken gecikme sırasında bile). Günlüğe göre fonksiyonlardaki parametreler aynıysa iBars(Symbol(), Period()) düzgün çalışırken, kesinlikle doğru sembol ve zaman çerçevesi ile iBars(sembol, zaman çerçevesi) nasıl sıfır döndürebilir?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Dosyalar:
Test.mq5  7 kb
 
Bu konunun moderatörünü kim tanıyor?
 

MetaQuotes Demo'da demo MT4 hesabı nasıl açılır? Eskiden sorunsuz çalışıyordu, şimdi diyaloğun son sayfasında şöyle yazıyor: Kayıt, Biraz bekleyin lütfen ve bu durumda sonsuza kadar boşta kalır, oturum açma ve şifre alanları boş kalır. Günlükte mesaj yok. Hem "demo" hem de "gerçek" ve farklı hesap türlerini denedim.

UPD. Bir komisyoncunun demosunu denedim - aynı çöp.

 
Artyom Trishkin :

"New tick" olayı geldiğinde, program OnTick() işleyicisinde başlar, sonuna kadar çalışır ve durur. Yeni bir kene gelişiyle, her şey baştan tekrar eder. Programın yürütülmesi sırasında bir sonraki onay işareti geldiyse ve program bir önceki onay işaretini henüz tamamlamadıysa (hala çalışıyorsa), bu işaret atlanır.

MQL programları döngülü değildir. Üç giriş noktası vardır - OnInit(), OnDeinit() ve OnTick()

Başlangıçta OnInit() yürütülür, ardından onay geldiğinde OnTick() ve tamamlandığında OnDeinit() yürütülür.

Başka işleyiciler de var. Ancak, birinden onu burada kopyalamasını istemektense , yardımı açmanız sizin için daha iyidir.

Teşekkür ederim. Evet, anlıyorum, sadece fonksiyon programın gövdesinde yazıyor. Belki bir yerde aramasını kaçırdım.
 
Ivan_Invanov :
Teşekkür ederim. Evet, anlıyorum, sadece fonksiyon programın gövdesinde yazıyor. Belki bir yerde aramasını kaçırdım.

Bahsettiğiniz şeyi nasıl görebiliriz? Örnek vermek.

 
Artyom Trishkin :

Bahsettiğiniz şeyi nasıl görebiliriz? Örnek vermek.

Tekrar teşekkürler evet, aramayı fark etmedim, sadece baktım ve fırsatları açan fonksiyon tarafından çağrıldı .
 
Ivan_Invanov :
Teşekkür ederim. Evet, anlıyorum, sadece fonksiyon programın gövdesinde yazıyor. Belki bir yerde aramasını kaçırdım.

mql4'te fonksiyonlar herhangi bir sırayla yazılır, tamburda yukarı ve aşağı, er ya da geç çalışıyor gibi görünebilir. C++'da böyle bir şey yok, tüm fonksiyonlar sadece yazma sırasına göre çalışabilir ve eğer onu çağırmak istiyorsanız, o zaman çağrı sitesinden önce tanımlanmalıdır, aksi takdirde program çöker. Kişi, fonksiyonları farklı şekillerde yazabileceğim şekilde nasıl yapılacağını gösterdi, ancak C++ 'da nasıl yapıldığını hatırlamıyorum ve bunun pek önemi yok.

 
Ivan_Invanov :

Selamlar. Bana yardım et lütfen. Bir sorum var. doğru mu anladım. Programın baştan sona çalıştığı, ancak bir tik gibi bir olay geldiğinde kesintiye uğradığı, ontick işlevinin yürütmeye başladığı, ardından yürütmeyi bitirdiği ve programın yeniden baştan yürütüldüğü mü? Bu soru bununla ilgili, nereye yazmalıyım, örneğin işlem lotunun büyüklüğünü? program gövdesinde mi yoksa ontick işlevinde mi?

Örnek olarak programın gövdesinde lot hesaplamanın yapıldığı terminalde bulunan resmi bota bakıyorum ve nedenini anlamadım.

Benim lotum böyle hesaplanıyor

 #property link        "http://www.mql5.com"
input double CheckLots = 0.01 ;
input int     Persent   = 5 ;
   double Lots= NormalizeDouble (AccountBalance()*CheckLots/ 1000 - 0.005 , 2 );  

danışmanın başında durur ... ve kodun en sonuna koyar

OnTick işlevinde Lots değişkeni çağrıldığında, EA bulur ve yeniden hesaplar.

 

@Artyom Trishkin

Bu konunun moderatörü müsünüz?