ATcl - MT4용 Tcl 인터프리터 - 페이지 4

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

진드기에서 다른 것을 짜낼 수 있습니까? )))

티키 뿐만이 아닙니다 :-)

"나옴"하자마자 구조를 보완/변경하는 것은 불가능합니다. 따라서 위의 표에 뭔가 빠진 것이 있다면 바로 말할 가치가 있습니다.

ATcl 데모 - Cawt Excel

가장 간단한 사용 시나리오 - 사용자/거래자가 지표를 실행하고 Excel을 열고 테이블을 채우기 시작합니다.

사용자는 이를 완료하고 수식을 입력할 수 있습니다. 결과는 MT4 해도 및 표시 버퍼(선/화살표/지그재그)에 표시됩니다.

즉, Excel을 소유한 사람은 자신을 위해 MT4에 대한 지표를 만들 수 있습니다.

 

축제 스크린샷:

ATcl - 해피 빅토리 데이!

곧 있을 데모에서:
"즉석에서"줄은 Excel에서 공식에 따라 계산되며 거기에서 축하 표시를 가져오고 유용한 링크를 클릭할 수 있습니다.
다음은 접시 자체입니다.
ATcl - 테이블

 
왜 엑셀인가? 어쩌면 더 기능적인?
 
Алексей Тарабанов :
왜 엑셀인가? 어쩌면 더 기능적인?

모든 상인이 Excel을 알고 있다는 사실에서. (물론 돈으로 일할 때 쓸 줄 모르는 독특한 사람들이 있을 수도 있음)

그리고 이 데모를 통해 그는 예를 들어 귀찮게 하지 않고 자신의 계산으로 자신의 지표를 만들 수 있습니다.
그리고 프로그래머는 데모에서 MS-Office를 사용하는 일반적인 방법을 엿보고 자신의 제품(예: Word 및 PowerPoint의 보고서, OutLook 및 OneNote의 일정)에 첨부할 수 있습니다.

OO::Calc 옵션은 OpenOffice API가 없기 때문에 적합하지 않습니다.

 

버전 출시를 준비 중입니다. 새 도메인으로 이동하고 Set 메소드의 API 변경으로 인해 이전 데모를 확인하고 도크를 편집하고 있습니다.

웹 소켓 작업을 위해 오랫동안 약속된 데모를 수정했습니다. 실수는 내 것입니다. 실수로 타이머 내부에서 "영원한 주기"를 비틀었습니다 :-) 터미널은 가장 예상치 못한 장소에 매달려 있었고 그 당시에는 결코 잡지 못했습니다. 그리고 이제 새로운 모습으로 돌아왔습니다.

ATcl - 웹 소켓

화면에서 - 두 개의 데모가 한 번에 시작됩니다. 첫 번째 데모는 주기적으로 올바르게 사이트 페이지를 가져오고 프리랜스를 구문 분석합니다(여기서 나는 분명히 영원히 목욕 중입니다).

두 번째(기록된 것)는 Binance.com 연결을 열고 현재 기호를 구독하고 실시간으로 스트림을 읽는 동일한 웹 소켓입니다.

 

Tk가 작동하기 시작했습니다. 스크립트로 GUI를 구축할 수 있습니다.

ATcl - Tk

미니 패널은 위젯이 배치되는 Tk 창입니다.

모든 것이 MT4에서 시작되고 데이터가 창으로 전송되고 창에서 읽힙니다.

그려진 GUI의 복잡성에 의존하지 않는 MQL 리소스:

 #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 리소스:

감독자! 대기 중...

 
Maxim Kuznetsov :

Tk가 작동하기 시작했습니다. 스크립트로 GUI를 구축할 수 있습니다.


미니 패널은 위젯이 배치되는 Tk 창입니다.

모든 것이 MT4에서 시작되고 데이터가 창으로 전송되고 창에서 읽힙니다.

그려진 GUI의 복잡성에 의존하지 않는 MQL 리소스:

다음은 그래픽(패널)을 구현하는 약간 보완된 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 베타 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를 동시에 하나의 차트에 로드할 때 충돌이 있습니다. 오류의 성격은 분명하지만 아직 코드에서 찾지 못했기 때문에 아직 수정되지 않았습니다.
별도로, 그들은 모두 훌륭하게 작동하므로 지연되지만 이 버그가 있는 릴리스를 출시하기로 결정했습니다.

추신. 사이트 결함 또는 브라우저이지만 이 메시지는 세 번째로 채워져 있습니다.

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를 사용하는 Expert Advisor를 동시에 하나의 차트에 로드할 때 충돌이 있습니다. 오류의 성격은 분명하지만 아직 코드에서 찾지 못했기 때문에 아직 수정되지 않았습니다.
별도로, 그들은 모두 훌륭하게 작동하므로 지연되지만 이 버그가 있는 릴리스를 출시하기로 결정했습니다.

추신. 사이트의 결함이나 브라우저의 결함이지만 세 번째로 이 메시지를 입력합니다.

괜찮은! 테스트하자! )))