sushozin 兄,
使用XS警示腳本抓最近3日累積日K成交量最大的那個成交價,
大致撰寫邏輯如下:
1. 手動調整資料讀取範圍日期,每天記得要調整資料讀取範圍的日期(T+1),
近T日,則資料讀取範圍的日期請選擇包含今日(20170518),往前算的第四個營業日(20170515,資料讀取範圍請設此日期)。
2. 到最新的K棒(Tick)才會跑警示腳本,往回蒐集近三日的Tick收盤價與單量。
3. 第一個While計算檔數價差、近三日收盤價最大值與收盤價最小值
4. 第二個While將單量累計在各個價格中
5. 最後用陣列找出最大累計成交量後,就能找到最近3日累積日K成交量最大的那個成交價。
策略雷達屬性設定:
因為我是在盤後跑策略,故使用單次洗價模式,請注意資料讀取務必記得要調整資料讀取範圍的日期(T+1),
近三日,則資料讀取範圍的日期請選擇包含今日(20170518),往前算的第四個營業日(20170515,資料讀取範圍請設此日期)。

程式碼範例腳本:
Value1即是,最近3日累積日K成交量最大的那個成交價。
// 每天記得要調整資料讀取範圍的日期(T+1),
// 近T日,則資料讀取範圍的日期請選擇包含今日(20170518),
// 往前算的第四個營業日(20170515,資料讀取範圍請設此日期)。
variable:DateChageFlag(0),while_i(0),MaxClose(0),MinClose(0),DiffClose(0),DiffFlag(0),ArrayIndex(0),for_i(0),MaxVolume(0),MaxVolumeIndex(0);
Array: NumArray[](0);
// 到了最新的K棒(Tick)才Run程式碼
if IsLastBar = false then return;
// 最大值與最小值變數先儲存最新K棒的收盤價
MaxClose = close;
MinClose = close;
// 第一個While
while DateChageFlag < 3
begin
// 計算檔數價差,因為只需要計算一次,故用Flag停止計算
if DiffFlag = 0 and time[while_i] >= 090000 and time[while_i] <= 132500 and close[while_i] <> close[while_i+1] then
begin
DiffFlag = 1;
// 檔數價差,需使用絕對值。
DiffClose = AbsValue(close[while_i] - close[while_i+1]);
end;
// 計算近三日最大值與最小值
if close[while_i] > MaxClose then MaxClose = close[while_i];
if close[while_i] < MinClose then MinClose = close[while_i];
// 只要讀取近三日的序列資料,故換日超過兩次,就停止迴圈
//print(date[while_i],time[while_i],close[while_i]);
if date[while_i] <> date[while_i+1] then DateChageFlag += 1;
while_i += 1;
end;
//print(date,time,close,while_i);
//print(DiffClose,DiffFlag,"Diff");
//print(Maxclose,Minclose,"MAX_MIN");
// 計算陣列有幾個差距(近三日最大值-最小值後,再除以檔數價差)
ArrayIndex = (MaxClose - MinClose)/DiffClose;
//print(ArrayIndex,"ArrayIndex");
// 設定陣列大小,差距 + 1
Array_SetMaxIndex(NumArray,ArrayIndex + 1);
// DateChageFlag與while_i先歸零,因為要Run第二個While分價分量
DateChageFlag = 0;
while_i = 0;
// 第二個While
while DateChageFlag < 3
begin
// Tick成交量累積在各個價格
for for_i = 0 to ArrayIndex
begin
if close[while_i] = MaxClose - for_i * DiffClose then NumArray[for_i + 1] += GetField("成交量","Tick")[while_i];
//print(NumArray[for_i + 1],for_i + 1,"NumArray[for_i + 1]");
end;
//print("");
// 只要讀取近三日的序列資料,故換日超過兩次,就停止迴圈
if date[while_i] <> date[while_i+1] then DateChageFlag += 1;
while_i += 1;
end;
// 找到最大累計成交量
ExtremesArray(NumArray,ArrayIndex + 1,1,MaxVolume,MaxVolumeIndex);
//print(MaxVolume,MaxVolumeIndex,"MaxVolumeIndex");
value1 = MaxClose - (MaxVolumeIndex - 1) * DiffClose;
print(value1,"最近3日累積日K成交量最大的那個成交價");
以上,供參考,有問題歡迎詢問,謝謝。
27 評論