ATcl - MT4용 Tcl 인터프리터 - 페이지 2

 
Maxim Kuznetsov :
누가 파이프를 제어하고 프로토콜을 구현하며 결과를 구문 분석합니까? 길고 느리며 유일한 투표입니다.

모든 것을 뒤지지 않고 주제에 더 의도적으로 익숙해지기 위해 이 atcl에 대한 몇 가지 링크를 읽을 수 있습니다.

 
Alexey Oreshkin :

모든 것을 뒤지지 않고 주제에 더 의도적으로 익숙해지기 위해 이 atcl에 대한 몇 가지 링크를 읽을 수 있습니다.

MT4 통합자 라이브러리(내가 지속적으로 사용하는 라이브러리)에 대한 주요 링크는 현재 주제와 http://luxtrade.tk/atcl:start 주제에 언급된 링크입니다(역사적으로 내 사이트는 영구 혼란 상태에 있습니다. -) )

Tcl 자체(루트 사이트): http://www.tcl.tk

위키: http://wiki.tcl.tk

"표준 라이브러리" : https://core.tcl.tk/tcllib/doc/tcllib-1-18/embedded/www/toc.html

현재 ActiveState의 주요 유통업체: https://www.activestate.com/activetcl ,

그들은 MagicSplat http://www.magicsplat.com/ 및 IronTcl https://irontcl.com/ 에 의해 밟히고 있습니다.

언어 및 스크립팅 플랫폼으로서 Tcl은 시간 테스트를 거쳐 온화하게 표현합니다. 첫 번째 릴리스는 1990년에 있었고, 현재로서는 Linux/UNIX에 사실상 존재하며, 이제는 Android에도 있습니다. 98%는 일부 잘린 형식으로 컴퓨터에 있습니다 - python, ruby, R, maxima, octave 및 기타는 GUI에 사용합니다(tkinter는 동일함)

추신. 나는 그들이 많은 링크로 인해 게시물과 나를 동시에 충돌시키지 않기를 바랍니다. 모두 무료입니다.

추신 로컬 아웃소싱 업체의 경우 "맛있는" 현상금 https://github.com/flightaware/Tcl-bounties 도 있습니다. 그러나 2500USD에서 어려운 작업만 남았고 힘든 규율이 있습니다.

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

미래에 대한 생각과 함께:

일부 패치 등의 도움으로 다음과 같은 결과가 나타납니다.


이것은 매우, 매우 실험적이며 현재 버전에서도 Tk를 실행할 수 있는 패치를 아직 포함하지 않을 것입니다(첫 번째, 초기이고, 다른 결함이 많고, 두 번째로 맥주용으로 제작되었습니다. , 나중에 검토해야합니다)

그러나 결국 당신이 그것을 얻기를 원하고 그것이 기술적으로 가능하다는 확신이 있다는 것이 분명합니다. 예, 예, 전체 스크립트 GUI도 가능합니다.

그건 그렇고, 로컬 GUI 빌더에게 창(알파 채널이 있는 창)은 다음과 같이 풍부하게 설명됩니다(이것은 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"
}
 

파일을 약간 정리했습니다. 이제 ZIP 형식으로 Indicators, Scripts, Experts, Libraries, Include 폴더에 정렬됩니다. 이론상 라이브러리 설치는 매우 간단합니다.
데이터 디렉토리 안에 있는 아카이브의 압축을 풀면 모든 것이 제자리에 있어야 하고 작업할 준비가 되어야 합니다(Tcl 자체도 설치해야 한다는 점을 제외하면 :-)).

제공되는 API는 다음과 같습니다.

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

상당히 컴팩트하고 편리한 것 같습니다.

나는 언급된 zip-archive를 동봉합니다. 누군가 갑자기 그것을 필요로 하고 설치하는 동안 문제가 있으면 여기에 또는 개인 메일로 작성하십시오.

파일:
atcl.zip  135 kb
 

놀라운 예

"즉석에서 컴파일하고 MQL 스크립트 내에서 ATcl에서 C/C++ 사용"

 #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();
}
파일:
atcl.zip  149 kb
 

음, 베타를 축하합니다! :-)

간단히 말해서, 이제 ATcl을 통해 MT4에서 쉽게 액세스할 수 있는 기능은 다음과 같습니다.

Tcl 기능

  • 단순 - 간단한 스크립팅 언어
  • 이식성 - 모든 시스템(Windows, Linux, Android 및 기타)에서 개발된 스크립트 및 알고리즘을 사용할 수 있습니다.
  • 이벤트 기반 - 내부 이벤트 모델
  • 객체 지향 - 현대 OOP의 모든 기능
  • 스레딩 - 시스템 스레드, 뮤텍스, 조건 변수, 영구 저장소가 있는 공유 변수 등 다중 스레드 프로그래밍의 모든 기능을 사용할 수 있습니다.
  • 가상 파일 시스템 - zip, tar, ftp, webdav를 파일 시스템으로 투명하게 액세스
  • 데이터베이스 - 통합 인터페이스 tdbc 및 sqlite는 tcl 코어의 일부입니다. PostresSQL, MySQL, MonetDB, Oracle 및 모든 ODBC 데이터베이스가 적극적으로 지원됩니다.
  • 네트워킹 - 클라이언트/서버: tcp,http,mail,websocket,zmq. 필요한 거의 모든 프로토콜 및 서비스.
  • 암호화 - 체크섬, 전자 서명, 암호화 해시. 대칭 및 비대칭 암호화. 공개 키 인프라, TLS, SASL 지원
  • windows - Windows 환경에서 작업하기 위한 도구 - 레지스트리, DDE, COM 클라이언트/서버, ldap 클라이언트
  • tcllib - Tcl 표준 라이브러리는 추가 기능(소프트웨어 도구, 워드 프로세싱, 수학 및 통계 등)을 제공합니다.
  • c/c++ - TinyC 컴파일러가 라이브러리에 포함되어 있으며 Critcl 패키지를 사용하면 시스템 C/C++ 컴파일러(vc,gcc,clang)를 사용할 수 있습니다. 모듈과 함수는 즉시 컴파일하고 사용할 수 있습니다.
  • 가장 잘 알려진 - 많은 라이브러리와 시스템이 Tcl API를 제공하므로 프로그램에서 쉽게 사용할 수 있습니다.
블로그 사이트에서 더 완벽합니다: https://www.mql5.com/ru/blogs/post/715411 (아무도 읽지 않는 :-))
그리고 프로젝트 페이지 http://luxtrade.tk/atcl:start 에서


주제에 대한 모든 질문에 기꺼이 답변하고 아이디어와 의견을 경청합니다.


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

축하합니다!

코드베이스 및 기사에 있는 것과 유사한 몇 가지 실용적인 예를 만드는 것이 유용할 것입니다.
예를 들어 MySQL, Telegram과의 통신 또는 TCP를 통한 두 터미널의 연결.

 
Andrey Khatimlianskii :

축하합니다!

코드베이스 및 기사에 있는 것과 유사한 몇 가지 실용적인 예를 만드는 것이 유용할 것입니다.
예를 들어 MySQL, Telegram과의 통신 또는 TCP를 통한 두 터미널의 연결.

데모에서(보관됨):

- SQLite 데이터베이스 에 따옴표를 저장하는 스크립트. MySQL의 경우 모든 것이 동일합니다. 모든 사람이 시스템에 있는 것은 아닙니다 :-)

- 표시기 및 조언자 형태의 tcp 서버(두 가지 옵션) - 실행 후 포트 8000(시작 시 설정에서 설정할 수 있음)에 대한 연결을 수락하고 들어오는 틱을 브로드캐스트합니다. 텔넷 옴 및 볼 수 있습니다

- 주기적으로 이 사이트에 접속하는 http 클라이언트 인디케이터는 작업 페이지를 가져와서 파싱하여 간단한 정보를 Comment 형태로 차트에 출력합니다.

물론 데모가 보충되며 아이디어를 제공할 수 있습니다.

그 과정에서 아마 데모를 만들 것입니다.

- "웹 서버", 브라우저를 사용할 수 있고 사용 방법을 보여줍니다.

- GlobalVariable의 확장 아날로그인 TSV(스레드 공유 변수) 사용 - 응용 프로그램에서 공유 데이터 사용

명확하고 간결하며 최소한 조금이라도 유용하도록 스크립트를 작성해야 합니다 :-).

 

여기에는 다소 매혹적인 Skype 대화가 있습니다. 유용하다고 생각하기 때문에 일부를 음성으로 전달할 필요가 있다고 생각합니다 :-)

1. 왜 일부 Tcl은 인기가 없는 Python, Ruby입니까?

물론, 첫째, 내가 그를 잘 알고 그를 거래뿐만 아니라 사용하기 때문입니다. 그리고 기술적 인 점 또한 중요합니다. Python과 Ruby는 메타 트레이더의 스레딩 모델과 호환되지 않습니다. 이론적으로 실행될 수 있지만 매우 낮은 API를 파거나 언어 자체를 패치해야 합니다. R 및 기타 많은 경우에도 마찬가지입니다.
이것이 작동하려면 " 하나의 프로세스와 하나의 스레드 내에서 여러 개의 격리된 인스턴스가 독립적으로 생성될 수 있음 " 조건을 관찰해야 합니다.
내가 아는 스크립팅 언어 중 루아만이 할 수 있는 말인데, 이것을 "표준 없는 언어"라고 스스로 이해하고 있다..
그건 그렇고, 굵은 글꼴은 제품의 모든 DLL 개발자가 준수해야 합니다.

2. 데이터를 정확하고 빠르게 계산하는 방법

정확하고 빠르게 메타 트레이더에서 계산을 수행하는 것 입니다. 실제로 데이터를 얻고, 계산을 수행하고, 명령을 내리기 위해 만들어졌습니다. DLL에서 해당 기능을 복제하는 것은 어리석은 일입니다. 결국 MQL 자체는 C ++와 매우 유사하며 프로그래머가 작성을 시작하는 데는 하루나 이틀의 문제입니다. 그리고 DLL에서 플랫폼이 다루지 않고 물리적으로 다룰 수 없는 것(데이터베이스, 서비스, 통합 등과의 통신)을 수행해야 합니다. 그리고 MetaTrader 외부에서 사용할 수 있고 사용해야 하는 것입니다.

3. 5-ki 버전은 언제 어디서

빨리, 그래서 즉시 :-) 기술적으로 DLL을 4에서 5로 드래그하는 것은 전혀 어렵지 않지만 스크립트는 상관하지 않습니다. Tcl은 32비트와 64비트입니다. 그러나 4-ke에서 개발하는 것이 훨씬 더 편리합니다. 만지지 않습니다 :-) 안정적이고 놀라움이 없습니다. 그러나 5일차에서는 플랫폼 개발자가 "서비스 작업"(표시기, 스크립트 및 조언자와 함께)을 약속하고 DLL과 스레드 간의 관계에서 확실히 여러 빌드가 연속적으로 변경될 것으로 예상됩니다. 그것이 진정될 때까지 5-ki의 버전은 없을 것입니다.

 

작동 중 및 사용자 리뷰에 따르면 msvcrt의 DLL 종속성과 관련된 문제가 확인되었습니다.
동일한 DLL을 검색하는 작은 (내) 버그. 상대 경로는 ATcl.mqh 헤더에 작성되었습니다 :-)

모든 것이 수정되었습니다. 수정된 버전(첨부됨), 설치 지침을 사용할 수 있습니다 - 기존 위치 http://luxtrade.tk/atcl:install


DLL 개발자의 경우 수행된 조작에 대한 유용한 정보:

- DLL은 컴파일러가 CRT에서 가능한 거의 모든 것을 "인라인"하도록 강제하는 define -D_CRTIMP_ALTERNATIVE로 컴파일됩니다 :-)

- 이제 DLL이 /MT 키로 빌드되어 링커가 정적 연결을 사용하고 불필요한 종속성을 생성하지 않도록 합니다. 재배포 가능(VC 지원 패키지) 종류는 더 이상 가지고 다닐 필요가 없습니다.

DLL의 크기는 커졌지만 종속성은 줄어들었고 라이브러리를 더 쉽게 운반할 수 있어야 합니다.

PS/ 작은 업데이트 - 첨부된 아카이브를 변경했습니다. 라이브러리는 완전한 멀티스레드 지원으로 구축되었습니다.
Install
  • luxtrade.tk
ATcl является библиотекой-интегратором и поэтому в первую очередь нужен сам по себе Tcl. Tcl свободно доступен и не имеет лицензионных отягощений (лицензии как правило BSD-like). Для работы с MT4 вам потребуется 32-х битная (это важно! MT4 32-х битный...
파일:
atcl.zip  243 kb