ATcl - MT4 için Tcl yorumlayıcısı - sayfa 6

 
Maxim Kuznetsov :

yazılım teknolojisi açısından - potansiyel olarak evet. Kitaplıklar, bulutta değilken optimize ediciden çağrılabilir.

Ulusal Meclis tarafından - nasıl hayal ediyorsunuz?

Optimize edicide bir geçiş yapılır ve veriler bir dosyaya yazılır, daha sonra eğitim için ağa gönderilir, eğitimden sonra eğitim değerlendirmesinin sonuçları MT4 / 5'e ve ağın (kuralların) kendisine döndürülür bir dosyaya yazılır . Başka bir tür, NS mantığının kayıtlı dosyalarından (NS seçeneklerinin kendilerini) optimize ettiğimiz ve TS'nin standart göstergelerini düzelttiğimiz zamandır.

 

Tk grafikleriyle ilgili demoyu genişletti - şimdi bir sipariş tablosunu da gösteriyor.

Ayrı bir pencerede sipariş tablosu

Sipariş tablosuna atıfta bulunan MQL kodu
- tüm siparişlerini seçer ve OnOrderList yönteminde tcl'ye gönderir
- çıktıda 3 bilet listesi alır - yeni olanlar, değişenler ve silinenler

 void
SendOrderList() 
{
   int total= OrdersTotal ();
   Tcl_Obj list=tcl.Ref(tcl.Obj()); // пустой список
   for ( int pos= 0 ;pos<total;pos++) {
       if (! OrderSelect (pos, SELECT_BY_POS , MODE_TRADES ) ||
         OrderMagicNumber ()!=MAGIC ||
         OrderSymbol ()!= _Symbol ||
         OrderCloseTime ()!= 0 ) continue ;
      Tcl_Obj ord=tcl.Ref(tcl.List(
         tcl.Obj( OrderTicket ()),
         tcl.Obj( OrderType ()),
         tcl.Obj( OrderOpenTime ()),
         tcl.Obj( OrderSymbol ()),
         tcl.Obj( OrderLots ()),
         tcl.Obj( OrderOpenPrice ()),
         tcl.Obj( OrderStopLoss ()),
         tcl.Obj( OrderTakeProfit ()),
         tcl.Obj( OrderComment ()),
         tcl.Obj( OrderSwap ()),
         tcl.Obj( OrderCommission ())
      ));
      tcl.AppendObj(list,ord);
      tcl.Unref(ord);
   }
   if (tcl.Call(panel,methodOnOrderList,list)!=TCL_OK) {
       PrintFormat ( "OrderSendList failed : %s" ,tcl.StringResult());
   } else {
      Tcl_Obj triplet=tcl.Ref(tcl.Result()); // 0-новые 1-изменённые 2-удалённые
      Tcl_Obj created=tcl.Ref(tcl.Index(triplet, 0 ));   // список новых ордеров
      Tcl_Obj changed=tcl.Ref(tcl.Index(triplet, 1 ));   // список изменённых ордеров
      Tcl_Obj removed=tcl.Ref(tcl.Index(triplet, 2 ));   // список удалённых ордеров
      PrintOrderList( "New orders" ,created);
      PrintOrderList( "Modified orders" ,changed);
      PrintOrderList( "Deleted orders" ,removed);
       // объекты больше ненужны
      tcl.Unref(removed);
      tcl.Unref(changed);
      tcl.Unref(created);
      tcl.Unref(triplet);
   }
}

ve işin büyük kısmını yapan Tcl yöntemi:
- yeni bir sipariş listesi alır
- önceki arama sırasında olanlarla karşılaştırır
- belirtilen 3 listeyi oluşturur (yeni, değiştirilmiş, silinmiş)
- aynı zamanda aslında bir ağaç olan ve birkaç seviyeye dönüştürülebilen bir tabloyu korur ..


# надо обновить внутренние структуры
# и вернуть триплет (список из трёх списков)
#   1 - список новых ордеров
#   2 - ордера которые поменялись
#    3 - ордера которые удалены
method OnOrderList { orderList } {
    set created {}
    set changed {}
    set removed {}
    foreach order $orderList {
        set ticket [ lindex $order 0 ]
        set known($ticket) $order
        if { ! [ info exists Orders($ticket) ] } {
            # новый тикет
            # добавить в список свежесозданных
            lappend created $ticket
            set Orders($ticket) $order
            continue
        }
        if { $Orders($ticket) != $order } {
            # что-то поменялось
            # добавить в список изменённых
            set Orders($ticket) $order
            lappend changed $ticket
        }
    }
    foreach ticket [ array names Orders ] {
        if { ! [ info exists known($ticket) ] } {
            # прежнего ордера нет в новом списке - значит удалён
            lappend removed $ticket
            unset Orders($ticket)
        }
    }
    # обновить грфику :-)
    foreach ticket $removed {
        my OnRemoveOrder $ticket
    }
    foreach ticket $changed {
        my OnChangeOrder $ticket
    }
    foreach ticket $created {
        my OnCreateOrder $ticket
    }
    return [ list $created $changed $removed ]
}

her şey çok kompakt.
Her iki dilin de güçlü yanlarını kullanabilirsiniz - MQL ticaret ortamına yakındır ve dizilerde hızlı bir şekilde hesaplar,
Tcl, listeler ve karmalarla kullanımı kolaydır.
MQL'de katı bir ticaret algoritması uygulanır ve dünya ve kullanıcı ile etkileşim komut dosyaları ile düzenlenir.

Arşivi ekliyorum.

Dosyalar:
atcl.zip  6662 kb
 

Teklifleri Excel'e aktarmak için komut dosyası

alıntıları doğrudan Excel'e aktarmak için kısa bir komut dosyası yaptı.
CSV'de ve genel parametrelerde herhangi bir kayıt olmadan - sadece grafiğe atmak için bir Excel sayfası açılacak ve tüm alıntılar buna kopyalanacaktır.

Metin mümkün olduğunca yorumlanmış ve eklenmiştir. Kişisel bir sitede betiğin ayrıntılarını çizdim http://nektomk.ru/atcl:ratestoexcel
Hacim forumun kapsamı dışında, yani orada. Belki havamdaysam, bilgilerin kesinlikle kaybolmaması için yerel bir blogda çoğaltırım.

scripti ekliyorum

PS/ mql'nin toplu derlemesi için bir make-dosyası olan var mı? bir mqh'yi değiştirmek, dürtmek ve bağımlılıklarda listelenen bir grup mq4'ü yeniden oluşturmak için ..

makaleyi yerel blogda güncelleyin/ çoğaltın https://www.mql5.com/en/blogs/post/718304 - şimdi muhtemelen kaybolmayacak
RatesToExcel
  • nektomk.ru
Часто возникающий (и довольно практичный) вопрос у пользователей MetaTrader - «Как скопировать котировки в Excel?» . При помощи библиотеки ATcl это программируется довольно легко. В состав библиотеки входит «большая» программа работающая с Excel, но для частых потребностей сделал короткий скрипт, который делает самую простую вещь - экспорт...
Dosyalar:
 

Postacı çalışıyor ama yine de bir yorum yapmamız gerekiyor, açıklamayı tamamlamamız gerekiyor...

Bu arada, insanlara bir soru - GUI-Builder talep görecek mi?
Tk için öyleler, ancak metinde komut dosyası yazmanın çizimden daha hızlı olması nedeniyle çok az talep görüyorlar.

şöyle bir şey:

PS/ böyle bir GUI yapısının sonucu artık "böyle ve böyle bir anne" yardımıyla MT4'ten başlatılabilir..

 
Maxim Kuznetsov :

Postacı çalışıyor, ancak belgelemeyi, açıklamayı tamamlamayı hala daha uzun yapmamız gerekiyor ...

Bu arada, insanlara bir soru - GUI-Builder talep görecek mi?
Tk için öyleler, ancak metinde komut dosyası yazmanın çizimden daha hızlı olması nedeniyle çok az talep görüyorlar.

şöyle bir şey:

PS/ böyle bir GUI yapısının sonucu artık "böyle ve böyle bir anne" yardımıyla MT4'ten başlatılabilir..

Ne ilginç özellikler ... ama nasıl uygulanır?

Ve sadece grafik arayüzler için bir fikrim var - bir karar ağacı gibi ticaret mantığı yaratmak! Onlar. bir grafik düzenleyicide (yani kabuk) bir ağaç oluşturuyoruz ve bir düğme yardımıyla onu basit kurallara, hatta hemen koda dönüştürüyoruz! Bununla birlikte, kodda kuralları çok kompakt bir şekilde de okuyabilirsiniz.

Bu neden gerekli? Evet, bu yaklaşım ticaret stratejisini detaylandırmanıza izin verir, örneğin, onu zaman serilerine bölmek kolaydır - sadece ticaret yaptığımız / ticaret yapmadığımız kararları verirken değil, aynı zamanda bu zamanda bu şekilde ticaret yapıyoruz ve bu zaman başka bir şekilde. Ticaret taktiklerinde birçok farklı değişiklik işareti var ve kodda ilk olarak yazmak kompakt değil ve ikincisi görsel olarak okumak zor - çok fazla hata yapabilirsiniz.

Yeteneğinizin uygulanması için böyle bir fikirle ilgileniyor musunuz?

 
Aleksey Vyazmikin :

Ne ilginç özellikler ... ama nasıl uygulanır?

Ve sadece grafik arayüzler için bir fikrim var - bir karar ağacı gibi ticaret mantığı yaratmak! Onlar. bir grafik düzenleyicide (yani kabuk) bir ağaç oluşturuyoruz ve bir düğme yardımıyla onu basit kurallara, hatta hemen koda dönüştürüyoruz! Bununla birlikte, kodda kuralları çok kompakt bir şekilde de okuyabilirsiniz.

Bu neden gerekli? Evet, bu yaklaşım ticaret stratejisini detaylandırmanıza izin verir, örneğin, onu zaman serilerine bölmek kolaydır - sadece ticaret yaptığımız / ticaret yapmadığımız kararları verirken değil, aynı zamanda bu zamanda bu şekilde ticaret yapıyoruz ve bu zaman başka bir şekilde. Ticaret taktiklerinde birçok farklı değişiklik işareti var ve kodda ilk olarak yazmak kompakt değil ve ikincisi görsel olarak okumak zor - çok fazla hata yapabilirsiniz.

Yeteneğinizin uygulanması için böyle bir fikirle ilgileniyor musunuz?

"Grafik karar ağacı" fikrini hiç anlamadım :-) belki yeterli yetenek uygulanmamıştır :-)

 
Maxim Kuznetsov :

"Grafik karar ağacı" fikrini hiç anlamadım :-) belki yeterli yetenek uygulanmamıştır :-)

Bir dizi kural içeren bir veri tablosunu temsil edin



Koddaki bu kurallar aşağıdaki gibi düzenlenmiştir

       for ( int i= 1 ;i<StrokTotal_Buy; i++)
        {
         UslovieSumm_Buy=
                          Sravnenief(arr_Vektor_Week,arrRead_Buy_01[i])+
                          Sravnenief(arr_Vektor_Day,arrRead_Buy_02[i])+
                          Sravnenief(arr_Vektor_Don,arrRead_Buy_03[i])+
                          Sravnenief(arr_DonProc,arrRead_Buy_04[i])+
                          Sravnenief(arr_iDelta_H1,arrRead_Buy_05[i])+
                          Sravnenief(arr_iDelta_H3,arrRead_Buy_06[i])+
                          Sravnenief(arr_iDelta_H4,arrRead_Buy_07[i])+
                          Sravnenief(arr_iDelta_H6,arrRead_Buy_08[i])+
                          Sravnenief(arr_iDelta_H12,arrRead_Buy_09[i])+
                          Sravnenief(arr_iDelta_D1,arrRead_Buy_10[i])+
                          Sravnenief(arr_iDelta_W1,arrRead_Buy_11[i])+
                          Sravnenief(arr_iDelta_MN1,arrRead_Buy_12[i])+
                          Sravnenief(arr_RSI_Open_M1,arrRead_Buy_13[i])+
                          Sravnenief(arr_RSI_Open_H1,arrRead_Buy_14[i])+
                          Sravnenief(arr_BB_Center_Open,arrRead_Buy_15[i])+
                          Sravnenief(arr_BB_Up_Open,arrRead_Buy_16[i])+
                          Sravnenief(arr_BB_Down_Open,arrRead_Buy_17[i])+
                          Sravnenief(arr_TimeH,arrRead_Buy_18[i])+
                          Sravnenief(arr_Den_Nedeli,arrRead_Buy_19[i])+
                          Sravnenief(arr_iDelta_Max_H1,arrRead_Buy_20[i])+
                          Sravnenief(arr_iDelta_Min_H1,arrRead_Buy_21[i])+
                          Sravnenief(arr_iDelta_Max_D1,arrRead_Buy_22[i])+
                          Sravnenief(arr_iDelta_Min_D1,arrRead_Buy_23[i]);                                                                              
;




         if (UslovieSumm_Buy== 23 )
           {
            Pattern_Buy= 1 ;
            Pravilo_Buy=i;
             break ;
           }
        }

Kuralın değerleri ile hesaplanan değerler (gösterge değeri / zaman / diğer kalıp) arasında bir eşleşme varsa, örneğin bir ticaret eylemi gerçekleştirilir.

Bu ticaret kararları yöntemi çok kompakt ve çeşitlidir - örneğin birçok stratejiyi bu kadar basit bir şekilde kodlayabilirsiniz - onlara farklı bir sihir vererek.

Ancak buradaki önemli nokta, bu programlama tarzı için yalnızca ortama ihtiyacınız olmasıdır. Bu ortam, bloklar oluşturabileceğiniz bir karar ağacı (ilkel blok diyagramı) gibi görünmelidir (hesaplama sonucu örneğin arr_iDelta_Max_D1 önceden tanımlanmış değerlerle (1,2,3,4 ..n) ve / veya değerleri sınırlama yeteneği, bu şekilde birçok farklı grup oluşturma ), bu blok, her değişken değeri veya değişken değer aralığı için dallara sahip olacak ve bir sonraki bloğa kadar böyle devam edecek. Böylece, her biri bu arada tüm blokları kullanmak zorunda olmayan bir dizi kuralımız olacak.

Bu daha net mi? Açıklamaya ihtiyacınız varsa - sorun.

 
Aleksey Vyazmikin :

Bir dizi kural içeren bir veri tablosunu temsil edin



Koddaki bu kurallar aşağıdaki gibi düzenlenmiştir

Kuralın değerleri ile hesaplanan değerler (gösterge değeri / zaman / diğer kalıp) arasında bir eşleşme varsa, örneğin bir ticaret eylemi gerçekleştirilir.

Bu ticaret kararları yöntemi çok kompakt ve çeşitlidir - örneğin birçok stratejiyi bu kadar basit bir şekilde kodlayabilirsiniz - onlara farklı bir sihir vererek.

Ancak buradaki önemli nokta, bu programlama tarzı için yalnızca ortama ihtiyacınız olmasıdır. Bu ortam, bloklar oluşturabileceğiniz bir karar ağacı (ilkel blok diyagramı) gibi görünmelidir (hesaplama sonucu örneğin arr_iDelta_Max_D1 önceden tanımlanmış değerlerle (1,2,3,4 ..n) ve / veya değerleri sınırlama yeteneği, bu şekilde birçok farklı grup oluşturma ), bu blok, her değişken değeri veya değişken değer aralığı için dallara sahip olacak ve bir sonraki bloğa kadar böyle devam edecek. Böylece, her biri bu arada tüm blokları kullanmak zorunda olmayan bir dizi kuralımız olacak.

Bu daha net mi? Açıklamaya ihtiyacınız varsa - sorun.

Simülasyonlardaki Xcos (http://www.scilab.org/en/scilab/features/xcos) ve benzer modlar gibi mi?
tcl'de benzer bir şey gördüm - blokların oklarla bağlandığı bir ortam .. ses / video / grafik işlemeyi bu şekilde programladılar. http://wiki.tcl.tk/8565 batıracak çok şey var gibi görünüyor, hatta Maxim'i bir bloğa sıkıştırdılar
Eğer öyleyse, çok dikkat edeceğim.
Xcos / Features / Scilab / Home - Scilab
Xcos / Features / Scilab / Home - Scilab
  • Scilab Enterprises
  • www.scilab.org
Xcos is a graphical editor to design hybrid dynamical systems models. Models can be designed, loaded, saved, compiled and simulated.
 
Maxim Kuznetsov :
Simülasyonlardaki Xcos (http://www.scilab.org/en/scilab/features/xcos) ve benzer modlar gibi mi?
tcl'de benzer bir şey gördüm - blokların oklarla bağlandığı bir ortam .. ses / video / grafik işlemeyi bu şekilde programladılar. http://wiki.tcl.tk/8565 batıracak çok şey var gibi görünüyor, hatta Maxim'i bir bloğa sıkıştırdılar
Eğer öyleyse, çok dikkat edeceğim.

Evet, yaklaşım bu! Ana şey, işleri karmaşıklaştırmamak ve doğru bir tercüman yapmaktır, böylece tüm bloklar MQL programının zaten çalışacağı bir satırda (her biri bir dalda) toplanır.

 
Aleksey Vyazmikin :

Evet, yaklaşım bu! Ana şey, işleri karmaşıklaştırmamak ve doğru bir tercüman yapmaktır, böylece tüm bloklar MQL programının zaten çalışacağı bir satırda (her biri bir dalda) toplanır.

Karmaşık olmam pek olası değil, örneğin, bwise kodunda çok fazla kurcalamak.

En fazla ATcl ile birlikte kullanılabilecek (yani, Mql'den girişlerine veri aktarabilecek) ve çıkışları alacak şekilde uyarlarım.
Tabii ki, bir çeşit HowTo yazmanız gerekecek "kareler nasıl çizilir ve bir uzmana eklenir". Ve yazarla (yazarlar) iletişim kurarken İngilizce olarak çok çalışın :-)