原程式碼
實際交易與回測仍差異很大,為何? - XQ全球贏家官方論壇
以下是GPT強化避免連續委託所修改的程式碼,是否正確?
// %B指標
input: Lengthb(20, "布林通道天數");
input: BandRange(2, "上下寬度");
input: bM(80, "擴展"), bs(60, "緊縮");
variable: up(0), down(0), mid(0);
up = bollingerband(Close, Lengthb, BandRange);
down = bollingerband(Close, Lengthb, -1 * BandRange);
if up - down = 0 then value31 = 0 else value31 = (close - down) * 100 / (up - down);
// ATR
input: Length(6, "ATR天數"), ATRs(2.25, "ATR除數");
value1 = Average(TrueRange, Length);
value2 = open - low;
value3 = high - open;
value4 = high - low;
value5 = value2 / (value4 + 0.0001);
value6 = 1 - value5;
value7 = round(open - open * 0.00015 - (value1 * value5) / ATRs, 2);
condition1 = GetField("收盤價", "Tick") <= value7; // close
value8 = round(open + open * 0.00015 + (value1 * value6) / ATRs, 2);
condition2 = GetField("收盤價", "Tick") >= value8; // close
// 整合條件
input: TM(090200, "進場時間"), P1(10, "操作價位L"), P2(500, "操作價位H"), X1(1, ">買進有漲%停利");
condition7 = GetSymbolInfo("處置股") = false;
condition90 = close > P1 and close < P2 and close < close[1] * 1.05 and condition7;
// 防止重複操作的旗標
var: intrabarpersist SentTime(0), intrabarpersist hasOrdered(false);
// 買賣操作
if position = 0 and filled = 0 and condition90 and currentTime > TM and currentTime <= 110000 then begin
if condition1 and (trueAll(value31 > value31[1], 2) or value7 > value7[1])
and value7 * 1.0045 < GetField("High", "D") then begin
if not hasOrdered then begin
setposition(minList(position + 1, 1), GetField("收盤價", "Tick"), label:="買1-31");
hasOrdered = true;
end;
end;
if condition1 and (trueAll(value31 > value31[1], 2) or value7 > value7[1])
and value7 * 1.0045 < GetField("High", "D") then begin
if not hasOrdered then begin
setposition(minList(position + 1, 1), GetField("收盤價", "Tick"), label:="買1-7");
hasOrdered = true;
end;
end;
end;
if position <> 0 and filled <> 0 then begin
value95 = 100 * (Close - FilledAvgPrice) / FilledAvgPrice; // 停利停損%
if filled = 1 then begin
setposition(0, filledAvgPrice * (1 + (X1 / 100)), label:="買進續漲%停利");
SentTime = GetField("時間", "Tick");
hasOrdered = false;
end;
end;
// 排隊時間和改價時間設置
input: CT1(10, "排隊時間秒"), CT2(60, "改價時間分");
if position = 0 and filled = 1 and GetField("收盤價", "Tick") >= filledAvgPrice * (1 + (X1 / 100))
and GetField("時間", "Tick") >= timeadd(SentTime, "S", CT1)
and addSpread(filledAvgPrice * (1 + (X1 / 100)), 0) >= filledAvgPrice * (1 + (0.435 / 100)) then begin
setposition(0, addSpread(filledAvgPrice * (1 + (X1 / 100)), 0), label:="排隊則調利");
end;
if position = 0 and filled = 1 and GetField("時間", "Tick") >= timeadd(SentTime, "M", CT2) then begin
setposition(0, filledAvgPrice * (1 + (0.45 / 100)), label:="未達委託價調利");
end;