mt4交易統計腳本?想讓MQL4程序運行起來,就必須對它進行編譯(按“編譯”按鈕或F5鍵)在程序編譯過程中不允許出現任何錯誤(允許有警告信息,但一定要對它進行具體分析)編譯成功之後,将會在相應的目錄terminal_dir\experts,terminal_dir\experts\indicators,或 terminal_dir\experts\scripts 中,自動創建一個擴展名為.EX4的可執行文件,隻有創建了相應的.EX4文件,MQL4程序(EA,腳本,自定義指标)才能夠被用戶運行起來,我來為大家講解一下關于mt4交易統計腳本?跟着小編一起來看一看吧!
mt4交易統計腳本
想讓MQL4程序運行起來,就必須對它進行編譯(按“編譯”按鈕或F5鍵)。在程序編譯過程中不允許出現任何錯誤(允許有警告信息,但一定要對它進行具體分析)。編譯成功之後,将會在相應的目錄terminal_dir\experts,terminal_dir\experts\indicators,或 terminal_dir\experts\scripts 中,自動創建一個擴展名為.EX4的可執行文件,隻有創建了相應的.EX4文件,MQL4程序(EA,腳本,自定義指标)才能夠被用戶運行起來。
用戶通過鼠标可以将智能交易、自定義指标和腳本從客戶端“導航”窗口拖動到相應的圖表上(拖曳技術),它們會附加到已打開的任一圖表上。MQL4程序隻有在客戶端已啟動的基礎上才能運行。
要停止智能交易運行,必須從圖表的上下文菜單中删除它(智能交易系統-取消)。“啟用智能交易”按鈕狀态将會直接影響智能交易的運行。
要使自定義指标停止運行,應該将它從圖表中删除。
自定義指标和智能交易一直運行着,直到用戶從圖表中明确地删除它們為止。有關附加的智能交易和自定義指标的信息在客戶端啟動之時保存于客戶端内。
在腳本己經完成操作之後、當前圖表被關閉或其狀态己經發生改變、或當客戶端中斷運行時,腳本都隻執行一次任務,并被自動删除掉。由于不保存運行狀态信息,當客戶端再次重新啟動時腳本并不自動運行。
在同一個圖表内,智能交易、腳本和更多數量的指标可以同時運行。
Back to Top
程序運行
程序附加到圖表之後,它立即開始與init()函數協同運行。在客戶端開始運行和曆史數據(僅與智能交易有關,而與指标無關)被另外加載之後、當貨币對和圖表時段改變了、在MetaEditor裡重新編譯之後、或者從智能交易或自定義指标的設置窗口改變了輸入參數,附加到圖表上的智能交易和自定義指标中的init()函數将會運行。當計算結果發生變化時,智能交易同樣也會被初始化。
每一個附加到圖表上的程序可以借助deinit()函數完成善後工作。當客戶端關機、圖表被關閉、在貨币對或圖表時段改變之前、程序重編譯成功、改變了輸入參數或計算結果改變了,deinit()函數都會運行。在deinit()函數執行期間,用戶可以使用UninitializeReason()函數查看未初始化成功的原因。
deinit()函數必須在2.5秒内執行完畢,如果函數在這段時問内沒有完成它的工作,它将會被強制結束。腳本是這一條規則的例外,由于它們能正常地自主完成它們的工作,它的運行不取決于任何外界的命令。如果一個腳本工作時間過長(例如,永無止境的死循環),用戶可以應用外部命令結束它的運行(從圖表的上下文菜單中删除腳本、在原有的圖表上添加新的腳本、改變圖表的貨币對或時段)。 在這種情況下,deinit()函數同樣被限制在2.5秒内。
在收到新報價時,智能交易和自定義指标中start()函數将會被執行。當新報價進入時,如果start()函數還在忙着處理前面的報價,智能交易會忽略新報價而不予處理。在start()函數運行期間,所有新收的報價都會被一跳而過,直到當前start()函數運行完成為止。從那之後,僅在收到源源不斷的新報價時,start()函數才一會運行。對于自定義的指标,由于收到了新報價,當前圖表貨币對或時段發生了變化,start()函數将會重新運行。start()函數是否運行還取決于“啟用/禁用智能交易”按鈕狀态,當“啟用/禁用智能交易”按鈕處于禁用狀态時,start()函數不會運行,但是,當通過該按鈕切換到禁用狀态時,不會中斷當前start()函數運行。在智能交易屬性窗口打開時,start()函數将停止運行,在其執行期間也不會被打開。
從圖表中卸載程序、改變貨币對或圖表時段、計算結果發生了變化、關閉圖表、客戶端關機,都将會中斷程序的執行。如果這些中斷程序執行的指令到來的時候,start()函數此刻還在運行,那留給它的工作時間依然被限制在2.5秒之内。程序知道用内置IsStopped()函數試着把它關閉并正确地結束它的工作。
腳本的執行不依賴收到的報價。在貨币對或圖表時段發生改變時,腳本将完成它的工作并從客戶端上卸載下來。
腳本和智能交易運行在自己的線程裡,自定義指标則工作在主接口線程上。但是,如果一個自定義指标被iCustom()函數調用,這個指标就運行在調用它的程序線程中,庫(導入)函數也同樣工作在調用程序的線程裡。
Back to Top
導入函數調用
為了在mql4程序執行期間導入函數,采用了所謂的“滞後聯編”。這就意味着,導入函數被調用前,不會被加載相應的模塊(EX4或DLL)。 MQL4和DLL庫在調用模塊線程下運行。
這裡不推薦使用全路徑模塊名 Drive:\Directory\FileName.Ext 加載模塊。MQL4庫是從 terminal_dir\experts\libraries 文件夾中載入進來。如果庫中未找到,将會嘗試從terminal_dir\experts 文件夾下加載。
系統動态鍊接庫(DLL)按照操作系統規則加載。如果一個DLL已經加載過(例如,被其他智能交易系統,或從同時啟動的另一個客戶端程序加載),則将直接引用已加載過的庫,否則,搜索會按照以下順序進行:
1. terminal_dir\experts\libraries 目錄 。
2. terminal_dir 目錄,客戶端程序啟動的目錄。
3. 當前目錄。
4. windows_dir\SYSTEM32 系統目錄 (或是Win98下 windows_dir\SYSTEM 目錄 )。
5. windows_dir 目錄,即操作系統安裝的目錄。
6. 系統環境變量PATH中列出的目錄。
如果一個DLL運行時調用了另一個DLL,而後者又不可用,那麼前者就不會被加載。
與系統庫不同,自定義庫(MQL4)是每個調用模塊各自單獨加載,而不管是否被其它模塊獨立地加載過。例如,調用.ex4模塊可以從lib1.ex4和lib2.ex4庫中調用函數,反過來,lib1.ex4庫也可以從lib2.ex4庫中調用函數。在這種情況下,一個以上lib1.ex4副本和兩份lib2.ex4副本被加載,根本不考慮所有的調用都來自同一個調用.ex4模塊。
從DLL導入到MQL4程序的函數必須符合Windows API函數的鍊接規則。為了确保在程序源碼裡符合這樣的規定,我們用C或C 語言編程時使用關鍵字_stdcall予以說明,表示是用微軟公司編譯器編譯。上述鍊接規定有以下特點:
為了将函數參數以适當的方式置入堆棧,調用函數(這種情況下,是一個MQL4程序)必須“看得見”被調用函數的原型(來自DLL導入函數);
調用函數(這種情況下,是一個MQL4程序)以逆序方式将參數置入堆棧,也就是說,從右到左;它就是以這種順序讓導入函數讀取傳遞給它的參數;
參數通過值傳遞,除那些明确說明通過引用傳遞之外;
在讀取傳遞給它的參數後,導入函數本身将會自行清除堆棧。
在描述導入函數原型時,由于所有的參數必須明确地傳遞給導入函數,所以參數的默認值是無用的。
如果調用導入函數失敗(智能交易設置不允許DLL導入,或是由于一些原因導緻無法加載相應的庫),智能交易會停止運行并把相關信息輸出到“智能交易停止”日志。另外,智能交易隻有在重新初始化之後才能啟動。重新編譯或打開智能交易屬性表并按OK鍵,其結果就是智能交易系統重新初始化。