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
Piemann的沙龍
21會員
134內容數
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
在交易千萬別見樹不見林 中示範如何在同一張圖表上加入不同週期的行情走勢,本篇將對MultiCharts初體驗-函式撰寫、MultiCharts初體驗-訊號撰寫 的程式進行改寫,讓程式可以讀取到多週期的K線資料。 在MC中可以用Data1、Data2、⋯⋯、Data99的指定方式,來存取圖表中的數列
Thumbnail
在交易千萬別見樹不見林 中示範如何在同一張圖表上加入不同週期的行情走勢,本篇將對MultiCharts初體驗-函式撰寫、MultiCharts初體驗-訊號撰寫 的程式進行改寫,讓程式可以讀取到多週期的K線資料。 在MC中可以用Data1、Data2、⋯⋯、Data99的指定方式,來存取圖表中的數列
Thumbnail
程式條件選股 主要做波段與短線,非價值型投資,操作週期約1個禮拜~多個月 選股純屬分享,本人並沒有帶入帶出及買賣推薦,任意跟單請盈虧自負,本人不帶任何責任。 大盤還在季線上主要還是以偏多操作,所以目前還是先分享做多選股 由於當沖根據金管會統計勝率較低,所以我也不做當沖,主要皆分享一些剛回檔均線或是剛
Thumbnail
程式條件選股 主要做波段與短線,非價值型投資,操作週期約1個禮拜~多個月 選股純屬分享,本人並沒有帶入帶出及買賣推薦,任意跟單請盈虧自負,本人不帶任何責任。 大盤還在季線上主要還是以偏多操作,所以目前還是先分享做多選股 由於當沖根據金管會統計勝率較低,所以我也不做當沖,主要皆分享一些剛回檔均線或是剛
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
廣告常說:「男人過了四十歲,只剩一張嘴。」,連續二天的話當年後,要開始進入程式交易的主題,雖然前文描述是使用TradeStation為開發平台,但後來TS已轉為美國國內券商使用,在台灣MultiChart(以下簡稱MC)已成為主流的平台,雖然在使用上還是有許多雷區要避開,但平心而論,這平台算是程式初
Thumbnail
廣告常說:「男人過了四十歲,只剩一張嘴。」,連續二天的話當年後,要開始進入程式交易的主題,雖然前文描述是使用TradeStation為開發平台,但後來TS已轉為美國國內券商使用,在台灣MultiChart(以下簡稱MC)已成為主流的平台,雖然在使用上還是有許多雷區要避開,但平心而論,這平台算是程式初
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
經過之前MACD指數平滑移動平均線的詳細介紹,相信已經對 MACD 指標有徹底的瞭解了,這篇將實際使用 Crypto Arsenal 量化交易平台裡的免費 MACD 指標模板做回測,這篇將教學如何簡單地修改模板程式,更客製化自己的想法和策略。
Thumbnail
經過之前MACD指數平滑移動平均線的詳細介紹,相信已經對 MACD 指標有徹底的瞭解了,這篇將實際使用 Crypto Arsenal 量化交易平台裡的免費 MACD 指標模板做回測,這篇將教學如何簡單地修改模板程式,更客製化自己的想法和策略。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News