ATcl - Interprete Tcl per MT4 - pagina 2

 
Maxim Kuznetsov:
Chi controllerà i pip, implementerà il protocollo e analizzerà i risultati? è lungo, lento e solo tramite sondaggio.

Posso avere un paio di link da leggere su questo atcl, così non devi passare tutto, ma puoi essere più concentrato sull'argomento.

 
Alexey Oreshkin:

Può un paio di link per leggere su questo atcl non per scavare attraverso tutto, e più volutamente conoscere l'argomento.

I link principali alla libreria-integratore per MT4 (proprio quello su cui sto lavorando duramente) sono l'argomento attuale qui, più quello menzionato nel thread http://luxtrade.tk/atcl:start (storicamente il mio sito, che è in un costante casino :-) )

il Tcl (sito radice) stesso: http: //www.tcl.tk

wiki: http://wiki.tcl.tk

"libreria standard": https: //core.tcl.tk/tcllib/doc/tcllib-1-18/embedded/www/toc.html (link ai documenti, sono probabilmente di primario interesse)

Attualmente il principale distributore di ActiveState: https://www.activestate.com/activetcl ,

Sono "sulla scia" di MagicSplat http://www.magicsplat.com/ e IronTcl https://irontcl.com/

Come linguaggio e piattaforma di scripting, Tcl è a dir poco collaudato nel tempo - primo rilascio nel 1990, ora è presente de facto in Linux/UNIX, ora anche sotto Android. 98% lo avete sulla vostra macchina in qualche forma ridotta - python, ruby, R, maxima, octave e altri lo usano per l'interfaccia grafica (tkinter ecc.)

PS. spero che non uccidano il mio post e me insieme a un sacco di link? È tutto gratis.

PPS. Per gli outsourcer locali - c'è anche un "gustoso" bounty https://github.com/flightaware/Tcl-bounties. Ma ci sono solo compiti difficili da 2500USD e c'è una disciplina rigorosa.

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

Con pensieri sul futuro:

con l'aiuto di alcune patch e di una tale madre, questo è ciò che otteniamo:


anche se questo è un esperimento, e anche nella versione attuale, non includerò ancora la patch per far funzionare Tk (in primo luogo, è troppo presto, gli altri glitch sono pieni, e in secondo luogo, è fatto per la birra, lo rivedrò più tardi)

Ma si può vedere che alla fine si vuole ottenere e c'è fiducia che tecnicamente è possibile. Sì, sì, una GUI completamente scrivibile è anche possibile.

a proposito, per i costruttori locali di GUI, la finestra (quella con il canale alfa) è eccessivamente descritta così (è 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"
}
 

Ho messo i file in ordine - ora nello ZIP sono messi nelle cartelle Indicators, Scripts, Experts, Libraries, Include e per installare la libreria è sufficiente
per decomprimere l'archivio nella directory dei dati e tutto dovrebbe andare a posto ed essere pronto a lavorare (tranne che Tcl stesso deve essere messo :-) ).

L'API è così:

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);
   
};

Sembra essere abbastanza compatto e maneggevole.

Il suddetto zip-archive è allegato, se qualcuno ne ha bisogno e ha problemi con l'installazione, lo posti qui o di persona

File:
atcl.zip  135 kb
 

un esempio di tetto

"compilare al volo e usare C/C++ da ATcl dentro uno 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();
}
File:
atcl.zip  149 kb
 

Beh, congratulazioni per la beta! :-)

Brevemente le caratteristiche che attraverso ATcl sono ora facilmente accessibili da MT4:

Caratteristiche Tcl

  • semplice - semplice linguaggio di scripting
  • Portatile - eseguendo script e algoritmi che puoi usare in qualsiasi sistema (Windows, Linux, Android e altri)
  • guidato dagli eventi - modello interno degli eventi
  • orientamento agli oggetti - tutte le moderne caratteristiche OOP.
  • threading - è possibile utilizzare tutte le caratteristiche della programmazione multithreading - thread di sistema, mutex, variabili condizionali, variabili condivise con possibilità di memorizzazione permanente.
  • file system virtuale - accesso trasparente a zip, tar, ftp, webdav come file system
  • database - interfaccia unificata tdbc e sqlite sono inclusi nel nucleo tcl. Supporta attivamente PostresSQL, MySQL, MonetDB, Oracle e qualsiasi database ODBC.
  • Networking - client/server: tcp, http, mail, websocket, zmq. Praticamente tutti i protocolli e i servizi di cui potreste aver bisogno.
  • crittografia - checksum, firme elettroniche, crypto hash. Crittografia simmetrica e asimmetrica. Supporto dell'infrastruttura a chiave pubblica, TLS, SASL.
  • windows - strumenti per l'ambiente windows - registro, DDE, COM client/server, client ldap
  • tcllib - la libreria standard di Tcl fornisce funzioni aggiuntive (strumenti di programmazione, elaborazione del testo, matematica e statistica, e altro)
  • c/c++ - Il compilatore TinyC è incluso nelle librerie e il pacchetto Critcl permette l'uso del compilatore C/C++ di sistema (vc,gcc,clang). I moduli e le funzioni possono essere compilati e utilizzati al volo.
  • Molte librerie e sistemi forniscono un'API Tcl, si può facilmente usarla nei propri programmi
più nel sito del blog: https://www.mql5.com/ru/blogs/post/715411 (che nessuno legge :-))
e sulla pagina del progetto: http://luxtrade.tk/atcl:start


Felice di rispondere a qualsiasi domanda sull'argomento e di ascoltare idee e commenti.


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

Congratulazioni!

Sarebbe utile fare qualche esempio pratico, simile a quello che c'è in kodobase e negli articoli.
Per esempio, la connessione a MySQL, Telegram o semplicemente la connessione di due terminali via TCP.

 
Andrey Khatimlianskii:

Congratulazioni!

Sarebbe utile fare qualche esempio pratico, simile a quello che c'è in kodobase e negli articoli.
Per esempio, la comunicazione con MySQL, Telegram, o semplicemente la connessione di due terminali via TCP.

in demo (in archivio):

- script che salva le citazioni in un database SQLite. Per MySQL è lo stesso, ma non tutti ce l'hanno :-)

- server tcp come indicatore e consulente (due varianti) - dopo l'avvio accetta la connessione sulla porta 8000 (può essere impostata nelle impostazioni all'avvio) e traduce lì i tick in arrivo. Si può fare un telnet e vedere

- indicatore client http, che va periodicamente al sito, prende la pagina dei lavori, la analizza e visualizza brevi informazioni nel grafico come Comment

le demo continueranno certamente a crescere, potete proporre delle idee.

Man mano che andiamo avanti, probabilmente farò dei demo che illustrano

- "web server" per mostrare che si può usare un browser, e come si fa.

- uso di TSV (thread shared variables), un analogo esteso di GlobalVariable - uso di dati condivisi nelle applicazioni

Devo inventare altri script :-) per renderlo chiaro, conciso e almeno un po' utile.

 

C'è stata una conversazione su Skype piuttosto affascinante, una parte della quale penso di dover dare voce perché la trovo utile :-)

1. Perché un po' di Tcl e non il molto più popolare Python, Ruby?

Naturalmente, non sarà il primo perché lo conosco bene e lo sto usando non solo per il trading. E il punto tecnologico è molto importante - Python e Ruby non sono compatibili con il modello di threading di Metatrader. Teoricamente possono essere eseguiti, ma devo o scavare API molto basse o rompere il linguaggio. Lo stesso vale per R e molti altri.
Per farli funzionare, bisogna soddisfare la condizione "diverse istanze isolate possono essere create indipendentemente all'interno di un processo e di un thread".
Lua è l'unico altro linguaggio di scripting che conosco, ma è "un linguaggio senza standard".
A proposito, questo tipo di grassetto dovrebbe essere osservato da tutti gli sviluppatori di DLL nei loro prodotti

2. Come analizzare correttamente e rapidamente i dati

Corretto e veloce - è quello di eseguire i calcoli in metatrader. Questo è ciò per cui Metatrader è progettato: ricevere dati, eseguire calcoli ed emettere ordini. Sarebbe sciocco duplicare le sue caratteristiche nella vostra DLL. Dopo tutto, MQL stesso è piuttosto simile al C++ e un programmatore impiega solo un giorno o due per iniziare a scrivere in esso. E nella DLL dobbiamo fare ciò che la piattaforma non copre e fisicamente non può coprire - comunicazione con i database, servizi, integrazione e così via. E in più le cose che possono e devono essere usate al di fuori di MetaTrader.

3. Dove e quando è disponibile la versione 5?

Il più presto possibile :-) Tecnicamente non è difficile trascinare la DLL dalla 4 alla 5, gli script non si preoccupano. Tcl è sia a 32 che a 64 bit. Ma è molto più conveniente sviluppare su 4, non si tocca :-) è stabile e non ci sono sorprese. Ma con il 5 vedremo, gli sviluppatori della piattaforma promettono "compiti di servizio" (insieme a indicatori, script e Expert Advisors) e sicuramente qualcosa nelle relazioni di DLL e thread cambierà diverse build di fila. Finché questo non sarà risolto, non ci sarà nessuna versione per la 5.

 

Durante il runtime e sulla base del feedback degli utenti, sono stati trovati alcuni problemi relativi alle dipendenze della DLL msvcrt.
e un piccolo bug (mio) nel trovare la stessa DLL. I percorsi relativi nel gestore ATcl.mqh erano prescritti :-)

tutto risolto, potete ottenere la versione corretta (allegata), le istruzioni di installazione sono sul posto tradizionale http://luxtrade.tk/atcl:install


Per gli sviluppatori di DLL, questa è un'informazione utile:

- DLL compilata con define -D_CRTIMP_ALTERNATIVE che forza il compilatore a inlineare quasi tutto da CRT :-)

- La DLL è ora costruita con lo switch /MT, che forza il linker a usare lo static linking e a non causare dipendenze inutili. Il Redistributable (pacchetto di supporto VC) è come non doversi trascinare ovunque

La DLL è cresciuta in dimensioni, ma ci sono meno dipendenze e dovrebbe essere più facile portare in giro la libreria

PS/ piccolo aggiornamento - cambiato l'archivio allegato. La libreria è costruita con pieno supporto multithread
Install
  • luxtrade.tk
ATcl является библиотекой-интегратором и поэтому в первую очередь нужен сам по себе Tcl. Tcl свободно доступен и не имеет лицензионных отягощений (лицензии как правило BSD-like). Для работы с MT4 вам потребуется 32-х битная (это важно! MT4 32-х битный...
File:
atcl.zip  243 kb