MC模組開發.1

閱讀時間約 15 分鐘
Multicharts 在台灣是很流行的程式交易套裝軟體,強大的回測功能總令人愛不釋手以下是我運用MC開發程式碼與回測的方法

步驟1 : 常見的Donchain Channel策略,搭配一個進場濾網以及一個出場策略

If EntriesToday(Date)=0 then begin
Buy next bar at Highest(High,55) stop;
SellShort next bar at Lowest(Low,55) stop;
End;

If BarsSinceEntry>=8 then begin
Sell next bar at Low stop;
BuyToCover next bar at High stop;
End;

步驟2 : 利用陣列填裝更多類似的通道策略、納入更多的濾網作為備選方案

Inputs:xxL(1),xxS(1);
Inputs:LenExit(8);
Arrays:BreakLong[10](0),BreakShort[10](0);

BreakLong[1]=Highest(High,55);
BreakLong[2]=MaxList(HighD(1),HighD(2),HighD(3));
BreakLong[3]=Average(High,30)+Highest(Range,500);
BreakLong[4]=Average(High,30)+1.85StdDev(High,60); BreakLong[5]=CloseD(1)+1.35(HighD(1)-LowD(1));
BreakLong[6]=OpenD(0)*1.0075;

BreakShort[1]=Lowest(Low,55);
BreakShort[2]=MinList(LowD(1),LowD(2),LowD(3));
BreakShort[3]=Average(Low,30)-Highest(Range,500);
BreakShort[4]=Average(Low,30)-1.85StdDev(Low,60); BreakShort[5]=CloseD(1)-1.35(HighD(1)-LowD(1));
BreakShort[6]=OpenD(0)*0.9925;

If Time>=CalcTime(Sess1StartTime,5BarInterval) then begin
If ADX(21)>ADX(21)[10] then begin
If EntriesToday(Date)=0 then begin
Buy next bar at BreakLong[xxL] stop;
SellShort next bar at BreakShort[xxS] stop;
End;
End;
End;

If BarsSinceEntry>=LenExit then begin
Sell next bar at Low stop;
BuyToCover next bar at High stop;
End;
步驟3 : 運用亂數,決定挑選的配對組合、長度參數、濾網是否啟用
Vars:ii(0),jj(0);
Inputs:Seed(131071);
Arrays:PRNumber[100,250](0);
Vars:MiddleSquare(0),RandomNumber(0);

//Distribution:Entry+Filter
Vars:xxL(1),xxS(1);
Arrays:BreakLong[10](0),BreakShort[10](0);
Arrays:LenLong[100](0),LenShort[100](0),RatioLong[100](0),RatioShort[100](0);
Arrays:LogisticOnOff[100](0),LenTimeLong[100](0),LenTimeShort[100](0);
//Distribution:Exit
Arrays:LenExit[10](0);

//Pseudo Random Parameterics
If CurrentBar=1 then begin
For ii = 1 to 100 begin
PRNumber[ii,0]=Seed+31*(ii-1);
End; //For ii = 1 to 100 begin

For ii = 1 to 100 begin
For jj = 1 to 200 begin
//Pseudo Random Number Middle Square Method
MiddleSquare=IntPortion(Power(PRNumber[ii,jj-1],2)0.001)0.000001;
RandomNumber=1000000*(MiddleSquare-IntPortion(MiddleSquare));

If RandomNumber<90000 then begin //Check Function
MiddleSquare=IntPortion(Power(PRNumber[ii,jj-1]+110011,2)0.001)0.000001;
RandomNumber=1000000*(MiddleSquare-IntPortion(MiddleSquare));
End; //If RandomNumber<90000 then begin //Check Function
PRNumber[ii,jj]=RandomNumber;
End; // For ii = 1 to 100
End; // For jj = 1 to 200

xxL=Mod(PRNumber[1,1],6)+1;
xxS=Mod(PRNumber[1,101],6)+1;
LenLong[1]=Mod(PRNumber[2,1],50)+21;
LenShort[1]=Mod(PRNumber[2,101],50)+21;
LenLong[2]=Mod(PRNumber[2,2],50)+21;
LenShort[2]=Mod(PRNumber[2,102],50)+21;
LenLong[3]=Mod(PRNumber[2,3],300)+350;
LenShort[3]=Mod(PRNumber[2,103],300)+350;
LenLong[4]=Mod(PRNumber[2,4],50)+55;
LenShort[4]=Mod(PRNumber[2,104],50)+55;
LenLong[5]=Mod(PRNumber[2,5],150)+55;
LenShort[5]=Mod(PRNumber[2,105],150)+55;
LenLong[6]=Mod(PRNumber[2,6],15)+15; //ADX
LenShort[6]=Mod(PRNumber[2,106],15)+15; //ADX
LenLong[7]=Mod(PRNumber[2,7],10)+5; //ADX
LenShort[7]=Mod(PRNumber[2,107],10)+5; //ADX

RatioLong[1]=Mod(PRNumber[3,1],150)0.01+1.64; RatioLong[2]=Mod(PRNumber[3,2],80)0.01+0.75;
RatioLong[3]=Mod(PRNumber[3,3],120)0.01+0.55; RatioShort[1]=Mod(PRNumber[3,101],150)0.01+1.64;
RatioShort[2]=Mod(PRNumber[3,102],80)0.01+0.75; RatioShort[3]=Mod(PRNumber[3,103],120)0.01+0.55;
For ii=1 to 100 begin
LogisticOnOff[ii]=Iff(PRNumber[4,ii]>500000,1,0);
End;
LenTimeLong[1]=Mod(PRNumber[5,1],10)+1;
LenTimeShort[1]=Mod(PRNumber[5,101],10)+1;
LenExit[1]=Mod(PRNumber[6,1],10)+5;

End; //If CurrentBar=1 then begin

//BaseInformation : 1 ~ 10
Vars:StartDate(0),TimeLen(0),BP(0);
Vars:Session(1),OpenDFirstBar(1),EndTime(0),OpenDFirstTime(0),IntraDayBarNo(0);

If CurrentBar=1 then begin //BaseInformation*
StartDate=DateToJulian(Date);
TimeLen=BarInterval;
BP=MinMove/PriceScale;
If Session=1 then EndTime=Sess1EndTime;
If Session=2 then EndTime=Sess2EndTime;
If OpenDFirstBar=1 then OpenDFirstTime=Sess1StartTime;
If OpenDFirstBar=2 then OpenDFirstTime=Sess2StartTime;
IntraDayBarNo=IntPortion((TimeToMinutes(EndTime)-TimeToMinutes(OpenDFirstTime))/TimeLen)+1;
End; //CurrentBar=1

//State Case//
Vars:MP(0),Liquidity(False),Price(0),NoBar(0),EEP(0),TN(0);
MP=MarketPosition;
Liquidity=Summation(Range,20)>80BP and Range>5BP and Range[1]>5BP; Price=0.5(High+Low);
NoBar=BarNumber;
EEP=EntryPrice(0);
TN=TotalTrades;

BreakLong[1]=Highest(High,LenLong[1]);
BreakLong[2]=MaxList(HighD(1),HighD(2),HighD(3));
BreakLong[3]=Average(High,LenLong[2])+Highest(Range,LenLong[3]);
BreakLong[4]=Average(High,LenLong[4])+RatioLong[1]StdDev(High,LenLong[5]);
BreakLong[5]=CloseD(1)+RatioLong[2](HighD(1)-LowD(1));
BreakLong[6]=OpenD(0)*RatioLong[3];
BreakShort[1]=Lowest(Low,LenShort[1]);
BreakShort[2]=MinList(LowD(1),LowD(2),LowD(3));
BreakShort[3]=Average(Low,LenShort[2])-Highest(Range,LenShort[3]);
BreakShort[4]=Average(Low,LenShort[4])-RatioShort[1]StdDev(Low,LenShort[5]);
BreakShort[5]=CloseD(1)-RatioShort[2](HighD(1)-LowD(1));
BreakShort[6]=OpenD(0)*RatioShort[3];
ClearDebug;
SetStopContract;

If IFFLogic(LogisticOnOff[1]=0,True,Time>=CalcTime(Sess1StartTime,LenTimeShort[1]BarInterval)) then begin
If IFFLogic(LogisticOnOff[2]=0,True,ADX(LenLong[6])>ADX(LenLong[6])[LenLong[7]]) then begin
If IFFLogic(LogisticOnOff[3]=0,True,EntriesToday(Date)=0) then begin
Buy next bar at BreakLong[xxL] stop;
End; //If EntriesToday(Date)=0 then begin
End; //If ADX(21)>ADX(21)[10] then begin
End; //If Time>=CalcTime(Sess1StartTime,5BarInterval) then begin
If IFFLogic(LogisticOnOff[1]=0,True,Time>=CalcTime(Sess1StartTime,LenTimeLong[1]BarInterval)) then begin
If IFFLogic(LogisticOnOff[2]=0,True,ADX(LenShort[6])>ADX(LenShort[6])[LenShort[7]]) then begin
If IFFLogic(LogisticOnOff[3]=0,True,EntriesToday(Date)=0) then begin
SellShort next bar at BreakShort[xxS] stop;
End; //If EntriesToday(Date)=0 then begin
End; //If ADX(21)>ADX(21)[10] then begin
End; //If Time>=CalcTime(Sess1StartTime,5BarInterval) then begin
If BarsSinceEntry>=LenExit[1] then begin
Sell next bar at Low stop;
BuyToCover next bar at High stop;
End;
步驟4 : 輸出績效文字檔,透過報酬、風險…等指標,排序模組的優劣相關程式碼,請待下篇文章分享
為什麼會看到廣告
avatar-img
21會員
112內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Piemann的沙龍 的其他內容
200多年前,本間宗九在稻米市場的買賣,發明了K線,還有對應的酒田戰法技術分析,並因此發大財,家族一值到1945年以前,都是日本第一大地主 那200多年的日本是甚麼樣的社會 ?
選擇權的基礎用途,就是在混亂的行情中,鎖定價格
假設每筆成交價與前一筆的成交價的差異,只有 -1、0、1 三種跳動情況,且每個出現機率都相同,請問觀察51筆成交價資料後,在95%的信心水準下,累積的漲跌點數合理區間為何 ?
利用亂數,在複雜的多個條件下,透過模擬而得到參考答案,在計算科學越來越進步的情況下,此法應用的領域範圍,已獲得大爆發式的增加。本文利用Excel VBA工具,來產生兩種亂數表,一個是均勻分配、另一個是標準常態分配亂數。
挑戰南極點 1911.12.15,阿蒙森是人類史上第一個抵達南極點的探險家,然後阿蒙森拔得頭籌且平安回國,而另一組人34天後抵達南極,但是領隊的史考特則慘被凍死 來回1400英里的距離,阿蒙森的準備方式是這樣進行
山難一二事 1. 凜冬之際,山岳能手Piemann,精挑數名隊友,欲在台灣的奇萊之巔,共賞午夜銀河,享受人生 2. 其中一名隊友Bill是三鐵金牌人,Piemann行前諄切隊友必備物品、時間、路徑
200多年前,本間宗九在稻米市場的買賣,發明了K線,還有對應的酒田戰法技術分析,並因此發大財,家族一值到1945年以前,都是日本第一大地主 那200多年的日本是甚麼樣的社會 ?
選擇權的基礎用途,就是在混亂的行情中,鎖定價格
假設每筆成交價與前一筆的成交價的差異,只有 -1、0、1 三種跳動情況,且每個出現機率都相同,請問觀察51筆成交價資料後,在95%的信心水準下,累積的漲跌點數合理區間為何 ?
利用亂數,在複雜的多個條件下,透過模擬而得到參考答案,在計算科學越來越進步的情況下,此法應用的領域範圍,已獲得大爆發式的增加。本文利用Excel VBA工具,來產生兩種亂數表,一個是均勻分配、另一個是標準常態分配亂數。
挑戰南極點 1911.12.15,阿蒙森是人類史上第一個抵達南極點的探險家,然後阿蒙森拔得頭籌且平安回國,而另一組人34天後抵達南極,但是領隊的史考特則慘被凍死 來回1400英里的距離,阿蒙森的準備方式是這樣進行
山難一二事 1. 凜冬之際,山岳能手Piemann,精挑數名隊友,欲在台灣的奇萊之巔,共賞午夜銀河,享受人生 2. 其中一名隊友Bill是三鐵金牌人,Piemann行前諄切隊友必備物品、時間、路徑
你可能也想看
Google News 追蹤
Thumbnail
本策略採用ATR(平均真實波幅)技術指標,針對下午盤1500~2000進行交易的策略,針對盤勢而順勢進場的交易策略。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略主要用在盤勢強勢上漲時,等待盤勢拉回且維持在長紅K棒之上,進行的拉回買進策略,目的是不追高買進,讓順勢過程中確保成本不必追高的交易策略。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
if I had to only trade one setup and I had to wait for it. It had to be there in the chart where I did nothing. I would be trading the second stage di
Thumbnail
周一崩盤絕對精彩,只要方向錯誤、沒設停損甚至凹單,通常直接被畢業。雖然策略有開發波段單,但很容易出現夜盤崩盤,若沒有出場就會造成隔天重大損傷,所以波段單一定要把夜盤也納入設計,不然畢業就不用玩了。
Thumbnail
本策略採用5、30分K的支撐與壓力進行突破買進與跌破賣出策略,透過盤中的量能變化進行買賣操作策略,該指標能夠真實地反映出價格的波動情況,並且可以靈活地調整參數進行進出場操作。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為攻擊盤,當成交量能達到當日一定的量能時,當日順勢向上的盤面機率就會增加,適合多方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本文介紹了交易分析中的DNT策略,包括利用Daily觀察、Weekly Profile、4H BSL等方式進行交易的思考流程。想了解更詳細的DNT策略講解,敬請期待接下來推出的訂閱服務。
Thumbnail
原本將空方策略放上去後,準備有機會往下走一波,碰到20MA均線之後,就有強力支撐,之後就一路往上噴,那策略就只能一直觸發多方策略,本周賺了860點,算是一大進補,大賺一次可以有好幾次小賠可以使用了。
Thumbnail
一般常見的時間架構分成三個:趨勢級別、分析級別、進場級別。 趨勢級別 週線 or 日線,目的是為了確認整體市場的方向,以及關鍵流動性區域(支撐、壓力位) 分析級別 4H or 1H,目的是確認市場當前方向、公允價值缺口、訂單塊、流動性區域、高期望值交易區域,需要花較多時間來分析。 進場級別
Thumbnail
今天多方策略直接吃鱉,開高走低,當策略突破向上通常訊號指標都會有,反轉僅能依靠停損來設計,不知道大家對策略有什麼想法可以分享看看。
Thumbnail
本策略採用ATR(平均真實波幅)技術指標,針對下午盤1500~2000進行交易的策略,針對盤勢而順勢進場的交易策略。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本策略主要用在盤勢強勢上漲時,等待盤勢拉回且維持在長紅K棒之上,進行的拉回買進策略,目的是不追高買進,讓順勢過程中確保成本不必追高的交易策略。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
if I had to only trade one setup and I had to wait for it. It had to be there in the chart where I did nothing. I would be trading the second stage di
Thumbnail
周一崩盤絕對精彩,只要方向錯誤、沒設停損甚至凹單,通常直接被畢業。雖然策略有開發波段單,但很容易出現夜盤崩盤,若沒有出場就會造成隔天重大損傷,所以波段單一定要把夜盤也納入設計,不然畢業就不用玩了。
Thumbnail
本策略採用5、30分K的支撐與壓力進行突破買進與跌破賣出策略,透過盤中的量能變化進行買賣操作策略,該指標能夠真實地反映出價格的波動情況,並且可以靈活地調整參數進行進出場操作。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作
Thumbnail
本策略採用台指期五分K的成交量進行判斷是否當日為攻擊盤,當成交量能達到當日一定的量能時,當日順勢向上的盤面機率就會增加,適合多方的順勢盤面。 此策略主要是針對看盤的經驗,將策略轉化為程式進行自動化交易,減少人為的操作,即使沒看盤也能自動化的完成交易。
Thumbnail
本文介紹了交易分析中的DNT策略,包括利用Daily觀察、Weekly Profile、4H BSL等方式進行交易的思考流程。想了解更詳細的DNT策略講解,敬請期待接下來推出的訂閱服務。
Thumbnail
原本將空方策略放上去後,準備有機會往下走一波,碰到20MA均線之後,就有強力支撐,之後就一路往上噴,那策略就只能一直觸發多方策略,本周賺了860點,算是一大進補,大賺一次可以有好幾次小賠可以使用了。
Thumbnail
一般常見的時間架構分成三個:趨勢級別、分析級別、進場級別。 趨勢級別 週線 or 日線,目的是為了確認整體市場的方向,以及關鍵流動性區域(支撐、壓力位) 分析級別 4H or 1H,目的是確認市場當前方向、公允價值缺口、訂單塊、流動性區域、高期望值交易區域,需要花較多時間來分析。 進場級別
Thumbnail
今天多方策略直接吃鱉,開高走低,當策略突破向上通常訊號指標都會有,反轉僅能依靠停損來設計,不知道大家對策略有什麼想法可以分享看看。