MQL4程序的常見(jiàn)錯(cuò)誤以及如何避免它們_第1頁(yè)
MQL4程序的常見(jiàn)錯(cuò)誤以及如何避免它們_第2頁(yè)
MQL4程序的常見(jiàn)錯(cuò)誤以及如何避免它們_第3頁(yè)
MQL4程序的常見(jiàn)錯(cuò)誤以及如何避免它們_第4頁(yè)
MQL4程序的常見(jiàn)錯(cuò)誤以及如何避免它們_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)用文檔MQL4程序的常見(jiàn)錯(cuò)誤以及如何避免它們介紹一些較舊的程序可能在HYPERLINK新版本的MQL4編譯器中返回錯(cuò)誤。為了避免關(guān)鍵的程序完成,以前版本的編譯器在運(yùn)行環(huán)境中處理了許多錯(cuò)誤。例如,除數(shù)為零或數(shù)組越界都是嚴(yán)重錯(cuò)誤,并通常會(huì)導(dǎo)致應(yīng)用程序崩潰。這些錯(cuò)誤只在一些狀態(tài)下針對(duì)某些變量值而發(fā)生。閱讀這篇文章了解如何處理這樣的情況。

新的編譯器可以檢測(cè)實(shí)際或潛在的錯(cuò)誤源并提高代碼質(zhì)量。在這篇文章中,我們討論了舊程序編譯過(guò)程中檢測(cè)到的可能出現(xiàn)的錯(cuò)誤,以及解決這些問(wèn)題的方法。編譯錯(cuò)誤HYPERLINK1.1.與關(guān)鍵字一致的標(biāo)識(shí)HYPERLINK1.2.變量和函數(shù)名的特殊字符HYPERLINK1.3.使用switch操作符的錯(cuò)誤HYPERLINK1.4.函數(shù)返回值

HYPERLINK1.5.函數(shù)參數(shù)數(shù)組

運(yùn)行時(shí)間錯(cuò)誤HYPERLINK2.1.數(shù)組越界HYPERLINK2.2.除數(shù)為零HYPERLINK2.3.當(dāng)前字符用0替代NULLHYPERLINK2.4.Unicode格式字符串和它們?cè)贒LL中的使用HYPERLINK2.5.文件共享HYPERLINK2.6.日期時(shí)間轉(zhuǎn)換HYPERLINK編譯器警告HYPERLINK3.1.全局和局部變量名稱一致HYPERLINK3.2.類型不匹配HYPERLINK3.3.未使用的變量1編譯錯(cuò)誤如果程序代碼中包含HYPERLINK錯(cuò)誤,則它不能被編譯。要完全控制所有的錯(cuò)誤,建議使用HYPERLINK嚴(yán)謹(jǐn)?shù)木幾g模式,它通過(guò)以下指令來(lái)設(shè)置:#propertystrict這種模式大大簡(jiǎn)化了故障排除。

1.1.與關(guān)鍵字一致的標(biāo)識(shí)如果變量或函數(shù)的名稱與其中一個(gè)HYPERLINK關(guān)鍵字一致intchar[];

//incorrectintchar1[];//correctintchar()

//incorrect{return(0);}編譯器會(huì)返回一個(gè)錯(cuò)誤信息:圖1.錯(cuò)誤“unexpectedtoken(非預(yù)期標(biāo)記)”和“nameexpected(預(yù)期名稱)”要解決這個(gè)錯(cuò)誤,您需要使用變量或函數(shù)的正確名稱。1.2.變量和函數(shù)名的特殊字符如果變量或函數(shù)名稱中包含特殊字符($,@,點(diǎn)):

int$var1;//incorrectint@var2;//incorrectintvar.3;//incorrectvoidf@()

//incorrect{return;}編譯器會(huì)返回一個(gè)錯(cuò)誤信息:圖2.錯(cuò)誤“unknownsymbol(未知交易品種)”與“semicolonexpected(預(yù)期分號(hào))”要解決這個(gè)錯(cuò)誤,您需要使用正確的函數(shù)或變量名。1.3.使用switch操作符的錯(cuò)誤在舊版本的編譯器中,您可以在HYPERLINKswitch操作符的表達(dá)式和常量中使用任何值:voidstart(){doublen=3.14;switch(n){case3.14:Print("Pi");break;case2.7:Print("E");break;}}在新的編譯器中,switch操作符的常量和表達(dá)式必須是整數(shù),所以當(dāng)您嘗試使用這樣的結(jié)構(gòu)時(shí)會(huì)發(fā)生錯(cuò)誤:圖3.錯(cuò)誤“illegalswitchexpressiontype(非法switch表達(dá)式類型)”和“constantexpressionisnotintegral(常量表??達(dá)式不是整數(shù))”在這種情況下,您可以使用明確的數(shù)值比較,例如:voidstart(){doublen=3.14;if(n==3.14)Print("Pi");elseif(n==2.7)Print("E");}1.4.函數(shù)返回值除了空值外的所有函數(shù)都應(yīng)該返回聲明的類型值。例如:intfunction(){}在嚴(yán)謹(jǐn)?shù)木幾g模式下發(fā)生錯(cuò)誤:圖4.錯(cuò)誤“notallcontrolpathsreturnavalue(并非所有的控制路徑返回一個(gè)值)”在默認(rèn)的編譯模式下,編譯器會(huì)返回一個(gè)警告:圖5.警告:“notallcontrolpathsreturnavalue(并非所有的控制路徑返回一個(gè)值)”如果函數(shù)的返回值與聲明的不匹配:intinit()

{return;

}在嚴(yán)格的編譯中會(huì)檢測(cè)錯(cuò)誤:圖6.錯(cuò)誤“functionmustreturnavalue(函數(shù)必須返回一個(gè)值)”在默認(rèn)的編譯模式下,編譯器會(huì)返回一個(gè)警告:圖7.警告'return-functionmustreturnavalue(回報(bào)-函數(shù)必須返回一個(gè)值)”要解決這樣的錯(cuò)誤,添加帶有相應(yīng)類型返回值的HYPERLINKreturn操作符到函數(shù)代碼。1.5.函數(shù)參數(shù)數(shù)組在函數(shù)參數(shù),數(shù)組現(xiàn)在只引用傳遞。

doubleArrayAverage(doublea[]){return(0);}在嚴(yán)謹(jǐn)?shù)木幾g模式下,該代碼將導(dǎo)致錯(cuò)誤:圖8.編譯器錯(cuò)誤“arrayspassedbyreferenceonly(數(shù)組只引用傳遞)”在默認(rèn)的編譯模式下,編譯器會(huì)返回一個(gè)警告:圖9.編譯器警告“arrayspassedbyreferenceonly(數(shù)組只引用傳遞)”要修復(fù)此錯(cuò)誤,您必須通過(guò)在數(shù)組名稱之前添加前綴來(lái)指定數(shù)組是通過(guò)引用傳遞的:doubleArrayAverage(double&a[]){return(0);}但應(yīng)注意的是,現(xiàn)在常量數(shù)組(HYPERLINKTime[],

HYPERLINKOpen[],

HYPERLINKHigh[],

HYPERLINKLow[],

HYPERLINKClose[],

HYPERLINKVolume[])不能引用傳遞。例如,下面的調(diào)用:ArrayAverage(Open);無(wú)論何種編譯模式都會(huì)導(dǎo)致錯(cuò)誤:圖10.錯(cuò)誤'Open'-constantvariablecannotbepassedasreference(‘打開(kāi)’-常量變量不能引用傳遞)為了避免這些錯(cuò)誤,從常量數(shù)組??復(fù)制所需的數(shù)據(jù)://---anarraythatstoresopenpricevaluesdoubleOpenPrices[];//---copythevaluesofopenpricestotheOpenPrices[]arrayArrayCopy(OpenPrices,Open,0,0,WHOLE_ARRAY);//---functioncallArrayAverage(OpenPrices);2.運(yùn)行時(shí)間錯(cuò)誤程序代碼執(zhí)行過(guò)程中出現(xiàn)的錯(cuò)誤稱為運(yùn)行時(shí)間錯(cuò)誤。這種錯(cuò)誤通常是依賴于程序的狀態(tài),并與變量的不正確的值相關(guān)聯(lián)。

例如,如果變量用作數(shù)組元素的索引,其負(fù)值將不可避免地導(dǎo)致數(shù)組超出范圍的錯(cuò)誤。2.1.數(shù)組超出范圍訪問(wèn)指標(biāo)緩沖區(qū)時(shí)常常在指標(biāo)中發(fā)生這個(gè)錯(cuò)誤。該HYPERLINKIndicatorCounted()函數(shù)返回自上次指標(biāo)調(diào)用的不變的柱數(shù)。先前計(jì)算的柱的指標(biāo)值不需要重新計(jì)算,所以為了更快的計(jì)算,您只需要處理最后的幾個(gè)柱。

大部分使用這種計(jì)算優(yōu)化的方法的指標(biāo)看起來(lái)如下://+------------------------------------------------------------------+//|Customindicatoriterationfunction

|//+------------------------------------------------------------------+intstart(){//---somecalculationsrequirenolessthanNbars(e.g.100)

if(Bars<100)//iflessbarsareavailableonachart(forexampleonMNtimeframe)

return(-1);//stopcalculationandexit//---thenumberofbarsthathavenotchangedsincethelastindicatorcallintcounted_bars=IndicatorCounted();//---exitifanerrorhasoccurredif(counted_bars<0)return(-1);//---positionofthebarfromwhichcalculationintheloopstartsintlimit=Bars-counted_bars;//---ifcounted_bars=0,reducethestartingpositionintheloopby1,

if(counted_bars==0){limit--;

//toavoidthearrayoutofrangeproblemwhencounted_bars==0//---weuseashiftof10barsbackinhistory,soaddthisshiftduringthefirstcalculationlimit-=10;}else//---theindicatorhasbeenalreadycalculated,counted_bars>0{

//---forrepeatedcallsincreaselimitby1toupdatetheindicatorvaluesforthelastbarlimit++;}//---themaincalculationloopfor(inti=limit;i>0;i--){Buff1[i]=0.5*(Open[i+5]+Close[i+10])//valuesofbars5and10barsdeepertohistoryareused}}通常counted_bars==0的情況處理不當(dāng)(初始限制持倉(cāng)應(yīng)該通過(guò)等于相對(duì)循環(huán)變量的1+最大指數(shù)的值來(lái)降低)。另外,請(qǐng)記住,在執(zhí)行start()函數(shù)的時(shí)候,我們可以從0到HYPERLINKBars()-1的訪問(wèn)指標(biāo)緩沖區(qū)的數(shù)組元素。如果您需要使用無(wú)指標(biāo)緩沖區(qū)的數(shù)組,那么按照指標(biāo)緩沖區(qū)的當(dāng)前大小使用HYPERLINKArrayResize()函數(shù)來(lái)增加其大小。也可以通過(guò)調(diào)用用作參數(shù)的指標(biāo)緩沖區(qū)的

HYPERLINKArraySize()來(lái)獲得元素地址的最大指數(shù)。2.2.除數(shù)為零當(dāng)除法運(yùn)算中除數(shù)為零時(shí)則會(huì)發(fā)生零除的錯(cuò)誤:voidOnStart(){//---inta=0,b=0,c;c=a/b;Print("c=",c);}當(dāng)您運(yùn)行這個(gè)腳本時(shí),專家選項(xiàng)卡會(huì)出現(xiàn)一條錯(cuò)誤的消息,并且程序關(guān)閉:圖11.錯(cuò)誤消息“zerodivide(除數(shù)為零)”當(dāng)除數(shù)的值由任何外部數(shù)據(jù)值來(lái)決定時(shí),通常會(huì)出現(xiàn)此錯(cuò)誤。例如,如果交易參數(shù)進(jìn)行分析,如果沒(méi)有新建訂單,那么已用預(yù)付款的值等于0。另一個(gè)例子:如果要從一個(gè)文件讀取分析數(shù)據(jù),如果該文件不可用,那么我們也不能保證正確的操作。所以您應(yīng)該考慮到這樣的情況并正確地處理它們。最簡(jiǎn)單的方法是除法運(yùn)算前檢查除數(shù)并報(bào)告不正確的參數(shù)值:voidOnStart(){//---inta=0,b=0,c;if(b!=0){c=a/b;Print(c);}else{Print("Error:b=0");return;};}這不會(huì)導(dǎo)致嚴(yán)重的錯(cuò)誤,但是不正確參數(shù)值的消息一出現(xiàn)則程序即關(guān)閉:圖12.不正確的除數(shù)消息2.3.當(dāng)前字符用0替代NULL

在舊版本的編譯器中0(零)可用作滿足金融工具規(guī)范的函數(shù)參數(shù)。例如,當(dāng)前交易品種的移動(dòng)平均線技術(shù)指標(biāo)的值可能被要求如下:AlligatorJawsBuffer[i]=iMA(0,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);//incorrect在新的編譯器中您應(yīng)該明確地指定NULL來(lái)規(guī)定當(dāng)前的交易品種:AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);//correct此外,當(dāng)前交易品種和圖表周期可使用HYPERLINKSymbol()和HYPERLINKPeriod()函數(shù)來(lái)指定。AlligatorJawsBuffer[i]=iMA(Symbol(),Period(),13,8,MODE_SMMA,PRICE_MEDIAN,i);//correct2.4.Unicode字符串和它們?cè)贒LL中的使用字符串現(xiàn)在表示為Unicode字符序列。記住這一點(diǎn),并使用適當(dāng)?shù)腤indows函數(shù)。例如,使用wininet.dll庫(kù)來(lái)替代InternetOpenA()和InternetOpenUrlA(),您應(yīng)該調(diào)用InternetOpenW()和InternetOpenUrlW()。該HYPERLINK字符串的內(nèi)部結(jié)構(gòu)在MQL4中(現(xiàn)在只需要12個(gè)字節(jié))發(fā)生了變化,當(dāng)傳遞字符串到DLL時(shí)應(yīng)使用MqlString結(jié)構(gòu):#pragmapack(push,1)structMqlString{int

size;

//32bitinteger,containsthesizeofthebufferallocatedforthestringLPWSTR

buffer;

//32bitaddressofthebufferthatcontainsthestringint

reserved;

//32bitinteger,reserved,donotuse};#pragmapack(pop,1)2.5.文件共享在新MQL4中,F(xiàn)ILE_SHARE_WRITE和FILE_SHARE_READ標(biāo)志應(yīng)明確地指定以便打開(kāi)文件時(shí)共享使用。

如果標(biāo)志不存在,那么該文件以單獨(dú)模式打開(kāi),直到文件由打開(kāi)它的用戶關(guān)閉才可以被其他人打開(kāi)。例如,使用離線圖表時(shí)共享標(biāo)志應(yīng)明確指定://1-stchange-addshareflagsExtHandle=FileOpenHistory(c_symbol+i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);欲了解更多詳情,請(qǐng)閱讀HYPERLINK新MQL4的離線圖表。2.6.日期時(shí)間轉(zhuǎn)換轉(zhuǎn)換HYPERLINK日期時(shí)間為一個(gè)字符串現(xiàn)在取決于編譯模式:datetimedate=D'2014.03.0515:46:58';stringstr="mydate="+date;//---str="mydate=1394034418"-oldcompiler,nodirective#propertystrictinthenewcompiler//---str="mydate=2014.03.0515:46:58"-newcompilerwiththedirective#propertystrict例如,嘗試使用文件名中包含冒號(hào)的文件會(huì)導(dǎo)致錯(cuò)誤。3.編譯器警告HYPERLINK編譯器警告是信息性而非錯(cuò)誤的訊息,但它們指出了可能的錯(cuò)誤來(lái)源。一個(gè)清晰的代碼不應(yīng)該包含警告。3.1.全局和局部變量名稱一致如果全局和局部各級(jí)變量具有相似的名稱:inti;//aglobalvariablevoidOnStart(){//---inti=0,j=0;//localvariablesfor(i=0;i<5;i++){j+=i;}PrintFormat("i=%d,j=%d",i,j);}編譯器會(huì)顯示指出全局變量的聲明行號(hào)的警告:圖13.警告“decl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論