MC模組開發.1

更新於 發佈於 閱讀時間約 16 分鐘

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
留言分享你的想法!
avatar-img
Piemann的沙龍
21會員
113內容數
Piemann的沙龍的其他內容
2025/04/01
2025.04.01 明顯的,Cheat GPT 功能越來越強大,應用範圍只多不少 !! 輸入問題如下 : 1. 有一個隨機碼,長度為5個不重複的數字及小寫英文字母所組成, 例如 e2k9z、ju72d、...,共有一萬筆數據 2. 請設計一個雜湊函數方案,讓隨機碼對應到實數整數空間 3.
Thumbnail
2025/04/01
2025.04.01 明顯的,Cheat GPT 功能越來越強大,應用範圍只多不少 !! 輸入問題如下 : 1. 有一個隨機碼,長度為5個不重複的數字及小寫英文字母所組成, 例如 e2k9z、ju72d、...,共有一萬筆數據 2. 請設計一個雜湊函數方案,讓隨機碼對應到實數整數空間 3.
Thumbnail
2024/12/01
龐氏騙局定義 : 由後繼者的投資本金,支付前期投資者的紅利,謂之 !! 案例 : 制定獎勵生育誘因、追求人口紅利之國策,其實就是隱形的龐氏騙局 !! 那生命的意義,除了在於繼起宇宙生命之外,還有啥意義 ? 對曰 : 還得創造傳奇 ! 那如何創造傳奇 ? 對曰 : 確定目標、集中資源、專研
2024/12/01
龐氏騙局定義 : 由後繼者的投資本金,支付前期投資者的紅利,謂之 !! 案例 : 制定獎勵生育誘因、追求人口紅利之國策,其實就是隱形的龐氏騙局 !! 那生命的意義,除了在於繼起宇宙生命之外,還有啥意義 ? 對曰 : 還得創造傳奇 ! 那如何創造傳奇 ? 對曰 : 確定目標、集中資源、專研
2024/11/17
1990~1991之際,爆發第一次波灣戰爭(市場稱為第三次石油危機),起因是兩伊戰爭期間,伊拉克對科威特欠下巨債,戰後伊拉克藉端生事,要求取消相關債權,科威特不願意,因此伊拉克便開始調動軍隊部署於邊境(1990.七月中下旬),緊張局勢快速升溫,及至入侵(1990.08.02)科威特佔領全境後(199
2024/11/17
1990~1991之際,爆發第一次波灣戰爭(市場稱為第三次石油危機),起因是兩伊戰爭期間,伊拉克對科威特欠下巨債,戰後伊拉克藉端生事,要求取消相關債權,科威特不願意,因此伊拉克便開始調動軍隊部署於邊境(1990.七月中下旬),緊張局勢快速升溫,及至入侵(1990.08.02)科威特佔領全境後(199
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
在交易千萬別見樹不見林 中示範如何在同一張圖表上加入不同週期的行情走勢,本篇將對MultiCharts初體驗-函式撰寫、MultiCharts初體驗-訊號撰寫 的程式進行改寫,讓程式可以讀取到多週期的K線資料。 在MC中可以用Data1、Data2、⋯⋯、Data99的指定方式,來存取圖表中的數列
Thumbnail
在交易千萬別見樹不見林 中示範如何在同一張圖表上加入不同週期的行情走勢,本篇將對MultiCharts初體驗-函式撰寫、MultiCharts初體驗-訊號撰寫 的程式進行改寫,讓程式可以讀取到多週期的K線資料。 在MC中可以用Data1、Data2、⋯⋯、Data99的指定方式,來存取圖表中的數列
Thumbnail
廣告常說:「男人過了四十歲,只剩一張嘴。」,連續二天的話當年後,要開始進入程式交易的主題,雖然前文描述是使用TradeStation為開發平台,但後來TS已轉為美國國內券商使用,在台灣MultiChart(以下簡稱MC)已成為主流的平台,雖然在使用上還是有許多雷區要避開,但平心而論,這平台算是程式初
Thumbnail
廣告常說:「男人過了四十歲,只剩一張嘴。」,連續二天的話當年後,要開始進入程式交易的主題,雖然前文描述是使用TradeStation為開發平台,但後來TS已轉為美國國內券商使用,在台灣MultiChart(以下簡稱MC)已成為主流的平台,雖然在使用上還是有許多雷區要避開,但平心而論,這平台算是程式初
Thumbnail
經過之前MACD指數平滑移動平均線的詳細介紹,相信已經對 MACD 指標有徹底的瞭解了,這篇將實際使用 Crypto Arsenal 量化交易平台裡的免費 MACD 指標模板做回測,這篇將教學如何簡單地修改模板程式,更客製化自己的想法和策略。
Thumbnail
經過之前MACD指數平滑移動平均線的詳細介紹,相信已經對 MACD 指標有徹底的瞭解了,這篇將實際使用 Crypto Arsenal 量化交易平台裡的免費 MACD 指標模板做回測,這篇將教學如何簡單地修改模板程式,更客製化自己的想法和策略。
Thumbnail
程式條件選股 主要做波段與短線,非價值型投資,操作週期約1個禮拜~多個月 選股純屬分享,本人並沒有帶入帶出及買賣推薦,任意跟單請盈虧自負,本人不帶任何責任。 大盤還在季線上主要還是以偏多操作,所以目前還是先分享做多選股 由於當沖根據金管會統計勝率較低,所以我也不做當沖,主要皆分享一些剛回檔均線或是剛
Thumbnail
程式條件選股 主要做波段與短線,非價值型投資,操作週期約1個禮拜~多個月 選股純屬分享,本人並沒有帶入帶出及買賣推薦,任意跟單請盈虧自負,本人不帶任何責任。 大盤還在季線上主要還是以偏多操作,所以目前還是先分享做多選股 由於當沖根據金管會統計勝率較低,所以我也不做當沖,主要皆分享一些剛回檔均線或是剛
Thumbnail
均線指標在明顯趨勢特別好用,但是盤整階段就很不適合使用趨勢指標。因此,判斷趨勢開始與結束,就是程式交易做趨勢策略的重中之重。今天我們使用CCI策略來搭配,幫助我們尋找趨勢波段的起點。
Thumbnail
均線指標在明顯趨勢特別好用,但是盤整階段就很不適合使用趨勢指標。因此,判斷趨勢開始與結束,就是程式交易做趨勢策略的重中之重。今天我們使用CCI策略來搭配,幫助我們尋找趨勢波段的起點。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News