Kütüphaneler: MultiTester - sayfa 3

 
Edgar:

Optimizasyon sonuçlarına nasıl bakılacağını kastediyorsanız, sonuçları önbellekten programlı olarak okumaktan bahsediyordum.

Kastettiğim bu değildi. Ama önbellek okuma mümkün. Sadece yazmanız gerekiyor.

[Silindi]  

Harika bir şey!!!

Cycles'ı da ona vidaladım ve tam olarak özlediğim şeydi )))))

#include <fxsaber\MultiTester\MultiTester.mqh> // Tester'da çoklu çalıştırma/iyileştirme.

enum CyclNum
{
   n01   = 1,     // 1
   n02,           // 2
   n03,           // 3
   n04,           // 4
   n05,           // 5
   n06,           // 6
   n07,           // 7
   n08,           // 8
   n09,           // 9
   n10,           // 0
};
sinput bool Period_M1 = false;         // M1'i açın
sinput bool Period_M5 = false;         // M5'i açın
sinput bool Period_M15 = false;        // M15'i açın
sinput bool OnlyCustomSymbols = false; // Yalnızca özel karakterler
sinput CyclNum number_cycles  = n06;   // Döngü sayısı

// Bu fonksiyon görev listesinin oluşturulmasından sorumludur.
void SetTesterSettings()
{
   for(int n = 0; n < number_cycles; n++)
   {
      // Piyasa İzleme'den tüm sembolleri arayın.
      for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
      {

Teşekkürler!

 
Сергей Таболин:

Cycles'ı ekledim ve tam da ihtiyacım olan şey oldu ))))

Test cihazında düğmeye basma işlevlerine ihtiyacım var. O zaman otomasyon farklı bir seviyede olacaktır.

 

İhtiyacım olan kontroller için bazı fonksiyonlar ekledim (Depo, Para Birimi, Kaldıraç, OptimisationType, BarsType, Kriterler). Ancak henüz test etmedim. Daha sonra yayınlayabilirim.

Temsilci yönetimini uygulamak istedim. Örneğin, aracılar listesine tıklayabilir, HOME tuşuna basabilir ve VK_DOWN ile her bir aracıyı seçebilirsiniz. Ancak seçilen satır için içerik menüsünü nasıl çağıracağımı bilmiyorum. Ve devre dışı bırakmak/etkinleştirmek için 'd'/'e' tuşlarına basmak gerekiyor.

Biri bana bir ipucu verebilir mi?

Bulutu etkinleştirmek/devre dışı bırakmak daha da zor (tik veya çapraz optimizasyondan önce devre dışı bırak). İçerik menüsüne bile ulaşsanız, açıkça etkinleştiremez/devre dışı bırakamazsınız, sadece çevirebilirsiniz. Mevcut durumu programlı olarak öğrenemezsiniz. Terminal günlüğünden okuyabilirsiniz "2019.07.31 19:27:35.664 Tester Cloud servers using switch off". Görünüşe göre günlüğü programlı olarak da okuyamazsınız, günlük dosyasına bakmanız gerekir.

Belgelenmemiş WinAPI komutları için hala bir şans var. Belki bazı C++ programcıları bunları nasıl bulacaklarını biliyorlardır?

[Silindi]  

Elektrik kesintisi sorunuyla karşı karşıya. Şimdi ne kadar optimizasyon yapıldığını bilmiyorum ((((

Zamanım olduğunda, toplam optimizasyon yüzdesi ve çalışılan karakterler için bir kontrol eklemeye çalışacağım. Umarım yazarın bir sakıncası yoktur? ))) Yoksa kendisi mi yapmak isteyecek?

 
Сергей Таболин:

Elektrik kesintisi sorunuyla karşı karşıya kaldım. Şimdi ne kadar optimizasyon yapıldığını bilmiyorum (((

MultiTester adımlarını günlüklere yansıtır. Terminal günlükleri kaydetmişse, orada her şeyi göreceksiniz.

Ayrıca, optimizasyon önbellekleri %100 kaydedilir. Böylece neyin yürütüldüğünü görebilirsiniz.

 
Edgar:

İhtiyacım olan kontroller için bazı fonksiyonlar ekledim (Depo, Para Birimi, Kaldıraç, OptimisationType, BarsType, Kriterler). Ancak henüz test etmedim. Daha sonra yayınlayabilirim.

Özel sorunları çözmeden önce, çözümlerinin kullanım senaryolarını tanımlamak iyi olacaktır.

 
fxsaber:

Özel sorunları çözmeden önce, çözümlerini kullanmak için senaryolar belirlemek iyi bir fikirdir.

Senaryomu bir önceki sayfada anlattım.

Clicker her şeyin yerine geçmez, optimizasyonu otomatikleştirmek için gereken birkaç araçtan biridir. Ek bir terminal başlatmadan her şeyi tek bir terminalde yapmanızı sağlar. Sonuçları analiz etmek için çerçeveler (optimizasyon önbelleğini okumak için yeni kütüphaneniz aynı amaç için iyidir), girdi değişkenlerini yönetmek için fonksiyonlar, durumları ve istatistikleri depolamak için SQLITE eklerdim. Ve akıllı optimizasyon komut dosyaları yazabilirsiniz. Evrensellik sağlanamaz, her Uzman Danışmanın kendi komut dosyası vardır. Ve bunu manuel olarak oluşturmanız ve ancak o zaman tekrar tekrar uygulamanız gerekir.

Çerçeveler zaten eklendi. SQLITE ile deneyimim vardı.

İhtiyaçlarım için lib'inizi genişlettim. Eminim bunu kendiniz planlıyordunuz, ama ben beklemedim. Bu, yukarıdakiler arasında hazır bir çözümüm olmayan tek teknolojiydi. Bu arada, eklentilerimi kontrol ettim, çalışıyorlar. Temsilci yönetimi sorunları hala geçerli. Spy++ deneyimli bir sistem mühendisi için mesajları yakalamada yardımcı olabilir, ancak benim çok az yardımım oldu, neyi filtreleyeceğimi bilmem gerekiyor. Umarım insanlar yukarı çeker. Konu 2008'den beri ortaya çıkıyor.

 
Edgar:

İşte bunu nasıl geliştirmek istediğim. Benim tipik optimizasyon senaryom:

OHLC için N genetik çalıştırma yapın. Özelleştirilmiş bir kritere göre her birinden en iyi sonucu alın.

Her bir parametre grubu üzerinde yavaş optimizasyon gerçekleştirin (her grupta birbirine bağlı 2-3 parametre vardır).

Optimuma ulaşılana kadar her grup için yinelemeli olarak yavaş optimizasyonları tekrarlayın (parametrelerin kayması durur).

Gerçek tiklere geçin, aynı yavaş optimizasyonları gerçekleştirin.

Başka bir sembole geçin, hepsini tekrarlayın.

Önümde böyle bir görev yok. Tabii ki otomasyon buna izin verirse iyi olacaktır.

Ben de otomatik optimizasyon göstergeleri aracılığıyla TS'nin sağlamlığı için bir kriter geliştirmeye çalışıyorum. Araştırmada daha fazla nesnellik için bu çok eksik.

Otomatik optimizasyon şeması tamamen düşünülmüştür, uygulanması için hiçbir teknik engel yoktur.

Bibla'nın kesinlikle işlevsellikle desteklenmesi gerekiyor. Bu yüzden lütfen gerçekleştirimlerinizi önerin.

 
enum eOptType   { eOptOff, eOptSlow, eOptGen, eOptAllSym };
enum eBars      { eBarsEvery, eBarsReal, eBarsOHLC, eBarsOpen, eBarsMath };
enum eCriteria  { eCritBal, eCritPF, eCritEPO, eCritDD, eCritRF, eCritSR, eCritCust };



class MTTESTER {
public:

        static bool 
        SetOptType(eOptType opt) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28FB };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < opt; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetBars(eBars type) {
                const bool rc = MTTESTER::IsReady();
                if (rc) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x2913 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return rc;
        }



        static bool 
        SetCriteria(eCriteria type) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x290B };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_HOME, 0);
                        for (int i = 0; i < type; i++)
                                user32::SendMessageW(Handle, WM_KEYDOWN, VK_DOWN, 0);
                }
                return Res;
        }



        static bool 
        SetCurrency(const string name) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x293F, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        char Chars[];
                        const int Size = ::StringToCharArray(name, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetDepo(const long depo) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28F9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = IntegerToString(depo);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }



        static bool 
        SetLeverage(const long leverage) {
                const bool Res = MTTESTER::IsReady();
                if (Res) {
                        static const int ControlID[] = { 0xE81E, 0x804E, 0x28EC, 0x28E9, 0x03E9 };
                        GET_HANDLE
                        user32::SendMessageW(Handle, WM_LBUTTONDOWN, 0, 0);
                        user32::SendMessageW(Handle, WM_KEYDOWN, VK_DELETE, 0);
                        string s = "1:" + IntegerToString(leverage);
                        char Chars[];
                        const int Size = ::StringToCharArray(s, Chars);
                        for (int i = 0; i < Size; i++)
                                user32::SendMessageW(Handle, WM_CHAR, Chars[i], 0);
                }
                return Res;
        }