ATcl - Interprète Tcl pour MT4 - page 2

 
Maxim Kuznetsov:
Qui va contrôler les pips, mettre en œuvre le protocole et analyser les résultats ? C'est long, lent et uniquement par sondage.

Puis-je avoir quelques liens à lire sur cette atcl, afin de ne pas avoir à tout parcourir, mais de pouvoir se concentrer davantage sur le sujet.

 
Alexey Oreshkin:

Peut-on trouver quelques liens à lire sur cet atcl pour ne pas tout fouiller, et se familiariser plus volontairement avec le sujet.

Les principaux liens vers l'intégrateur-bibliothèque pour MT4 (celui-là même sur lequel je travaille dur) sont le sujet actuel ici, ainsi que celui mentionné dans le fil de discussion http://luxtrade.tk/atcl:start (historiquement mon site, qui est dans un désordre constant :-) ).

le Tcl (site racine) lui-même : http://www.tcl.tk

wiki : http://wiki.tcl.tk

"bibliothèque standard" : https://core.tcl.tk/tcllib/doc/tcllib-1-18/embedded/www/toc.html (lien vers les docs, ils sont probablement d'un intérêt primordial)

Actuellement le premier distributeur d'ActiveState : https://www.activestate.com/activetcl ,

Ils sont "sur les talons" de MagicSplat http://www.magicsplat.com/ et IronTcl https://irontcl.com/.

En tant que langage et plateforme de script, Tcl est pour le moins éprouvé - première version en 1990, il est maintenant présent de facto dans Linux/UNIX, maintenant sous Android également. 98% d'entre vous l'ont sur votre machine sous une forme plus ou moins dépouillée - python, ruby, R, maxima, octave et d'autres l'utilisent pour les interfaces graphiques (tkinter etc.).

PS. J'espère qu'ils ne vont pas supprimer mon poste et moi, ainsi que de nombreux liens ? C'est gratuit.

PPS. Pour les sous-traitants locaux, il y a aussi une prime "savoureuse" https://github.com/flightaware/Tcl-bounties. Mais il n'y a que des tâches difficiles à partir de 2500USD et il y a une discipline stricte.

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

En pensant à l'avenir :

avec l'aide de quelques patchs et d'une telle mère, voilà ce que nous obtenons :


bien qu'il s'agisse d'une expérience, et même dans la version actuelle, je n'inclurai pas encore le patch pour faire tourner Tk (premièrement, c'est trop tôt, les autres glitches sont complets, et deuxièmement, c'est fait pour la bière, je ferai le point plus tard)

Mais vous pouvez voir qu'à la fin vous voulez obtenir et il y a la confiance que techniquement c'est possible. Oui, oui, une interface graphique entièrement scriptable est également possible.

Au fait, pour les constructeurs locaux de GUI, la fenêtre (celle avec le canal alpha) est excessivement décrite comme ceci (c'est du 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"
}
 

J'ai mis les fichiers dans l'ordre - maintenant dans le ZIP ils sont placés dans les dossiers Indicateurs, Scripts, Experts,Libraries,Include et dans l'idée d'installer la bibliothèque il suffit simplement de
pour décompresser l'archive dans le répertoire data et tout devrait se mettre en place et être prêt à fonctionner (sauf que Tcl lui-même doit être installé :-) ).

L'API se présente comme suit :

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

Il semble être assez compact et pratique.

L'archive zip ci-dessus est jointe, si quelqu'un en a besoin et rencontre des problèmes d'installation, postez-le ici ou en personne.

Dossiers :
atcl.zip  135 kb
 

un exemple sur le toit

"Compilation à la volée et utilisation de C/C++ à partir d'ATcl à l'intérieur d'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();
}
Dossiers :
atcl.zip  149 kb
 

Eh bien, félicitations pour la bêta ! :-)

En bref, les fonctionnalités qui, par le biais d'ATcl, sont maintenant facilement accessibles depuis MT4 :

Caractéristiques de Tcl

  • simple - langage de script simple
  • Portable - exécution de scripts et d'algorithmes que vous pouvez utiliser dans n'importe quel système (Windows, Linux, Android et autres)
  • axé sur l'événement - modèle d'événement interne
  • l'orientation objet - toutes les fonctionnalités modernes de la POO.
  • threading - vous pouvez utiliser toutes les fonctionnalités de la programmation multithreading - threads système, mutex, variables conditionnelles, variables partagées avec possibilité de stockage permanent.
  • système de fichiers virtuel - accès transparent à zip,tar,ftp,webdav comme système de fichiers
  • base de données - interface unifiée tdbc et sqlite sont inclus dans le noyau tcl. Il prend activement en charge PostresSQL, MySQL, MonetDB, Oracle et toute base de données ODBC.
  • Mise en réseau - client/serveur : tcp,http,mail,websocket,zmq. Pratiquement tous les protocoles et services dont vous pourriez avoir besoin.
  • la cryptographie - sommes de contrôle, signatures électroniques, hachages cryptographiques. Cryptage symétrique et asymétrique. Prise en charge de l'infrastructure à clé publique, TLS, SASL.
  • windows - outils de l'environnement windows - registre, DDE, COM client/serveur, client ldap
  • tcllib - La bibliothèque standard de Tcl fournit des fonctionnalités supplémentaires (outils de programmation, traitement de texte, mathématiques et statistiques, etc.)
  • c/c++ - Le compilateur TinyC est inclus dans les bibliothèques et le paquet Critcl permet d'utiliser le compilateur C/C++ du système (vc,gcc,clang). Les modules et les fonctions peuvent être compilés et utilisés à la volée.
  • De nombreuses bibliothèques et systèmes fournissent une API Tcl, que vous pouvez facilement utiliser dans vos programmes.
plus dans le site du blog : https://www.mql5.com/ru/blogs/post/715411 (que personne ne lit :-))
et sur la page du projet : http://luxtrade.tk/atcl:start


Heureux de répondre à toute question sur le sujet et d'écouter les idées et les commentaires.


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

Félicitations !

Il serait utile de faire quelques exemples pratiques, similaires à ce qui se trouve dans kodobase et les articles.
Par exemple, la connexion à MySQL, Telegram ou simplement la connexion de deux terminaux via TCP.

 
Andrey Khatimlianskii:

Félicitations !

Il serait utile de faire quelques exemples pratiques, similaires à ce qui se trouve dans kodobase et les articles.
Par exemple, la communication avec MySQL, Telegram, ou simplement la connexion de deux terminaux via TCP.

dans les démocrates (dans les archives) :

- script de sauvegarde des citations dans une base de données SQLite. Pour MySQL, c'est la même chose, mais tout le monde ne l'a pas :-)

- serveur tcp comme indicateur et conseiller (deux variantes) - après le démarrage, il accepte la connexion sur le port 8000 (peut être défini dans les paramètres au démarrage) et y traduit les ticks entrants. Vous pouvez vous connecter et voir

- L'indicateur client http, qui se rend périodiquement sur le site, prend la page des emplois, l'analyse et affiche un résumé des informations dans le graphique comme Commentaire

Les démos vont certainement continuer à se développer, vous pouvez proposer des idées.

Au fur et à mesure, je ferai probablement des démos illustrant

- "serveur web" pour montrer que l'on peut utiliser un navigateur, et comment cela se passe.

- utilisation de TSV (thread shared variables), un analogue étendu de GlobalVariable - utilisation de données partagées dans les applications

Je dois trouver d'autres scripts :-) pour que ce soit clair, concis et au moins un peu utile.

 

Il y a eu une conversation Skype plutôt fascinante, dont je pense que je dois exprimer une partie parce que je la trouve utile :-)

1. Pourquoi du Tcl et pas du Python, beaucoup plus populaire, ou du Ruby ?

Bien sûr, ce ne sera pas le premier, car je le connais bien et je ne l'utilise pas seulement pour le commerce. Et le point technologique est très important - Python et Ruby ne sont pas compatibles avec le modèle de filetage de metatrader. Théoriquement, ils peuvent être exécutés, mais je dois soit extraire une API très faible, soit casser le langage. Il en va de même pour R et bien d'autres.
Pour les faire fonctionner, il faut remplir la condition "plusieurs instances isolées peuvent être créées indépendamment au sein d'un processus et d'un thread".
Lua est le seul autre langage de script que je connaisse qui peut le faire, mais c'est "un langage sans normes".
À propos, ce type de caractères gras devrait être respecté par tous les développeurs de DLL dans leurs produits

2. Comment analyser correctement et rapidement les données

Correct et rapide - est d'effectuer des calculs dans metatrader. C'est pour cela que metatrader est conçu - pour recevoir des données, effectuer des calculs et émettre des ordres. Il serait stupide de dupliquer ses caractéristiques dans votre DLL. Après tout, MQL lui-même est assez similaire à C++ et il ne faut qu'un jour ou deux à un programmeur pour commencer à écrire dans cette langue. Et dans la DLL, nous devons faire ce que la plate-forme ne couvre pas et ne peut pas physiquement couvrir - la communication avec les bases de données, les services, l'intégration et ainsi de suite. Et plus les choses qui peuvent et doivent être utilisées en dehors de MetaTrader.

3. Où et quand la version 5 sera-t-elle disponible ?

Dès que possible :-) Techniquement, il n'est pas difficile de glisser-déposer une DLL de 4 à 5, les scripts s'en moquent. Tcl est à la fois 32 et 64 bits. Mais c'est beaucoup plus pratique de développer sur 4, on n'y touche pas :-) c'est stable et on ne s'attend pas à des surprises. Mais avec les 5 que nous verrons, les développeurs de la plateforme promettent des "tâches de service" (avec les indicateurs, les scripts et les Expert Advisors) et sûrement quelque chose en relation avec les DLL et les threads changera plusieurs builds de suite. Jusqu'à ce que cette question soit réglée, il n'y aura pas de version pour 5.

 

Au cours de l'exécution et sur la base des commentaires des utilisateurs, quelques problèmes ont été trouvés liés aux dépendances de la DLL msvcrt.
et un petit bug (le mien) pour trouver la même DLL. Les chemins relatifs dans le gestionnaire ATcl.mqh ont été prescrits :-)

tout est corrigé, vous pouvez obtenir la version corrigée (ci-jointe), les instructions d'installation sont sur l'endroit traditionnel http://luxtrade.tk/atcl:install


Pour les développeurs de DLL, il s'agit d'un élément d'information utile :

- DLL compilé avec la définition -D_CRTIMP_ALTERNATIVE qui force le compilateur à mettre en ligne presque tout ce qui vient du CRT :-)

- La DLL est maintenant construite avec le commutateur /MT, qui force l'éditeur de liens à utiliser la liaison statique et à ne pas créer de dépendances inutiles. Le Redistributable (package de support VC) permet de ne pas avoir à se trimballer partout.

La taille de la DLL a augmenté, mais il y a moins de dépendances et la bibliothèque devrait être plus facile à transporter.

PS/ petite mise à jour - modification de l'archive jointe. La bibliothèque est construite avec un support multithread complet.
Install
  • luxtrade.tk
ATcl является библиотекой-интегратором и поэтому в первую очередь нужен сам по себе Tcl. Tcl свободно доступен и не имеет лицензионных отягощений (лицензии как правило BSD-like). Для работы с MT4 вам потребуется 32-х битная (это важно! MT4 32-х битный...
Dossiers :
atcl.zip  243 kb