Рад представить новую версию ATcl. Была продолжена работа по унификации и упрощению API, удалось добиться стабильной работы Tk в экспертах. Демки пополнились двумя полезными демонстрациями.
В новой версии
API
Изменён синтаксис методов Set - они всегда принимают непосредственное MQL значение в качестве параметров. Для того чтобы присвоить переменной объект Tcl_Obj введён метод SetObj(varName,obj). По мере развития аналогичные изменения коснуться и других методов.
Структура каталогов
Скрипты tcl перенесены в каталог Libraries/ATcl/demo В дистрибутив включена библиотека Cawt (http://www.cawt.tcl3d.org/)
Полноценный GUI
Демо - WebSocket
Демо - CawtExcel
Развитие проекта
Были проблемы со старым доменом и ATcl переехал на мой персональный домен; для избежания проблем с доступностью дистрибутива файлы будут дублироваться на SourceForge https://sourceforge.net/projects/mt-atcl/ . Там же можно оставлять отзывы, пожелания и запросы
Проект распространняется бесплатно, без лицензионных ограничений и вы можете помочь его развитию монеткой donate
Загрузить дистрибутив
Дистрибутив доступен на странице загрузки install и на SourceForge https://sourceforge.net/projects/mt-atcl/files
Промежуточные версии также выкладываются по мере выхода на форуме mql5.com : https://www.mql5.com/ru/forum/224745
Известный баг:
- в самый последний момент обнаружен : есть конфликт при
одновременной загрузке на один чарт индикаторов ATcl и советника
использующего Tk. Природа ошибки понятна, но в коде она ещё не
лоцирована и поэтому пока не исправлена.
По отдельности они все замечательно работают, поэтому хоть и с задержкой но решился выпустить релиз с этим багом.
Шаблон MQL приложения использующего ATcl :
//--- input parameters input int MAGIC=0; #include <ATcl/ATcl.mqh> ATcl *tcl=NULL; bool hasTimer=false; #define TIMER_MSC 100 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { // reset global vars. to defaults tcl=NULL; hasTimer=false; // initialize ATcl library and create interp. if(ATcl_OnInit()!=INIT_SUCCEEDED || (tcl=new ATcl)==NULL || !tcl.Ready()) { return INIT_FAILED; } // start timer hasTimer=EventSetMillisecondTimer(TIMER_MSC); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { // stop timer if(hasTimer) EventKillTimer(); if(tcl!=NULL) { // unref refferred objects // delete interp. delete tcl; } // finalize library ATcl_OnDeinit(reason); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(!hasTimer) { tcl.Update(); hasTimer=EventSetMillisecondTimer(TIMER_MSC); } return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer() { tcl.Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { tcl.Update(); } //+------------------------------------------------------------------+
UPDATE - обновлён архив