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

 
Maxim Kuznetsov:
¿Quién controlará los pips, aplicará el protocolo y analizará los resultados? es largo, lento y sólo mediante encuestas.

Me pueden dar un par de enlaces para leer sobre este atcl, para no tener que repasar todo y poder centrarse más en el tema.

 
Alexey Oreshkin:

Puede un par de enlaces para leer acerca de este atcl no cavar a través de todo, y más a propósito de familiarizarse con el tema.

Los principales enlaces a la biblioteca-integrador para MT4 (en la que estoy trabajando duro) son el tema actual aquí, más el mencionado en el hilo http://luxtrade.tk/atcl:start (históricamente mi sitio, que está en un constante desorden :-) )

el propio Tcl (sitio raíz) : http://www.tcl.tk

wiki: http://wiki.tcl.tk

"biblioteca estándar" : https://core.tcl.tk/tcllib/doc/tcllib-1-18/embedded/www/toc.html (enlace a los documentos, probablemente sean de interés primordial)

Actualmente es el principal distribuidor de ActiveState: https://www.activestate.com/activetcl ,

Le pisan los talones a MagicSplat http://www.magicsplat.com/ y IronTcl https://irontcl.com/

Como lenguaje y plataforma de scripting, Tcl ha sido probado por el tiempo, por decir lo menos - la primera versión en 1990, ahora está presente de facto en Linux/UNIX, ahora en Android también. 98% lo tienes en tu máquina en alguna forma despojada - python, ruby, R, maxima, octave y otros lo utilizan para GUI (tkinter etc.)

PS. espero que no maten mi post y a mi junto con un montón de enlaces ? Todo es gratis.

PPS. Para los subcontratistas locales - también hay una "sabrosa" recompensa https://github.com/flightaware/Tcl-bounties. Pero sólo hay tareas difíciles a partir de 2500USD y hay una disciplina estricta.

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

Con pensamientos de futuro:

con la ayuda de algunos parches y tal madre, esto es lo que obtenemos:


aunque esto es un experimento, e incluso en la versión actual, no voy a incluir todavía el parche para ejecutar Tk (en primer lugar, es demasiado pronto, los otros fallos están llenos, y en segundo lugar, está hecho para la cerveza, voy a revisar más tarde)

Pero puedes ver lo que quieres conseguir al final y tener confianza en que técnicamente es posible. Sí, también es posible una interfaz gráfica de usuario totalmente programable.

por cierto, a los constructores locales de GUI, la ventana (la que tiene el canal alfa) se describe excesivamente así (es 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"
}
 

Puse los archivos en orden - ahora en ZIP están colocados en las carpetas Indicadores, Scripts, Expertos,Bibliotecas,Incluir y en idea para instalar la biblioteca es suficiente simplemente
para desempaquetar el archivo en el directorio de datos y todo debería caer en su lugar y estar listo para trabajar (excepto que el propio Tcl necesita ser puesto :-) ).

La API es así:

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 y utilizable.

Se adjunta el archivo zip anterior, si alguien lo necesita y tiene algún problema con la instalación, que lo publique aquí o en persona

Archivos adjuntos:
atcl.zip  135 kb
 

un ejemplo de techo

"compilar sobre la marcha y usar C/C++ desde ATcl dentro de un 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();
}
Archivos adjuntos:
atcl.zip  149 kb
 

Bueno, ¡felicidades por la beta! :-)

Brevemente las características que a través de ATcl son ahora fácilmente accesibles desde MT4 :

Características de Tcl

  • simple - lenguaje de scripting sencillo
  • Portátil: ejecuta scripts y algoritmos que puedes utilizar en cualquier sistema (Windows, Linux, Android y otros)
  • impulsado por eventos - modelo interno de eventos
  • orientación al objeto - todas las características modernas de la POO.
  • threading - puede utilizar todas las características de la programación multithreading - hilos del sistema, mutexes, variables condicionales, variables compartidas con posibilidad de almacenamiento permanente.
  • sistema de archivos virtual - acceso transparente a zip, tar, ftp, webdav como sistema de archivos
  • base de datos - interfaz unificada tdbc y sqlite se incluyen en el núcleo tcl. Soporta activamente PostresSQL,MySQL,MonetDB, Oracle y cualquier base de datos ODBC.
  • Redes - cliente/servidor: tcp,http,mail,websocket,zmq. Prácticamente todos los protocolos y servicios que pueda necesitar.
  • criptografía - sumas de comprobación, firmas electrónicas, cripto hash. Cifrado simétrico y asimétrico. Soporte de infraestructura de clave pública, TLS, SASL.
  • windows - herramientas del entorno windows - registro, DDE, cliente/servidor COM, cliente ldap
  • tcllib - La biblioteca estándar de Tcl proporciona características adicionales (herramientas de programación, procesamiento de texto, matemáticas y estadísticas, y más)
  • c/c++ - El compilador TinyC está incluido en las bibliotecas y el paquete Critcl permite utilizar el compilador C/C++ del sistema (vc,gcc,clang). Los módulos y las funciones pueden compilarse y utilizarse sobre la marcha.
  • Muchas bibliotecas y sistemas proporcionan una API Tcl, puede utilizarlas fácilmente en sus programas
más en el sitio del blog: https://www.mql5.com/ru/blogs/post/715411 (que nadie lee :-))
y en la página del proyecto: http://luxtrade.tk/atcl:start


Estaré encantado de responder a cualquier pregunta sobre el tema y escuchar ideas y comentarios.


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

Enhorabuena.

Sería útil hacer algunos ejemplos prácticos, similares a los que hay en kodobase y en los artículos.
Por ejemplo, conectar con MySQL, Telegram o simplemente conectar dos terminales vía TCP.

 
Andrey Khatimlianskii:

Enhorabuena.

Sería útil hacer algunos ejemplos prácticos, similares a los que hay en kodobase y en los artículos.
Por ejemplo, la comunicación con MySQL, Telegram, o simplemente la conexión de dos terminales a través de TCP.

en dems (en archivo):

- script que guarda las citas en una base de datos SQLite. Para MySQL es lo mismo, pero no todo el mundo lo tiene :-)

- Servidor tcp como indicador y asesor (dos variantes) - después del inicio acepta la conexión en el puerto 8000 (se puede establecer en la configuración al inicio) y traduce allí los ticks entrantes. Puede telnet y ver

- El indicador de cliente http, que acude periódicamente al sitio, toma la página de empleos, la analiza y muestra un resumen de la información en el gráfico como Comentario

demos sin duda seguirá creciendo, puedes proponer ideas.

A medida que avancemos, probablemente haré demostraciones que ilustren

- "servidor web" para mostrar que se puede utilizar un navegador, y cómo se hace.

- uso de TSV (thread shared variables), un análogo ampliado de GlobalVariable - uso de datos compartidos en las aplicaciones

Tengo que idear más guiones :-) para que sea claro, conciso y al menos un poco útil.

 

Hubo una conversación por Skype bastante fascinante, parte de la cual creo que tengo que expresar porque me resulta útil :-)

1. ¿Por qué Tcl y no el mucho más popular Python o Ruby?

Por supuesto, no será el primero porque lo conozco bien y lo uso no sólo para el comercio. Y el punto tecnológico es muy importante - Python y Ruby no son compatibles con el modelo de roscado de Metatrader. Teóricamente se pueden ejecutar, pero tengo que sacar una API muy baja o romper el lenguaje. Lo mismo ocurre con R y muchos otros.
Para que funcionen, hay que cumplir la condición "se pueden crear varias instancias aisladas de forma independiente dentro de un proceso y un hilo".
Lua es el único otro lenguaje de scripting que conozco, pero es "un lenguaje sin estándares".
Por cierto, esta negrita debería ser observada por todos los desarrolladores de DLL en sus productos

2. Cómo analizar los datos correcta y rápidamente

Correcto y rápido - es realizar los cálculos en metatrader. Para eso está diseñado metatrader, para recibir datos, realizar cálculos y emitir órdenes. Sería una tontería duplicar sus características en tu DLL. Al fin y al cabo, el propio MQL es bastante similar a C++ y un programador sólo necesita uno o dos días para empezar a escribir en él. Y en la DLL tenemos que hacer lo que la plataforma no cubre y no puede cubrir físicamente: comunicación con bases de datos, servicios, integración, etc. Y además las cosas que pueden y deben ser utilizadas fuera de MetaTrader.

3. ¿Dónde y cuándo está disponible la versión 5?

Lo antes posible :-) Técnicamente no es difícil arrastrar y soltar la DLL de la 4 a la 5, los scripts no importan. Tcl es tanto de 32 como de 64 bits. Pero es mucho más cómodo desarrollar en el 4, no se toca :-) es estable y no se esperan sorpresas. Pero con el 5 veremos, los desarrolladores de la plataforma prometen "tareas de servicio" (junto con indicadores, scripts y Expert Advisors) y seguramente algo en relaciones de DLL e hilos cambiará varias builds seguidas. Hasta que no se resuelva esto, no habrá versión para el 5.

 

Durante el tiempo de ejecución y en base a los comentarios de los usuarios, se encontraron algunos problemas relacionados con las dependencias de la DLL msvcrt.
y un pequeño error (mío) al encontrar la misma DLL. Las rutas relativas en el manejador ATcl.mqh fueron prescritas :-)

todo arreglado, usted puede obtener la versión corregida (adjunto), las instrucciones de instalación están en el lugar tradicional http://luxtrade.tk/atcl:install


Para los desarrolladores de DLL, este es un dato útil:

- DLL compilado con la definición -D_CRTIMP_ALTERNATIVE que obliga al compilador a inlinear casi todo desde CRT :-)

- La DLL se construye ahora con el parámetro /MT, que obliga al enlazador a utilizar la vinculación estática y no causar dependencias innecesarias. El Redistributable (paquete de soporte de VC) es como no tener que cargar con todo

La DLL ha crecido en tamaño, pero hay menos dependencias y debería ser más fácil cargar la biblioteca

PS/ pequeña actualización - cambió el archivo adjunto. La biblioteca está construida con un soporte completo de multihilos
Install
  • luxtrade.tk
ATcl является библиотекой-интегратором и поэтому в первую очередь нужен сам по себе Tcl. Tcl свободно доступен и не имеет лицензионных отягощений (лицензии как правило BSD-like). Для работы с MT4 вам потребуется 32-х битная (это важно! MT4 32-х битный...
Archivos adjuntos:
atcl.zip  243 kb
Razón de la queja: