首先看看老史的文章:
13:43平倉 15K最終改良版!
本來想改成13:30平倉,回測少賺一點省得麻煩,結果改成13:30分用TS回測成績少了40萬....是因為我留倉的部位是由最後收盤價決定...早 15分鐘去決定要不要留倉...,留倉單的勝率及獲利部位會減少很多...所以最後想了一個辦法,經過不斷實驗,解決我所有的煩腦~~~不過還是得實際跑才知道有沒有其他side effect...
//當下k棒時間在13:43的時候平倉訊號出現 Q1 or Q2,等到q_time>134400,此訊號消失由下面的T1 or T2接手
IF q_TIME>134300 and q_time<134400 AND MarketPosition<>0 then
if marketposition=1 then
ExitLong("Q1") this bar at market;
end if
if marketposition=-1 then
exitshort("Q2") this bar at market;
end if;
End if;
//當下k棒時間過了13:44分,Q1 or Q2消失,T1 or T2接手發出平倉訊號
//(OR q_TIME=000000 這部份可兼顧回測歷史k棒)
IF TIME = 134500 AND (q_TIME>134400 OR q_TIME=000000) THEN
EXITLONG("T1") THIS BAR AT MARKET
EXITSHORT("T2") THIS BAR AT MARKET
end if;
這樣就可以了嗎? 不...這樣可能會有個問題...就是在Q1/Q2消失 到 T1/T2出現的極短期間,有可能發生倉位會變化(平倉=>新倉=>平倉),所以最後輸出到signal.txt時還要再加一段程式碼避免這種情況發生:
//簡單說就是在13:44分之後,有可能發生倉位變化的期間,不將結果寫入signal.txt
/*********信號寫入檔案 signal.txt********/
if date = lastcalcdate and time = LastCalcTime
and (q_TIME<134400 or q_Time >134450) then
FileDelete("C:\danRC15\signal.txt")
FileAppend("C:\danRC15\signal.txt", ("0,"+ NumToStr( Date, 0 ) +","+ NumToStr (Q_time,0)+","+ NumToStr(CurrentContracts,0)+",0,"+NumToStr(close,0)+",1"))End if
/*********先信號後下單程式結束*********/
好了,這樣子就把原先在開盤時,訊號換手的問題解決,以後可以安心的在開盤前將HTS、下單機通通開好等著開盤,接著印鈔。這篇寫得亂七八糟應該沒有人看得懂吧 XD
這樣就解決出場的問題了…至於進場的話…目前的想法也是類似。
不過是在 Q_time = 134300 的時候判斷條件是不是成立…如果成立的話把某個變數修改為某個值…類似這樣:
if Q_time > 134300 and Q_Time < 134400 and dayEndCheck = 0 and xxx then
buy this bar at market
dayEndCheck = 1
end if
if time = 134500 and (Q_time > 134400 or Q_time = 000000) and dayEndCheck = 1 then
buy this bar at market
end if
大概會類似這樣…不過還沒實測過這樣的結果到底是會正常還是不正常。
請教DK,奇狐的barslast函數在TS上如何呈現? 感謝幫忙!
回覆刪除J.I. 這個必需要自行去計算了...我有利用 barnumber 去算過..在條件成立時計下當時的 barnumber..接著再去用目前的 barnumber 減掉就知道過了多少根 k 線了
回覆刪除感謝D.K.!!
回覆刪除試作一下,看起來可以用,一開始想太多,加了許多不曾用過的函數,又沒手冊,結果搞得頭昏腦脹.去蕪存菁得到以下程式碼.
回覆刪除//X上次條件成立到當前的週期
//注意這是數值型函數不是指標喔,命名是BarsLast
//在指標中引用應有Variables:ABC(false),其中ABC是任意給的
//引用BarsLast(ABC)函數時ABC為boolean
Parameter: X(bool)
Variables:Counter(0)
If X = True Then
Counter = 0
Else
Counter = Counter + 1
End If
BarsLast = Counter
試作奇狐中的Filter,請參考邏輯測試看看
回覆刪除初步看起來可以用,如有更正確寫法,請能指正.
//X條件成立後,將其後N週期內的數據設為0,不被採用.這裡是傳回偽false
//注意這是倫理型函數不是指標喔,命名是Filter
//在指標中引用應有Variables:ABC(false),其中ABC是任意給的
//引用Filter(ABC,N)函數時ABC為boolean
Parameter: X(bool), Length(Numeric)
Variables: Counter(0)
If X = True Then
If Counter <= Length Then
Filter = False
Counter = Counter + 1
Else
Filter = True
Counter = 0
End If
Else
Filter = False
Counter = Counter + 1
End If
print(b2,b3)測試部分結果
b1 = Value70 cross over Value8
b2 = Filter(b1,5)
b3 = BarsLast(b2)
TRUE 0.00
FALSE 1.00
FALSE 2.00
FALSE 3.00
FALSE 4.00
FALSE 5.00
FALSE 6.00
FALSE 7.00
FALSE 8.00
FALSE 9.00
TRUE 0.00
FALSE 1.00
FALSE 2.00
FALSE 3.00
//BarsLast修正如下:
回覆刪除//由於輸入有可能是連續True,False
Parameter: X(bool)
Variables:Counter(0),Counter1(0)
If X = True Then
Counter = 0
Counter1 = Counter1 + 1
Else
Counter1 = 0
Counter = Counter + 1
End If
If Counter>Counter1 Then
BarsLast = Counter
Else
BarsLast = Counter1
End If
謝謝peter的分享!真的是厲害~這個對於奇狐語法轉TS有很大的幫助
回覆刪除peter: 感謝您的用心…如果方便的話我會弄成一篇文章喔。
回覆刪除會公佈也是想大家研究看看,有沒有更好的邏輯去完成更好的勝率,其實目前的寫法還不夠完美,如果像奇狐那樣有三個狀態,1,-1,0
回覆刪除時,又當如何?
DK:能整理成一篇文章定能造福更多人,網路上那麼多人在問這個問題.
只是幫助有多大實在不知道,只要告訴大家那是一個五十多歲的阿伯peter 寫的就好了.
回到正題像奇狐那樣有三個狀態,X也可以這樣用
Parameter: X(Numeric)
Variables:Counter(0)
If X <> X[1] Then
Counter = 0
Else
Counter = Counter + 1
End If
//BarsLast = Counter + 1
If Counter = 0 And X[1] <> X[2] Then
BarsLast = 1
Else
//排除第一次轉換時誤植為1
以上寫法未完成,大家研究看看.
peter: 謝謝你的熱心…不過提出一個之前遇到的問題...利用 counter 去累加是一個辦法..可是當該條件很久才出現一次的時候...問題就會滿大的...因為會導至 TS 運算量過大...而無法正常運作。
回覆刪除之前寫到二個 barlast 條件..一直都累加到數百根 k 線過後還沒有出現的時候… K 線數開到 500 就會讓我的 TS 整個停住了。
所以到後來我的寫法比較偏向記錄的方式。
在條件成立時候去記錄下來目前的 barnumber,等到下次成立的時候再用當時的 barnumber 去減到上一次成立的 barnumber得到結果。
這樣的方式可以只有一個 barnumber 在作累加的動作…其它的部份都只是一個變數去存一個數值下來。
D.K.您好
回覆刪除雖然有買TS的書來參考,但目前並沒有安裝或使用,無法了解上述問題,不過您的做法應是正確的.
現在是用HTS,如果是看三十分鐘,一星期大慨有十個信號,不會有TS的那種情形.
順便一提,那天喝得如何?最近也都在作空,不過都閃得很快,並沒受傷.這兩個月盤勢刁鑽的很,好像有一群人價差5~10點就跑,苦了一般大眾.
寫那兩個函數,並沒在用.現在是用自己寫的均線和三才線看盤.
peter: 如果訊號多的話就比較沒問題..相同的問題在 hts 應該也是會發生才對。
回覆刪除請問peter大大可以把filter函數改成HTS版嗎?謝謝
回覆刪除backset..函數....求救...請幫我改成 ts..版..
回覆刪除我看不太懂 backset 在作什麼…不如你直接把想要的功能說出來我會比較明白一點…
刪除backset(x,n) -->若x<>0 則把當日及前n-1日的數值設為1;
刪除大神您好,請問可以作一個HTS的SUMBARS函數嗎?謝謝大神
回覆刪除