麦语言和python区别_麦语言编程教程之二:解决两大类问题
所有的編程都可以歸結為以下三類:
第一,表達式問題。以當前視角,給出變量的計算公式。所謂的當前視角,就是不考慮位置關系,把那個位置當作是當前位置。事實上,前面那張表中任何一個方格的數據,都是把這個方格所在列當成當前K線來解讀的。
第二,邏輯判斷問題。其實可以歸結成表達式問題,但是考慮到邏輯判斷比較重要,而且和純計算數值的表達式略有些不同的,所以獨立出來。
第三,定位問題。只有一個位置不需要確定,那就是當前,這里說的當前,是K線圖上最后一根K線,不是前面說的當前視角。定位的結果是得到歷史某個位置到當前的距離。定位的目的是到那個歷史位置去取值,可以是邏輯值,也可以是數據值。當然定位還有另外一個作用,就是畫線,這種情況我們之后再討論。
表達式問題和邏輯判斷問題
這兩個問題都是比較簡單的。關鍵點是以當前視角給出計算公式,不需要考慮計算公式之外的位置問題。
****************************************************************************
先來一個簡單的例子:求當前K線最高價和最低價一半的價格。
這是一個和位置完全沒有關系的問題,因為當前K線是不需要定位。所以我們可以直接定義變量名稱并給出計算公式。
HL:(H+L)/2;
****************************************************************************
如果在表達式中,某個數據需要通過定位從歷史中取,那么可以用定位問題的解決方法取到這個數值,然后再與其他與位置無關的變量組成表達式。
例如,計算最高、最低價,以及前一根K線收盤價的平均。
前一根K線收盤價定義為:
ZC:=REF(C,1);//定位問題后面會有詳細說明
HLC:(H+L+ZC)/3;
****************************************************************************
在一個區間內計算數值,如果有系統函數,則與定位無關。因為這個定位過程是有系統函數后臺完成的。
例如:最近5根K線收盤價的平均值。雖然理論上需要分別定位到前面4根歷史K線,然后取到收盤價,再計算平均。但是由于有系統函數MA(),所以仍是在當前K線上解決的,和定位沒有關系。
在當前位置上解決區間問題的系統函數我們總結如下:
所有的平均值的函數
所有的數理統計函數
HHV()、HV()、LLV()、LV()函數
COUNT()、SUM()函數
EVERY()、EXIT()函數
LOOP1()函數
定位問題
所謂的定位問題,就是在上面那張表里,確定數據存儲在哪個方格中。
取值的過程是使用REF函數實現的,前提是需要知道歷史方格與當前位置的距離。
如果距離是動態變化的,那么就需要根據方格滿足的條件,然后使用BARSLAST()函數動態計算距離。
****************************************************************************
先看一個簡單的例子:前面第3根K線的收盤價。與當前位置的距離已經確定了是3,所接定位取值的過程比較簡單
CC:REF(C,3);//從C那一行與當前距離為3的方格里把數據拿過來,存貯到CC這個變量當前方格中。
****************************************************************************
稍復雜的例子:分鐘周期上,在盤中取前一天的收盤價。
與前面一個例子不同,距離參數是動態變化的,不是一個常量。
這種情況,我們需要用BARSLAST()根據方格滿足的條件計算動態數值。
那用什么條件在分鐘周期上定位前一天最后一根K線呢?
因為是最后一根K線,那么下一根K線就屬于第二天,所以日期在這兩根K線之間發生了切換。而且,只有最后一根和第一根K線才會滿足這個條件。
所以我們用條件COND:=DATE<>REF(DATE,1)可以定位到當天第一根K線,那么前面一根就是前一天最后一根K線。
N:=BARSLAST(COND)+1;//前一天最后一根K線與當前的距離。之所以加1,是因為BARSLAST(COND)定位到的是當天第一根K線到當前的距離。
有了這個動態距離之后,就可以通過REF來取值了。
YC:REF(C,N);//從C那一行與當前距離為N的方格里把數據拿過來,存貯到YC這個變量當前方格中。隨著時間向右擴展,N也隨之增加,但是定位到的昨天最后一根K線的絕對位置是不變的。
****************************************************************************
再深入思考,如果取前天最后一根K線收盤價怎么處理?其實過程是一樣的。
COND:=DATE<>REF(DATE,1);
N1:=BARSLAST(COND)+1;
N2:=REF(N1,N1);
兩個N1一樣嗎?先看第二個N1,它是距離參數。而第一個N1是存儲數值的變量。所以這兩個N1含義是不同的。如何理解?從N1那一行與當前位置距離為N1(當前位置方格中的數值)的方格里把數據拿過來,放到N2當前的方格里。
放到N2當前方格中的數據代表什么意思呢?以當前視角理解,也就是說把存數據的方格看作是當前位置,然后理解N1的含義:當前位置左邊滿足第一個滿足條件COND的K線與當前位置的距離加1。
換句話說,我們先用REF( ,N1)定位到昨天最后一根K線上,然后在這根K線上以當前視角,再得到前一天與當前視角這跟K線的距離。
再簡單一點說,N1是昨天最后一根K線到當前位置的距離,N2是前天最后一根K線到昨天最后一根K線的距離。
(這里說的當前位置,就是K線圖上最后一根K線。而當前視角,是把歷史某根K線當作最后一根K線看待的意思。)
N3:=N2+N1;//前天最后一根K線到當前位置的距離。
YYC:REF(C,N3);//從C那一行與當前距離為N3的方格里把數據拿過來,存貯到YYC這個變量當前位置方格中。
其實這個問題還有另外一種解決辦法:
COND:=DATE<>REF(DATE,1);
N1:=BARSLAST(COND)+1;//以當前視角,當前位置左邊滿足第一個滿足條件COND的K線與當前位置的距離加1
YC:=REF(C,N1);
YYC:REF(YC,N1);//從YC行與當前距離為N1的方格里把數據拿來,存儲到YYC這個變量當前位置方格中。
兩種方法得到的結果是相同的,區別在于,一個是從C行取值,一個是從YC行取值,由于這兩行本身的含義不同,所以定位用的距離參數也有所差異。但是本質都是一樣的。
****************************************************************************
既然討論定位的問題,那么我們就要把問題討論透徹,來解決一個終極問題:求前面第10天的收盤價格。
解決方案如下:
COND:=DATE<>REF(DATE,1);
N1:=BARSLAST(COND)+1;
NN1:=REF(N1,N1);
N2:=N1+NN1;
NN2:=REF(N1,N2);
N3:=N2+NN2;
NN3:=REF(N1,N3);
N4:=N3+NN3;
NN4:=REF(N1,N4);
N5:=N4+NN4;
NN5:=REF(N1,N5);
N6:=N5+NN5;
NN6:=REF(N1,N6);
N7:=N6+NN6;
NN7:=REF(N1,N7);
N8:=N7+NN7;
NN8:=REF(N1,N8);
N9:=N8+NN8;
NN9:=REF(N1,N9);
N10:N9+NN9,NODRAW;
YC10:REF(C,N10);
我放棄用文字解釋的想法了,大家看圖吧。
你一定會問,100天也要這么求嗎?當然不必要,之所以講前面的內容,是為了讓大家理解最本質的東西。
BARSLAST函數可以完全被SUMBARS函數代替。
BARSLAST表示最近一次滿足條件到當前位置的距離。
SUMBARS表示左邊第N次滿足條件到當前位置的距離,如果N=1,等效于BARSLAST。
還有一點差異,BARSLAST計算距離時不包含當前這根K線,而SUMBARS則包含。
求10天前收盤價的問題,還可以通過以下方式解決:
COND:=DATE<>REF(DATE,1);
N10:SUMBARS(COND,10),NODRAW;//與前面得到的數值是相同的。
YC10:REF(C,N10);
****************************************************************************
終極問題解決了,接下來我們看一下另一個稍微簡單一點的問題:定位歷史區間。
涉及到從歷史區間內取值的問題,我們只需要定位到區間結束的位置,然后在這個問題上,以當前視角,把問題轉換為表達式問題就可以了。
看個例子:取昨天最高最低價。
COND:=DATE<>REF(DATE,1);//確定區間起點K線位置的條件,紅色外套
NN:=BARSLAST(COND)+1;//以當前視角,計算區間起點到當前位置的距離
HH:=HHV(H,NN);//以當前視角,計算一天內的最高價
HZ:REF(HH,NN);//從HH那一行與當前距離為NN的方格里把數據拿過來,存貯到HZ這個變量當前方格中。
我們也可以完全從定位的角度解決這個問題。也就是找到昨天最高價那個K線到當前位置的距離。這里需要使用HHVBARS定位區間高點到區間結束位置的距離。
COND:=DATE<>REF(DATE,1);
NN:=BARSLAST(COND)+1;
NN2:=HHVBARS(H,NN);//左邊包含當前K線在內的NN根K線里,最高價那根K線到當前的距離(不包含當前K線)。
NN3:=REF(NN2,NN);//從NN2那一行距離當前位置NN的方格中把數據拿過來,存到NN3行當前方格中。
NHZ:=NN3+NN;//昨天最高價到當前的總距離
HZ:REF(H,NHZ);//從NH2那一行距離當前位置NN的方格中把數據拿過來,存到NH3行當前方格中。
昨天最低價的道理是一樣的。
總結
以上是生活随笔為你收集整理的麦语言和python区别_麦语言编程教程之二:解决两大类问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        