(1)使用報價欄位要注意一點,那就是它沒有[1]。
(2)運算時,不需要用Round去除小數點。系統會自己運算。你這樣做只會增加系統的負擔。只有在顯示的時候才需要用到Round。
(3)你原本的value5是多餘的,我把它改到isFirstCall的IF裡面,接收過去5天均量的數值,過去5天均量這個數值並不需要盤中一直計算。
(4)符合四個條件才進來判斷是否進出場時間,這個邏輯有問題。應該把控制時間的IF放外面。
(5)計算死亡交叉時候的value2,應直接將value2賦予value7,不需要重新計算8期均線數值。你的停利沒有觸發,是因為value7的緣故。value7在死亡交叉之後接收value2的數值,但下一個Tick它又恢復成0,而value1不可能小於等於0。這裡不應該用value7,而應自行用intrabarpersist宣告變數。
(6)不應該用四個condition控制出場。若商品價格從499漲到500以上,難道就不出場?
(7)想確認交易的日期是今天,不需要盤中都用date=currentdate判斷,這樣很沒效率,可在程式上面加一行程式碼,排除歷史K棒(回測時需要拿掉,不然不會有回測結果):
if getinfo("IsRealTime")=0 then return;
(8)你仔細閱讀我寫的程式,然後對照你原本的程式碼,學習如何有效率地寫程式。
settotalBar(300);
var: intrabarpersist hasRet(false);
var: intrabarpersist RetValue(0);
if getinfo("IsRealTime")=0 then return;
if isFirstCall("Date") then
begin
hasRet=false;
value5=average(getField("成交量", "D")[1], 5);
end;
value1 = getField("close", "1");
value2 = average(value1, 8);
value3 = average(value1, 17);
value4 = q_DailyHigh;
value6 = GetQuote("漲跌幅");
condition1 = value5 > 2000;
condition2 = value1 >= 100;
condition3 = value1 <= 500;
condition4 = value4 > value2 and value4 > value3;
if time >= 093000 and time < 132400 then
begin
if condition1 and condition2 and condition3 and condition4 then
begin
if hasRet=false and value2 cross under value3 then
begin
hasRet = true;
RetValue = value2;
if value6 > 0 and value6 < 8 then setposition(-1);
end;
end;
if position = -1 then
if value1 <= RetValue * 0.985 or value1 >= value4 then
begin
hasRet=true;
setposition(0);
end;
end
else if position < 0 and time >= 132400 then setposition(0);
50 評論