導航:首頁 > 源碼編譯 > 編譯器讀取歷史記錄

編譯器讀取歷史記錄

發布時間:2023-05-13 18:34:57

編譯器的歷史

20世紀50年代,IBM的John Backus帶領一個研究小組對FORTRAN語言及其編譯器進行開發。但由於當時人們對編譯理論了解不多,開發工作變得既復雜又艱苦。與此同時,Noam Chomsky開始了他對自然語言結構的研究。他的發現最終使得編譯器的結構異常簡單,甚至還帶有了一些自動化。Chomsky的研究導致了根據語言文法的難易程度以及識別它們所需要的演算法來對語言分類。正如Chomsky架構(Chomsky Hierarchy),它包括了文法的四個層次:0型文法、1型文法、2型文法和3型文法,且其中的每一個都是其前者的特殊情況。2型文法(或上下文無關文法)被證明是程序設計語言中最有用的,而且今天它已代表著程序設計語言結構的標准方式。分析問題(parsing problem,用於上下文無關文法識別的有效演算法)的研究是在60年代和70年代,它相當完善的解決了這個問題。它已是編譯原理中的一個標准部分。
有限狀態自動機(Finite Automation)和正則表達式(Regular Expression)同上下文無關文法緊密相關,它們與Chomsky的3型文法相對應。對它們的研究與Chomsky的研究幾乎同時開始,並且引出了表示程序設計語言的單詞的符號方式。
人們接著又深化了生成有效目標代碼的方法,這就是最初的編譯器,它們被一直使用至今。人們通常將其稱為優化技術(Optimization Technique),但因其從未真正地得到過被優化了的目標代碼而僅僅改進了它的有效性,因此實際上應稱作代碼改進技術(Code Improvement Technique)。
當分析問題變得好懂起來時,人們就在開發程序上花費了很大的功夫來研究這一部分的編譯器自動構造。這些程序最初被稱為編譯器的編譯器(Compiler-compiler),但更確切地應稱為分析程序生成器(Parser Generator),這是因為它們僅僅能夠自動處理編譯的一部分。這些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年為Unix系統編寫的。類似的,有限狀態自動機的研究也發展了一種稱為掃描程序生成器(Scanner Generator)的工具,Lex(與Yacc同時,由Mike Lesk為Unix系統開發)是這其中的佼佼者。
在20世紀70年代後期和80年代早期,大量的項目都貫注於編譯器其它部分的生成自動化,這其中就包括了代碼生成。這些嘗試並未取得多少成功,這大概是因為操作太復雜而人們又對其不甚了解。
編譯器設計最近的發展包括:首先,編譯器包括了更加復雜演算法的應用程序它用於推斷或簡化程序中的信息;這又與更為復雜的程序設計語言的發展結合在一起。其中典型的有用於函數語言編譯的Hindley-Milner類型檢查的統一演算法。其次,編譯器已越來越成為基於窗口的交互開發環境(Interactive Development Environment,IDE)的一部分,它包括了編輯器、連接程序、調試程序以及項目管理程序。這樣的IDE標准並沒有多少,但是對標準的窗口環境進行開發已成為方向。另一方面,盡管在編譯原理領域進行了大量的研究,但是基本的編譯器設計原理在近20年中都沒有多大的改變,它正迅速地成為計算機科學課程中的中心環節。
在20世紀90年代,作為GNU項目或其它開放源代碼項目標一部分,許多免費編譯器和編譯器開發工具被開發出來。這些工具可用來編譯所有的計算機程序語言。它們中的一些項目被認為是高質量的,而且對現代編譯理論感興趣的人可以很容易的得到它們的免費源代碼。
大約在1999年,SGI公布了他們的一個工業化的並行化優化編譯器Pro64的源代碼,後被全世界多個編譯器研究小組用來做研究平台,並命名為Open64。Open64的設計結構好,分析優化全面,是編譯器高級研究的理想平台。
編譯器相關專業術語: 1. compiler編譯器;編譯程序 2. on-line compiler 連線編譯器 3. precompiler 預編譯器 4. serial compiler 串列編譯器 5. system-specific compiler 特殊系統編譯器 6. Information Presentation Facility Compiler 信息展示設施編譯器 7. Compiler Monitor System 編譯器監視系統

Ⅱ 無法讀取編譯器命令

無法讀取編譯器命令行,1 頭部#include文件錯誤,#include 後面的包含的文件時,如果使用的是 "<>" 尖括弧的話, 表示讓編譯器在系統頭文件夾中查找對應名字的頭文件, 當使用""引號時,就是讓編譯器在當前程序目錄下螞掘查找對應名字的頭文件,如果沒有找到,則編譯器會再在系統頭文件夾中查找該頭文件. 注意#include文件到位置。
2 感覺是編譯器兼容問題,比如:include 「streams.h」有的情況下在vs2003編譯通過的情況下,在vs。net編譯無法通升唯過,改成,include "streams"去掉.h就可以了。
3 有可能是文件整理後移動位置,將與編譯頭文件和cpp文件目錄修改導致錯誤,用記事本打開.dsp文件,找到與編譯cpp文件,少了個與編譯開關所以不能生成與編譯頭文悶笑核件:.pch

Ⅲ C++編譯的時候為什麼要先clean

clean是因為有個makefile文件,去清除上一次編譯餘下的文件,這樣做能保證編譯器會檢查到你所有用到的文件並編譯它們,保證編譯出來的程序是最新的。您可以試一下不clean,我想結果會一樣。

Ⅳ 菜鳥的python在線編譯器能否打開本地文件,如果能怎麼打開

應當是不行的,在線編輯器應當是運行在一個虛擬的環境中,所以不能讀取出本機文件的。

看這樣得到的文件路徑是/box,感覺像是一個容器。

Ⅳ 簡述一下編譯器和鏈接器的作用

1、編譯器:
編譯器對源文件進行編譯,就是把源文件中的文本形式存在的源代碼翻譯成機器語言形式的目標文件的過程,在這個過程中,編譯器會進行一系列的語法檢查。如果編譯通過,就會把對應的CPP轉換成OBJ文件。
2、鏈接器:
當鏈接器進行鏈接的時候,首先決定各個目標文件在最終可執行文件里的位置。然後訪問所有目標文件的地址重定義表,對其中記錄的地址進行重定向(加上一個偏移量,即該編譯單元在可執行文件上的起始地址)。
然後遍歷所有目標文件的未解決符號表,並且在所有的導出符號表裡查找匹配的符號,並在未解決符號表中所記錄的位置上填寫實現地址。最後把所有的目標文件的內容寫在各自的位置上,再作一些另的工作,就生成一個可執行文件。

Ⅵ Python編譯器控制台作用

Python控制台是一種執行命令的快速方法,可以訪問完整的PythonAPI、查詢命令歷史記錄和自動補全。
命令提示符是Python3.x的典型操作,載入解釋器,並在提示符>>>處接受命令。
Python控制台是內置的用於探索Blender的可能性的絕佳方法。Python控制台可用於測試小段python,然後粘貼到更大的腳本中。

Ⅶ 怎麼學習ollydbg原理是什麼基本使用方法是什麼

最簡單的方法是啟動OllyDbg,點擊File|Open,然後選擇你想調試的程序。程序需要命令行參數輸入對話框下方的文本欄。
重新開始調試最後一個程序的快捷鍵是Ctrl+F2,並且OllyDbg使用相同的參數。
你也可以點選歷史記錄。把程序拖入OllyDbg也可以開始調試。
當然,當啟動OllyDbg時,你在命令行中也能指定被調試的程序名和參數。比如:
你可以創建桌面快捷方式指向OllyDbg,選擇屬性,到快捷方式,把程序名加入目
標欄。每次你雙擊這個快捷圖標,OllyDbg自動裝載被調試程序。
你可以attach OllyDbg到某個正在運行的進程。點擊File|Attach,從列表中選擇
該進程。注意:當你關閉OllyDbg,這個進程也會終止。不要試圖attach系統進程
,這很可能使系統完全死機。(事實上,大多數情況下,OS不允許attach敏感進
程)
OllyDbg能作為just-in-time debugger。這需要在注冊表中登記。點擊
Options|Just-in-time debugging,在對話框中按「Make OllyDbg just-in-time
debugger」。現在,當一些程序崩潰,你會被詢問是否調試它。這樣,操作系統
可以啟動OllyDbg並直接停在異常發生處。如果你選擇attaching without
confirmation,OllyDbg不會詢問直接啟動。要恢復原來的just-in-time
debugger,在出現的對話框中按相應的按紐就行了。
其它方法還有,把OllyDbg加入可執行文件的彈出式菜單。點擊Options|Add to
Explorer,按「Add OllyDbg to menu in Windows Explorer」。以後你可以右擊
可執行文件點選OllyDbg。這個選項創建注冊表鍵
HKEY_CLASSES_ROOT/exefile/shell/Open with OllyDbg and
HKEY_CLASSES_ROOT/exefile/shell/Open with OllyDbg/command
OllyDbg可以調試控制台(基於文本)程序。
注意:WindowsNT或Windows2000下,你必須有管理員許可權
OllyDbg的help-通用快捷鍵(翻譯)
Golbal shortcuts(通用快捷鍵)
這些快捷鍵在OllyDbg中通用,不依賴於當前活動窗口。
Ctrl+F2---OllyDbg重置,重新開始調試。如果沒有活動程序,OllyDbg裝入歷史列表中的第一個程序。OllyDbg重置會釋放內存移除硬斷點。
Alt+F2--關閉被調試的程序。如果程序還在活動狀態,你會被詢問是否執行該操作。
F3--顯示「Open 32-bit .exe file」對話框,這里可以選擇可執行文件和指定參數
Alt+F5--使OllyDbg顯示在屏幕最前方。如果被調試程序中斷時顯示窗口遮住OllyDbg的一些區域,不繼續運行又不能移動或最小化它。激活OllyDbg按Alt+F5可以解決。如果你再次按Alt+F5,OllyDbg會恢復為普通窗口。OllyDbg的當前狀態顯示在狀態欄。
F7--step into,執行下一條簡單命令。如果該命令是一個函數調用,進入調用函數內部。如果命令有REP前綴,執行該命令的一步操作。
Shift+F7--與F7相同,除了當被調試程序遇到某些異常時,首先嘗試調用程序自己的異常處理過程。
Ctrl+F7--animate into,一步一步執行程序,也進入函數調用(就象你一直按著F7,不過更快)。當你執行一些單步或繼續命令,程序到達有效斷點,一些異常發生時,Animation終止。每步執行,OllyDbg重畫所有窗口。要加速animation,關閉所有窗口而不要只改變現有窗口的大小。終止animation,也可按Esc。
F8-step over,執行下一條簡單命令。如果該命令是一個函數調用,立刻執行完該函數(除非函數內部有斷點或產生異常)如果命令有REP前綴,執行所有重復操作,並停於下一條命令。
Shift+F8--與F8相同,除了當被調試程序遇到某些異常時,首先嘗試調用程序自己的異常處理過程。
Ctrl+F8--animate over,一步一步執行程序,但不進入函數調用(就象你一直按著F8,不過更快)。當你執行一些單步或繼續命令,程序Animation到達有效斷點或異常發生時,Animation終止。每步執行,OllyDbg重畫所有窗口。要加速animation,關閉所有窗口而不要只改變現有窗口的大小。終止animation也可按Esc。
F9--繼續執行程序。
Shift+F9--與F9相同。除了當被調試程序遇到某些異常時,首先嘗試調用程序自己的異常處理過程。
Ctrl+F11--run trace into,一步一步執行程序,要進入函數調用,記錄寄存器內容。Run trace 不重繪CPU窗口.
F12-懸掛所有線程以停止程序執行。最好用繼續鍵和菜單命令(像F9)恢復執行線程,而不要用其它手動方法恢復。
Ctrl+F12--run trace over,一步一步執行程序,不進入函數調用,記錄寄存器內容。Run trace不重繪CPU窗口。
ESC--如果animation或跟蹤正在進行,將被終止。如果CPU窗口顯示跟蹤時的數據,此時轉為顯示實際數據。
Alt+B--打開或恢復Breakpoint窗口。這里可以編輯,刪除和觀察斷點。
Alt+C--打開或恢復CPU窗口。
Alt+E--打開或恢復模塊列表
Alt+E--打開或恢復Call stack窗口。
Alt+L--打開或恢復Log窗口。
Alt+M--打開或恢復Memory窗口。
Alt+O--打開Option對話框
Ctrl+P--打開Patch窗口。
Ctrl+T--打開Pause run trace對話框
Alt+X-中斷OllyDbg。
多數窗口可以使用下列快捷鍵:
Alt+F3--關閉活動窗口。
Ctrl+F4--關閉活動窗口。
F5--最大化或恢復活動窗口。
F6--激活下一個窗口。
Shift+F6--激活前一個窗口。
F10--打開激活窗口或面板的右鍵菜單。
LeftArrow--左移一個字元。
Ctrl+LeftArrow--左移一行。
RightArrow--右移一個字元。
Ctrl+RightArrow--右移一行。
OllyDbg的help-分析模塊介紹(翻譯)
分析
OllyDbg集成了快速超強的代碼分析器。裝載它,可以用彈出式菜單或者CPU窗口
的反匯編欄按Ctrl+A或者在執行模塊選「Analyze all moles」。
分析器非常有用。它在數據中分辨代碼,標記入口點和jump的目標,辨認switch
tables,ASCII和UNICODE字元串,定位過程、循環、高級switch語句和解碼標准
API函數參數(看範例)。OllyDbg的其它部分也廣泛用於數據分析。
這怎麼可能呢?我稍微介紹一下原理。首先,OllyDbg反匯編代碼區所有可能的地
址,記下所有發現的調用及指向的目標。當然,許多這樣的調用不正確,但是未
必會有兩個錯誤的調用指向同一條命令,並且三個或三個以上更不可能。這樣,
三個或更多調用指向同一地址,我就確信該地址是經常使用的子過程入口。從這
個入口開始,我跟蹤所有的跳轉和調用,反復操作。這種方法使我99.9%確定所
有命令。然而,某些位元組不在這條鏈中,我採用大約20個更高效的方法(最簡單
的如:「MOV [RA],Ra"是無效命令).
過程檢測也簡單。過程,從分析器的角度看,就是從入口開始的代碼的連續區域
,(理論上)可以到達其它命令(除NOP或對齊填充外)。你可以指定三種識別級
。Strict級嚴格確認一個入口和至少一個出口。heuristical級,分析器嘗試確認
入口。如果你選擇fuzzy級,或多或少相容的代碼區被分離為過程。現代編譯器把
過程分成幾個部分作公用代碼優化。這種情況下,fuzzy級特別有用!然而,誤解
的概率也相當高。
類似的,loop是一個封閉的連續命令序列,這里最後的命令跳到開頭、一個入口
幾個出口。Loop相當於高級操作語言中的do,while和for。OllyDbg能認識任何復
雜的嵌套循環。在反匯編區,他們用長長的大括弧標記。如果入口不是循環的第
一條命令,OllyDbg用個小三角形作標記。
實現switch語句,多數編譯器把switch變數裝入寄存器,然後減去一部分,像下
面代碼序列一樣:
MOV EDX,<switch variable>
SUB EDX,100
JB DEFAULTCASE
JE CASE100 ; Case 100
DEC EDX
JNE DEFAULTCASE
... ; Case 101
這些序列也可能包含一級或兩級switch表,直接比較,優化,填充等等。如果你
深入研究比較和跳轉樹,很難說哪一條命令是某個case語句。OllyDbg為你代勞。
它標記所有的case語句,包括default,甚至嘗試猜測case的意思,如'A',
WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果命令序列不修改寄存器(只
由比較命令構成),那麼不大可能是switch語句,但可能是if嵌套:
if (i==0) {...}
else if (i==5) {...}
else if (i==10) {...}
讓OllyDbg解碼if嵌套為switch,選擇Analysis1中相應的選項。
OllyDbg預置超過1900個常用API函數的描述。包括KERNEL32, GDI32, USER32,
ADVAPI32, COMDLG32, SHELL32, VERSION, SHLWAPI, COMCTL32, WINSOCK,
WS2_32 和 MSVCRT。你也可以加入自己的描述。如果分析器遇到已知函數名的調
用(或跳轉到該函數),它嘗試解碼調用跟前的PUSH命令。因此,你可以粗略翻
譯該調用的功能。OllyDbg也內置大約400個標准C函數的描述。如果你利用新庫,
我建議你分析前先掃描對象文件。這種情況下,OllyDbg也會解碼已知的C函數參
數。
如果選項「Guess number of arguments of unknown functions」被設置,分析
器嘗試確認調用過程進棧的雙字數目,並標記他們為參數Arg1,Arg2等等。注意:
如果有寄存器參數,OllyDbg還是不認識也不包括在上面的統計中。分析器採用了
一個安全的方法。例如,它不分辨無參數過程和返回前用POP恢復寄存器代替舍棄
參數的case語句。然而,能分辨出的函數數目相當多,並非常有助於提高代碼的
可讀性。
分析器能跟蹤寄存器的值。現代優化編譯器,特別是面向Pentium的,經常把常量
和地址裝入寄存器便於重復使用或減小內存佔用空間。如果一些常量裝入寄存器
,分析器會注意它,並用於解碼函數及其參數。還能執行簡單的算術計算跟蹤
push和pop命令。
分析器不能區別不同類型的名字。如果你用已有的名字命名一些函數,OllyDbg會
解碼所有該地址的調用為原過程。WinMain,DllEntryPoint和WinProc是特殊的預
定義名。你可以使用這些標號標記主程序入口,DLL入口指針和window過程(注意
:OllyDbg不會檢查用戶定義標號的唯一性)。當然,最好的方法是顯示已定義的
參數。
非常不幸,沒有一般的規則用於100%的准確分析。有些情況下,例如當模塊包含
p-代碼或者代碼區嵌入大量數據,分析器可能認為部分數據是代碼。如果統計分
析顯示代碼可能被打包或加密,分析器會警告你。如果你想用hit跟蹤方式,我建
議你不要用fuzzy分析方式,否則斷點被設置在被誤認為代碼的數據上的幾率很高。
解壓文件通常在主體代碼外有解壓代碼。如果你選擇SFX選項「Extend code
section to include self-extractor」,OllyDbg會擴大代碼區,形式上允許分
析它並跟蹤。
OllDbg的一般原理(翻譯)部分
我希望你熟悉80x86兼容CPU的內部結構,並且有匯編寫程序的經歷。我也希望你
熟悉Microsoft Windows.
OllyDbg是一個單進程多線程的「機器代碼級」debugger,用於Windows環境下的32位程序。它允許你debug和patch PE格式的可執行程序。OllDbg僅僅使用列入文檔的Win32 API調用,所以可用於下一代32位Windows系統。OllDbg看來也可工作於Windows XP,但是我沒有詳盡的測試,因此不能保證功能完整。
OllyDbg不是面向編譯器。它不含特別的規則顯示某些情況下特定的編譯程序生成哪些代碼序列。因此,你可以一樣對待任何編譯器編譯的,或者匯編書寫的任何代碼。
OllyDbg與被調試的程序同時工作。你可以瀏覽代碼和數據、設置斷點、停止或繼續線程,甚至運行期修改內存(有時這叫作軟調試方式)。當然,如果被請求的操作不是最基本的,OllyDbg就會短時暫停程序,但這對用戶透明。有時不在調試狀態運行的程序會意外崩潰。OllyDbg,這個「及時」debugger,會指出異常發生的位置。
OllyDbg強烈面向模塊。模塊這里指啟動時載入的或動態載入的主執行文件或動態連接庫。在調試區,你可以設置斷點,定義新標號和注釋匯編語句。當一些模塊從內存卸載後,OllyDbg保存這些信息到擴展名為.UDD名字同被調試模塊的文件中。下次當裝載這些模塊時,OllyDbg自動復原所有調試信息,不論程序是否使用這些模塊。比如:你調試使用Mydll的程序Myprog1,並且在Mydll中設置一些斷點。那麼當你調試Myprog2時,也使用Mydll,你會發現所有在Mydll中的斷點還在那裡,不管Mydll是否裝載在不同的位置。
一些調試器把被調試進程的內存視為單個2**32位元組區域。OllyDbg做了別的處理方法。內存由幾個獨立的塊組成。任何內存操作都限制於塊內。在大多數案例中,這工作優良並且容易調試。但是模塊包含幾個執行部分等等,你將不能立刻看到整個代碼。然而這些例外不常見。
OllyDbg是內存消耗大戶。啟動時就要分配3MB內存,甚至更多。每次分析,備份,跟蹤或文件轉儲另外再分配。所以當你調試大工程時消耗40或60M內存很正常。
要有效的調試一些無源代碼的程序,你首先必須理解它是如何工作的。OllyDbg提供了大量的手段使理解更容易

Ⅷ 求asp網頁設計中給從資料庫中讀取的記錄添加超鏈接的代碼

這是ASP無法避免的,在PHP裡面就簡單了。其實,只要注意引號的使用就好辦,只是寫出來的東西看清咐起來非常復雜,下面這樣寫就可以:

Response.Write "<td><a href='views_show.asp?page="&rs("id")&"'>"&rs("name") & "</a></td>"

發現了沒有,我的程序兩個特色,答尺純一是一個程序只要一個<% %>,不要反復嵌套,否則會自己都不知道錯在哪裡;二是盡量避免在HTML語法裡面使用雙引號,我上面的代碼輸出的HTML就是這樣的單引號<a href='...'>。而你下面的三種都錯了:

(1)Response.Write <a href="views_show.asp?page=<% rs("id") %>">"<td>" & rs("name") & "</td>" </a>

(2)Response.Write "<a href="views_show.asp?page=<% rs("id") %>"><td>" & rs("name") & "</a></td>"

(3) Response.Write "<td>" & <a href="views_show.asp?page=<% rs("id") %>"困悔> rs("name") & </a> "</td>"

Ⅸ C語言編譯器會編譯改變過的代碼,而不會編譯沒有改動的代碼。 我想知道它是怎麼判斷程序是否有唄修改過的

編譯器要記錄你的編譯生成文件,比如obj、exe等的生成日期,發現與相關的文件如.c源文件、obj等日期舊時則選擇對此部分重新編譯。
特別地,它記錄所有相關文件,比如你新修改了某頭文件.h,編譯系統會逐一比較所有使用這個.h文件的編譯結果,如果發現時間舊了就重新編譯它們。

Ⅹ 新版編譯器OnCalculate我這樣編寫,理解,對嗎

OnCalculate

OnCalculate()函數只在自定義指標中調用,通過Calculate計算指標值是必須的。通常在接到指標計算的交易品種新訂單號時發生。這個指標不需要附在交易品種的價格圖表上。

OnCalculate() 函數有個返回值int。有兩個可能定義。一個指標中不可以有兩個函數版本。

一種是用於單數據緩沖中計算的指標。例如,自定義移動平均數指標。

int OnCalculate (const int rates_total, // 價格[] 數組的大小
const int prev_calculated, // 前一次調用處理的柱
const int begin, // 有效數據起始位置
const double& price[] // 計算的數組
);
價格[]數組中,可以傳送時間序列和計算的一些指標緩沖。ArrayGetAsSeries()函數確定價格[] 數組索引方向。為了不依賴默認值,需要無條件的調用ArraySetAsSeries()函數用於工作的數組。

價格[]數組中,在「參數」標簽啟動指標時,選擇適當的時間序列或者指標。所以,需要在「應用於」欄位的下拉列表中指定必要的項目。

Selecting timeseries to calculate an indicator

從其他mql5程序中接收自定義指標值,要使用iCustom()函數,返回嵌入指標處理程序。可以指定適當的價格[]數組或者另一個指標處理程序。這個參數在自定義指標輸入變數列表中最後傳送。
示例:

void OnStart()
{
//---
string terminal_path=TerminalInfoString(STATUS_TERMINAL_PATH);
int handle_customMA=iCustom(Symbol(),PERIOD_CURRENT, "Custom Moving Average",13,0, MODE_EMA,PRICE_TYPICAL);
if(handle_customMA>0)
Print("handle_customMA = ",handle_customMA);
else
Print("Cannot open or not EX5 file '"+terminal_path+"\\MQL5\\Indicators\\"+"Custom Moving Average.ex5'");
}
這個示例中,通過的最後參數是PRICE_TYPICAL值(從ENUM_APPLIED_PRICE計數開始),指出自定義指標可以用獲得的典型價格建立(高價+低價+平倉)/3。如果沒有確定這個參數,指標基於PRICE_CLOSE 值建立,例如每欄平倉價。

另一個示例顯示依照指定價格[]數組的最後一個參數傳送指標處理程序,由函數iCustom()所描述。

另一種形式意在所有其他指標,計算更多的時間序列。

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[] // 點差
);
開盤價[],最高價[],最低價[]和收盤價[]參數由當前時間表的開盤價,最高和最低價和收盤價數組組成。時間參數[]包括開盤時間值數組,擴展參數[]有一個數組包括擴展歷史記錄(如果為交易安全提供擴展)。volume[] 和tick_volume[] 參數分別包括交易和交易量歷史記錄。

確定時間[]索引方向, 開盤價[], 最高價[], 最低價[], 收盤價[], 交易量[], 交易量[] 和 擴展[],需要調用ArrayGetAsSeries()函數。若不想依賴默認值,需要無條件的調用函數ArraySetAsSeries()用於工作的數組。

首先rates_total 參數包括欄的數量,可用來計算指標,與圖表中現存的欄數一致。

需要注意OnCalculate() 返回值和第二輸入參數prev_calculated的連接。調用函數時,prev_calculated 參數包括上次調用時OnCalculate() 返回值。這就允許用經濟演算法計算自定義指標,避免重復計算。

返回rates_total參數值足夠了,包括當前調用函數的欄數。如果自從上次調用函數OnCalculate(),價格數據更改了(下載深度歷史記錄或者填滿歷史空白期),輸入參數prev_calculated 值由終端機設置為零。

註:如果OnCalculate返回零,那麼指標值不能顯示在客戶端的數據窗口。

為更好的理解,啟動附加以下代碼的指標很有用。

指標示例:
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//---- 圖的線
#property indicator_label1 "Line"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDarkBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- 指標緩沖區
double LineBuffer[];
//+------------------------------------------------------------------+
//| 自定義指標初始化函數 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 指標緩沖區繪圖
SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 自定義指標重復函數 |
//+------------------------------------------------------------------+
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[])
{
//--- 獲得當前交易品種和圖表周期的有效柱數
int bars=Bars(Symbol(),0);
Print("Bars = ",bars,", rates_total = ",rates_total,", prev_calculated = ",prev_calculated);
Print("time[0] = ",time[0]," time[rates_total-1] = ",time[rates_total-1]);
//--- 為下次調用返回prev_calculated值
return(rates_total);
}
//+------------------------------------------------------------------+

閱讀全文

與編譯器讀取歷史記錄相關的資料

熱點內容
非科班程序員自學 瀏覽:799
壓縮泡沫鞋底底材 瀏覽:217
程序員職場第一課2正確的溝通 瀏覽:677
遇到不合法app應該怎麼辦 瀏覽:90
匯編程序編譯後的文件 瀏覽:77
大智慧均線源碼 瀏覽:371
單片機排阻的作用 瀏覽:213
滴滴金融app被下架如何還款 瀏覽:210
jpg轉換成pdf免費軟體 瀏覽:741
范里安pdf 瀏覽:443
偽造pdf 瀏覽:75
能刪除android文件夾嗎 瀏覽:446
LINUX使用V2ray 瀏覽:797
找人幫忙注冊app推廣是什麼 瀏覽:820
獨立伺服器如何恢復初始化 瀏覽:11
優秀到不能被忽視pdf 瀏覽:316
導遊程序員家政 瀏覽:586
22乘28的快速演算法 瀏覽:338
軟通動力程序員節2021 瀏覽:847
安卓系統如何卸載安裝包 瀏覽:870