ATcl - интерпретатор Tcl для MT4 - страница 4

 
Алексей Барбашин:

А разве можно выжать из тиков еще что-то? )))

там-же не только тики :-)

как "выйдет в свет", то дополнять/изменять структуру будет нельзя.. Поэтому если чего незватает в приведённой таблице - стоит сказать сразу.

ATcl demo - Cawt Excel

Простейший сценарий использования - пользователь/трейдер запускает индикатор, тот открывает Эксель и начинает заполнять таблицу.

Пользователь может её дооформить и вписать всякие формулы. Результат будет отображаться в чарте MT4 и в индикаторных буферах (линиями/стрелками/зигзагами).

То есть человек владеющий экселем сможет сам для себя сделать индикатор для MT4

 

Праздничный скриншот :

ATcl - с днём победы !

Из грядущей демки :
Линии "на лету" рассчитываются в Exсel по его формулам, поздравительная табличка берётся оттуда-же, ссылки на всякое полезное кликабельны.
вот собственно и сама табличка:
ATcl - таблица

 
Отчего-же ексель? Может, что-нибудь функциональнее? 
 
Алексей Тарабанов:
Отчего-же ексель? Может, что-нибудь функциональнее? 

От того что любой трейдер знает Excel. (может конечно есть уникумы которые работая с деньгами не умеют его использовать)

И эта демка позволит ему например сделать свой индикатор с собственными расчётами не заморачиваясь.
А программист может подсмотреть в демке как вообще работать с MS-Office и прицепить к своим продуктам например отчёты в Word и PowerPoint, расписания из OutLook и заметки OneNote

вариант с OO::Calc не подходит, за отсутствием программных интерфейсов OpenOffice.  

 

Версия готовится к выпуску - всвязи с переездом на новый домен и изменениями API в методах Set проверяю прежние демки и правлю доки.

Исправил давно обещанную демку для работы с Web-сокетами. Ошибка была моя - нечаянно закрутил "вечный цикл" внутри таймера :-) Терминал вис в самых нежданных местах и так и не поймал в своё время. А сейчас вернулся со свежим взглядом и вот она !

ATcl - веб сокет

на скрине - запущены сразу две демки, первая периодически и правильно берёт страницу сайта и парсит фриланс (где я видимо навечно в бане)

вторая (то что выводится в журнал) - тот самый веб-сокет, который открывает соединение Binance.com , подписывается на текущий символ и вычитывает поток в реальном времени

 

начал работать Tk - можно будет GUI строить скриптами.

ATcl - Tk

мини-панелька - это окошко Tk в котором разложены его виджеты.

Всё запускается из MT4, данные в окошко передаются и из окошка читаются.

сурс MQL, которые не зависит от сложности рисуемого GUI :

#include <ATcl/ATcl.mqh>

bool hasTimer=false;
ATcl *tcl=NULL;
Tcl_Obj panel=0,methodMessages=0,methodOnTick=0,methodDestroy=0;

int OnInit()
{
   // инициализируем библиотеку и интерпретатор разом
   if (ATcl_OnTkInit()==0 || (tcl=new ATcl)==NULL || !tcl.Ready()) {
      return INIT_FAILED;
   }
   // нам требуется Tk
   tcl.Eval("package require Tk");
   // "спрячем" корневое окно
   tcl.Eval("wm withdraw .");
   // загрузим исходник класса
   tcl.Eval("source MQL4/Files/ATcl/TradePanel.tcl");
   // создаём экземпляр - запускаем панельку
   tcl.Set("Symbol",_Symbol); // подствим переменную в след.выражение
   panel=tcl.ObjEval("TradePanel new .tradePanel $Symbol");
   if (panel==0) {
      return INIT_FAILED;
   }
   tcl.Ref(panel);
   // будем пользоваться этими методами:
   methodMessages=tcl.Ref(tcl.Obj("Messages"));
   methodOnTick=tcl.Ref(tcl.Obj("OnTick"));
   methodDestroy=tcl.Ref(tcl.Obj("destroy"));
   hasTimer=EventSetMillisecondTimer(100);
   
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
   if (hasTimer) EventKillTimer();
   if (tcl!=NULL) {
      if (panel!=0)  tcl.Call(panel,methodDestroy);
      tcl.Unref(panel);
      tcl.Unref(methodMessages);
      tcl.Unref(methodOnTick);
      tcl.Unref(methodDestroy);
      tcl.Eval("destroy .");
      delete tcl;
   }
   ATcl_OnDeinit(reason);
}
void OnTick()
{
   CheckMessages();
   tcl.Call(panel,methodOnTick,tcl.Obj(Bid),tcl.Obj(Ask));
}

void OnTimer()
{
   CheckMessages();
   tcl.Eval("update idletasks");
}
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if ( ! hasTimer) EventSetMillisecondTimer(100);
   CheckMessages();
}

void OnGUI(Tcl_Obj msg) {
   tcl.Ref(msg);
   PrintFormat("On GUI: %s",tcl.String(msg));
   tcl.Unref(msg);
}

void CheckMessages() {
   tcl.Update();
   if (tcl.Call(panel,methodMessages)==TCL_OK) {
      Tcl_Obj msgs=tcl.Ref(tcl.Result());
      if (tcl.Count(msgs)>0) {
         // есть сообщения от GUI
         for(int i=tcl.Count(msgs)-1;i>=0;i--) {
            Tcl_Obj msg=tcl.ListIndex(msgs,i);
            if (msg!=0) OnGUI(msg);
         }
      }
      tcl.Unref(msgs);
   }
}
 
Maxim Kuznetsov:

начал работать Tk - можно будет GUI строить скриптами.


мини-панелька - это окошко Tk в котором разложены его виджеты.

Всё запускается из MT4, данные в окошко передаются и из окошка читаются.

сурс MQL, которые не зависит от сложности рисуемого GUI :

Супер! Ждемс...

 
Maxim Kuznetsov:

начал работать Tk - можно будет GUI строить скриптами.


мини-панелька - это окошко Tk в котором разложены его виджеты.

Всё запускается из MT4, данные в окошко передаются и из окошка читаются.

сурс MQL, которые не зависит от сложности рисуемого GUI :

а вот и слегка дополненный сурс tcl который реализует графику (панельку):
# простая торговая панель
oo::class create TradePanel {
variable W                      ; # имя окна Tk
variable Symbol         ; # символ
variable Bid            ; # значение Bid
variable Ask            ; # значение Ask
variable LabelBid       ; # имя виджета с Bid 
variable LabelAsk       ; # имя виджета с Ask
variable Outgoing       ; # простая очередь исходящих (чтобы MT её считывал, сами мы MT вызывать не можем)
constructor { w symbol } {
        set W $w
        set Symbol $symbol
        set Bid 0
        set Ask 0
        set LabelBid ""
        set LabelAsk ""
        set Outgoing {}
        my Draw
}
destructor {
        catch { destroy $W }
}
method Draw { } {
        # создаём окно
        set W [ toplevel $W ]   ; # toplevel окно
        wm protocol $W WM_DELETE_WINDOW {}      ; # запретим закрывать по "крестику"
        wm title $W $Symbol             ; # выведем заголовок
        # сделаем выпадающее меню с единственным пунктом About
        set mainMenu [ menu $W.menu -tearoff 0 ]
        $mainMenu add cascade -label "Help" -menu $W.menu.help
        set helpMenu [ menu $W.menu.help -tearoff 0 ]
        $helpMenu add command -label "About" -command [ list tk_messageBox -parent $W -title "TradePanel" -message "ATcl demonstation" ]
        # назначим его как меню окна
        $W configure -menu $W.menu
        # и в окне всякие элементы
        set f [ frame $W.panel ]
        label $f.title -text $Symbol -fg grey -font "{Arial Black}"
        set LabelBid [ label $f.bid  -fg grey -font "{Arial Black}" ]
        set LabelAsk [ label $f.ask  -fg grey -font "{Arial Black}" ]
        button $f.buy  -text "Buy"  -fg blue -font "{Arial Black}" -command [ list [ self ] OnBuyPressed ] ; # кнопка Buy - при нажатии вызовет собственный метод OnBuyPressed
        button $f.sell -text "Sell" -fg red -font "{Arial Black}" -command [ list [ self ] OnSellPressed ]
        # проще всего располагать элементы в таблице
        grid $f.title -row 0 -column 0 -columnspan 2 -sticky "ew"
        grid $f.bid -row 1 -column 0 -sticky "e"
        grid $f.ask -row 1 -column 1 -sticky "w"
        grid $f.sell -row 2 -column 0 -sticky "nsew"
        grid $f.buy -row 2 -column 1 -sticky "nsew"
        grid columnconfigure $f 0 -uniform same
        grid columnconfigure $f 1 -uniform same
        # фрейм с контролами - на всё окно
        pack $f -fill both -expand yes
        
        return $W
}
method OnBuyPressed {} {
        # при нажатии кнопки Buy :
        # добавить в исходящий список сообщение 
        lappend Outgoing [ list "buy" [ clock milliseconds ] ]
}
method OnSellPressed {} {
        # при нажатии кнопки Sell :
        # добавить в исходящий список сообщение 
        lappend Outgoing [ list "sell" [ clock milliseconds ] ]
}
# метод будет вызываться из MT когда приходит новый тик
# поменяем значения в виджетах и раскрасим заодно 
method OnTick { bid ask } {
        if { $bid == $Bid } {
                $LabelBid configure -fg grey
        } elseif { $bid > $Bid } {
                $LabelBid configure -fg blue
        } else {
                $LabelBid configure -fg red
        }
        if { $ask == $Ask } {
                $LabelAsk configure -fg grey
        } elseif { $ask > $Ask } {
                $LabelAsk configure -fg blue
        } else {
                $LabelAsk configure -fg red
        }
        set Bid $bid
        set Ask $ask
        $LabelAsk configure -text $Ask
        $LabelBid configure -text $Bid
}
# метод будет вызываться из MT чтобы считать все сообщения
method Messages {} {
        set msgs $Outgoing
        set Outgoing {}
        return $msgs
}

export OnBuyPressed OnSellPressed
export OnTick Messages
} ; # /class TradePanel

##### TEST CASE для автономного запуска #####
if { [ info exists argv0 ] && $argv0 == [ info script ] } {
        package require Tk
        set panel [ TradePanel new .tradePanel "EURUSD" ]
        $panel OnTick 1.2345 1.1234
        update
        wm withdraw .
        tkwait window .tradePanel
        exit
}
просто только что додавил мелкие баги связанные с графикой, доволен как слон !

библиотеку опубликую завтра. утро вечера мудренее - днём ещё раз всё проверю и выложу
 

Релиз ATcl Beta 2

С небольшой задержкой, выпущена новая версия ATcl.

Детали релиза, см http://nektomk.ru/atcl:beta2

Так как были проблемы с доменом, то чтобы обеспечить доступность дистрибутива сделан проект на SourceForge: https://sourceforge.net/projects/mt-atcl/

Загрузить проект можно соотв. со страницы SF или с привычной страницы загрузки: http://nektomk.ru/atcl:install

Архив также прикладываю

Новые фичи:

- добавлена демка работы с Веб-Сокетами

- добавлена демка управления Excel и обмена с ним данными

- начал работать Tk (тоже есть демка) - теперь можно быстро и просто делать самый размашистый GUI

Известный баг:

 - в самый последний момент обнаружен : есть конфликт при одновременной загрузке на один чарт индикаторов ATcl и советника использующего Tk. Природа ошибки понятна, но в коде она ещё не лоцирована и поэтому пока не исправлена.
По отдельности они все замечательно работают, поэтому хоть и с задержкой но решился выпустить релиз с этим багом.

PS. То-ли глюки сайта, то ли броузера, но сие сообщение набиваю 3-й раз.

ATcl - "beta 2" version
ATcl - "beta 2" version
  • nektomk.ru
Рад представить новую версию ATcl. Была продолжена работа по унификации и упрощению API, удалось добиться стабильной работы Tk в экспертах. Демки пополнились двумя полезными демонстрациями. В новой версии API Изменён синтаксис методов Set - они всегда принимают непосредственное MQL значение в качестве параметров. Для того чтобы присвоить...
Файлы:
atcl.zip  6651 kb
 
Maxim Kuznetsov:

Релиз ATcl Beta 2

С небольшой задержкой, выпущена новая версия ATcl.

Детали релиза, см http://nektomk.ru/atcl:beta2

Так как были проблемы с доменом, то чтобы обеспечить доступность дистрибутива сделан проект на SourceForge: https://sourceforge.net/projects/mt-atcl/

Загрузить проект можно соотв. со страницы SF или с привычной страницы загрузки: http://nektomk.ru/atcl:install

Архив также прикладываю

Новые фичи:

- добавлена демка работы с Веб-Сокетами

- добавлена демка управления Excel и обмена с ним данными

- начал работать Tk (тоже есть демка) - теперь можно быстро и просто делать самый размашистый GUI

Известный баг:

 - в самый последний момент обнаружен : есть конфликт при одновременной загрузке на один чарт индикаторов ATcl и советника использующего Tk. Природа ошибки понятна, но в коде она ещё не лоцирована и поэтому пока не исправлена.
По отдельности они все замечательно работают, поэтому хоть и с задержкой но решился выпустить релиз с этим багом.

PS. То-ли глюки сайта, то ли броузера, но сие сообщение набиваю 3-й раз.

Отлично! Будем тестировать! )))