@Alex,請幫忙看看下面代碼是不是有問題? [MC]
-
MC用戶求助:
采用tick周期
目的是價(jià)格比13.10低0.04就買入,比13.10高0.05就賣出
以買入為例:
如果買入成功后,13.10變成13.06,比13.06高0.05賣出,比13.06低0.04買入,以此類推;
vars:mpab(0),order_status(0),order_no(1),cen(13.10),up(0.05),down(0.04);{mpab記錄實(shí)盤證券帳號的總股數(shù),order_status記錄成交狀態(tài),cen代表當(dāng)前參考價(jià)格,up,down分別為上下波動}
if MarketPosition_at_Broker > 0 then
? ? mpab = MarketPosition_at_Broker;
?
if mpab[2] > 0 then {試驗(yàn)發(fā)現(xiàn),無論給mpab什么值,發(fā)生了mpab = MarketPosition_at_Broker后,總是mpab[1]=0,所以參考bar設(shè)為3,mpab[2] >0 保證解決了初始0值的問題,如果初始是0,則condition1一開始都是成立的}
?
begin?
condition1 = mpab > mpab[1];
condition2 = mpab < mpab[1];
condition3 = mpab = mpab[1];
condition4 = close - cen >= up;
condition5 = cen - close >= down;
if condition3 and order_status = 0 then
begin
? ? if condition4 then
? ? begin
? ? ? ? sell 200 shares from entry(text(order_no)) next bar at market;
? ? ? ? print("----sell----");
? ? ? ? order_no = order_no -1;
? ? ? ? order_status = 1;
? ? end;
? ??
? ? if condition5 then
? ? begin
? ? ? ? order_no = order_no + 1;? ??
? ? ? ? buy (text(order_no)) 200 shares next bar at market;? ??
? ? ? ? print("++++buy++++");? ??
? ? ? ? order_status = 1;
? ? end;? ??
end;
?
if condition1 then?
begin
? ? cen = cen + up;
? ? order_status = 0;
end;
?
if condition2 then?
begin
? ? cen = cen - down;
? ? order_status = 0;
end;
end;
print(cen,"? ? ",mpab,"? ? ",mpab[1],"? ? ",order_status ,"? ? ", order_no);
問題出在實(shí)盤模擬的時候,打印了++++buy++++,但是圖上面沒有標(biāo)定買入信號,mpab的值沒有變化,電腦右下也沒有彈出發(fā)出委托的氣泡,請問這是哪里除了問題?
打印結(jié)果如下:?
13.10? ? 101400.00? ? 101400.00? ?? ? 0.00? ?? ? 1.00
??13.10? ? 101400.00? ? 101400.00? ?? ? 0.00? ?? ? 1.00
++++buy++++
??13.10? ? 101400.00? ? 101400.00? ?? ? 1.00? ?? ? 2.00
??13.10? ? 101400.00? ? 101400.00? ?? ? 1.00? ?? ? 2.00
??13.10? ? 101400.00? ? 101400.00? ?? ? 1.00? ?? ? 2.00(來自舊論壇客戶,thgink)
?
-
MC回復(fù)討論一:
您的代碼中有一個bug,您應(yīng)該在開啟自動交易時手動輸入了初始倉位,這個也在您的初始參數(shù)order_no初始值為1中看出來了,我將在下面點(diǎn)出您的問題,假設(shè)都已經(jīng)開啟自動交易了,并且手動輸入了101400股:
第一、初始輸入會在圖表上標(biāo)記"Initial Entry",所以按照您代碼中的方式,您一直賣不出去,因?yàn)槟莊rom entry(text(order_no)),而不是from entry("Initial Entry")。
第二、如果價(jià)格在開啟自動交易之后下降然后執(zhí)行市價(jià)買入命令,我猜測您因?yàn)槭褂媚J(rèn)允許同一方向一筆進(jìn)場,如果是這樣的話,因?yàn)閳D表已經(jīng)有初始多頭進(jìn)場了,后續(xù)即使?jié)M足進(jìn)場條件也不會再多頭進(jìn)場。
第三、基于上面兩點(diǎn),您肯定不能賣出股票也不能買入股票;另外,由于代碼“if MarketPosition_at_Broker > 0 then
? ? mpab = MarketPosition_at_Broker;”的存在,所以一旦mpab不為0,那么導(dǎo)致后續(xù)mpab一直不為0
第四、另外,問一下,您使用是SA模式還是AA模式,使用的是真回報(bào)還是假回報(bào)?
?
-
MC回復(fù)討論二:
SA,真回報(bào)
設(shè)置的是同一方向允許6500筆進(jìn)場
這里的邏輯是昨日收盤,受傷已經(jīng)有很多股票才會執(zhí)行程序,如果沒有股票則什么也不做
?
那個bug我也直到,所以真是的使用的是這個
if condition4 then
begin
if order_no > 1 then?
begin
sell 200 shares from entry(text(order_no)) this bar on close;
order_no = order_no -1;
end
else
sell 200 shares from entry("Initial Entry") this bar on close;
print("----sell----");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
order_status = 1;
end;
?
這兩個似乎都不是問題的關(guān)鍵,問題的關(guān)鍵是MarketPosition_at_Broker不行,換成marketposition*currentshares初步看來就可以了,我本來的目標(biāo)是想通過實(shí)時的獲取券商處的股票數(shù),以判定實(shí)際上是否發(fā)生成交,可是加載策略的時候會把歷史數(shù)據(jù)計(jì)算一次,這會導(dǎo)致一些問題,但是也不是關(guān)鍵,不是歷史數(shù)據(jù)導(dǎo)致的問題就是發(fā)不出單
我想請教:具體得知成交了用那種方式最靠譜?我指的相對靠譜是說確實(shí)成交了,比如掛單200股賣出,我確實(shí)賣了200股
其實(shí),只有一個方式才是穩(wěn)妥的,就是能否根據(jù)時刻獲取持股數(shù),比如在t時刻觸發(fā)條件,做出了買或賣,這時候?qū)時刻的持股數(shù)記錄下來,在對比t之后每個時刻的持股數(shù),如果有變動,變動在預(yù)期值,這說明按要求發(fā)單且成交了。我這個方案的問題在于邏輯上要求得到瞬時變化,這要求我有點(diǎn)高了,可能也與multicharts的每個bar運(yùn)行一次的邏輯有沖突。還像請教您一下,能否獲得比如一小時前的持倉數(shù)?雖然現(xiàn)在并不需要這么做了。
?
?
-
MC回復(fù)討論三:
后來改成這樣了:
[SameExitFromOneEntryOnce = false];
vars:cen(13.40), tims(0),cur(0), up(0.03),down(0.03),cur_r(0),size(200),order_status(0),order_no(0),var1(0);
?
var1 = 0;
?
if 0 >= marketposition_at_broker then buy ("Initial Entry") 10000 shares this bar on close;
cur = currentshares;
if marketposition_at_broker> 0 then
begin
? ? ? ? ? ? ? ? if order_status = 1 and var1 = 0 then
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? var1 = 1;
? ? ? ? ? ? ? ? ? ? ? ? print("order_status = 1 and var1 = 0 ",cur_r,"? ",cur," ",time_s);? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? if cur_r - cur >= size then
? ? ? ? ? ? ? ? ? ? ? ? begin?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print("condition3:",cur_r,"? ",cur," ",time_s);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? order_status = 0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cen = cen + up;
? ? ? ? ? ? ? ? ? ? ? ? end;? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? if cur - cur_r >= size then
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print("condition4:",cur_r,"? ",cur," ",time_s);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? order_status = 0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cen = cen - down;
? ? ? ? ? ? ? ? ? ? ? ? end;
? ? ? ? ? ? ? ? end;
?
? ? ? ? if close - cen >= up and order_status = 0 and var1 = 0 then
? ? ? ? begin
? ? ? ? ? ? ? ? print("condition1 and order_status = 0 and var1 = 0"," ",time_s);
? ? ? ? ? ? ? ? tims = time_s;
? ? ? ? ? ? ? ? if order_no >= 1 then
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? sell size shares from entry(text(order_no)) this bar on close;
? ? ? ? ? ? ? ? order_no = order_no - 1;
? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? sell size shares from entry("Initial Entry") this bar on close;
? ? ? ? ? ? ? ? order_no = 0;
? ? ? ? ? ? ? ? end;
? ? ? ? ? ? ? ? print("----"," ",time_s);
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? order_status = 1;? ? ? ??
? ? ? ? ? ? ? ? var1 = 1;? ? ? ??
? ? ? ? end;
? ? ? ? if cen - close >= down and order_status = 0 and var1 = 0 then
? ? ? ? begin
? ? ? ? ? ? ? ? print("condition2 and order_status = 0 and var1 = 0"," ",time_s);
? ? ? ? ? ? ? ? tims = time_s;
? ? ? ? ? ? ? ? order_no = order_no + 1;
? ? ? ? ? ? ? ? buy (text(order_no)) size shares this bar on close;
? ? ? ? ? ? ? ? print("++++"," ",time_s);
? ? ? ? ? ? ? ? order_status = 1;? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? var1 =1;
? ? ? ? end;?
? ? ? ? if time_s = tims then?
? ? ? ? begin
? ? ? ? print("time_s = tims "," ",time_s);?
? ? ? ? cur_r= currentshares;
? ? ? ? end;
? ? ? ??
end;
?
print(currentbar,"? ? ",var1, "? ? ",tims,"? ?",order_status,"? ? ",order_no,"? ? ",close,"? ?",cen,"? ? ",cur,"? ? ",cur_r,"? ? ",time_s);
? ? ? ??
應(yīng)該沒問題了。
多謝指導(dǎo)!
?
?
-
MC回復(fù)討論四:
后來改成這樣了:
[SameExitFromOneEntryOnce = false];
vars:cen(13.40), tims(0),cur(0), up(0.03),down(0.03),cur_r(0),size(200),order_status(0),order_no(0),var1(0);
?
var1 = 0;
?
if 0 >= marketposition_at_broker then buy ("Initial Entry") 10000 shares this bar on close;
cur = currentshares;
if marketposition_at_broker> 0 then
begin
? ? ? ? ? ? ? ? if order_status = 1 and var1 = 0 then
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? var1 = 1;
? ? ? ? ? ? ? ? ? ? ? ? print("order_status = 1 and var1 = 0 ",cur_r,"? ",cur," ",time_s);? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? if cur_r - cur >= size then
? ? ? ? ? ? ? ? ? ? ? ? begin?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print("condition3:",cur_r,"? ",cur," ",time_s);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? order_status = 0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cen = cen + up;
? ? ? ? ? ? ? ? ? ? ? ? end;? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? if cur - cur_r >= size then
? ? ? ? ? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print("condition4:",cur_r,"? ",cur," ",time_s);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? order_status = 0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cen = cen - down;
? ? ? ? ? ? ? ? ? ? ? ? end;
? ? ? ? ? ? ? ? end;
?
? ? ? ? if close - cen >= up and order_status = 0 and var1 = 0 then
? ? ? ? begin
? ? ? ? ? ? ? ? print("condition1 and order_status = 0 and var1 = 0"," ",time_s);
? ? ? ? ? ? ? ? tims = time_s;
? ? ? ? ? ? ? ? if order_no >= 1 then
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? sell size shares from entry(text(order_no)) this bar on close;
? ? ? ? ? ? ? ? order_no = order_no - 1;
? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? begin
? ? ? ? ? ? ? ? sell size shares from entry("Initial Entry") this bar on close;
? ? ? ? ? ? ? ? order_no = 0;
? ? ? ? ? ? ? ? end;
? ? ? ? ? ? ? ? print("----"," ",time_s);
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? order_status = 1;? ? ? ??
? ? ? ? ? ? ? ? var1 = 1;? ? ? ??
? ? ? ? end;
? ? ? ? if cen - close >= down and order_status = 0 and var1 = 0 then
? ? ? ? begin
? ? ? ? ? ? ? ? print("condition2 and order_status = 0 and var1 = 0"," ",time_s);
? ? ? ? ? ? ? ? tims = time_s;
? ? ? ? ? ? ? ? order_no = order_no + 1;
? ? ? ? ? ? ? ? buy (text(order_no)) size shares this bar on close;
? ? ? ? ? ? ? ? print("++++"," ",time_s);
? ? ? ? ? ? ? ? order_status = 1;? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? var1 =1;
? ? ? ? end;?
? ? ? ? if time_s = tims then?
? ? ? ? begin
? ? ? ? print("time_s = tims "," ",time_s);?
? ? ? ? cur_r= currentshares;
? ? ? ? end;
? ? ? ??
end;
?
print(currentbar,"? ? ",var1, "? ? ",tims,"? ?",order_status,"? ? ",order_no,"? ? ",close,"? ?",cen,"? ? ",cur,"? ? ",cur_r,"? ? ",time_s);
? ? ? ??
應(yīng)該沒問題了。
多謝指導(dǎo)!
?
有思路,想編寫各種指標(biāo)公式,程序化交易模型,選股公式,預(yù)警公式的朋友
可聯(lián)系技術(shù)人員 QQ: 511411198 進(jìn)行 有償 編寫!(不貴!點(diǎn)擊查看價(jià)格!)
相關(guān)文章
-
沒有相關(guān)內(nèi)容