練習交流~分享想法之 -庫存自訂排序壓力價前先平倉獲利、若回檔則當沖

  •   118 
  • 最後發表   xqyi  2024 七月 14
xqyi 發文於   2024/07/10

1.庫存虧損時若小賺 自訂壓力價前先平倉

2.也可不放成本計算,在壓力價前平倉

3. 平倉後若要買回當沖------尚未完成

setBarBack(500);

//壓力支撐價位

Vars: intrabarpersist maxLessThanLow(0), intrabarpersist minGreaterThanHigh(0),

intrabarpersist mTlow(0), intrabarpersist mThigh(0);

var:i(0);

Array: values[19](0) ;

    values[1] = round(average(getField("收盤價","D"),5),2); // 5日均

    values[2] = round(average(getField("收盤價","D"),10),2); // 10日均

    values[3] = round(average(getField("收盤價","D"),30),2); // 30日均

    values[4] = round(average(getField("收盤價","D"),60),2); // 60日均

    values[5] = highest(High, 5);//5日高 

    values[6] = highest(High, 25);//25日高 

    values[7] = highest(High, 75);//75日高 

    values[8] = highest(High, 300);//300日高

    values[9] = round(bollingerband(Close, 20, 2),2); // 布林上 

    values[10] = round(High,2); // 今高

    values[11] = round(Close,2); // 今收

    values[12] = round(Low,2); // 今低 

    values[13] = round(average(Close, 20),2); // 布林中

    values[14] = round(bollingerband(Close, 20, -2),2); // 布林下

    values[15] = round(xf_EMA("w",getField("收盤價","W"),12),2); // WE12 

    values[16] = round(xf_EMA("W",getField("收盤價","W"),26),2); // WE26 

    values[17] = EMA(getField("收盤價","D"),12); // DE12 

    values[18] = EMA(getField("收盤價","D"),26); // DE26 

    values[19] = round(GetField("控盤者成本線")[1],2);



value27=HighestArray(values,19);

value28=LowestArray(values,19);



// 初始化 minGreaterThanHigh 和 maxLessThanLow

minGreaterThanHigh = value27*1.1;

maxLessThanLow = value28*0.9;



For i = 1 to 19 

begin

    // 找出大于 high 的最小值 壓力

    if values[i] > High then 

    begin

        if values[i] < minGreaterThanHigh then

            minGreaterThanHigh = values[i];

    end;


    // 找出小于 low 的最大值 支撐

    if values[i] < Low then 

    begin

        if values[i] > maxLessThanLow then

            maxLessThanLow = values[i];

    end;

end;



// 更新壓力價和支撐價

mThigh = minGreaterThanHigh;

mTlow = maxLessThanLow;


//----------------------------平倉賣

input:

    TM(090100,"進場時間"),LLP(1,"最低獲利%"),LLM(1.5,"最低獲利千元"),

    CT1(5,"排隊時間S"),CT2(3,"改價時間H"),  mth(-2,"壓力價-檔");

var: intrabarpersist SentTime(0) ,intrabarpersist FRC1(0);

if 

position > 0 //未委賣

and  filled > 0 //有庫存

and currentTime > TM //進場時間


then

begin


//1S

    if position > 0 //確保未委賣

        and filled > 0 //確保有庫存

        and getField("漲停價", "D") > filledAvgPrice*(1+LLP/100) //避免放空及虧損賣出,有>最低獲利1%

        and  addSpread(mThigh,mth) >= filledAvgPrice*(1+LLP/100) //壓力價-1檔 並確保大於最低獲利

    then begin

        if close=getField("漲停價", "D") then

        setposition(0,addSpread(getField("漲停價", "D"),-1),label:="漲停賣");

        setposition(0,addSpread(mThigh,mth),label:="壓力價停利");//0702 mth-2檔

        setposition(0,(filledAvgPrice*(1+LLP/100))+LLM,label:="1000停利");

            //委賣最低獲利壓力價-1檔或1000

        SentTime=Getfield("時間","Tick");//紀錄委賣時間

        FRC1=getField("當日序號", "Tick");//紀錄序號

        end;

end;

     



if position=0 //已經委賣

    and filled >0  //委賣但未成交

    and GetField("收盤價","Tick") >=filledAvgPrice*(1+LLP/100) //現價大於成本價最低獲利

    and Getfield("時間","Tick")>=timeadd(SentTime,"H",CT2) //排隊時間超過CT2

    and  addSpread(mThigh,mth) >= filledAvgPrice*(1+LLP/100) //壓力價-1檔情況下,還>=最低獲利1%

then 

    setposition(0,minList(addSpread(mThigh,mth),addSpread(((filledAvgPrice*(1+LLP/100))+LLM),-1)),label:="3H未達委託調價"); 

    //平倉取最小值(壓力價-1檔 或 最低獲利價+1.5元-1檔的價格  ) 

 

排序方式: 標準 | 最新
xqyi 發文於   2024/07/11

//----------賣出後若有回檔則買回。 該如何抓取賣出的價格?

if filled=-1 then begin

if getField("收盤價", "Tick") < addSpread(mTLow,mth) then

setposition(position +1 , getField("收盤價", "Tick"),label:="支撐買回");

if getField("收盤價", "Tick") < DefaultSellPrice*0.98 then 

setposition(position+1,getField("收盤價", "Tick"),label:="差價買回");

//

1. 這個腳本用在有庫存時,先賣後買,回測可能會沒有交易,會自動抓庫存部位?

2. 如果要用差價買回,因為預先不知道回賣出在哪個價位,該如何抓取賣出的價格 DefaultSellPrice ?

xqyi 發文於   2024/07/12

是否有前輩能指教,目前壓力價調整得檔位是手動,

是否可以根據歷史資料,自動調整找出更適合的檔位以利更適合觸發條件?

xqyi 發文於   2024/07/13

自動調整找出更適合的檔位以利更適合觸發條件=>

可以考慮以價差計算,用布林函數的適合的標準差來自動調整價差

虎科大許教授 發文於   2024/07/13

下面同時三個setposition是不行的。

if close=getField("漲停價", "D") then

setposition(0,addSpread(getField("漲停價", "D"),-1),label:="漲停賣");

setposition(0,addSpread(mThigh,mth),label:="壓力價停利");//0702 mth-2檔

setposition(0,(filledAvgPrice*(1+LLP/100))+LLM,label:="1000停利");

xqyi 發文於   2024/07/14

三個不行的原因是?

想法是 若獲利 哪一個先符合先執行

1.一開盤就漲停則漲停平倉

//可能未達壓力價但已漲停

2.壓力價位先平倉

//通常為較會觸發的程式行

3. 固定獲利額度

//可能未達壓力價但有期望獲利金額

 

鍵盤上的小白兔 發文於   2024/07/14

(A)setposition(0,addSpread(getField("漲停價", "D"),-1),label:="漲停賣");

(B)setposition(0,addSpread(mThigh,mth),label:="壓力價停利");//0702 mth-2檔

(C)setposition(0,(filledAvgPrice*(1+LLP/100))+LLM,label:="1000停利");

A執行過後 , position已經為0 , 因此B和C不會執行

 

如果哪一個先符合先執行 , 可能要分成3個判斷式

xqyi 發文於   2024/07/14

我的想法比較直接,因為條件相同,只是盤中價位獲利的觸發時間點差異,

若條件有到,這三個只會被執行一個,把優先想要的寫在前面的程式行作為判斷。

鍵盤上的小白兔 發文於   2024/07/14

剛剛看了一下我的回覆 , 我覺得我寫的不夠嚴謹

同一次洗價 , 只會執行第一次遇到的setposition

後面再遇到的setposition , 會被忽略掉

 

虎科大許教授 發文於   2024/07/14

同一次洗價,只有第一個setposition會被執行。

xqyi 發文於   2024/07/14

同一次洗價 , 只會執行第一次符合條件的setposition=>程式想法是這樣沒錯!

實際庫存交易時=>大部分會執行第二個,若商品價位高的會觸發第三個(除非調整獲利)

第一個,因為一開盤就漲停的機率較低,庫存交易目前沒發生過觸發(回測無法抓取庫存部位)

顯示更多回應 發表回覆
Close