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

 
Sergey Likho :

Algoritma yazmanın en iyi yolu nedir?


Görev:

Farklı çizelgelerde bir Uzman Danışman başlatılır.

Hesaba ait bakiye, özkaynak vb. bilgilerin tutanağa göre ayrı bir dosyaya yazılması zorunludur.

Şimdi tüm danışmanların tüm bilgileri tek bir dosyaya yazdığı ortaya çıktı. Sonuç olarak, birçok gereksiz kayıt ortaya çıkıyor.

Hangi orijinal çözümü bulabilirsin ki, sadece bir bot kayıt dosyası oluştursun. (Ve örneğin silindiyse, başka bir bot giriş yapmaya başladı vb.)

OnInit()'te uzmanın veya başka birinin adıyla bir grafik nesnesi oluşturun, belki de uzman zaten bir nesne oluşturuyordur, o zaman onu kullanabilirsiniz, varsayalım "MyEA": ObjectCreate (0, "MyEA" , OBJ_... ,...))

Dosyanın yazıldığı OnTick()'te, bu etiketin hangi ilk kimlik çizelgesinde olduğunu kontrol edin = bu, terminalde kurulu ilk Uzman Danışman olduğu anlamına gelir, artık daha fazla ilgilenmiyoruz.

Yineleme kullanıyoruz:

 string ChartGetSymb()
  {
   string symb= "" ;
   long chartID= ChartFirst ();
   while (chartID!=- 1 ) 
    {
       if ( ObjectGetString (chartID, "MyEA" , OBJPROP_NAME )== "MyEA" )
       {
        symb= ChartSymbol (chartID);
         break ;
       }
      chartID= ChartNext (chartID);
     }
   return (symb);
  }

Expert Advisor'ın kurulu olduğu ilk kullanılabilir tablo/sembol alındı

Ayrıca, dosyaya yazmadan önce, bunun ilk Uzman Danışman olduğunu karşılaştırıyoruz:

 if (ChartGetSymb() == Symbol ()) {
  записываем в файл, если соответствует символу, иначе не записываем
}


Tasarım kolay değil, ancak global bir değişkene yazarak diski çekmekten daha iyidir

 
Artyom Trishkin :

Standart MA'yı alın, arabellek veri türünü değiştirin, derleyin ve terminal veri penceresinde kontrol edin (Ctrl+D)

Bu yardımcı olmaz çünkü terminalde görüntülenmeyeceklerdir. Ancak, INDICATOR_CALCULATIONS olarak bildirilen Yüksek ve Düşük için iki ek arabelleğe sahip ZigZag göstergesini kontrol ettim. Terminalde görüntülenmeseler de programdan da alınırlar. Neyse tavsiye için teşekkürler.
 
Sergey Likho :

ChartID(), terminalin global değişkenlerine bir hata ile yazılır. ne saçmalık?


Bu kodu deneyin:


Bu kodu çalıştırmanın sonucu

 2019.11 . 29 15 : 22 : 07.453 Script 00 EURUSD,H1: removed
2019.11 . 29 15 : 22 : 07.453 00 EURUSD,H1: uninit reason 0
2019.11 . 29 15 : 22 : 07.453 00 EURUSD,H1: GVAR id: 131992895281608496 GV_id: 131992895281608496
2019.11 . 29 15 : 22 : 07.453 00 EURUSD,H1: initialized
2019.11 . 29 15 : 22 : 07.433 Script Test\ 00 EURUSD,H1: loaded successfully
 
Vitaly Muzichenko :

OnInit()'te uzmanın veya başka birinin adıyla bir grafik nesnesi oluşturun, belki de uzman zaten bir nesne oluşturuyordur, o zaman onu kullanabilirsiniz, varsayalım "MyEA": ObjectCreate (0, "MyEA" , OBJ_... ,...))

Dosyanın yazıldığı OnTick()'te, bu etiketin hangi ilk kimlik çizelgesinde olduğunu kontrol edin = bu, terminalde kurulu ilk Uzman Danışman olduğu anlamına gelir, artık daha fazla ilgilenmiyoruz.

Yineleme kullanıyoruz:


Expert Advisor'ın kurulu olduğu ilk kullanılabilir tablo/sembol alındı

Ardından, dosyaya yazmadan önce bunun ilk Uzman Danışman olduğunu karşılaştırıyoruz:


Tasarım kolay değil, ancak global bir değişkene yazarak diski çekmekten daha iyidir

Evet güzel fikir.

Sayesinde.


O zaman soru şudur: Ya danışman silinirse (örneğin, bir hata nedeniyle) ve nesne kalırsa. Grafik tamamen kapalıysa, bir şekilde "ana" Uzman Danışmanı yeniden atamanız gerekir mi?

 
Sergey Likho :

Evet güzel fikir.

Sayesinde.


O zaman soru şudur: Ya danışman silinirse (örneğin, bir hata nedeniyle) ve nesne kalırsa. Grafik tamamen kapalıysa, bir şekilde "ana" Uzman Danışmanı yeniden atamanız gerekir mi?

Tek bir durumda bir hata - Uzman Danışman nesneyi acil bir durumda bıraktıysa, ancak MT4'te hafızamda böyle bir şey hatırlamıyorum. Diğer tüm durumlarda, ana uzman yeniden atanacak, OnTik'te kontrol devam ediyor ve her zaman mevcut tablo için bir arama olacak


PS Expert Advisor'da bir hata olması ve tablodan kendi kendini kaldırması durumunda OnDeInit()'in ne döndüreceğini kontrol etmeye çalışın. Muhtemelen basitçe kontrol edebilir, bir değişken oluşturabilir ve keneleri sayabilir, 11. tikte 10/0'ı bölebilirsiniz.

OnDeInit()'te, Print'i koyun ve sıfırlamanın nedeninin ne olacağını görün, öyleyse, bu nedenle/sayı için "MyEA" nesnesini grafikten silin

t++;
if (t > 10 ) {
 int e = 10 ;
 e /= 0 ;
}

Sonuç hakkında aboneliğinizi iptal edebilirsiniz, çünkü kendiniz kontrol etmek için zamanınız yoktur.

 
Vitaly Muzichenko :

OnInit()'te uzmanın veya başka birinin adıyla bir grafik nesnesi oluşturun, belki de uzman zaten bir nesne oluşturuyordur, o zaman onu kullanabilirsiniz, varsayalım "MyEA": ObjectCreate (0, "MyEA" , OBJ_... ,...))

Dosyanın yazıldığı OnTick()'te, bu etiketin hangi ilk kimlik çizelgesinde olduğunu kontrol edin = bu, terminalde kurulu ilk Uzman Danışman olduğu anlamına gelir, artık daha fazla ilgilenmiyoruz.

Yineleme kullanıyoruz:


Expert Advisor'ın kurulu olduğu ilk kullanılabilir tablo/sembol alındı

Ayrıca, dosyaya yazmadan önce, bunun ilk Uzman Danışman olduğunu karşılaştırıyoruz:


Tasarım kolay değil, ancak global bir değişkene yazarak diski çekmekten daha iyidir

Bence yanılıyorsun. GV'ler her seferinde diske yazılmaz. Aksi takdirde, GV'yi diske yazmaya zorlamak için bir fonksiyona gerek kalmayacaktır.

 void    GlobalVariablesFlush ();
Evet, artı her şey, bir danışman ve bir nesne aramak için tüm çizelgeleri sıralamak ... Vitaliy, bu teneke ...
 
Alexey Viktorov :

Bence yanılıyorsun. GV'ler her seferinde diske yazılmaz . Aksi takdirde, GV'yi diske yazmaya zorlamak için bir fonksiyona gerek kalmayacaktır.

Evet, artı her şey, bir danışman ve bir nesne aramak için tüm çizelgeleri sıralamak ... Vitaliy, bu teneke ...

Yazmanın başka bir yolu: GlobalVariableSet ("GV",ID);

profiller -> gvariables.dat


 
Vitaly Muzichenko :

Yazmanın başka bir yolu: GlobalVariableSet ("GV",ID);

profiller -> gvariables.dat


Oluştururken evet olabilir, ancak üzerine yazarken orada yazan uygulamayı devre dışı bırakmadan önce kontrol etmeniz gerekir. Ve tembelim. Yine de, tamamen teorik olarak, diske her yazıldığında, yukarıdaki işlev sadece bir çıngıraktır.

 
Sergey Likho :

Bu şekilde yapamazsınız.

Klasörlerdeki verileri senkronize eden bir Windows programı arayın. Ve danışmanın otomatik olarak yeni terminale kopyalanması için ayarlayın

Anladığım kadarıyla böyle programlar var ama sadece dosyalarla çalışıyorlar ama bu bir metin belgesi ise içerik kopyalanmıyor ve dosyaların yerini almıyor, belki normal programlar bulamadım. Geliştiricilerin, robotun veya uzmanın dosyasının nereden alınacağını belirleme yeteneğini hesaba katmamış olması kötü, yolu genellikle olduğu gibi belirtebileceğinizi düşündüm ve hepsi bu, ancak yukarıda belirttiğiniz gibi, bu imkansız.

 
Seric29 :

Anladığım kadarıyla böyle programlar var ama sadece dosyalarla çalışıyorlar ama bu bir metin belgesi ise içerik kopyalanmıyor ve dosyaların yerini almıyor, belki normal programlar bulamadım. Geliştiricilerin, robotun veya uzmanın dosyasının nereden çizileceğinin yolunu belirtme yeteneğini hesaba katmamış olması kötü, yolu genellikle yapıldığı gibi belirtebileceğinizi düşündüm ve hepsi bu, ama yukarıda belirttiğiniz gibi, bu imkansız.

Bu mesajdaki "Tüm terminallerde paylaşılan klasörler var" sözlerine dikkat edin.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Peki, pazardan alınan ürün neye bağlı?

Sergey Tabolin , 2019.11.23 08:17

Cidden nasıl ve nereye kuracağımı bilmediğimi mi düşünüyorsun? )))

Tüm terminallerin paylaşımlı klasörleri vardır

Marketten ücretsiz bir gösterge indirdim. Demire bağlı.

Öyleyse neden bir donanım parçasında bir terminalde çalışıyor, diğerinde çalışmıyor?

Bariz sonuç, en azından sadece ütülemeye bağlı olmadığıdır ...


Nasıl yapıldığına dair bilgi arayın ve gidin... Buna klasör bağlama denir.