kilroy
發表於 14-3-19 01:11
本帖最後由 kilroy 於 14-3-19 01:14 編輯
osdak 發表於 14-3-19 00:31 static/image/common/back.gif
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 的部分
不知道大大錯誤的訊息是什麼,可否貼上來讓小弟看一下
謝謝
參考看看了~
kilroy
發表於 14-3-19 01:36
osdak 發表於 14-3-19 00:31 static/image/common/back.gif
kilroy兄,
剛注冊就看到這麼好的帖, 感謝. 因為學用amibroker不久, 還在摸索, 有些可能您眼中很簡單的問題 ...
你一開始的這段, 為什麼是BuyTrigger AND BuyOrderID 都是沒有值時, 才CloseAllPpenPosition呢?
小弟剛重複看了一下大大的問題,以及小弟的回答,發現這裡沒有回答到
---
由於倉位的變化 ex. -1->1 or 1->-1 etc...
這個等於是要多寫一段判斷式子
所以最快的方式就是把手邊部位全部平掉,再進場新的部位(多單或空單)
好處就是不用寫一長串判斷
而且做 position sizing 也很好做,只要把模組算出來的值直接給 shares 就可以了
因為不管倉位要怎麼變之前,會先把原有的部位平掉後再做動作
參考看看了~
osdak
發表於 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會一行一行看, 但按你解釋, 先是用去把TimeNum()的值放於TN中(這個是array, 對嗎), 再用把TN的值(就是TimeNum()的值)再放於["TimeNumber"+Name()), 再用這句放於PrevTN中, 那我會有問題如下:
a.)為什麼這句放於另外兩句之前都可以? 因為是array語法, 所以前後關係不重要?
b.)我之前用vba等language, 可以一步一步追蹤那些var的數值變法, 比較好學習和debug, 請問於amirboker中, 有沒有相關的功能?還是我要用addcolumn把所有資料於做一個bar中的變化顯示出來?
謝謝. you are so nice.
kilroy
發表於 14-3-19 16:39
osdak 發表於 14-3-19 16:09 static/image/common/back.gif
謝謝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正式版
推一個
osdak
發表於 14-3-19 21:36
kilroy兄, 我試用了, 但只有title這一行有問點, 我//後就沒問題, 可否指教一下?
kilroy
發表於 14-3-19 21:51
osdak 發表於 14-3-19 21:36 static/image/common/back.gif
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 ) ) ));
這個是顯示在圖表上方
參考看看了~
osdak
發表於 14-3-19 23:01
kilroy 發表於 14-3-19 16:39 static/image/common/back.gif
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是怎樣的? 謝謝!
kilroy
發表於 14-3-19 23:17
本帖最後由 kilroy 於 14-3-19 23:19 編輯
osdak 發表於 14-3-19 23:01 static/image/common/back.gif
謝謝回覆. 我再想請教:
Hi,
是否想的太複雜?
先看好 lastvalue()
還有 StaticVarGet StaticVarSet 的語法
---
當新的K棒產生時,也意味著新的週期(時間)
如此一來, ex. 091500 不會等於 092000
哪 Newbar = !TN==PrevTN; 就是 true 了
懂小弟表達的意思嗎?
也就是說,每根k都會把當根k的時間丢給 PrevTN
那下一根新的K,時間一定不會跟前一根K一樣的
藉此判斷為 NewBar 再將 orderID的字串清掉
不知道這樣大大是否瞭解了
參考看看吧~~
osdak
發表於 14-3-20 00:53
kilroy 發表於 14-3-19 23:17 static/image/common/back.gif
Hi,
是否想的太複雜?
謝謝幫助, 我大約看懂了, 應該可以把sell和cover加上. 謝謝!!
osdak
發表於 14-3-20 01:26
我研究了一會, 還是要請教一下{:4_186:}
我想在你的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去判斷?
謝謝
kilroy
發表於 14-3-20 11:40
osdak 發表於 14-3-20 01:26 static/image/common/back.gif
我研究了一會, 還是要請教一下
我想在你的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(),"");
---
這樣就可以了
參考看看囉~~
osdak
發表於 14-3-20 13:25
kilroy 發表於 14-3-20 11:40
Hi,
如果是我,我會這樣做...
對, 聰明!我老是想判斷倉位和怎樣把cover和buy的signal分開,你的方法快速和直接,謝謝。
陳小花
發表於 14-3-20 14:44
幾個月沒用amibroker了
現在看你們的code又變天書了.....
webxp
發表於 14-3-21 09:33
joshsmi 發表於 14-3-15 16:38 static/image/common/back.gif
You can use NET with AmiBroker also, see here http://www.dotnetforab.com/
MultiChart .NET SE 免費卻提供全功能,是最大的誘因 :)
頁:
1
2
[3]
4
5
6
7
8
9
10
11
12