ATcl - Intérprete Tcl para MT4 - página 4

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

Há mais alguma coisa que você possa espremer dos carrapatos? )))

Não se trata apenas de carrapatos :-)

Se for "liberado", não será possível acrescentar/modificar a estrutura. Portanto, se algo está faltando na mesa dada - vale a pena dizer imediatamente.

ATcl demo - Cawt Excel

O cenário de uso mais simples - o usuário/comerciante inicia o indicador, ele abre o Excel e começa a preencher a tabela.

O usuário pode preenchê-lo e adicionar fórmulas. O resultado será exibido no gráfico MT4 e em buffers indicadores (linhas/rotas/gráficos).

Ou seja, um usuário do Excel pode criar um indicador para o MT4

 

Tela de férias :

ATcl - feliz dia de vitória!

A partir de uma próxima demonstração :
As linhas na mosca são calculadas em Excel usando suas fórmulas, a tabela de saudação é tirada de lá também, e os links para todo o material útil são clicáveis.
Aqui está a própria mesa:
ATcl - tabela

 
Por que Excel? Talvez algo mais funcional?
 
Алексей Тарабанов:
Por que Excel? Talvez algo mais funcional?

Porque todo comerciante conhece o Excel. (É claro que pode haver algumas pessoas que trabalham com dinheiro e não sabem como utilizá-lo).

Esta demonstração lhes permite, por exemplo, fazer seu próprio indicador com seus próprios cálculos sem ter que pensar muito.
E o programador pode usar a demonstração para aprender a trabalhar com o MS-Office e anexar os relatórios em Word e PowerPoint, os horários do OutLook e as notas do OneNote a seus próprios produtos

A versão com OO::Calc não é adequada, pois não há interface de programação OpenOffice.

 

A versão está pronta para lançamento - mudança para novo domínio e mudança de API nos métodos Set, verificação de demonstrações anteriores e fixação de docas.

Fixo o longo tempo prometido para o trabalho com Web-sockets. Meu erro - inadvertidamente fez "loop eterno" dentro do temporizador :-). O terminal fica pendurado nos lugares mais inesperados e nunca o pegou no devido tempo. E agora voltou com um novo olhar e lá estava ele!

ATcl - tomada web

Na captura de tela - rodando duas demos ao mesmo tempo, a primeira periodicamente e corretamente pega uma página do site e analisa freelance (onde provavelmente estou proibido para sempre)

O segundo (o que é exibido no log) é o mesmo soquete que abre a conexão Binance.com , assina o símbolo atual e lê o fluxo em tempo real

 

Tk começou a funcionar - será possível construir uma GUI com scripts.

ATcl - Tk

o mini-panel é a janela Tk na qual estão dispostos seus widgets.

Tudo é executado a partir do MT4, os dados são transferidos para a janela e lidos da janela.

A fonte MQL, que não depende da complexidade da GUI a ser desenhada:

#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 começou a funcionar - será possível construir uma GUI com scripts.


O mini-panel é a janela Tk na qual estão dispostos seus widgets.

Tudo é executado a partir do MT4, os dados são transferidos para a janela e lidos da janela.

A fonte MQL, que não depende da complexidade da GUI a ser desenhada:

Super! Olhando para o futuro...

 
Maxim Kuznetsov:

Tk começou a funcionar - será possível construir uma GUI com scripts.


O mini-panel é a janela Tk na qual estão dispostos seus widgets.

Tudo é executado a partir do MT4, os dados são transferidos para a janela e lidos da janela.

A fonte MQL, que não depende da complexidade da GUI a ser desenhada:

Aqui estão os tcl sours ligeiramente modificados que implementam os gráficos (painel):
#  простая торговая панель
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
}
Acabei de terminar todos os pequenos bugs relacionados com gráficos, estou feliz com isso!

Colocarei a biblioteca amanhã de manhã - verificarei novamente à tarde e afixá-la-ei
 

Lançamento ATcl Beta 2

Com um leve atraso, uma nova versão da ATcl foi lançada.

Detalhes do lançamento, ver http://nektomk.ru/atcl:beta2

Como houve problemas com o domínio, para tornar a distribuição disponível, foi feito um projeto no SourceForge: https://sourceforge.net/projects/mt-atcl/

O projeto pode ser baixado da página SF ou da página de download usual: http://nektomk.ru/atcl:install

arquivo também anexado

Novas características:

- Adicionado o WebSocket handling demo

- Acrescentada a demonstração de gerenciamento e intercâmbio de dados do Excel

- Tk agora está funcionando (demo também está disponível) - agora você pode rápida e facilmente fazer a GUI mais espalhada

Inseto conhecido:

- No último momento foi detectado: há um conflito ao carregar simultaneamente em um gráfico um indicador ATcl e um Expert Advisor usando Tk. A natureza do erro é clara, mas ele ainda não foi registrado no código e, portanto, ainda não foi corrigido.
Separadamente, todos eles funcionam bem, então decidi liberá-lo com este bug.

PS. Se o site apresentar falhas ou navegador, mas esta mensagem eu preencho a terceira vez.

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

Lançamento ATcl Beta 2

Com um leve atraso, uma nova versão da ATcl foi lançada.

Detalhes do lançamento, ver http://nektomk.ru/atcl:beta2

Como houve problemas com o domínio, para tornar a distribuição disponível, foi feito um projeto no SourceForge: https://sourceforge.net/projects/mt-atcl/

O projeto pode ser baixado da página SF ou da página de download usual: http://nektomk.ru/atcl:install

O arquivo também é anexado

Novas características:

- Adicionado o WebSocket handling demo

- Acrescentada a demonstração de gerenciamento e intercâmbio de dados do Excel

- Tk agora está funcionando (demo também está disponível) - agora você pode rápida e facilmente fazer a GUI mais espalhada

Inseto conhecido:

- No último momento eu descobri: há um conflito com o carregamento simultâneo de indicadores ATcl e EA usando Tk em um gráfico. A natureza do erro é clara, mas ele ainda não foi registrado no código e, portanto, ainda não foi corrigido.
Separadamente, todos eles funcionam bem, então decidi liberá-lo com este bug.

PS. Se o site apresentar falhas ou navegador, mas esta mensagem eu preencho a terceira vez.

Ótimo! Vamos testá-lo! )))