Bir dosyadan bir Expert Advisor'ın otomatik olarak başlatılması ve yeniden başlatılması

 
Görev: Yeniden başlatma, sistem arızası durumunda yeniden başlatma vb. sonrasında Expert Advisor ortamını (konum verileri, sayaçlar vb.) geri yükleyin.

Çözüm: Uzmanın dinamik değişkenlerindeki her değişikliği bir dosyaya kaydedin. OnInit() sırasında dosyadaki her şey yerine geri yüklenir.

Ancak, aşağıdaki durumlarda değişkenlerin geçmiş durumu bir dosyadan yüklenemez:
  • dosya yapısı değişti (sürüm eşleşmiyor, uzmanın yeni yapısı). İlköğretim kontrol edildi, sorun yok.
  • Bot en son hata verdi. Diyelim ki bir duraklamada homurdandınız veya takıldınız veya hata sınırını aştınız, o zaman dosyada hemen hataya neden olan değişkenler olabilir. Kısmen, bunu kontrol etmek çok kolaydır (hesaplanacak hata sınırı, kritik hata kaydı ...), ancak bu çözüm tam değildir.
  • dosya çok "tozlu". Diyelim ki Expert Advisor en son X gün önce, hatta bugün yüklendi, ancak içindeki bilgiler zaten eski. Nasıl kontrol edilir - FIG bilir.

Şimdi bunu yaptım: OnDeinit'in () nedenini analiz ediyorum, program kapanırsa, terminal globalini silerim (yeniden başlatma bayrağı gibi).

OnInit() sırasında bu bayrak bulunmadığında, kullanıcıya aptal bir mesaj kutusuyla "dosyadan değişkenleri geri yükle" diye sormanız gerektiğinde.

Bu delicesine aptalca ve uygunsuz!


Soru: Böyle bir çözüm nasıl tamamen otomatikleştirilir?

Bir dosyanın ne zaman indirilemeyeceği ve ne zaman indirilebileceği nasıl belirlenir?

En azından bu mesaj kutusunun çağrısını en aza indirin.

 

MQL4 veya MQL5?

MQL5 ise   , o zamanlar:

OnInit() içinde şunları kontrol ederiz:

1. Konum

 if ( PositionSelect ( _Symbol ) )
{
}
else
{
}

2. Siparişler:

(Ben, herhangi bir başarısızlık varsa, "bacakların nereden büyüdüğünü" anlamamak için tüm siparişleri aptalca siliyorum)

 //+------------------------------------------------------------------+
//| Expert Remove orders function                                    |
//+------------------------------------------------------------------+
void RemoveOrders()
{
   int orders_total = OrdersTotal ();
//---  
   if ( orders_total > 0 )
  {
     for ( int i = ( orders_total - 1 ); i >= 0 ; i-- )
    {
       ulong temp_order_ticket = OrderGetTicket ( i );
      
       if ( OrderSelect ( temp_order_ticket ) )
      {
         string temp_symbol = OrderGetString ( ORDER_SYMBOL );
        
         if ( ( temp_symbol == sec_symbol ) || ( temp_symbol == _Symbol ) )
        {
          RemoveOldOrder( temp_order_ticket );
        }
      }
    }
  }
}

3. Terminal global değişkenleri :

   if ( ! GlobalVariableCheck ( "trans_count" ) )
  {
     datetime a_time = GlobalVariableSet ( "trans_count" , 0 );
    
     if ( ulong ( a_time ) == 0 )
    {
       MessageBox ( "Глобальная переменная терминала 'Счётчик транзакций' не создана!" , "Ошибка" , MB_OK | MB_ICONHAND );
       return ( INIT_FAILED );
    }
  }

4. Kaydedilecek Değişkenler

a) Yükleme:

 //+------------------------------------------------------------------+
//| Expert Load setings function                                     |
//+------------------------------------------------------------------+
void LoadSettings()
{
   string file_name = _Symbol + ".dat" ;
   int file_handle;
//---  
   if ( FileIsExist ( file_name, 0 ) )
  {
    file_handle = FileOpen ( file_name, FILE_READ | FILE_BIN );
    
     if ( file_handle != INVALID_HANDLE )
    {
      e_high = FileReadLong ( file_handle );
      a_profit = FileReadLong ( file_handle );
      e_low = FileReadLong ( file_handle );
      ord_delta_high = FileReadLong ( file_handle );
      ord_delta_low = FileReadLong ( file_handle );
      order_delta = FileReadLong ( file_handle );
      exit_delta = FileReadLong ( file_handle );
       FileClose ( file_handle );
    }
  } 
}

b) Kaydetme ( OnDeInit() )

 //+------------------------------------------------------------------+
//| Expert Save settings function                                    |
//+------------------------------------------------------------------+
void SaveSettings()
{
   string file_name = _Symbol + ".dat" ;
   int file_handle;
   bool file_found = true ;
//---  
   if ( FileIsExist ( file_name, 0 ) )
  {
     if ( FileDelete ( file_name, 0 ) ) file_found = false ;
  }
   else
  {
    file_found = false ;
  }
//---
   if ( !file_found )
  {
    file_handle = FileOpen ( file_name, FILE_WRITE | FILE_BIN );
    
     if ( file_handle != INVALID_HANDLE )
    {
       FileWriteLong ( file_handle, e_high );
       FileWriteLong ( file_handle, a_profit );
       FileWriteLong ( file_handle, e_low );
       FileWriteLong ( file_handle, ord_delta_high );
       FileWriteLong ( file_handle, ord_delta_low );
       FileWriteLong ( file_handle, order_delta );
       FileWriteLong ( file_handle, exit_delta );
       FileClose ( file_handle );
    }
  } 
}
 
Fry_Антон :
Görev: Yeniden başlatma, sistem arızası durumunda yeniden başlatma vb. sonrasında Expert Advisor ortamını (konum verileri, sayaçlar vb.) geri yükleyin.

Karşı soru - Neden?

IMHO, ortamı bir dosyadan geri yüklemek sonunda her zaman intihardır. Yeniden başlatırken, verilerinizi her zaman MetaTrader ticaret ortamına göre yeniden hesaplamalısınız.

 
Fry_Антон :
Görev: Yeniden başlatma, sistem arızası durumunda yeniden başlatma vb. sonrasında Expert Advisor ortamını (konum verileri, sayaçlar vb.) geri yükleyin.
anlatmak
 
Vasiliy Sokolov :

Karşı soru - Neden?

IMHO, ortamı bir dosyadan geri yüklemek sonunda her zaman intihardır. Yeniden başlatırken, verilerinizi her zaman MetaTrader ticaret ortamına göre yeniden hesaplamalısınız.

Vadeli işlem piyasasının özellikleri.

Her şey sayılamaz. Tabii ki ortamdan mümkün olanı güncelliyorum ama... Pekala, örnek olarak:

Takaslarda, pozisyonlar ve emirler kapatılır/açılır. Terminal, anlaşmayı düzeltir ve o gün için emirleri siler (ve iptal edilene kadar emirler komisyoncu tarafından yasaklanır). Yeni siparişler oluşturmalısınız.

Ve ilk pozisyon açılış fiyatına, ilk pozisyona ve emir verme süresine ihtiyacım var.

Bu nedenle, bu tür parametreler için kendi hesabınızı tutmalısınız.

Ayrıca saniye/dakika/saat/gün başına istek sayısı için sayaçlar, önemli olmayan hatalı eylemler için sayaçlar vb. vardır. vb.

Dosyayı seve seve reddederim! Gerçek olsaydı. =(

Ne de olsa böyle bir durum var: terminal çöktü (bugün yapılar kararlı, ancak daha önce her zaman böyleydi ve her zaman yalnızca kararlı sürümlerin olacağı bir gerçek değil).

Terminalin çökmesinden sonra: hızlı yeniden başlatma ve otomatik yükleme - bir dosyadan geri yükleme ve her şey çalışır.

Çok kararlı çalışıyor, çünkü OnTrade () olayı için başlatma dosyasını sürekli olarak kaydediyorum (diske eziyet etmemek için bir veya iki saniyelik bir zamanlayıcı ile).


Bu yüzden benim için soru çok alakalı: eski veya yüklenmesi tehlikeli bir dosyadan değişkenler nasıl yüklenmez?

 
Михаил :

MQL4 veya MQL5?

MQL5 ise   , o zamanlar:

OnInit() içinde şunları kontrol ederiz:

1. Konum

2. Siparişler:

(Ben, herhangi bir başarısızlık varsa, "bacakların nereden büyüdüğünü" anlamamak için tüm siparişleri aptalca siliyorum)

3. Terminal global değişkenleri :

4. Kaydedilecek Değişkenler

a) Yükleme:

b) Kaydetme ( OnDeInit() )

Neredeyse bunu yaptı. Dosyayı yalnızca bir zamanlayıcı ile OnTrade()'e kaydederim.

Ayrıca birçok farklı özelliğim ve diğer değişkenlerim var ve kod sürekli gelişiyor, bu yüzden tek tek kaydetmek çok elverişsizdi.

Dosya için gereken her şeyi (birkaç dize değeri dışında) tutan temel bir yapı oluşturdum.

Yapının adı bir harften bildirilir, bu nedenle kod oldukça kısadır (b.volume neredeyse hacim gibidir). Operatör = tüm yapıyı bir kerede kaydetmek uygundur.

 
Fry_Антон :

...

Soru: Böyle bir çözüm nasıl tamamen otomatikleştirilir?

...

Uzman Danışmanları programlamak için temelde farklı bir yaklaşım.

 
Dmitry Fedoseev :

Uzman Danışmanları programlamak için temelde farklı bir yaklaşım.

Cevabı makul bir yararlı düşünceye genişletin ve size minnettar olacağım.

Expert Advisor kodunun "daha iyi" olduğu temel ilkeler nelerdir?

 
Fry_Антон :

Cevabı makul bir yararlı düşünceye genişletin ve size minnettar olacağım.

Expert Advisor kodunun "daha iyi" olduğu temel ilkeler nelerdir?

Burada zaten yazdı - yeniden hesaplamak için yeniden. Onlar. durumu emirlerle analiz edin. Bazı verileri dosyalarda veya başka bir şeyde (belki global değişkenlerde ) depolamak önemli değildir. Bazı verilere ihtiyaç duyulursa, sipariş biletleriyle ilgili olarak saklanması esastır, bu durumda eski veriler sorunu yoktur, bir sipariş varsa - veri vardır, sipariş yoksa - veri yoktur . Belirli bir sıraya bağlı olmayan veriler olabilir, ancak burada her bir özel durum hakkında düşünmeniz gerekir, genel olarak görev çözülür.

Temizleme gerçekten en çok karıştırılan sorundur. Ancak bu, uzun süreli veri depolama (veya eskimesi) sorunu değildir, verileri Expert Advisor'da basit değişkenlerde de saklayabilirsiniz (biraz riskli, ancak sadece 5 dakika). Buradaki zorluk, daha sonra nasıl çözüleceğidir. Her sipariş için bir grup global terminal değişkeni oluşturabilir, açılış fiyatını da bunlara kaydedebilirsiniz. Ardından, işaretlenmemiş siparişler göründüğünde (veya yeni bir günün açılışında), tarihteki son kapalı siparişlere bakarız, bunları mümkün olan işaretlere göre karşılaştırırız (örneğin, çok) ve tüm transferleri aktarırız. kapalı düzenden yeni düzene global değişkenler.

 

Anton!

Bu konuyu fazla düşünüyorsun.

Acil bir durumdan sonra Uzman Danışmanın çalışmalarını yetkin bir şekilde geri yüklemek istediğiniz açıktır.

durumlar. Ben, ilk başta, aynı şaşkınım.

Ama sonra bu tür durumların son derece nadir olduğuna karar verdim.

(gerçek MT5'te bir buçuk yıllık ticaret deneyimimden yola çıkarak), bu yüzden yapmamam gerektiğine karar verdim

verilen siparişlerle "rahatsız edin", ancak düşüşten sonra var olan her şeyi "çivileyin".

Düşüşten önce verilen siparişler, yerine getirilirse hiçbir şey yapılamaz ve eğer

hala "sarkan", sonra onları öldürerek ve ticaret durumuna göre yeniden kurarak HİÇBİR ŞEY kaybetmeyeceksiniz!

O zaman sadece konum kalacaktır - var olsun ya da olmasın .

Bir dosyadan değişken yazma/okuma konusuna gelince.

Danışmanlarımda "sıcak" (işlem sırasında) değişken değişikliği var, bu yüzden

Expert Advisor'ın yeni bir başlangıçta "sıcak" ayarları alması için bunları bir dosyadan yazıp okuyorum.

Sorunu kendin yaratıyorsun !

Bunu düşün!

P/S MT5, siparişlerin çok önemli olduğu MT4 değildir!

MT5'te, siparişler değil, KONUM üzerine inşa etmeniz gerekir.

 
Fry_Антон :

Cevabı makul bir yararlı düşünceye genişletin ve size minnettar olacağım.

Expert Advisor kodunun "daha iyi" olduğu temel ilkeler nelerdir?

Kişisel olarak cevaplandı.

ZY Verdiğiniz örnekler geçerli değil. Kalelerde böyle bir sorun yok. Tabii ki, herhangi bir problem icat edebilir ve daha sonra onu uzun süre çözmeye çalışabilirsiniz. Ama icat etmemek daha kolayken neden çözesiniz ki?