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

 
Maxim Kuznetsov:
Quem controlará os pips, implementará o protocolo e analisará os resultados? é longo, lento e somente através de sondagens.

Posso ter alguns links para ler sobre este atcl, para que você não tenha que passar por tudo, mas possa estar mais focado no tema.

 
Alexey Oreshkin:

Será que um par de links para ler sobre este atcl pode não escavar tudo, e se familiarizar mais propositadamente com o tema.

Os principais links para o library-integrator para MT4 (o mesmo em que estou trabalhando duro) são o tópico atual aqui, mais o mencionado no tópico http://luxtrade.tk/atcl:start (historicamente meu site, que está em uma confusão constante :-) )

o próprio Tcl (site raiz) : http://www.tcl.tk

wiki: http://wiki.tcl.tk

"biblioteca padrão" : https://core.tcl.tk/tcllib/doc/tcllib-1-18/embedded/www/toc.html (link para os documentos, provavelmente eles são de interesse primário)

Atualmente o principal distribuidor da ActiveState: https://www.activestate.com/activetcl ,

Eles estão "nos calcanhares" do MagicSplat http://www.magicsplat.com/ e do IronTcl https://irontcl.com/

Como linguagem e plataforma de script, o Tcl é testado no mínimo - primeiro lançamento em 1990, agora está presente de fato no Linux/UNIX, agora também no Android. 98% você o tem em sua máquina em alguma forma despojada - python,ruby,R,maxima,octave e outros o usam para GUI (tkinter etc.)

PS. espero que eles não matem meu posto e a mim junto com muitos links ? É tudo grátis.

PPS. Para as empresas terceirizadas locais - há também uma recompensa "saborosa" https://github.com/flightaware/Tcl-bounties. Mas existem apenas tarefas difíceis a partir de 2500USD e existe uma disciplina rigorosa.

ATcl
  • luxtrade.tk
До любого обращения к ATcl должна быть вызвана функций ATcl_OnInit() и в завершении скрипта/индикатора/советника ATcl_OnDeinit(const int reason). Между вызовами этих двух функций возможны обращения ко всем прочим функциям библиотеки. При разработке советников и индикторов также рекомендуется вызывать функции ATcl_OnEvent(..) ATcl_OnTimer...
 

Com pensamentos sobre o futuro:

com a ajuda de alguns remendos e de uma mãe assim, é isto que recebemos:


embora este seja um experimento, e mesmo na versão atual, ainda não vou incluir o adesivo para executar o Tk (primeiro, é muito cedo, as outras falhas estão cheias, e segundo, é feito para cerveja, vou revisar mais tarde)

Mas você pode ver o que quer obter no final e ter confiança de que tecnicamente é possível. Sim, sim, também é possível uma GUI com possibilidade de scriptable completa.

A propósito, para os construtores locais de GUI, a janela (aquela com o canal alfa) é descrita excessivamente assim (é tcl) :

set symbol "symbol"
set bid "bid"
set ask "ask"
set lots 0.1
set minLot 0.01
set maxLot 1
set lotStep 0.01
proc TradeFrame { w } {
        # всё в отдельном фрейме
        frame $w
        # виджеты
        label $w.symbol -textvariable symbol
        label $w.bid -textvariable bid
        label $w.ask -textvariable ask
        button $w.buy -text "BUY" -command {Trade buy}
        button $w.sell -text "SELL" -command {Trade sell}
        global minLot
        global maxLot
        global lotStep
        ttk::spinbox $w.lots -font "Courier 12" -from $minLot -to $maxLot -increment $lotStep -textvariable lots
        # размещение в таблице
        grid $w.symbol -row 0 -column 0 -columnspan 2 -sticky "ew"
        grid $w.bid    -row 1 -column 0 -sticky "e"
        grid $w.ask    -row 1 -column 1 -sticky "w"
        grid $w.buy    -row 2 -column 0 -sticky "nsew"
        grid $w.sell    -row 2 -column 1 -sticky "nsew"
        grid $w.lots   -row 3 -column 0 -columnspan 2 -sticky "ew"
        # настройка таблицы
        grid rowconfigure $w 2 -weight 1
        grid columnconfigure $w 0 -uniform same -weight 1
        grid columnconfigure $w 1 -uniform same -weight 1
        # привязки и прочие настройки
#       $w.lots set $minLot
        return $w
}
proc TradeWindow { w } {
        toplevel $w 
        wm title $w "TradePanel"
        wm attributes $w -alpha 0.75
        TradeFrame $w.panel 
        pack $w.panel -fill both -expand yes
        raise $w
}
proc Trade { op } {
        global symbol
        global lots
        tk_messageBox -message "Your request $op $lots $symbol lots"
}
 

Coloco os arquivos em ordem - agora em ZIP eles são colocados em pastas Indicadores, Scripts, Especialistas, Bibliotecas, Incluir e em idéia para instalar a biblioteca é suficiente para simplesmente
para desempacotar o arquivo no diretório de dados e tudo deve cair no lugar e estar pronto para trabalhar (exceto que o próprio Tcl precisa ser colocado :-) ).

O API é assim:

class ATcl {
protected:
   Tcl_Interp interp;
public:
   ATcl(bool safe=false);  // создание нового инерпретатора
   ATcl(Tcl_Interp);       // создание объекта из готового интерпретатора

   Tcl_Interp CreateSlave(string name,bool safe=false); // создать дочерный интерпретатор
   Tcl_Interp CreateSlave(Tcl_Obj name,bool safe=false);

   Tcl_Interp Interp(); // получить интерпретатор (например для вызова Tcl C API)
   
   ~ATcl();
   
   bool Ready();  // =true если можно исполнять команды
   int Update(); // запустить проход EventLoop
   
   // MQL specific handlers
   int OnInit();
   void OnDeinit(const int reason);
   void OnTimer();
   void OnChartEvent();
   void OnChartEvent(const int id,const long lparam,const double dparam,const string sparam);

   // Objects
   Tcl_Obj Obj();             // создать пустой временный объект
   Tcl_Obj Ref(Tcl_Obj obj);  // увеличить счётчик ссылок
   Tcl_Obj Unref(Tcl_Obj obj);// уменьшить счётчик ссылок, удалить объект при обнулении
   int Shared(Tcl_Obj obj);   // =true если объект зашарен и не может быть изменнён
   Tcl_Obj Clone(Tcl_Obj obj);// дублировать объект
   
   ///////////////////////////////  
   // Исполнение команд и скриптов
   ///////////////////////////////
   // методы возвращают код реультата: (стандартные коды: TCL_OK - успех, TCL_ERROR, TCL_BREAK,TCL_CONTINUE)
   // и сохраняют объект-"результат", который можно потом получить методоми Result(),StringResult(),...
   // Флаги: TCL_EVAL_GLOBAL - исполнять на глобальном уровне, TCL_EVAL_DIRECT - исполнять сразу, без компиляции
   int Eval(string script,int flags=0);
   int Eval(Tcl_Obj script,int flags=0);
   Tcl_Obj ObjEval(string script,int flags=0);  // simplified - Eval and return Result as Tcl_Obj
   Tcl_Obj ObjEval(Tcl_Obj script,int flags=0);
   
   int Call(Tcl_Obj &objv[],int flags=0);
   int Call(Tcl_Obj obj1,Tcl_Obj obj2=0,Tcl_Obj obj3=0,Tcl_Obj obj4=0,Tcl_Obj obj5=0,Tcl_Obj obj6=0,Tcl_Obj obj7=0,Tcl_Obj obj8=0,Tcl_Obj obj9=0,Tcl_Obj obj10=0,Tcl_Obj obj11=0);
   
   Tcl_Obj ObjCall(Tcl_Obj &objv[],int flags=0);// simplified - Call and return Result as Tcl_Obj
   Tcl_Obj ObjCall(Tcl_Obj obj1,Tcl_Obj obj2=0,Tcl_Obj obj3=0,Tcl_Obj obj4=0,Tcl_Obj obj5=0,Tcl_Obj obj6=0,Tcl_Obj obj7=0,Tcl_Obj obj8=0,Tcl_Obj obj9=0,Tcl_Obj obj10=0,Tcl_Obj obj11=0);
   
   Tcl_Obj Result(int ignoreThis=0);  // получить объект-результат
   int   ResetResult();             // сбросить(обнулить) результат

   ////////////////////////////////////////
   // Source - чтение и исполнение скриптов
   //////////////////////////////////////// 
   // use : Eval("source filename.tcl") оr Call("source","filename.tcl");
   // int Source(const string fileName,const string encoding="");
   // int Source(Tcl_Obj fileName,Tcl_Obj encoding=0);

   /////////////////
   // List - Списки
   /////////////////
   Tcl_Obj ListIndex(Tcl_Obj obj,int index=0);
   
   int ListLength(Tcl_Obj obj);  // =кол-во элементов списка
   int Count(Tcl_Obj obj);       // синоним
   
   int ListAppend(Tcl_Obj list,Tcl_Obj element);   // добавить эл-т к списку. список должен быть !Shared()
   int Append(Tcl_Obj list,Tcl_Obj element); // синоним
   
   /////////////////////////////////////////
   // Set: задать объект-значение переменной
   /////////////////////////////////////////
   // аналог в tcl: set var $value ; set hash($key) $value 
   Tcl_Obj Set(Tcl_Obj var,Tcl_Obj value);
   Tcl_Obj Set(Tcl_Obj hash,Tcl_Obj key,Tcl_Obj value);
   Tcl_Obj Set(string var,Tcl_Obj value);
   Tcl_Obj Set(string hash,string key,Tcl_Obj value);
   
   ///////////////////////////////////////////
   // Get: получить значение переменной в виде объекта
   //////////////////////////////////////////
   // аналог в tcl: set var ; set hash($key)
   Tcl_Obj Get(Tcl_Obj var);
   Tcl_Obj Get(Tcl_Obj hash,Tcl_Obj key);
   Tcl_Obj Get(string var);
   Tcl_Obj Get(string hash,string key);
   
   // IsSet: проверить существование переменной
   int IsSet(Tcl_Obj var);
   int IsSet(Tcl_Obj hash,Tcl_Obj key);
   int IsSet(string var);
   int IsSet(string hash,string key);
   
   // IsArray - проверить что hash это действительно хеш :-)
   int IsArray(Tcl_Obj hash);
   int IsArray(string hash);
   
   // Unset: удалить переменную или элемент хеша
   int Unset(Tcl_Obj var);
   int Unset(Tcl_Obj hash,Tcl_Obj key);
   int Unset(string var);
   int Unset(string hash,string key);
   
   // Link: связать скалярную переменную с элементом массива
   int Link(double &arr[],int pos,Tcl_Obj hash,Tcl_Obj key=0);
   int Link(double &arr[],int pos,string hash,string key="");
   // Unlink: разорвать свзяь
   int Unlink(Tcl_Obj hash,Tcl_Obj key=0);
   int Unlink(string hash,string key="");

   //////////////////////////
   // Double
   Tcl_Obj Obj(double);                // создать объект из double
   Tcl_Obj Obj(const double &arr[],int pos=0,int count=WHOLE_ARRAY); // создать объект из массива double
   double Double(Tcl_Obj);             // конвертировать объект в double
   double Double(Tcl_Obj,int index);   // получить эл-т списка как double   
   double DoubleResult(int ignoreThis=0);  // получить последний результат как double
   // упрощенный доступ к Call,Eval   
   // исполнить скрипт и срузу получить результат как double (0 при ошибке)
   double DoubleEval(string script,int flags=0); 
   double DoubleEval(Tcl_Obj script,int flags=0);
   // вызвать команду и сразу получить результат как double
   double DoubleCall(Tcl_Obj command,Tcl_Obj arg1=0,Tcl_Obj arg2=0,Tcl_Obj arg3=0,Tcl_Obj arg4=0,Tcl_Obj arg5=0,Tcl_Obj arg6=0,Tcl_Obj arg7=0,Tcl_Obj arg8=0,Tcl_Obj arg9=0,Tcl_Obj arg10=0);
   double DoubleCall(Tcl_Obj &objv[],int objc=WHOLE_ARRAY);
   
   ///////////////////////////
   // String
   Tcl_Obj Obj(string);
   Tcl_Obj Obj(const string &arr[],int pos=0,int count=WHOLE_ARRAY);
   string String(Tcl_Obj);
   string String(Tcl_Obj,int index);
   string StringResult(int ignoreThis=0);
   
   string StringEval(string script,int flags=0); 
   string StringEval(Tcl_Obj script,int flags=0);
   string StringCall(Tcl_Obj command,Tcl_Obj arg1=0,Tcl_Obj arg2=0,Tcl_Obj arg3=0,Tcl_Obj arg4=0,Tcl_Obj arg5=0,Tcl_Obj arg6=0,Tcl_Obj arg7=0,Tcl_Obj arg8=0,Tcl_Obj arg9=0,Tcl_Obj arg10=0);
   string StringCall(Tcl_Obj &objv[],int objc=WHOLE_ARRAY);
   
   ///////////////////////////
   // Long
   Tcl_Obj Obj(long);
   Tcl_Obj Obj(const long &arr[],int pos=0,int count=WHOLE_ARRAY);
   long Long(Tcl_Obj);
   long Long(Tcl_Obj,int index);
   long LongResult(int ignoreThis=0);
   
   long LongEval(string script,int flags=0); 
   long LongEval(Tcl_Obj script,int flags=0);
   long LongCall(Tcl_Obj command,Tcl_Obj arg1=0,Tcl_Obj arg2=0,Tcl_Obj arg3=0,Tcl_Obj arg4=0,Tcl_Obj arg5=0,Tcl_Obj arg6=0,Tcl_Obj arg7=0,Tcl_Obj arg8=0,Tcl_Obj arg9=0,Tcl_Obj arg10=0);
   long LongCall(Tcl_Obj &objv[],int objc=WHOLE_ARRAY);
   
   ///////////////////////////
   // Datetime
   Tcl_Obj Obj(datetime);
   Tcl_Obj Obj(const datetime &arr[],int pos=0,int count=WHOLE_ARRAY);
   datetime Datetime(Tcl_Obj);
   datetime Datetime(Tcl_Obj,int index);
   datetime DatetimeResult(int ignoreThis=0);
   
   datetime DatetimeEval(string script,int flags=0); 
   datetime DatetimeEval(Tcl_Obj script,int flags=0);
   datetime DatetimeCall(Tcl_Obj command,Tcl_Obj arg1=0,Tcl_Obj arg2=0,Tcl_Obj arg3=0,Tcl_Obj arg4=0,Tcl_Obj arg5=0,Tcl_Obj arg6=0,Tcl_Obj arg7=0,Tcl_Obj arg8=0,Tcl_Obj arg9=0,Tcl_Obj arg10=0);
   datetime DatetimeCall(Tcl_Obj &objv[],int objc=WHOLE_ARRAY);
   
};

Parece ser bastante compacto e utilizável.

O arquivo zip-archive acima é anexado, se alguém precisar dele e tiver algum problema com a instalação, afixe-o aqui ou pessoalmente

Arquivos anexados:
atcl.zip  135 kb
 

um exemplo no topo do telhado

"compilando na mosca e usando C/C++ da ATcl dentro de um script MQL".

#property copyright "Maxim A.Kuznetsov"
#property link      "luxtrade.tk"
#property version   "1.00"
#property strict
#property description "ATcl demo"
#property description "------------"
#property description "This script demonstrate how to compile and use C/C++ on-the-fly"


#include <ATcl\\ATcl.mqh>

const string c=
"static double sum(double x, double y) {"
"    return x+y;"
"}";

ATcl *tcl;
void OnStart()
{
   ATcl_OnInit();
   tcl=new ATcl;
   if (tcl!=NULL && tcl.Ready()) {
      tcl.Eval("package require critcl");             // use critcl package (compiler environment)
      tcl.Call(tcl.Obj("critcl::ccode"),tcl.Obj(c));  // pass some c/c++ to compiler
      tcl.Eval("critcl::cproc mysum { double x double y } double { return sum(x,y);}");      // make callable proc
      double ret=tcl.DoubleCall(tcl.Obj("mysum"),tcl.Obj((double)5.0),tcl.Obj((double)7.1)); // call :-)
      PrintFormat("ret=%f",ret);
   }
   delete tcl;
   ATcl_OnDeinit();
}
Arquivos anexados:
atcl.zip  149 kb
 

Bem, parabéns pelo beta! :-)

Em resumo, as características que através da ATcl são agora facilmente acessíveis a partir do MT4 :

Características Tcl

  • simples - linguagem de script simples
  • Portátil - executando scripts e algoritmos que você pode usar em qualquer sistema (Windows, Linux, Android e outros)
  • condução de eventos - modelo de evento interno
  • orientação a objetos - todas as características modernas do OOP.
  • threading - você pode usar todas as características da programação multithreading - threads do sistema, mutexes, variáveis condicionais, variáveis compartilhadas com a possibilidade de armazenamento permanente.
  • sistema de arquivo virtual - acesso transparente a zip,tar,ftp,webdav como um sistema de arquivo
  • banco de dados - interface unificada tdbc e sqlite estão incluídos no núcleo tcl. Ele suporta ativamente PostresSQL, MySQL, MonetDB, Oracle e qualquer banco de dados ODBC.
  • Rede - cliente/servidor: tcp,http,mail,websocket,zmq. Praticamente todos os protocolos e serviços que você possa precisar.
  • criptografia - checksums, assinaturas eletrônicas, hashes criptográficos. Criptografia simétrica e assimétrica. Apoio de infra-estrutura de chave pública, TLS, SASL.
  • windows - ferramentas de ambiente windows - registro, DDE, COM cliente/servidor, cliente ldap
  • tcllib - A biblioteca padrão da Tcl oferece recursos adicionais (ferramentas de programação, processamento de texto, matemática e estatística, e mais)
  • c/c++ - O compilador TinyC está incluído nas bibliotecas e o pacote Critcl permite o uso do sistema compilador C/C++ (vc,gcc,clang). Módulos e funções podem ser compilados e utilizados em tempo real.
  • Muitas bibliotecas e sistemas fornecem um Tcl API, você pode usá-los facilmente em seus programas
mais no site do blog: https://www.mql5.com/ru/blogs/post/715411 (que ninguém lê :-))
e na página do projeto: http://luxtrade.tk/atcl:start


Ficaremos felizes em responder a quaisquer perguntas sobre o assunto e ouvir idéias e comentários.


ATcl - безграничные возможности для ваших програм
ATcl - безграничные возможности для ваших програм
  • 2018.01.26
  • Maxim Kuznetsov
  • www.mql5.com
Рад представить вам библиотеку ATcl v1 beta - интерпретатор Tcl для MT4. Безграничные возможности расширения и интеграции программ MT4 Расширяйте возможности ваших программ MQL, используйте СУБД, дополняйте сетевыми средствами, интегрируйте их с любыми программами используя Tcl. threading - вы можете использовать все возможности...
 

Parabéns!

Seria útil fazer alguns exemplos práticos, semelhantes ao que está em kodobase e artigos.
Por exemplo, conectar ao MySQL, Telegramas ou apenas conectar dois terminais via TCP.

 
Andrey Khatimlianskii:

Parabéns!

Seria útil fazer alguns exemplos práticos, semelhantes ao que está em kodobase e artigos.
Por exemplo, comunicação com MySQL, Telegrama, ou simplesmente conectando dois terminais via TCP.

em demonstrações (em arquivo):

- Citações de economia de scripts em um banco de dados SQLite. Para o MySQL é o mesmo, mas nem todos o têm :-)

- servidor tcp como indicador e consultor (duas variantes) - após o início ele aceita conexão na porta 8000 (pode ser definido em configurações no início) e traduz aí os ticks de entrada. Você pode contar e ver

- O indicador de cliente http, que periodicamente vai ao site, pega a página de empregos, analisa-a e exibe informações breves no gráfico como Comentário

As demonstrações certamente continuarão a crescer, você pode propor idéias.

À medida que formos avançando, provavelmente farei demonstrações ilustrando

- "servidor web" para mostrar que você pode usar um navegador, e como ele é feito.

- uso de TSV (variáveis compartilhadas de linha), um análogo estendido de GlobalVariable - uso de dados compartilhados nas aplicações

Tenho que inventar mais roteiros :-) para torná-los claros, concisos e pelo menos um pouco úteis.

 

Houve uma conversa bastante fascinante no Skype, algumas das quais eu acho que preciso dar voz, porque eu acho útil :-)

1. Por que algum Tcl e não o muito mais popular Python, Ruby?

É claro que não será o primeiro, porque o conheço bem e estou usando-o não apenas para comércio. E o ponto tecnológico é muito importante - Python e Ruby não são compatíveis com o modelo de rosqueamento metatrader. Teoricamente eles podem ser executados, mas eu tenho que cavar um API muito baixo ou quebrar a linguagem. O mesmo é válido para R e muitos outros.
Para que funcionem, é preciso cumprir a condição "várias instâncias isoladas podem ser criadas independentemente dentro de um processo e um fio".
Lua é a única outra linguagem de script que conheço, mas é "uma linguagem sem padrões".
A propósito, este tipo arrojado deve ser observado por todos os desenvolvedores de DLLs em seus produtos

2. Como analisar os dados corretamente e rapidamente

Correto e rápido - é realizar cálculos em metatrader. É para isso que o metatrader foi projetado - para receber dados, efetuar cálculos e emitir ordens. Seria uma tolice duplicar suas características em sua DLL. Afinal, a própria MQL é bastante semelhante à C++ e só é preciso um ou dois programadores por dia para começar a escrever nela. E na DLL temos que fazer o que a plataforma não cobre e fisicamente não pode cobrir - comunicação com bancos de dados, serviços, integração e assim por diante. E mais as coisas que podem e devem ser usadas fora do MetaTrader.

3. Onde e quando a versão 5 está disponível?

O mais rápido possível :-) Tecnicamente, não é difícil arrastar e soltar DLL de 4 para 5, os scripts não se importam. Tcl é tanto 32 como 64 bit. Mas é muito mais conveniente desenvolver no 4, não é tocado :-) é estável e não se espera surpresas. Mas com os 5 que veremos, os desenvolvedores da plataforma prometem "tarefas de serviço" (juntamente com indicadores, scripts e Expert Advisors) e certamente algo nas relações de DLL e threads mudará vários builds seguidos. Enquanto isto não for resolvido, não haverá versão para 5.

 

Durante a execução e com base no feedback do usuário, foram encontrados alguns problemas relacionados às dependências DLL da msvcrt.
e um pequeno bug (meu) em encontrar a mesma DLL. Foram prescritos caminhos relativos no ATcl.mqh handler :-)

tudo corrigido, você pode obter a versão corrigida (anexada), as instruções de instalação estão no local tradicional http://luxtrade.tk/atcl:install


Para os desenvolvedores de DLLs, esta é uma informação útil:

- DLL compilada com definição -D_CRTIMP_ALTERNATIVE, que força o compilador a alinhar quase tudo do CRT :-)

- A DLL agora é construída com o interruptor /MT, o que obriga o linker a usar a ligação estática e não causar dependências desnecessárias. O Redistribuível (pacote de suporte VC) é como não ter que carregar por toda parte

A DLL cresceu em tamanho, mas há menos dependências e deve ser mais fácil de transportar a biblioteca

PS/ pequena atualização - alterou o arquivo anexo. A biblioteca é construída com suporte multithread completo
Install
  • luxtrade.tk
ATcl является библиотекой-интегратором и поэтому в первую очередь нужен сам по себе Tcl. Tcl свободно доступен и не имеет лицензионных отягощений (лицензии как правило BSD-like). Для работы с MT4 вам потребуется 32-х битная (это важно! MT4 32-х битный...
Arquivos anexados:
atcl.zip  243 kb