HSP程式交易論壇 >> 程式交易 >> 論壇主區 >> HSQL語言討論區 >> HSQL程式語言--策略實作範例(一)
HSQL程式語言--策略實作範例(一)
Hunta,2009-04-20 23:11:54
[COLOR=#333333][SIZE=2]本範例以MACD指標(參數為10,10,20)為操作標的,當MACD指標黃金交叉時多單建倉,當MACD指標死亡交叉時空單建倉。[/SIZE][/COLOR]
[COLOR=#333333][SIZE=2][/SIZE][/COLOR]
[COLOR=#333333][SIZE=2]範例網頁 [URL=http://www.huntasoft.com/hsp/lesson13.htm]http://www.huntasoft.com/hsp/lesson13.htm[/URL][/SIZE][/COLOR]
[COLOR=#333333][SIZE=2][/SIZE][/COLOR]
bw5168,2009-06-09 09:52:25
下單程式寫的很清楚!很棒!推一下 感謝囉
首先你要先判斷倉位(倉位:空手0,多單1,空單-1)
1. 作多 :首先判斷倉位空單 or 空手 >> (if 目前倉位 <=0)
操作訊號( 空單平倉 , 1口 , Va )然後 空單-1轉平倉>> 0
操作訊號( 多單建倉 , 1口 , Va ) 空手 0轉多單>> 1
2.作空: 首先判斷倉位多單 or 空手 >> (if 目前倉位 >=0)
操作訊號( 多單平倉 , 1口 , Va )然後 多單1轉平倉 >> 0
操作訊號( 空單建倉 , 1口 , Va ) 空手0轉多單 >> 1
mingyi1973,2009-06-15 14:31:37
我想請教:
如果我想要MACD指標一旦黃金交叉後就下單,然後三根k線以內不做反手或平倉的動作,要怎麼寫?
mingyi1973,2009-06-15 17:49:36
請教:
無論多空一旦下單後10分鐘之內不做反手或平倉要的動作怎麼寫?
Hunta,2009-06-15 18:43:49
[QUOTE][B]下面引用由[U]mingyi1973[/U]發表的內容:[/B]
我想請教:
如果我想要MACD指標一旦黃金交叉後就下單,然後三根k線以內不做反手或平倉的動作,要怎麼寫?[/QUOTE]
程式碼如下,下載連結 [URL=http://www.huntasoft.com/hsp/9003.rda]http://www.huntasoft.com/hsp/9003.rda[/URL]
10 Va = 5分_開盤價
20
30 // 多單進場
40 If 目前部位( 倉位多空 ) <= 0 Then
50 If 前1_5分_MACD交叉( 10 , 10 , 20 ) = 是 And 交叉類型 = 1 Then
60 Vb = 4
70 If 目前部位( 倉位多空 ) < 0 Then
80 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
90 End If
100 If Vb >= 4 Then
110 Show [ K線下方 , ↑ ]
120 操作訊號( 空單平倉 , 1口 , Va )
130 操作訊號( 多單建倉 , 1口 , Va )
140 End If
150 End If
160 End If
170
180 // 空單進場
190 If 目前部位( 倉位多空 ) >= 0 Then
200 If 前1_5分_MACD交叉( 10 , 10 , 20 ) = 是 And 交叉類型 = -1 Then
210 Vb = 4
220 If 目前部位( 倉位多空 ) > 0 Then
230 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
240 End If
250 If Vb >= 4 Then
260 Show [ K線上方 , ↓ ]
270 操作訊號( 多單平倉 , 1口 , Va )
280 操作訊號( 空單建倉 , 1口 , Va )
290 End If
300 End If
310 End If
320
330 // 多單出場
340 If 目前部位( 倉位多空 ) > 0 Then
350 If 前1_5分_MACD交叉( 10 , 10 , 20 ) = 是 And 交叉類型 = -1 Then
360 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
370 If Vb >= 4 Then
380 Show [ K線下方 , ◎ ]
390 操作訊號( 多單平倉 , 1口 , Va )
400 End If
410 End If
420 End If
430
440 // 空單出場
450 If 目前部位( 倉位多空 ) < 0 Then
460 If 前1_5分_MACD交叉( 10 , 10 , 20 ) = 是 And 交叉類型 = 1 Then
470 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
480 If Vb >= 4 Then
490 Show [ K線上方 , ◎ ]
500 操作訊號( 空單平倉 , 1口 , Va )
510 End If
520 End If
530 End If
Hunta,2009-06-15 18:45:55
[QUOTE][B]下面引用由[U]mingyi1973[/U]發表的內容:[/B]
請教:
無論多空一旦下單後10分鐘之內不做反手或平倉要的動作怎麼寫?[/QUOTE]
那就是2根5分鐘K線內不反手或平倉,請比照上例改一下即可。
mingyi1973,2009-06-15 19:39:04
以下3點請教:
1.請問是將這裡:480 If Vb >= 4 Then
改為:480 If Vb >= 3 Then 就會變成2根5分鐘K線內不反手或平倉嗎?
2.如果是用This Bar可以嗎?
3.既然多單進場時已經空單平倉了,而空單進場時已經多單平倉了,那您最後為何還要再加多單出場和空單出場呢?
Hunta,2009-06-15 23:13:24
1.是的。
2.可以,但是會較複雜,編寫程式時要注意更多細節,否則很容易出錯,可以參考本論壇其他相關This Bar的討論。
3.沒錯,可以不用。(被你找到BUG[EM04])
mingyi1973,2009-06-16 13:26:56
請教
我想以兩口操作
條件是5分_均線黃金交叉( 10 , 40 )則做多兩口
一旦5分_均線死亡交叉( 10 , 20 )先出一口
等5分_均線死亡交叉( 10 , 40 )則做空兩口
一旦5分_均線黃金交叉( 10 , 20 )先出一口
但我這樣寫結果將交易明細輸出到Excel 怎麼跟我想的口數都不一樣?
請幫我看看問題出在那裡!謝謝!
150 Va = 5分_開盤價
160
170 // 多單進場
180 If 目前部位( 倉位多空 ) <= 0 Then
190 If 5分_均線交叉( 10 , 40 ) = 是 And 交叉類型 = 1 Then
200 Vb = 1
210 If 目前部位( 倉位多空 ) < 0 Then
220 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
230 End If
240 If Vb >= 1 Then
250 Show [ K線下方 , 多 ]
260 操作訊號( 空單平倉 , 2口 , Va )
270 操作訊號( 多單建倉 , 2口 , Va )
280 If 最後K線 = 是 And 單K計數器( 目前K線 , 0 ) = 0 Then
290 GoSub date_time
300 S1$ = S1$ + '1'
310 輸出文字檔( C:\cur_cmd.txt , S1$ )
320 單K計數器( 目前K線 , 0 ) = 1
330 End If
340 End If
350 End If
360 End If
370
380 If 目前部位( 倉位多空 ) > 0 Then
390 If 5分_均線交叉( 10 , 20 ) = 是 And 交叉類型 = -1 Then
400 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
410 If Vb >= 1 Then
420 Show [ K線上方 , ◎ ]
430 操作訊號( 多單平倉 , 1口 , Va )
440 If 最後K線 = 是 And 單K計數器( 目前K線 , 0 ) = 0 Then
450 GoSub date_time
460 S1$ = S1$ + '1'
470 輸出文字檔( C:\cur_cmd.txt , S1$ )
480 單K計數器( 目前K線 , 0 ) = 1
490 End If
500 End If
510 End If
520 End If
530
540 // 空單進場
550 If 目前部位( 倉位多空 ) >= 0 Then
560 If 5分_均線交叉(10 , 40 ) = 是 And 交叉類型 = -1 Then
570 Vb = 1
580 If 目前部位( 倉位多空 ) > 0 Then
590 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
600 End If
610 If Vb >= 1 Then
620 Show [ K線上方 , 空 ]
630 操作訊號( 多單平倉 , 2口 , Va )
640 操作訊號( 空單建倉 , 2口 , Va )
650 If 最後K線 = 是 And 單K計數器( 目前K線 , 0 ) = 0 Then
660 GoSub date_time
670 S1$ = S1$ + '1'
680 輸出文字檔( C:\cur_cmd.txt , S1$ )
690 單K計數器( 目前K線 , 0 ) = 1
700 End If
710 End If
720 End If
730 End If
740
750 If 目前部位( 倉位多空 ) < 0 Then
760 If 5分_均線交叉( 10 ,20) = 是 And 交叉類型 = 1 Then
770 Vb = K線序號( 目前K線 ) - 目前部位( 第 1 次建倉K線序號 )
780 If Vb >= 1 Then
790 Show [ K線下方 , ◎ ]
800 操作訊號( 空單平倉 , 1口 , Va )
810 If 最後K線 = 是 And 單K計數器( 目前K線 , 0 ) = 0 Then
820 GoSub date_time
830 S1$ = S1$ + '1'
840 輸出文字檔( C:\cur_cmd.txt , S1$ )
850 單K計數器( 目前K線 , 0 ) = 1
860 End If
870 End If
880 End If
890 End If
900
910 Sub date_time
920 Vc = 目前時間( 西元年4碼 )
930 S1$ = Cstr( Vc ) + '/'
940 Vc = 目前時間( 月 )
950 If Vc < 10 Then
960 S1$ = S1$ + '0' + Cstr( Vc ) + '/'
970 Else
980 S1$ = S1$ + Cstr( Vc ) + '/'
990 End If
1000 Vc = 目前時間( 日 )
1010 If Vc < 10 Then
1020 S1$ = S1$ + '0' + Cstr( Vc ) + ''
1030 Else
1040 S1$ = S1$ + Cstr( Vc ) + ''
1050 End If
1060 Vc = 目前時間( 時 )
1070 If Vc < 10 Then
1080 S1$ = S1$ + '0' + Cstr( Vc ) + ':'
1090 Else
1100 S1$ = S1$ + Cstr( Vc ) + ':'
1110 End If
1120 Vc = 目前時間( 分 )
1130 If Vc < 10 Then
1140 S1$ = S1$ + '0' + Cstr( Vc ) + ''
1150 Else
1160 S1$ = S1$ + Cstr( Vc ) + ''
1170 End If
1180 End Sub
Hunta,2009-06-16 14:12:34
首先,你這支程式是以This Bar方式編寫,要用This Bar方式編寫策略程式一定要非常嚴謹,因為其中有許多陷阱存在,一不注意就會出現問題,所以建議初學者先從Next Bar方式開始練習,等功力到達一定程度再來嘗試This Bar方式,我知道大家使用This Bar是因為想搶第一時間下單,但是其中也衍生了一些問題,不得不注意,例如:
1.因為你是判斷最後一根K線,而此K線還未正式結束,所以有可能發生兩條均線交叉了,過一下子又分開了,請問這時候該如何處理?是算還是不算?
2.若你用This Bar方式編寫策略,在做「績效回測」時通常無法正確的回測績效,因為你的進出場點是在K線進行中發生,所以績效回測時不可能模擬回復到當時的狀態,電腦看到的價格已經都是收盤價了,所以一定會有不同。
至於,你上面寫的程式很明顯就會碰到上述問題,而且減碼程式的部份也有問題,例如380行你應該一併判斷單K計數器是否為0,若是0才往下執行,否則依照你的程式,會連續平倉兩次,等於全出了。
mingyi1973,2009-06-16 14:24:12
例如380行你應該一併判斷單K計數器是否為0,若是0才往下執行,否則依照你的程式,會連續平倉兩次,等於全出了。
請教減碼程式的部份該怎麼寫?
mingyi1973,2009-06-16 15:15:48
還要請教一個問題如果我每日都要在收盤前將口數平掉的話,那我是這樣寫嗎?但是這樣不一定是兩口啊!
10 If 目前部位( 倉位多空 ) > 0 Then
20 If 前1_5分_K線時間 = 1335 Then
30 操作訊號( 多單平倉 , 2口 , Va )
40 Show [ K線下方 , 收 ]
50 End If
60 End If
90
100 If 目前部位( 倉位多空 ) < 0 Then
110 If 前1_5分_K線時間 = 1335 Then
120 操作訊號( 空單平倉 , 2口 , Va )
130 Show [ K線上方 , 收 ]
140 End If
150 End If
還有要將平倉口數改為變數?這樣寫對嗎?不然要怎麼寫?
10 If 目前部位( 倉位多空 ) > 0 Then
20 If 前1_5分_K線時間 = 1335 Then
30 操作訊號( 多單平倉 , Ve口, Va )
40 Show [ K線下方 , 收 ]
50 End If
60 End If
70
80 Ve = 目前部位( 第 1 次剩餘口數 )
90
100 If 目前部位( 倉位多空 ) < 0 Then
110 If 前1_5分_K線時間 = 1335 Then
120 操作訊號( 空單平倉 , Ve口 , Va )
130 Show [ K線上方 , 收 ]
140 End If
150 End If
感謝!
97 1 2 8: 此主題共有20帖 此頁12帖 每頁12帖
[查看完整模式] LeadBBS 5.0 耗時62.5毫秒 請求2次
|