最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

在赫茲量化中處理雙精度浮點(diǎn)數(shù)

2023-08-14 11:23 作者:bili_45793681098  | 我要投稿

簡介

赫茲量化編程為自動化交易提供了新的機(jī)遇,世界各地的眾多人士已對其表示贊賞。

當(dāng)我們編寫用于交易的 Expert Advisor 時(shí),必須確保其運(yùn)行無誤。

很多新手經(jīng)常在一些數(shù)學(xué)計(jì)算的結(jié)果跟預(yù)期結(jié)果不一致時(shí)產(chǎn)生困惑。 程序可以編譯和工作,但跟預(yù)期并不一致。 他們反復(fù)檢查代碼,試圖在語言、實(shí)現(xiàn)和函數(shù)等方面找出新的“錯(cuò)誤”。

多數(shù)情況下,經(jīng)過仔細(xì)分析后會發(fā)現(xiàn)語言和編譯工作良好,但代碼有小錯(cuò)誤,找出并改正需要花費(fèi)大量的時(shí)間。

在本文中我們將研究典型的編程錯(cuò)誤,這種錯(cuò)誤在處理 赫茲量化程序中的雙精度數(shù)值時(shí)會出現(xiàn)。



1. 驗(yàn)證數(shù)值

為了驗(yàn)證計(jì)算結(jié)果和調(diào)試,你可以使用標(biāo)準(zhǔn)庫 stdlib.mq4 的 DoubleToStrMorePrecision(double number, int precision) 函數(shù),從而將雙精度浮點(diǎn)數(shù)控制在指定的精確度。

這在搜索可能的錯(cuò)誤時(shí)可以節(jié)省時(shí)間。

示例:

#include <stdlib.mqh> int start() ?{ ? double a=2.0/3; ? Alert("Standard output:",a,", 8 digits precision:",DoubleToStr(a,8),", 15 digits precision:", DoubleToStrMorePrecision(a,15)); ? return(0); ?} ?

結(jié)果:

標(biāo)準(zhǔn)輸出:0.6667,8 位精確度:0.66666667,15 位精確度:0.666666666666667

在某些情況下,為了顯示雙精度浮點(diǎn)數(shù)的數(shù)值(例如,在 Print, Alert, Comment中),最好使用 DoubleToStr 和 DoubleToStrMorePrecision 函數(shù)(stdlib.mq4)來顯示更加精確的值代替標(biāo)準(zhǔn)的 4 位輸出精確度。

例如:

#include <stdlib.mqh> int start() ?{ ? double a=2.0/100000; ? Alert("Standard output=",a,", More precise output=",DoubleToStrMorePrecision(a,15)); ? return(0); ?}


返回: "Standard output=0, More precise output=0.000020000000000".

編輯切換為居中

2. 小數(shù)位精確度的準(zhǔn)確度

由于是雙精度浮點(diǎn)格式,其儲存的準(zhǔn)確度受到限制。

例如,如果我們假設(shè)精確度不受限制,從理論上講,對于任何的雙精度浮點(diǎn)數(shù) A 和 B,以下的表達(dá)式始終成立:

(A/B)*(B)=A,

A-(A/B)*B=0,

(A/B)*(B/A)=1 等

小數(shù)位在計(jì)算機(jī)內(nèi)儲存的準(zhǔn)確度取決于小數(shù)部分大小,并限制在 52 位。 為了說明該情況,赫茲量化來看看以下的例子:

在第一個(gè)循環(huán)(i)中,我們計(jì)算 23 的階乘(從 2 到 23 的整數(shù)的乘積),結(jié)果為: 23!=25852016738884976640000. 結(jié)果儲存在雙精度類型的變量 a 中。

在下一個(gè)循環(huán)(j)中,我們將得到的結(jié)果 a 除以從 23 到 2 的所有整數(shù)。 最后我們期待的結(jié)果是 a=1。

#include <stdlib.mqh> int start() ?{ ? int maxfact=23; ? double a=1; ? for (int i=2; i<=maxfact; i++) { a=a*i; } ? for (int j=maxfact; j>=2; j--) { a=a/j; } ? Alert(" a=",DoubleToStrMorePrecision(a,16)); ? return(0); ?}


實(shí)際上我們得到:

a=1.0000000000000002

可見,我們得到了 16 位的不準(zhǔn)確度。

如果我們計(jì)算 35 的階乘,則會得到 a=0.9999999999999998。

赫茲量化語言有一個(gè) NormalizeDouble 函數(shù),可以將雙精度浮點(diǎn)數(shù)圓整為指定的精確度。

雙精度類型的常量在內(nèi)存中儲存的方式跟雙精度變量類似,因此有必要在定義它們時(shí)考慮限制在 15 位有效數(shù)字。

但不要將小數(shù)位精確度的準(zhǔn)確度和雙精度浮點(diǎn)數(shù)的計(jì)算精確度混淆。

雙精度浮點(diǎn)數(shù)的可能值范圍更寬:從 -1.7*e-308 到 1.7*e308。

赫茲量化來嘗試估算雙精度浮點(diǎn)數(shù)的最小指數(shù)。

int start() ?{ ?double R=1; ?int minpwr=0; ?while (R>0) {R=R/10; minpwr--;} ?Alert(minpwr); ?return(0); ?}


程序會輸出 -324,但我們必須考慮小數(shù)部分的小數(shù)位(+15),將會得到最小雙精度浮點(diǎn)數(shù)的指數(shù)的近似值。



3. NormalizeDouble 函數(shù)

NormalizeDouble(double value, int digits)函數(shù)將浮點(diǎn)數(shù)值圓整到給定的精確度。 返回標(biāo)準(zhǔn)化雙精度型數(shù)值。

例如:

int start() ?{ ? double a=3.141592653589; ? Alert("a=",DoubleToStr(NormalizeDouble(a,5),8)); ? return(0); ?}


結(jié)果為:

a=3.14159000

注意:在交易操作中,是 不可能使用非標(biāo)準(zhǔn)價(jià)格的,因?yàn)槠錅?zhǔn)確度至少超過了交易服務(wù)器所要求的一位。 掛單的止損、獲利和價(jià)格值應(yīng)以某精確度標(biāo)準(zhǔn)化,它的值儲存在預(yù)定義的變量 Digits 中。



4. 檢查兩個(gè)雙精度浮點(diǎn)數(shù)是否相等

建議使用 stdlib.mq4 庫的 CompareDoubles(double number1,double number2) 函數(shù) 比較兩個(gè) 雙精度 浮點(diǎn)數(shù), 如下所示:

//+------------------------------------------------------------------+ //| correct comparison of 2 doubles ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ bool CompareDoubles(double number1,double number2) ?{ ? if(NormalizeDouble(number1-number2,8)==0) return(true); ? else return(false); ?}

該函數(shù)比較雙精度浮點(diǎn)數(shù) 1 和 2,精確度達(dá)到 8 位小數(shù)。

示例:

#include <stdlib.mqh> int start() ?{double a=0.123456781; ? double b=0.123456782; ? if (CompareDoubles(a,b)) {Alert("They are equal");} ? else {Alert("They are different");} ?}


輸出為:

它們相等

因?yàn)樗鼈冎辉诘?9 位才不同。

如果必要,你可以類似的編寫自己的比較函數(shù)(根據(jù)所需的準(zhǔn)確度)。



5. 整數(shù)相除

需要記住,如果我們將兩個(gè)整數(shù)相除,也會得到一個(gè)整數(shù)。

這就是為什么下面的代碼:

int start() ?{ ? Alert(70/100); ? return(0); ?}


會輸出 0,因?yàn)?70 和 100 都是整數(shù)。

跟 C/C++ 語言一樣,在 赫茲量化 中兩個(gè)整數(shù)相除的結(jié)果將是整數(shù),在本例中結(jié)果為 0。

但是,如果分子或分母是雙精度(即具有小數(shù)部分),結(jié)果也將是雙精度。 因此,Alert (70/100.0) 將輸出正確值 0.7。

例如:

int start() ?{ double a=1/3; ? ?double b=1.0/3; ? Alert("a=",a,", b=",b); ? return(0); ?}


將輸出“a=0, b=0.3333”


在赫茲量化中處理雙精度浮點(diǎn)數(shù)的評論 (共 條)

分享到微博請遵守國家法律
安康市| 岳普湖县| 陵水| 板桥市| 滨州市| 德兴市| 宿州市| 墨江| 宜章县| 项城市| 涪陵区| 沅江市| 漳浦县| 错那县| 茂名市| 册亨县| 隆安县| 南宁市| 泾川县| 敖汉旗| 泉州市| 钟祥市| 马关县| 斗六市| 武安市| 新泰市| 陆河县| 仁怀市| 洛南县| 南阳市| 社旗县| 昌邑市| 连城县| 汤阴县| 治县。| 台前县| 淄博市| 桦甸市| 南平市| 青神县| 额济纳旗|