COCO研究院

 找回密碼
 註冊
搜索
樓主: kilroy

[教學] [分享] 用AB踏入外期程式交易

  [複製鏈接]
 樓主| 發表於 14-6-17 16:48 | 顯示全部樓層
skyler 發表於 14-6-17 16:06
k大請問一下
我沒記錯的話 YM ZC ZS ZW 這四種
是在CBOT吧

照上面的訂閱就可以了

評分

參與人數 1金錢 +2 收起 理由
skyler + 2 感謝分享

查看全部評分

 樓主| 發表於 14-6-17 17:43 | 顯示全部樓層
skyler 發表於 14-6-17 16:06
k大請問一下
我沒記錯的話 YM ZC ZS ZW 這四種
是在CBOT吧

再補一下 eSignal 的好處
1. 報價穩定
2. 回補速度快
3. 省去資料整理的麻煩 (ex. MC 用 QM 去做 mapping)
4. 資料維護幫你做好了

但是如果你的策略可以改寫成 easy/power language

其實你可以開 TS 比較快也比較省啦

參考看看

評分

參與人數 1金錢 +2 收起 理由
skyler + 2 感謝分享

查看全部評分

發表於 14-6-17 19:48 | 顯示全部樓層
本帖最後由 skyler 於 14-6-17 19:56 編輯

TS 不是比較貴嗎?!

而且再改去TS 又要再多學一套與設定
我在MC上光回測結果與AB差異太多
我就不想再接下去研究如何接下單機了
實在是太耗心力了

您那時測試沒有遇過 AB 與 MC 結果不同的情況嗎 ?
----------

另外想到 IB要下多少口才能享有 eSignal 的CME免費優惠?
 樓主| 發表於 14-6-17 20:03 | 顯示全部樓層
本帖最後由 kilroy 於 14-6-17 20:29 編輯
skyler 發表於 14-6-17 19:48
TS 不是比較貴嗎?!

而且再改去TS 又要再多學一套與設定

TS 是方便在 historical data, real time data feed, brokerage 都整合在一起
而手續費跟 IB 比起來是貴一點點

但如果考量上述三點,算是經濟實惠的平台了

大大可以參考看看

---
我是先在 AB 做單策略多商品

但沒想過要把他重新組譯成 MC 的 power language

所以也沒在 MC 上測過相同策略

會有差異,可能會是在計算結果上的不同吧

ex. AB+eSignsal v.s. MC+eSignal

---
只要開 IB 帳戶,就有資格訂閱 CME Group fee-waived

沒有下單量的限制

---
AB 最麻煩的地方就是部位的處理

ex. marketposition 這類的函數,AB 要自己做

還有停損的寫法,也是傷腦筋的事情

所以直接寫多空對翻是最省事的

因為固定點數或百分比停損停利、移動停損停利、持有時間停損停利、特定時間停損停利

我是覺得比較容易去 fitting

但沒有一個正確和絕對的答案

參考看看了



評分

參與人數 1金錢 +2 收起 理由
skyler + 2 感謝分享

查看全部評分

發表於 14-6-17 21:12 | 顯示全部樓層
本帖最後由 skyler 於 14-6-17 22:54 編輯

原來TS整合了這三個
謝謝您的分享


不過目前首先要吸收您在前面寫的 IB Controller 的程式碼
自己是
Buy = ExRem( Buy, Short );
Sell = ExRem( Sell , Buy );
Short = ExRem( Short, Buy );
Cover = ExRem( Cover , Short );


所以還要吸收消化
才能改寫符合自己需求呀


之後還要麻煩k 大指導了


----
小弟跟大大相同
也是單策略多商品
只是策略沒有很複雜
所以才比較容易改寫成 Power Language

不過結果不同分析後
1.資料上的差異 或是 同資料歸分的差異
2.計算後值的不同
不過由於資料上的差異所以像MACD 或RSI 這種計算出來的值是否AB與MC會相同我就不確定了

不過搞不好跟AB 32bit 與 64bit 一樣算出來會有差異
回測結果不同
那就要看你要選擇相信什麼了


簡單的策略不去優化
配合多種商品的測試
與回測時間從08年到現在
能呈現比較正向的結果
那就只能硬著頭皮相信這是個可行的策略了
---
大大有寫到
"所以後來改為各別商品一個圖表的方式,加上了開關按鈕
當按下 off 之後,我可以做商品合約名稱的修改,按下 on 之後就開始自動下單啦"

這是指每一個商品搭配一個策略AFL
每個AFL都相同只差在裡面的
ContractMonth
方面能停止後修改名稱再起動
是嗎?!


 樓主| 發表於 14-6-17 22:52 | 顯示全部樓層
skyler 發表於 14-6-17 21:12
原來TS整合了這三個
謝謝您的分享

1. 啟用 safty card
2. 非專業

評分

參與人數 1金錢 +2 收起 理由
skyler + 2 按一個讚

查看全部評分

發表於 14-6-17 22:56 | 顯示全部樓層
本帖最後由 skyler 於 14-6-17 23:03 編輯
kilroy 發表於 14-6-17 22:52
1. 啟用 safty card
2. 非專業

啓用 safty card
不會影響IB Controller嗎?!
沒想到大大回覆我了
我修改了之前的留言了
想要詢問您這個問題

---
大大有寫到
"所以後來改為各別商品一個圖表的方式,加上了開關按鈕
當按下 off 之後,我可以做商品合約名稱的修改,按下 on 之後就開始自動下單啦"

這是指每一個商品搭配一個策略AFL
每個AFL都相同只差在裡面的
ContractMonth
方面能停止後修改名稱再起動
是嗎?!

----
另外 IB 的  paper account
是否能如實際狀況
我下了一張 OPEN價的單在K棒開始時
實際的市場上可能因為滑價的關係或是要排
所以不會馬上成交
但在回測上是一定會成交

所以IB 的  paper account  是否也會如實際情況一樣呢?
還是下出去的單都會成交?

謝謝大大指導~



 樓主| 發表於 14-6-17 23:14 | 顯示全部樓層
本帖最後由 kilroy 於 14-6-17 23:19 編輯
skyler 發表於 14-6-17 22:56
啓用 safty card
不會影響IB Controller嗎?!
沒想到大大回覆我了

1. 安全卡只會在登入 IB TWS 時會用到

    基本上除非當機、停電跳電、重開機之外

    IB TWS 不會需要一直去登入

    若網路斷線、IB伺服器斷線、IB伺服器維護等

    IB TWS 會自動重新連線(並不會關閉,除非 auto log-off 請參考此篇)

    若不是上述狀況,須重新開啟IB TWS外

    整個禮拜、整個月,甚至更長的時間,都不會需要再次登入 IB TWS
    IB Controller 是 AB 與 IB TWS API 的橋梁

    它會偵測是否與 IB TWS 正常連線,才可以正常下單

2. 開關是方便避免在修改月份時,有訊號

    不過這只是比較消極的方式,因為換約都是手動換的

    所以勢必要先將當月合約平倉、同向建立新月份新倉、更改合約月份

    其實開關可有可無 ^^"

3. IB paper account 是依照實際狀況(包含 ask/bid)

   所以下限價單會與真實操作時一樣

   需要排隊的




評分

參與人數 1金錢 +2 收起 理由
skyler + 2 好文章,我推薦

查看全部評分

發表於 14-6-18 23:06 | 顯示全部樓層
kilroy 發表於 14-3-28 01:58
Hi,

沒辦法下出去是因為

k大
從頭到尾看完後
有幾個問題不是很懂想跟您請教一下
-----
"AB 可以透過 SCAN 方式(不開圖表)"
在沒有圖表只有Analysis 視窗時
我要掃一小時的K線圖
只要將 Periodicity 設成 1小時即可對吧?

另外在General 裡 對於實際下單有影響的
應該只有Periodicity 其它都在AFL設定了
不知我理解對不對

2014-06-18_223329.png

------
"後來改為各別商品一個圖表的方式,加上了開關按鈕"
請問這是不是將AFL以拖拉的方式
拖放到到圖表中顯示指標?
-----
在89樓您回覆osdak 大
"沒辦法下出去是因為
barcomplete 和 newbar 相互抵觸
所以 new那邊要改寫一下
"

我不太懂為什麼會造成衝突?
以及該如何改寫?


-----
前天您在 170樓的回覆
"SCAN 模式下,會在當根K開始時判斷是否符合買賣條件"

那是不是表示
我如果是在Scan的模式下
根本不用去判斷 barcomplete 呢?

-----
ibc.CloseAllOpenPositions(ContractMonth);  
這句的語法的功用是什麼?
是取消所有尚未成交的委託單嗎?

-----
另外如果要平掉多單空單
是否跟委買委賣一樣?

假設我要以 1000 分別平多單跟空單
是否如下寫法?

平多單
ibc.PlaceOrder(ContractMonth, "SELL", Shares, "LMT", 1000, 0, "DAY", True);

平空單
ibc.PlaceOrder(ContractMonth, "BUY", Shares, "LMT", 1000, 0, "DAY", True);

-----
承上面
1000 之後的 0這個參數代表的是在建倉時給的停損價對吧?

------
以現在
6A #F 的報價是 0.9281
但澳幣409的報價是 9281

以連續月來判斷是否有策略成立
而下單時是下在近月的情況下
我下單的價格是要以連續月的報價 X 10000 來下嗎?

感謝您的指導~


 樓主| 發表於 14-6-19 10:19 來自手機 | 顯示全部樓層
skyler 發表於 14-6-18 23:06
k大
從頭到尾看完後
有幾個問題不是很懂想跟您請教一下

Hi,

沒錯,Periodicity 設定就是掃描的週期

其他資金或是手續費等設定,大多都可以寫在AFL裡,不用另外設定

---
可以用 drag-drop 方式,也可以直接寫在同一AFL檔裡

---
new bar 是判斷是否為新的bar

它會洗掉 staticvarset

所以可能會有互相抵觸的情況

staticvarset 最主要是用來避免重複送單

---
如果你的語法裡有類似 cross(c,condition)
之類的,就要用 barcomplete

只要是用到 c 的都要在 bar 走完之後

---
closeallposition

是把所有部位平倉

加上該合約月份就可以指定平倉那個商品

---
限價單要有價位才能送單

ibc.PlaceOrder("contractmonth", "BUY", 數量, "LMT", 價格, 0, "DAY", True );

這樣子的語法才可以

---
報價和下單要一樣

看你是接那種單位的資料源

不過下市價單應該沒差

參考看看了
發表於 14-6-19 11:30 | 顯示全部樓層
本帖最後由 skyler 於 14-6-19 11:36 編輯
kilroy 發表於 14-6-19 10:19
Hi,

沒錯,Periodicity 設定就是掃描的週期

感謝k大您的回覆
跟您確認一下我的理解有沒有誤

-----
PrevTN = StaticVarGet("TimeNumber"+Name());
TN = LastValue(TimeNum());
NewBar = TN != PrevTN;

我想問NewBar的變化

假設以小時K來看(用開盤時間表示)
-1 (前根K棒):時間是 09:00:00
0 (目前K棒):時間是 10:00:00  

scan 是1秒執行一次
系統時間在 09:59:59 的scan : NewBar = false
系統時間在 10:00:00 的scan : NewBar = true
系統時間在 10:00:01 的scan : NewBar = false

Buy = ExRem( Buy, Short );
假設在這三個時間點都有buy訊號成立

系統時間在 09:59:59 時 BuyOrderID != "" 所以不會有買訊送出
系統時間在 10:00:00 時 BuyOrderID != "" 會送出買訊
系統時間在 10:00:01 時 BuyOrderID != "" 所以不會有買訊送出


今天若加上
barcomplete = BarIndex() < LastValue(BarIndex());


系統時間在 09:59:59 時 -1K尚未走完 barcomplete = false 買訊不成立
系統時間在 10:00:00 時 -1K走完 barcomplete = true 買訊成立
系統時間在 10:00:01 時 0K尚未走完 barcomplete = false 買訊不成立

最後應該只有 10:00:00 時會有單子送出才對呀
想不出來為什麼會有單子送不出去的情境?!

-----
另外想問一下
如果下出去的單是限價單目前正在排而沒有立即成交時
那麼我在以下
BuyOrderID = StaticVarGetText("BuyOrderID"+Name());
SellOrderID = StaticVarGetText("SellOrderID"+Name());
是否就取不到值呢?

-----
ibc.CloseAllOpenPositions(ContractMonth);  
這會是以市價單平掉目前留倉並且也也包含委託中尚未成交單嗎?

如果要用限價來平倉
是否就是如下寫法

平多單(sell):
ibc.PlaceOrder("contractmonth", "SELL", 數量, "LMT", 價格, 0, "DAY", True );

平空單(cover):
ibc.PlaceOrder("contractmonth", "BUY", 數量, "LMT", 價格, 0, "DAY", True );

-----
下市價單就不用管邏輯中的
BuyPrice = CoverPrice = O;
ShortPrice = SellPrice = O;

只要管進出場
buy 或 cover:
ibc.PlaceOrder("contractmonth", "BUY", 數量, "MKT", 價格, 0, "DAY", True );

short 或 sell:
ibc.PlaceOrder("contractmonth", "SELL", 數量, "MKT", 價格, 0, "DAY", True );

所以大大都是下市價單
是為了確保所下的單能成交嗎?

------
突然想到
AB的回測能如果MC那樣
模擬各K線的上下振動來回測嗎
例如
我資料源是1分鐘
但回測K線圖是1小時
是否能做到 ?



再次謝謝您了~



 樓主| 發表於 14-6-19 16:29 | 顯示全部樓層
skyler 發表於 14-6-19 11:30
感謝k大您的回覆
跟您確認一下我的理解有沒有誤

Hi,

new bar 是以 timenum() 來抓的

ex. hourly 2:00 ->2:59 都是 2:00

若當根出現  BUY 訊號,則 BUY 恆為 true

而透過 scan 或 圖表,這個值一直都會是 true

那你的送單語法...

ex. if(lastvalue(buy))
    {
     ibc.PlaceOrder( Name(), "Buy", 100, "MKT", 0, 0, "Day", Transmit);
     }


這個部份就會一直去執行,所以會重覆著送單


我們必須用 StaticVarGetText 來紀錄送單出去成交後的 ID (暫存位置)


如此,當根K只會送這麼一次 BUY ORDER 了


而判斷是否為 new bar 是為了要將這個暫存的狀態清掉

請參考此網址

---
barcomplete 最主要是用在 cross(close,value) 這種進場策略

如果你的進場條件沒用到 Close 價

不用太執著這個部分

---
有成交才會有 order ID 產生

ibc.closeallopenpositions 是市價平倉沒錯

IB Controller 的下單語法與測試

建議開好 IB 後,在 paper account 上實際測試操作最快、最符合需求

---
這個部分可以用 bar replay 功能來觀察

不過 AB 沒有細部回測
---

參考看看了

評分

參與人數 1金錢 +2 收起 理由
skyler + 2 好文章,我推薦

查看全部評分

回復 支持 1 反對 0

使用道具 舉報

發表於 14-6-22 12:35 | 顯示全部樓層
K 大可否跟您請教一下, 如何把 trailling stop 的語法寫進策略裡 ? 再次謝謝 K 大!
 樓主| 發表於 14-6-23 22:49 | 顯示全部樓層
目前的寫法會變成
回測跑 applystop (但實際無法下單)

實測下單是把條件分離開來寫

符合條件後取得IB TWS 倉位再動作

IB Controller(多單停損或停利)

而且發現網路相關範例居然很少 ^^”

---
小弟是從開始就以多空對翻不空手的方式

trailling stop 還真不好寫

寫了還有一些問題需要確定是否送單無誤

我再努力看看



發表於 14-6-24 16:12 | 顯示全部樓層
kilroy 發表於 14-6-17 15:18
Hi,

申請 eSignal 可以到這個網站

k大您好
我在 http://chinafinpipe.com/category_list/realtime/
找不到
Extended Intraday History
CME Group Fee-Waived Globex Data

不知那裡選錯了?!


感謝~
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-12-23 15:25

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |