Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 18

 
Dennis Kiriçenko :
Ve size sormama izin verin, neden statik ?

Bağlamdan çıkarıldığı için - orijinal gönderiye bakın.
 

OnInit() işlevinin belgelenmiş bir özelliği değildir, bu işlev programın herhangi bir bölümünde çalıştırılabilir. Test kodu.

 //+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com/ru/users/sergey1294"
#property version    "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private :
   datetime           curbar;
   datetime           lastbar;
public :
                     CNevBar();
                    ~CNevBar();
   bool               bar( string symbol, ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar( void )
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar( string symbol, ENUM_TIMEFRAMES period)
  {
   curbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar== 0 )lastbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar!=curbar)
     {
      lastbar=curbar;
       return ( true );
     }
   return ( false );
  }

int test= 0 ;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

   test= 5 ;
   Print ( __FUNCTION__ , ": test = " ,test);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (newbar.bar( _Symbol , PERIOD_CURRENT ))
     {
      test= 10 ;
       Print ( __FUNCTION__ , ": test = " ,test);
       OnInit ();
     }
  }
//+------------------------------------------------------------------+

sonuç

 2017.03 . 10 19 : 26 : 02.977 test10 (EURUSD,M1)       OnInit : test = 5
2017.03 . 10 19 : 27 : 03.041 test10 (EURUSD,M1)       OnTick : test = 10
2017.03 . 10 19 : 27 : 03.042 test10 (EURUSD,M1)       OnInit : test = 5
2017.03 . 10 19 : 28 : 03.245 test10 (EURUSD,M1)       OnTick : test = 10
2017.03 . 10 19 : 28 : 03.245 test10 (EURUSD,M1)       OnInit : test = 5
2017.03 . 10 19 : 29 : 02.995 test10 (EURUSD,M1)       OnTick : test = 10
2017.03 . 10 19 : 29 : 02.995 test10 (EURUSD,M1)       OnInit : test = 5


‌...

 
Sergey Gritsay :

OnInit() işlevinin belgelenmiş bir özelliği değildir, bu işlev programın herhangi bir bölümünde çalıştırılabilir. Test kodu.


Tüm Açık işlevler sıradan işlevlerdir ve buna göre herhangi bir zamanda çağrılabilirler. Ya OnCalculate ya da OnTradeTransaction.
 
fxsaber :

Tüm Açık işlevler sıradan işlevlerdir ve buna göre herhangi bir zamanda çağrılabilirler. Ya OnCalculate ya da OnTradeTransaction.


ama belgelerde yazmıyor

OnInit

OnInit() işlevi, Init olayının işleyicisidir. void veya int türünde olabilir , parametresi yoktur:

geçersiz   OnInit ();

Başlatma olayı, bir Uzman Danışman veya gösterge yüklendikten hemen sonra oluşturulur; bu olay komut dosyaları için oluşturulmaz. Başlatma için OnInit() işlevi kullanılır. OnInit() bir int dönüş değerine sahipse, sıfır olmayan bir dönüş kodu başlatma başarısızlığını gösterir ve REASON_INITFAILED başlatmadan kaldırma neden koduyla bir Deinit olayı oluşturur .

Expert Advisor'ın giriş parametrelerini optimize etmek için dönüş kodu olarak ENUM_INIT_RETCODE numaralandırmasındaki değerlerin kullanılması önerilir. Bu değerler, en uygun test ajanlarının seçimi de dahil olmak üzere optimizasyon sürecinin yönetimini organize etmeye yöneliktir. Expert Advisor'ın başlangıcında, testin kendisinin başlamasından önce bile, TerminalInfoInteger() işlevini kullanarak aracının yapılandırması ve kaynakları (çekirdek sayısı, boş bellek, vb.) hakkında bilgi talep edebilirsiniz. Ve alınan bilgilere dayanarak, bu Uzman Danışmanı optimize ederken bu test aracının kullanımına izin verin veya reddedin.

ENUM_INIT_RETCODE

tanımlayıcı

Tanım

INIT_SUCCEDED

Başlatma başarılı oldu, Expert Advisor'ı test etmeye devam edebilirsiniz.

Bu kod, sıfır değeriyle aynı anlama gelir - Expert Advisor'ın test cihazında başlatılması başarılı olmuştur.

INIT_FAILED

Başarısız başlatma, ölümcül hatalar nedeniyle teste devam etmek mantıklı değil. Örneğin Expert Advisor'ın çalışması için gerekli olan bir indikatörün oluşturulması mümkün olmamıştır.

Bu değerin döndürülmesi, sıfır olmayan bir değerin döndürülmesiyle aynı anlama gelir - Test cihazında Expert Advisor'ın başlatılması başarısız oldu.

INIT_PARAMETERS_YANLIŞ

Programcının yanlış bir dizi giriş parametresini göstermesi amaçlanmıştır; genel optimizasyon tablosunda, böyle bir dönüş koduna sahip sonuç satırı kırmızı ile vurgulanacaktır.

Bu uzman parametre seti için test yapılmayacaktır, aracı yeni bir görev almakta serbesttir.

Bu değer alındığında, strateji test cihazının bu görevi yeniden yürütme için diğer aracılara aktarmaması garanti edilir.

INIT_AGENT_NOT_SUITABLE

Başlatma sırasında programda herhangi bir hata olmadı, ancak bu aracı nedense test için uygun değil. Örneğin yeterli RAM yok , OpenCL desteği yok vb.

Bu kod döndükten sonra, aracı bu optimizasyonun sonuna kadar artık iş almayacak.

Void türündeki OnInit() işlevi her zaman başarılı başlatma anlamına gelir.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
hafta sonları OnInit'te kod yazdığımda OnTick'i ekliyorum. Ve yeni keneler olmasa bile her şeyi iyi anlıyorum
 
Sergey Gritsay :


ama belgelerde yazmıyor

OnInit

OnInit() işlevi, Init olayının işleyicisidir. void veya int türünde olabilir , parametresi yoktur:

geçersiz   OnInit ();

Başlatma olayı, bir Uzman Danışman veya gösterge yüklendikten hemen sonra oluşturulur

Bunun bir fonksiyon olduğunu söylüyor.

OnInit'ten önce ve OnDeinit'ten sonra, global nesnelerin yapıcılarına/yıkıcılarına hala çağrılar var (Yardım'da yanlışlık). Bu nedenle, örneğin, OnInit olmadan göstergelerdeki gösterge arabelleklerini bildirmek mümkündür. İlkeler böyle.

 
FullOnCalculate araması , MT4/MT5'te gösterge arabellekleriyle çalışmanın tamamen belgelenmemiş birçok özelliğine hemen yol açmaz - bunlar yer yer ciddi şekilde farklılık gösterir.
 
İşte sorunu çözmek için son vizyonum:
 iCustom (... inputs, PRICE_CLOSE ,
         color &colors[], int &widths[], int &styles[] );

iAlligator (... params, PRICE_CLOSE ,
         color &colors[], int &widths[], int &styles[] );
Göstergenin aşağıdaki parametrelere sahip olduğunu varsayalım:
 #property indicator_plots 5
#property indicator_color1 clrAquamarine , clrBeige , clrBurlyWood
#property indicator_color2 clrRed , clrGreen

#property indicator_color5 clrGold , clrCrimson , clrCadetBlue
o zaman bunun için renk dizisi şöyle olacaktır:
 color colors[] = {
   clrAquamarine , clrBeige , clrBurlyWood ,   // 1 plot
   clrRed , clrGreen ,                       // 2 plot
   clrBlack ,                               // 3 plot
   clrWhite ,                               // 4 plot
   clrGold , clrCrimson , clrCadetBlue ,       // 5 plot
   clrBurlyWood , clrBlue                    // ignore
};

Dizi daha küçükse, renklerin yalnızca bir kısmı iletilir. Dizi daha büyükse, kesilir.

Genişlik ve stil dizileri için ilke aynıdır.‌

 
fxsaber :

Aşırı yüklenmiş (yukarıya bakın) HistoryDealSelect, OrderSendSync'te çağrılır.

Son pozisyonun açılma zamanını, son pozisyonun kapanma zamanını nasıl belirleyebilirsiniz?

Ve genel olarak, mql5‌'deki açık/kapalı pozisyonlar hakkında bilgi elde etmek için genel prensipleri ve algoritmaları bilmek istiyorum.

Nelere dikkat edilmesi gerekiyor, şu anda hangi özellikler var?

 
Artyom Trishkin :

Son pozisyonun açılma zamanını, son pozisyonun kapanma zamanını nasıl belirleyebilirsiniz?

Ve genel olarak, mql5‌'deki açık/kapalı pozisyonlar hakkında bilgi elde etmek için genel prensipleri ve algoritmaları bilmek istiyorum.

Nelere dikkat edilmesi gerekiyor, şu anda hangi özellikler var?


Bütün bunlar, siparişlerin ve işlemlerin geçmişinin seçimi ve daha sonra siparişlerin özelliklerinin okunmasıyla belirlenir.

 bool    HistorySelectByPosition ( 
   long    position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

POSITION_IDENTIFIER

Pozisyon Kimliği, her yeni açılan pozisyona atanan ve kullanım ömrü boyunca değişmeyen benzersiz bir numaradır. Pozisyonu açan sipariş biletine karşılık gelir.

 

Pozisyon kimliği, onu açan, değiştiren veya kapatan her siparişte (ORDER_POSITION_ID) ve anlaşmada (DEAL_POSITION_ID) belirtilir. Bir pozisyonla ilişkili siparişleri ve anlaşmaları aramak için bu özelliği kullanın.

 

Netleştirme modunda bir pozisyon tersine çevrildiğinde (tek bir giriş/çıkış anlaşması ile), pozisyon kimliği POSITION_IDENTIFIER değişmez. Ancak aynı zamanda POSITION_TICKET, iptalle sonuçlanan siparişin bileti olarak değiştirilir. Riskten korunma modunda pozisyonun tersine çevrilmesi sağlanmaz.

uzun


‌Ve enumdaki özellikleri kullanarak ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

Market girişi

DEAL_ENTRY_OUT

Pazar çıkışı

DEAL_ENTRY_INOUT

tersine çevirme

DEAL_ENTRY_OUT_BY

Zıt pozisyonla kapanış