COCO研究院

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

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

  [複製鏈接]
 樓主| 發表於 14-3-19 01:11 | 顯示全部樓層
本帖最後由 kilroy 於 14-3-19 01:14 編輯
osdak 發表於 14-3-19 00:31
kilroy兄,

剛注冊就看到這麼好的帖, 感謝. 因為學用amibroker不久, 還在摸索, 有些可能您眼中很簡單的問題 ...

Hi,
PrevTN = StaticVarGet("TimeNumber"+Name());
上面這行取的值就是這行 TN = LastValue(TimeNum());
設定這個值的方式就是這行 StaticVarSet("TimeNumber"+Name(),TN);

---
BuyTrigger = LastValue(Buy);
當進場多單條件成立時,回傳 true

BuyOrderID = StaticVarGetText("BuyOrderID"+Name());
上面這行的解釋是在IB Controller下單機送單(pending)出去後
會產生一個 OrderID,我們把 ID 分成 BUY的ID(BuyOrderID) 和 SELL的ID(SellOrderID)
並與該商品的 symbol (+Name()) 做為區別,如此,當有單送出成交後
這個 BuyOrderID就不會是空白的 ("")

if(BuyTrigger and BuyOrderID =="")
{
...
}
所以上面的條件式需滿足 buytrigger = true 與 buyorderid = "" (空白) 才會動作


與 if(NewBar) {...} 連用的用意就是...

由於當根K一直處於滿足進場條件的狀況,所以我們給了這個進場條件一個ID

當產生了這個ID後,表示已經送單成交(filled)了(orderid 就不會是空白了)

這樣才不會在當根K重複送單出去,而在下一根K(new bar)時會把 orderID 清空

---
小弟這邊貼的範例中...

ibc.ModifyOrder... 和 ibc.PlaceOrder... 兩者皆可正常送單

但我不是把 ibc.PlaceOrder 做 comment

在AB裡,小弟習慣用 // 來讓某一行不去執行

這邊建議可以直接用第一行
BuyOrderID = ibc.PlaceOrder(ContractMonth, "BUY", Shares, "MKT", 0, 0, "DAY", True);

因為這個範例我原本是用來測試送單後改單的語法

---
title 的部分

不知道大大錯誤的訊息是什麼,可否貼上來讓小弟看一下

謝謝

參考看看了~

評分

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

查看全部評分

 樓主| 發表於 14-3-19 01:36 | 顯示全部樓層
osdak 發表於 14-3-19 00:31
kilroy兄,

剛注冊就看到這麼好的帖, 感謝. 因為學用amibroker不久, 還在摸索, 有些可能您眼中很簡單的問題 ...
你一開始的這段, 為什麼是BuyTrigger AND BuyOrderID 都是沒有值時, 才CloseAllPpenPosition呢?


小弟剛重複看了一下大大的問題,以及小弟的回答,發現這裡沒有回答到

---
由於倉位的變化 ex. -1->1 or 1->-1 etc...

這個等於是要多寫一段判斷式子

所以最快的方式就是把手邊部位全部平掉,再進場新的部位(多單或空單)

好處就是不用寫一長串判斷

而且做 position sizing 也很好做,只要把模組算出來的值直接給 shares 就可以了

因為不管倉位要怎麼變之前,會先把原有的部位平掉後再做動作



參考看看了~
發表於 14-3-19 16:09 | 顯示全部樓層
謝謝kilroy兄, 很清楚, 但因為我之前寫的program, 經驗更amibroker的差很遠, 所以還有一些地方不明(所以我對amirboker用for-loop一個個bar去看, 反而容易看明白), 想請教:

1. 我見您所以地方都加Name(), 是為了區分, 對不對? 如果我只有一種貨品, 都可以免了, 對嗎?
2. PrevTN = StaticVarGet("TimeNumber"+Name());
  TN = LastValue(TimeNum());
  NewBar = TN != PrevTN;
  StaticVarSet("TimeNumber"+Name(),TN);
你解釋後, 我明白, 但有一點很奇怪, 我理解的是amirboker會一行一行看, 但按你解釋, 先是用[TN = LastValue(TimeNum()); ]去把TimeNum()的值放於TN中(這個是array, 對嗎), 再用[StaticVarSet("TimeNumber"+Name(),TN); ]把TN的值(就是TimeNum()的值)再放於["TimeNumber"+Name()), 再用[PrevTN = StaticVarGet("TimeNumber"+Name()); ]這句放於PrevTN中, 那我會有問題如下:
a.)為什麼[PrevTN = StaticVarGet("TimeNumber"+Name()); ]這句放於另外兩句之前都可以? 因為是array語法, 所以前後關係不重要?
b.)我之前用vba等language, 可以一步一步追蹤那些var的數值變法, 比較好學習和debug, 請問於amirboker中, 有沒有相關的功能?還是我要用addcolumn把所有資料於做一個bar中的變化顯示出來?

謝謝. you are so nice.
 樓主| 發表於 14-3-19 16:39 | 顯示全部樓層
osdak 發表於 14-3-19 16:09
謝謝kilroy兄, 很清楚, 但因為我之前寫的program, 經驗更amibroker的差很遠, 所以還有一些地方不明(所以我 ...

Hi,

1.
   用 +Name() 就可以取得該商品的 symbol

   所以每個商品都有自己的一個名字

   在 AB 裡,字串是用 "" 表示的,而 Name() 本身就是回傳字串

   所以如果現在這個商品的symbol是 CL #F,那這個字串就會是  TimeNumberCL #F

   如此,每個商品有每個商品自己的名字之後,就不會搞錯了

   建議還是先寫好,這樣之後新增商品可以直接使用

2. 你的理解沒有錯,AB是一行一行看下來

    不過 StaticVarGet, StaticVarSet 這些函數的使用方式就是這樣子

    ---
    在 AB 裡可以使用 printf 和 _TRACE 來除錯




參考看看了
發表於 14-3-19 18:11 | 顯示全部樓層
感謝分享~~今年也在年初升級amibroker正式版
推一個
發表於 14-3-19 21:36 | 顯示全部樓層
捕获.PNG
kilroy兄, 我試用了, 但只有title這一行有問點, 我//後就沒問題, 可否指教一下?
 樓主| 發表於 14-3-19 21:51 | 顯示全部樓層
osdak 發表於 14-3-19 21:36
kilroy兄, 我試用了, 但只有title這一行有問點, 我//後就沒問題, 可否指教一下?
...

Hi,

因為  title 指定是什麼

剛看了一下範例,沒有貼到 囧"

---
這行加下去就可以了

_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));


這個是顯示在圖表上方


參考看看了~
發表於 14-3-19 23:01 | 顯示全部樓層
kilroy 發表於 14-3-19 16:39
Hi,

1.

謝謝回覆. 我再想請教:


PrevTN = StaticVarGet("TimeNumber"+Name()); // 這句如用你的例子, 比如商品是CL#F, 會把TimeNumberCL#F的值指派給PrevTN.


TN = LastValue(TimeNum()); //這句是把最latest的時間給了TN, 比如09:15:00, 就會是091500


NewBar = TN != PrevTN; //這句我就不明白, TN跟PrevTN比較, 不一樣就是newbar, 為什麼不同type的東西去比較?


StaticVarSet("TimeNumber"+Name(),TN); //這句是StaticVarSet( ''varname'', value ), 就是把TN的值指派給TimeNumberCL#F, 就是把091500指派給TimeNumberCL#F, 而上面是把TimeNumberCL#F的值派給PrevTN, 如果是array, 我想問, 那不是TN和 PrevTN都是一樣嗎? 也就是把最後的時間(latest) 指派給TN和PrevTN? 我用addcolumn看每個bar的變化, 也看到這結果, 請問去判斷是否newbar的中logic是怎樣的? 謝謝!

捕获.PNG

 樓主| 發表於 14-3-19 23:17 | 顯示全部樓層
本帖最後由 kilroy 於 14-3-19 23:19 編輯
osdak 發表於 14-3-19 23:01
謝謝回覆. 我再想請教:


Hi,

是否想的太複雜?

先看好 lastvalue()

還有 StaticVarGet StaticVarSet 的語法

---

當新的K棒產生時,也意味著新的週期(時間)

如此一來, ex. 091500 不會等於 092000

哪 Newbar = !TN==PrevTN; 就是 true 了

懂小弟表達的意思嗎?

也就是說,每根k都會把當根k的時間丢給 PrevTN

那下一根新的K,時間一定不會跟前一根K一樣的

藉此判斷為 NewBar 再將 orderID的字串清掉

不知道這樣大大是否瞭解了

參考看看吧~~



評分

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

查看全部評分

發表於 14-3-20 00:53 | 顯示全部樓層
kilroy 發表於 14-3-19 23:17
Hi,

是否想的太複雜?

謝謝幫助, 我大約看懂了, 應該可以把sell和cover加上. 謝謝!!
發表於 14-3-20 01:26 | 顯示全部樓層
我研究了一會, 還是要請教一下
我想在你的code上面加上sell和cover, 那我原本的想法是:

else if( SellTrigger AND BuyOrderID != "" )
else if( BuyTrigger AND SellOrderID != "" )
去判斷sell/buy之前是否有倉位, 但我想想不對, 因為orderID只在有signal那根k才有, newbar又會清空, 所以想是不成的.

那可否做些提示, 應如何去判斷? 可否用GetPositionSize>0 / GetPositionSize<0 再加selltrigger和 buytrigger去判斷?

謝謝
 樓主| 發表於 14-3-20 11:40 | 顯示全部樓層
osdak 發表於 14-3-20 01:26
我研究了一會, 還是要請教一下
我想在你的code上面加上sell和cover, 那我原本的想法是:

Hi,

如果是我,我會這樣做...

因為 sell(多單平倉) cover(空單平倉)

所以這兩個倉位都會是零

也就是說我們可以這樣做

Clear = sell or cover;
ClearTrigger = LastValue(Clear);
ClearID = StaticVarGetText("ClearID"+Name());
ClearPending = ibc.IsOrderPending(ClearID);


if( ClearTrigger AND ClearID == "" )
{
ibc.CloseAllOpenPositions(ContractMonth);
StaticVarSetText("ClearID"+Name(),ClearID);
}

當然,newbar 這裡就要再加上一行
if( NOT ClearPending ) StaticVarSetText("ClearID"+Name(),"");

---
這樣就可以了

參考看看囉~~

評分

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

查看全部評分

發表於 14-3-20 13:25 來自手機 | 顯示全部樓層
kilroy 發表於 14-3-20 11:40
Hi,

如果是我,我會這樣做...

對, 聰明!我老是想判斷倉位和怎樣把cover和buy的signal分開,你的方法快速和直接,謝謝。
發表於 14-3-20 14:44 | 顯示全部樓層

幾個月沒用amibroker了

現在看你們的code又變天書了.....
發表於 14-3-21 09:33 | 顯示全部樓層
joshsmi 發表於 14-3-15 16:38
You can use NET with AmiBroker also, see here http://www.dotnetforab.com/

MultiChart .NET SE 免費卻提供全功能,是最大的誘因 :)
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

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

GMT+8, 24-11-22 11:16

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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