ATcl - MT4用Tclインタプリタ - ページ 4

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

ダニから搾り取れるものはないのか?)))

ダニだけではありません :-)

リリース」されると、構造の追加・変更ができなくなります。だから、もし与えられた表の中に何か欠けているものがあれば、すぐに伝える価値がある。

ATclデモ - Cawt Excel

最も単純な使用シナリオは、ユーザー/トレーダーがインジケータを起動し、Excelを開いてテーブルを埋め始めるというものです。

ユーザーが記入し、数式を追加することができます。結果はMT4チャートとインジケーターバッファ(ライン/矢印/矢印グラフ)に表示されます。

つまり、ExcelユーザーがMT4用のインジケータを作成することができます。

 

ホリデーのスクリーンショット。

ATcl - 勝利の日おめでとうございます。

近日公開のデモから:
その場のセリフはExcelでその数式を使って計算し、挨拶文の表もそこから取ってきて、便利なものにはすべてクリックできるリンクが張ってあるのです。
こちらが表そのものです。
ATcl - テーブル

 
なぜExcelなのか?もっと機能的なものがいいのでは?
 
Алексей Тарабанов:
なぜExcelなのか?もっと機能的なものがいいのでは?

なぜなら、トレーダーなら誰でもエクセルを知っているからです。(もちろん、お金を使う仕事をしている人の中には、お金の使い方がわからない人もいるかもしれません)。

このデモでは、例えば、あまり考えなくても、自分なりの計算で独自のインジケータを作ることができます。
また、プログラマーはデモを利用してMS-Officeとの連携方法を学び、WordやPowerPointのレポート、OutLookのスケジュール、OneNoteのメモを自分の製品に添付することができる

OO::Calcを搭載したバージョンは、OpenOfficeプログラミングインターフェイスがないため、適しません。

 

新しいドメインへの移行、SetメソッドのAPI変更、過去のデモの確認、ドックの修正など、バージョンアップの準備が整いました。

長い間お約束していた、Webソケットを使ったデモを修正しました。私のミスです。うっかりして、timerの中に "eternal loop "を入れてしまいました :-)。端末が意外なところにぶら下がっていて、間に合わせで捕まえたことがない。そして今、あらためて見直してみると、そこにあったのは......。

ATcl - ウェブソケット

スクリーンショットでは - 一度に2つのデモを実行すると、最初の定期的かつ正確にサイトのページを取り、フリーランス(私はおそらく永遠に禁止されている場所)を解析します。

2つ目(ログに入るもの)は、Binance.comの接続を開き、現在のシンボルを購読し、リアルタイムでストリームを読み取るのと同じウェブソケットです。

 

Tkが動き出した - スクリプトでGUIを構築することが可能になる。

ATcl - Tk

ミニパネルは、ウィジェットがレイアウトされるTkウィンドウです。

全てはMT4から実行され、データはウィンドウに転送され、ウィンドウから読み込まれます。

描画するGUIの複雑さに左右されないMQL-source。

#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から実行され、データはウィンドウに転送され、ウィンドウから読み込まれます。

描画するGUIの複雑さに左右されないMQL-source。

スーパー!楽しみだ...。

 
Maxim Kuznetsov:

Tkが動き出した - スクリプトでGUIを構築することが可能になる。


ミニパネルは、ウィジェットがレイアウトされるTkウィンドウです。

全てはMT4から実行され、データはウィンドウに転送され、ウィンドウから読み込まれます。

描画するGUIの複雑さに左右されないMQL-source。

そして、グラフィック(パネル)を実装するために少し修正したtcl soursはこちらです。
#  простая торговая панель
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ベータ2 リリース

少し遅れましたが、ATclの新バージョンをリリースしました。

リリースの詳細は、http://nektomk.ru/atcl:beta2 をご覧ください。

ドメインに問題があったため、配布を可能にするため、SourceForgeにプロジェクトが作られました: https://sourceforge.net/projects/mt-atcl/

このプロジェクトは、SFのページ、または通常のダウンロードページからダウンロードすることができます。http://nektomk.ru/atcl:install

アーカイブスも添付

新機能を搭載。

- WebSocketの操作デモを追加

- Excel管理・データ交換デモを追加

- Tkが稼動開始(デモもあり)-これで、最も広大なGUIを素早く、簡単に作ることができる

既知のバグ。

- ATclインジケータとTkを使用するExpert Advisorを同時に1つのチャートにロードすると、競合が発生することが最後の瞬間に検出されました。エラーの性質は明確ですが、まだコードに記録されていないため、まだ修正されていません。
別々には、どれも問題なく動くので、このバグのままリリースすることにしました。

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ベータ2 リリース

少し遅れましたが、ATclの新バージョンをリリースしました。

リリースの詳細は、http://nektomk.ru/atcl:beta2 をご覧ください。

ドメインに問題があったため、配布を可能にするため、SourceForgeにプロジェクトが作られました: https://sourceforge.net/projects/mt-atcl/

このプロジェクトは、SFのページ、または通常のダウンロードページからダウンロードすることができます。http://nektomk.ru/atcl:install

また、アーカイブも添付しています。

新機能を搭載。

- WebSocketの操作デモを追加

- Excel管理・データ交換デモを追加

- Tkが稼動開始(デモもあり)-これで、最も広大なGUIを素早く、簡単に作ることができる

既知のバグ。

- ATclインジケータとTkを使ったEAを1つのチャートで同時に読み込むとコンフリクトが発生することを最後の最後に発見しました。エラーの性質は明確ですが、まだコードに記録されていないため、まだ修正されていません。
別々には、どれも問題なく動作するので、このバグのままリリースすることにしました。

PS.サイトの不具合なのか、ブラウザの不具合なのか、このメッセージは3回目に記入したものです。

素晴らしいテストしてみよう)))