Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 742

 
Klimenko_a_e :

Gerçek kodda, bir işlev bir nesne döndürür.

Bence kopya oluşturucu bu durumda geçici bir kopya oluşturmalıdır.

Kod, MQL5 build 1545'te de düzgün çalışıyor.

Yeni yapıda, kopya oluşturucu tek boyutlu bir diziyi bile yeniden boyutlandıramaz: hata 4007.

Bana göre bu doğru değil.

Bu durumda kesin bir şey söylemek benim için zor. Sorununuzla ilgili çok iyi uzmanlar var, bu yüzden onunla https://www.mql5.com/ru/forum/1111 başlığına başvurmanızı tavsiye ederim.

Düzenlemelerimle kod olması gerektiği gibi çalışıyor. Olmadan - hayır. Ancak kodunuz işe yararsa - yukarıdaki bağlantıdaki şubede daha iyi.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Klimenko_a_e :

Gerçek kodda, bir işlev bir nesne döndürür.

Bence kopya oluşturucu bu durumda geçici bir kopya oluşturmalıdır.

Kod, MQL5 build 1545'te de düzgün çalışıyor.

Yeni yapıda, kopya oluşturucu tek boyutlu bir diziyi bile yeniden boyutlandıramaz: hata 4007.

Bana göre bu doğru değil.


1580 derlemesinde hata düzeltildi, teşekkürler, her şey olması gerektiği gibi çalışıyor).
 
fxsaber :

Bu durumda kesin bir şey söylemek benim için zor. Sorununuzla ilgili çok iyi uzmanlar var, bu yüzden onunla https://www.mql5.com/ru/forum/1111 başlığına başvurmanızı tavsiye ederim.

Düzenlemelerimle kod olması gerektiği gibi çalışıyor. Olmadan - hayır. Ancak kodunuz işe yararsa - yukarıdaki bağlantıdaki şubede daha iyi.


Bağlantı için teşekkürler.
 

Belki birisi tavsiyede bulunabilir.

Giriş ayarlarını manuel olarak değiştirdikten sonra bir Expert Advisor'ın yürütülmesini kesintiye uğratmanın nasıl mümkün olduğunu anlayamıyorum.

1) Aşağıdaki EA kodunu grafikte çalıştırın:

 #property version    "1.00"

input int Setting_ = 0 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   Print ( "OnInit:" ,Setting_);
   
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   Print ( "OnDeinit(" ,reason, "):" ,Setting_);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
   while (! _StopFlag )
   {
       Sleep ( 1000 );
   }
}

2) Ayarlar penceresini açın ve "Ayar_" parametresini 1 olarak değiştirin.

3) Ve değişiklikleri uygulayın.

Bu nedenle, değişikliklerin uygulanabilmesi için OnInit yürütülmelidir, ancak OnTick'teki (veya herhangi bir başka) hesaplama durana kadar OnInit yürütülmeyecektir.

Bildiğim kadarıyla, programı yalnızca _StopFlag - mql5 program durdurma bayrağı aracılığıyla durdurmak için bir denetim var, ancak bu yalnızca tam bir çıkış içindir. Ancak giriş ayarlarının hesaplamaları durdurmak için değiştiğini nasıl anlayacağımı bilmiyorum.

Belki birisi böyle bir durumla karşı karşıya kaldı? Belki gizli bir hack vardır?

 
Marat Sultanov :

Belki birisi tavsiyede bulunabilir.

Giriş ayarlarını manuel olarak değiştirdikten sonra bir Expert Advisor'ın yürütülmesini kesintiye uğratmanın nasıl mümkün olduğunu anlayamıyorum.

1) Aşağıdaki EA kodunu grafikte çalıştırın:

2) Ayarlar penceresini açın ve "Ayar_" parametresini 1 olarak değiştirin.

3) Ve değişiklikleri uygulayın.

Bu nedenle, değişikliklerin uygulanabilmesi için OnInit yürütülmelidir, ancak OnTick'teki (veya herhangi bir başka) hesaplama durana kadar OnInit yürütülmeyecektir.

Bildiğim kadarıyla, programı yalnızca _StopFlag - mql5 program durdurma bayrağı aracılığıyla durdurmak için bir denetim var, ancak bu yalnızca tam bir çıkış içindir. Ancak giriş ayarlarının hesaplamaları durdurmak için değiştiğini nasıl anlayacağımı bilmiyorum.

Belki birisi böyle bir durumla karşı karşıya kaldı? Belki gizli bir hack vardır?

OnInit() içindeki başlatmasızlaştırma kodunu kontrol edin

Başlatmama nedenleri

UninitializeReason() işlevi tarafından döndürülen, Expert Advisor'ın sıfırlanması için neden kodları. Aşağıdaki değerlerden herhangi birine sahip olabilir:

Devamlı

Anlam

Tanım

REASON_PROGRAM

0

Uzman, ExpertRemove() işlevini çağırarak çalışmasını durdurdu

REASON_REMOVE

1

Program grafikten kaldırıldı

REASON_RECOMPILE

2

Program yeniden derlendi

REASON_CHARTCHANGE

3

Grafik sembolü veya periyodu değiştirildi

REASON_CHARTCLOSE

4

Grafik kapatıldı

REASON_PARAMETERS

5

Giriş parametreleri kullanıcı tarafından değiştirildi

REASON_ACCOUNT

6

Hesap ayarlarındaki bir değişiklik nedeniyle başka bir hesap etkinleştirildi veya ticaret sunucusuna yeniden bağlanıldı

REASON_TEMPLATE

7

Başka bir grafik şablonu uygulandı

REASON_INITFAILED

sekiz

OnInit() işleyicisinin sıfır olmayan bir değer döndürdüğünü işaretleyin

REASON_CLOSE

dokuz

Terminal kapatıldı

 
Artyom Trishkin :

OnInit() içindeki başlatmasızlaştırma kodunu kontrol edin

...

Hımm... beni yanlış anladın :)

Fonksiyonun içinde (örneğin OnTick'te ) kullanıcının giriş parametrelerini değiştirdiğini, yani. Programı tamamlamanın ve programın OnDeinit'e gitmesine izin vermenin zamanının geldiğini öğrenin.

 
Marat Sultanov :

Hımm... beni yanlış anladın :)

Fonksiyonun içinde (örneğin OnTick'te ) kullanıcının giriş parametrelerini değiştirdiğini, yani. Programı tamamlamanın ve programın OnDeinit'e gitmesine izin vermenin zamanının geldiğini öğrenin.

Kullanıcı Uzman Danışman ayarları penceresini (F7) açar açmaz ve parametreleri değiştirdikten sonra oradaki Tamam düğmesine basar, OnDeinit() hemen çağrılır ve sırayla REASON_PARAMETERS değerini deinitialization koduna yazar. Daha sonra OnInit() çağrılır; burada UninitializeReason() kullanarak başlatmasızlaştırma kodunu kontrol edebilirsiniz ve değeri REASON_PARAMETERS'a eşitse , daha sonra ne yapacağınıza karar verebilirsiniz.
 
Artyom Trishkin :
Kullanıcı Uzman Danışman ayarları penceresini (F7) açar açmaz ve parametreleri değiştirdikten sonra oradaki Tamam düğmesine basar, OnDeinit() hemen çağrılır ve sırayla REASON_PARAMETERS değerini deinitialization koduna yazar. Daha sonra OnInit() çağrılır; burada UninitializeReason() kullanarak başlatmasızlaştırma kodunu kontrol edebilirsiniz ve değeri REASON_PARAMETERS'a eşitse , daha sonra ne yapacağınıza karar verebilirsiniz.

TAMAM.

Rica ederim:

1) İlk önce ilk mesajımda verdiğim kodumu çalıştırın. Oraya güzellik için getirmedim ... Herhangi bir grafikte başlatabilirsiniz.

2) Uzman Danışman ayarları penceresini arayın.

3) Ayarı değiştirin ve Tamam'a tıklayın.

Koduma dikkatlice bakarsanız, ortaya çıkan doğal sonuç sizi şaşırtmayacaktır: OnDeinit () çağrılmayacaktır.

 

Ayrıca, EA'nın hedefe ULAŞMADIĞINDAN emin olabilmeniz için, hem neden hem de parametrenin tanımına bir çıktı ekledim.

Lütfen koddaki en önemli parçaya dikkat edin:

 void OnTick ()
{
   while (! _StopFlag )
   {
       Sleep ( 1000 );
   }
}

Bu, giriş parametrelerindeki bir değişiklik nedeniyle kesintiye uğramayan uzun bir hesaplamanın görsel bir öykünmesidir. Ve onu kesmem gerekiyor ve soru nasıl? :)

Sadece MQL5'te hiçbir şeyi kaçırmadığımdan ve dilde _StopFlag dışında gerçekten başka bir şey olmadığından emin olmak istiyorum, bu ne yazık ki bu durumu çözmez.

Kabaca söylemek gerekirse, yoğun bir hesaplama sırasında giriş parametrelerinin değiştiği anı yakalamam gerekiyor.

 
Marat Sultanov :

Ayrıca, EA'nın hedefe ULAŞMADIĞINDAN emin olabilmeniz için, hem neden hem de parametrenin tanımına bir çıktı ekledim.

Lütfen koddaki en önemli parçaya dikkat edin:

Bu, giriş parametrelerindeki bir değişiklik nedeniyle kesintiye uğramayan uzun bir hesaplamanın görsel bir öykünmesidir. Ve onu kesmem gerekiyor ve soru nasıl? :)

Sadece MQL5'te hiçbir şeyi kaçırmadığımdan ve dilde _StopFlag dışında gerçekten başka bir şey olmadığından emin olmak istiyorum, bu ne yazık ki bu durumu çözmez.

Kabaca söylemek gerekirse, yoğun bir hesaplama sırasında giriş parametrelerinin değiştiği anı yakalamam gerekiyor.

Kabaca söylemek gerekirse - size yazdıklarımı dikkatlice tekrar okuyun ve kodunuzdan sonsuz bir döngü atın.

Expert Advisor'ı sonsuz bir döngüye sokmanın doğru karar olduğundan emin misiniz?