采用tick周期
目的是價格比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記錄實盤證券帳號的總股數,order_status記錄成交狀態,cen代表當前參考價格,up,down分別為上下波動}
if MarketPosition_at_Broker > 0 then
? ? mpab = MarketPosition_at_Broker;
?
if mpab[2] > 0 then {試驗發現,無論給mpab什么值,發生了mpab = MarketPosition_at_Broker后,總是mpab[1]=0,所以參考bar設為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);
問題出在實盤模擬的時候,打印了++++buy++++,但是圖上面沒有標定買入信號,mpab的值沒有變化,電腦右下也沒有彈出發出委托的氣泡,請問這是哪里除了問題?
打印結果如下:?(來自舊論壇客戶,thgink)
?
您的代碼中有一個bug,您應該在開啟自動交易時手動輸入了初始倉位,這個也在您的初始參數order_no初始值為1中看出來了,我將在下面點出您的問題,假設都已經開啟自動交易了,并且手動輸入了101400股:
第一、初始輸入會在圖表上標記"Initial Entry",所以按照您代碼中的方式,您一直賣不出去,因為您是from entry(text(order_no)),而不是from entry("Initial Entry")。
第二、如果價格在開啟自動交易之后下降然后執行市價買入命令,我猜測您因為使用默認允許同一方向一筆進場,如果是這樣的話,因為圖表已經有初始多頭進場了,后續即使滿足進場條件也不會再多頭進場。
第三、基于上面兩點,您肯定不能賣出股票也不能買入股票;另外,由于代碼“if MarketPosition_at_Broker > 0 then
? ? mpab = MarketPosition_at_Broker;”的存在,所以一旦mpab不為0,那么導致后續mpab一直不為0
第四、另外,問一下,您使用是SA模式還是AA模式,使用的是真回報還是假回報?
?
SA,真回報
設置的是同一方向允許6500筆進場
這里的邏輯是昨日收盤,受傷已經有很多股票才會執行程序,如果沒有股票則什么也不做
?
那個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;
?
這兩個似乎都不是問題的關鍵,問題的關鍵是MarketPosition_at_Broker不行,換成marketposition*currentshares初步看來就可以了,我本來的目標是想通過實時的獲取券商處的股票數,以判定實際上是否發生成交,可是加載策略的時候會把歷史數據計算一次,這會導致一些問題,但是也不是關鍵,不是歷史數據導致的問題就是發不出單
我想請教:具體得知成交了用那種方式最靠譜?我指的相對靠譜是說確實成交了,比如掛單200股賣出,我確實賣了200股
其實,只有一個方式才是穩妥的,就是能否根據時刻獲取持股數,比如在t時刻觸發條件,做出了買或賣,這時候將t時刻的持股數記錄下來,在對比t之后每個時刻的持股數,如果有變動,變動在預期值,這說明按要求發單且成交了。我這個方案的問題在于邏輯上要求得到瞬時變化,這要求我有點高了,可能也與multicharts的每個bar運行一次的邏輯有沖突。還像請教您一下,能否獲得比如一小時前的持倉數?雖然現在并不需要這么做了。
?
?
后來改成這樣了:
[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);
? ? ? ??
應該沒問題了。
多謝指導!
?
?
后來改成這樣了:
[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);
? ? ? ??
應該沒問題了。
多謝指導!
?