 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
[求救]迴圈語法及DoBS變數
版主你好:
有學習寫 兩口單交易,當沖策略 ,
研究多時在迴圈語法及DoBS變數上卡關,
懇請版主檢視賜教、協助完成,感恩。
先建立子公式515BS,指標BSLINE為進出線
M1:=(CROSS(MA(CLOSE,5), MA(CLOSE,15)));
M2:=(CROSS(MA(CLOSE,15), MA(CLOSE,5)));
M3:=M1-M2;
方向:=BARSLAST( M3 );
BS_CT:=barslast((方向=1 and ref(方向<>1,1))OR (方向=-1 and ref(方向<>-1,1)));
BSLINE:REF(O, BS_CT);
再引用子公式515BS指標的MIN1、MIN5、MIN30 不同周期
當沖策略:
無論多單或空單,滿倉最多為兩口單。
多單庫存兩口時,如因多減碼一口或多平一口,未滿倉時,
多進或多加 訊號再出現時會再進一口,但滿倉時不下單,空單同上。
多訊或空訊皆為次一根,停損或停利皆為當根。
進場超過盈利20點則回檔12點 停利
進場超過盈利60點則回檔30% 停利
停損點數:15
在C>BS30 只做多 不做空,
C>BS1多進一口 //+1,滿倉時不下單。
C>BS5多加碼一口 //+1,滿倉時不下單。
C<BS1多減碼一口 // -1,無多單庫存時不下單
C<BS5多減碼一口 // -1,無多單庫存時不下單
在C<BS30 只做空不做多,
C<BS1空單一口 // -1,滿倉時不下單。
C<BS5空加碼一口 // -1,滿倉時不下單。
C>BS1空減碼一口 // +1,無空單庫存時不下單
C>BS5空減碼一口 // +1,無空單庫存時不下單
以下是公式語法目前進度:( 後段應是錯誤一堆 > <” )
BS1:="515BS.BSLINE#MIN1";
BS5:=" 515BS.BSLINE#MIN5";
BS30:=" 515BS.BSLINE#MIN30";
多進:=C>BS30 and cross(C,BS1);// +1滿倉時不下單。
多加:=C>BS30 and cross(C,BS5);// +1滿倉時不下單。
多減:=C>BS30 and cross(BS1,C);// -1無多單庫存時不下單
多平:=C>BS30 and cross(BS5,C);// -1無多單庫存時不下單
空進:=C < BS30 and cross(BS1,C);// -1滿倉時不下單。
空加:=C < BS30 and cross(BS5,C);// -1滿倉時不下單。
空減:=C < BS30 and cross(C,BS1);// +1無空單庫存時不下單
空平:=C < BS30 and cross(C,BS5);// +1無空單庫存時不下單
StDoTime:=085000;
多進:= REF(多進,1) and time>=StDoTime or barpos=0;
多加:= REF(多加,1) and time>=StDoTime or barpos=0;
多減:= REF(多減,1) and time>=StDoTime or barpos=0;
多平:= REF(多平,1) and time>=StDoTime or barpos=0;
空進:= REF(空進,1) and time>=StDoTime or barpos=0;
空加:= REF(空加,1) and time>=StDoTime or barpos=0;
空減:= REF(空減,1) and time>=StDoTime or barpos=0;
空平:= REF(空平,1) and time>=StDoTime or barpos=0;
進場:= (多進+多加+空減+空平) - (空進+空加+多減+多平);
強出:=time>=133500;
限進:=time>=123500;
限停損次:=3; // 若為停損出場3次,當日不下單
滿倉:=2; //每日
停損點數:=15;
多進本:= ref(O,barslast(多進));
多加本:= ref(O,barslast(多加));
空進本:= ref(O,barslast(空進));
空加本:= ref(O,barslast(空加));
OO:=O; CC:=C; HH:=H; LL:=L;
StDE:=barpos=1 or time=StDoTime;
DoBS:C*0 NOAXIS; RecDO:C*0 linethick;
多空:=0; //1.多 -1.空 0.無
for i=1 to datacount do begin
if StDE[i] then begin
累停損次:=0; WaitBS:=0;
end;
if 多空=0 and 強出[i]=0 and 限進[i]=0 and 累停損次<限停損次then begin
if WaitBS=0 or WaitBS=進場[i] then begin
多空:=進場[i];
if 多空<>0 then begin
進價:=OO[i]; Max盈:=0; PreTN:=0; WaitBS:=-SGN(多空);
RecDO[i]:=SGN(多空);
end;
end;
end else if 多空<>0 then begin
NowDir:=SGN(多空);
if 強出[i] then begin
多空:=0; RecDO[i]:=NowDir*7;
end else if (C-多進本)*NowDir<= -停損點數
and多空:=2 then begin
多空:=1; 累停損次:=累停損次+1; //停損
end else if (C-多進本)*NowDir<= -停損點數
and多空:=1 then begin
多空:=0; 累停損次:=累停損次+1; //停損
end else if (C-多加本)*NowDir<= -停損點數
and多空:=2 then begin
多空:=1; 累停損次:=累停損次+1; //停損
end else if (C-多加本)*NowDir<= -停損點數
and多空:=1 then begin
多空:=0; 累停損次:=累停損次+1; //停損
end else if (C-空進本)*NowDir>= 停損點數
and多空:=-2 then begin
多空:=-1; 累停損次:=累停損次+1; //停損
end else if (C-空進本)*NowDir>= 停損點數
and多空:=-1 then begin
多空:=0; 累停損次:=累停損次+1; //停損
end else if (C-空加本)*NowDir>= 停損點數
and多空:=-2 then begin
多空:=-1; 累停損次:=累停損次+1; //停損
end else if (C-空加本)*NowDir>=停損點數
and多空:=-1 then begin
多空:=0; 累停損次:=累停損次+1; //停損
end else if
Max盈>=61 then begin
if 多進本+60 < Max盈*0.75 then 多空:=0;
end;
end else if
Max盈>=20 then begin
if 多進本+20 < Max盈*0.6 then 多空:=0;
end;
DoBS[i]:=多空;
end;
ENTERLONG: 多空=1; {多頭買入}
EXITLONG: 多空=-1 ; {多頭賣出}
ENTERSHORT: 多空=-1; {空頭買入}
EXITSHORT: 多空=1; {空頭賣出}
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-12 22:13 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18091 |
回覆: [求救]迴圈語法及DoBS變數
引用: 最初由 lung 發表
版主你好:
有學習寫 兩口單交易,當沖策略 ,
研究多時在迴圈語法及DoBS變數上卡關,
懇請版主檢視賜教、協助完成,感恩。
先建立子公式515BS,指標BSLINE為進出線
M1:=(CROSS(MA(CLOSE,5), MA(CLOSE,15)));
M2:=(CROSS(MA(CLOSE,15), MA(CLOSE,5)));
M3:=M1-M2;
方向:=BARSLAST( M3 );
BS_CT:=barslast((方向=1 and ref(方向<>1,1))OR (方向=-1 and ref(方向<>-1,1)));
BSLINE:REF(O, BS_CT);
再引用子公式515BS指標的MIN1、MIN5、MIN30 不同周期
當沖策略:
無論多單或空單,滿倉最多為兩口單。
多單庫存兩口時,如因多減碼一口或多平一口,未滿倉時,
多進或多加 訊號再出現時會再進一口,但滿倉時不下單,空單同上。
多訊或空訊皆為次一根,停損或停利皆為當根。
進場超過盈利20點則回檔12點 停利
進場超過盈利60點則回檔30% 停利
停損點數:15
在C>BS30 只做多 不做空,
C>BS1多進一口 //+1,滿倉時不下單。
C>BS5多加碼一口 //+1,滿倉時不下單。
C<BS1多減碼一口 // -1,無多單庫存時不下單
C<BS5多減碼一口 // -1,無多單庫存時不下單
在C<BS30 只做空不做多,
C<BS1空單一口 // -1,滿倉時不下單。
C<BS5空加碼一口 // -1,滿倉時不下單。
C>BS1空減碼一口 // +1,無空單庫存時不下單
C>BS5空減碼一口 // +1,無空單庫存時不下單
以下是公式語法目前進度:( 後段應是錯誤一堆 > <” )
.......................
母公式是在哪個週期中跑呢?
先從子公式問題看起,下面這兩行怪怪的
方向:=BARSLAST( M3 );
BS_CT:=barslast((方向=1 and ref(方向<>1,1))OR (方向=-1 and ref(方向<>-1,1)));
BARSLAST( M3 ) 是取得M3成立至今的距離,故 "方向" 其值永遠 >=0,不會有負數
但 BS_CT 卻有 方向=-1 的判斷式在其中,非常奇怪
請確認規則無誤 ....
若規則無誤
此行
BS_CT:=barslast((方向=1 and ref(方向<>1,1))OR (方向=-1 and ref(方向<>-1,1)));
可簡化為
BS_CT:=barslast(方向=1);
|
|
向版主報告此篇 |  |
|
2016-03-14 09:57 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
版主你好:
1 母公式是在1分K 運行,因子公式有引用1分K ,較能快速反應盤勢。
2 子公式單獨運行正常,已簡化為
BS_CT:=barslast(方向=1);也正常。
謝謝
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-14 11:46 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
版主你好:
尚未[多進],遇到[多加],是否進場?
是的,原先的想法C<BS5多減碼一口,多加訊號會再補一口。
若[多進]和[多加]同時成立,是否一次進兩口?
是的,但滿倉為2口單。
以[多進]來說 (其餘亦有相同問題...)
同上
前面描述的是 C>BS1 和程式中寫的 cross(C,BS1)
兩者是不相同的
[多進]判斷 是採 C>BS1 還是 cross(C,BS1) 呢?
原先用cross(C,BS1)是因擔心採 C>BS1進出,進場後會出現重複訊號,
如可過濾之後重複訊號,即採用 C>BS1進出,因在子公式已cross。
謝謝
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-14 16:28 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
版主你好:
謝謝版主細心提示
都採 cross 方式
感恩
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-14 17:14 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
版主你好:
引用:
第一行按前面所說,改採 cross 方式
但改完後,這兩行描述的並不一致
一為減碼(減一口), 一為平倉(倉位全出)
又尚未[多進](無持倉),遇到[多加]仍會買入1口
再按程式來看,實際規則其實並無所謂的加碼減碼
而是有兩組買賣訊(單邊),例如:多進1、多進2、多出1、多出2
每個訊號操作一口,滿2口則不操作,以開盤價操作
8:50起才動作,13:35後強制出場,12:35後不再買入只賣出
多訊或空訊皆為次一根,停損或停利皆為當根
進場超過盈利20點則回檔12點停利
進場超過盈利60點則回檔30%停利
停損點數:15
當日停損滿3次,則當日不再下單
這樣對吧?
是的,原義是加碼減碼,規則來看有兩組買賣訊(單邊),例如:多進1、多進2、多出1、多出2。
描述不全,多次費心,不好意思。
感恩
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-15 10:20 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
不急,有勞版主。 謝謝
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-15 11:34 |
|
|
|  |
 |
cgjj
總版主

註冊日期: Oct 2003
來 自:
文章數量: 18091 |
引用: 最初由 lung 發表
不急,有勞版主。 謝謝
規則簡介:
每個進出訊號操作1口,滿2口則不操作,以開盤價做操作。
8:50起才動作,13:35後強制出場,12:35後不再買入只賣出
[多進1] 多單+1,滿倉時不加
[多進2] 多單+1,滿倉時不加
[多出1] 多單-1,無持多單不減
[多出2] 多單-1,無持多單不減
[空進1] 空單+1,滿倉時不加
[空進2] 空單+1,滿倉時不加
[空出1] 空單-1,無持空單不減
[空出2] 空單-1,無持空單不減
若[多方]遇[空進]或[空方]遇[多進]則反手做。
同方[進1]和[進2]同時成立,則+2。
同方[出1]和[出2]同時成立,則-2。
停損或停利皆為當根,以收盤價做計算。
進場超過盈利20點則回檔12點停利
進場超過盈利60點則回檔30%停利
停損點數:15點
當日停損滿3次,則當日不再下單。
DoBS 和 DoXX 相對數值的意義請參考程式註解
關鍵字:交易範例
原碼: //子公式 515BS 程式範例
MA05:=MA(CLOSE,5); MA15:=MA(CLOSE,15);
M1:=CROSS(MA05,MA15); M2:=CROSS(MA15,MA05);
方向:=BARSLAST(M1-M2);
BS_CT:=BARSLAST(方向=1);
BSLINE:REF(O, BS_CT);
原碼: //母公式 程式範例
MA05:=MA(CLOSE,5); MA15:=MA(CLOSE,15);
M1:=CROSS(MA05,MA15); M2:=CROSS(MA15,MA05);
方向:=BARSLAST(M1-M2);
BS_CT:=BARSLAST(方向=1);
BS1:=REF(O, BS_CT);
BS5:="515BS.BSLINE#MIN5";
BS30:="515BS.BSLINE#MIN30";
始作Time:=085000; 限進Time:=123500;
強出:=time>=133500;
滿倉:=2; 控損點數:=15; 限停損次:=3;
控盈始1:=20; 控衰點數:=12;
控盈始2:=60; 控衰%數:=30;
//篩選決定進出訊號,並處理為次根
DoCK:=Time>=始作Time and Time<限進Time;
多進1:=ref(C>BS30 and cross(C,BS1),1) and DoCK or barpos=0;
多進2:=ref(C>BS30 and cross(C,BS5),1) and DoCK or barpos=0;
多出1:=ref(C>BS30 and cross(BS1,C),1) or barpos=0;
多出2:=ref(C>BS30 and cross(BS5,C),1) or barpos=0;
空進1:=ref(C<BS30 and cross(BS1,C),1) and DoCK or barpos=0;
空進2:=ref(C<BS30 and cross(BS5,C),1) and DoCK or barpos=0;
空出1:=ref(C<BS30 and cross(C,BS1),1) or barpos=0;
空出2:=ref(C<BS30 and cross(C,BS5),1) or barpos=0;
//彙整進出場訊號
進場:=(多進1+多進2)-(空進1+空進2) linethick coloryellow;
多出:=多出1+多出2 linethick colorred;
空出:=空出1+空出2 linethick colorgreen;
DoBS:C*0 NOAXIS COLORMAGENTA; //用開盤價做
{訊號進出: 1.多進, 2.空轉多, 3.多出, 4.多強出}
{ -1.空進,-2.多轉空,-3.空出,-4.空強出}
DoXX:DoBS NOAXIS COLOR0066FF; //用收盤價控
{控盈止損: 1.多控衰點, 2.多控衰%, 3.多停損}
{ -1.空控衰點,-2.空控衰%,-3.空停損}
持倉:DoBS linethick color777777; //該根最終持倉
多空:=0; //正:多, 負:空, 零:無
Max盈利:=0; OO:=O; CC:=C;
StDE:=date<>ref(date,1) or barpos=1;
for i=1 to datacount do begin
if StDE[i] then 累停損次:=0;
if 多空=0 then begin
if 累停損次<限停損次 then 多空:=進場[i];
if 多空<>0 then begin
進本:=OO[i]*多空; NowDir:=SGN(多空); 盈控:=0; Max盈利:=0; DoBS[i]:=NowDir;
end;
end else begin
Old多空:=多空;
if 強出[i] then begin
多空:=0; DoBS[i]:=NowDir*4;
end else if NowDir=SGN(進場[i]) and ABS(多空)<滿倉 then begin //同向
多空:=多空+進場[i];
if ABS(多空)>滿倉 then 多空:=滿倉*NowDir;
進本:=進本+OO[i]*(多空-Old多空);
if Old多空<>多空 then DoBS[i]:=NowDir;
end else if NowDir=-SGN(進場[i]) then begin //反手
多空:=進場[i]; 進本:=OO[i]*多空;
NowDir:=SGN(多空); 盈控:=0; Max盈利:=0; DoBS[i]:=NowDir*2;
end else if NowDir=1 and 多出[i]>0 then begin //多出
多空:=多空-多出[i]; DoBS[i]:=3; if 多空<0 then 多空:=0;
進本:=進本-(Old多空-多空)*OO[i];
Now盈虧:=CC[i]*多空-進本;
end else if NowDir=-1 and 空出[i]>0 then begin //空出
多空:=多空+空出[i]; DoBS[i]:=-3; if 多空>0 then 多空:=0;
進本:=進本-(Old多空-多空)*OO[i];
Now盈虧:=CC[i]*多空-進本;
end;
end;
if 多空<>0 then begin
Now盈虧:=CC[i]*多空-進本;
if Now盈虧<=-控損點數 then begin
多空:=0; 累停損次:=累停損次+1; DoXX[i]:=NowDir*3;
end else begin
if Now盈虧>Max盈利 then Max盈利:=Now盈虧;
if 盈控=0 and Now盈虧>控盈始1 then 盈控:=1;
if 盈控=1 and Now盈虧>控盈始2 then 盈控:=2;
盈衰:=Max盈利-Now盈虧;
if 盈控=1 then begin
if 盈衰>=控衰點數 then begin //停利1
多空:=0; DoXX[i]:=NowDir;
end;
end else if 盈控=2 then begin
if 盈衰>=Max盈利*(控衰%數/100) then begin //停利2
多空:=0; DoXX[i]:=NowDir*2;
end;
end;
end;
end;
持倉[i]:=多空;
end;
|
|
向版主報告此篇 |  |
|
2016-03-23 12:29 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
感謝版主費心協助,先來享用,如有不解之處再向版主請益。
祝: 平安喜樂
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-23 13:21 |
|
|
|  |
 |
lung
初級會員
註冊日期: Nov 2015
來 自:
文章數量: 17 |
版主好:
小弟愚昧,套用後 沒有出現訊號,引用錯誤,
故再請教:
DoBS:C*0 NOAXIS COLORMAGENTA; //用開盤價做
{訊號進出: 1.多進, 2.空轉多, 3.多出, 4.多強出}
{ -1.空進,-2.多轉空,-3.空出,-4.空強出}
DoXX:DoBS NOAXIS COLOR0066FF; //用收盤價控
{控盈止損: 1.多控衰點, 2.多控衰%, 3.多停損}
{ -1.空控衰點,-2.空控衰%,-3.空停損}
持倉:DoBS linethick color777777; //該根最終持倉
多空:=0; //正:多, 負:空, 零:無
上面 DoBS: DoXX: 持倉: 三項公式提示要加 =
DoBS: DoXX: 持倉: 三項加上 =
引用多空進出
ENTERLONG: 多空=1 ; {多頭買入}
EXITLONG: 多空=2 or 多空=3 or 多空=4 ;
ENTERSHORT: 多空=-1; {空頭買入}
EXITSHORT: 多空=-2 or 多空=-3 or 多空=-4;
請問正確用法
謝謝
__________________
lung
|
|
向版主報告此篇 |  |
|
2016-03-23 14:22 |
|
|
|  |
本站所有內容未經作者授權禁止轉貼節錄, 發表言論僅供參考勿作為投資決策依據。瀏覽本站請使用 IE 5.5 以上版本, 最佳瀏覽解析度 1024 x 768 全彩。
|
Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.
簡愛洋行 製作 Copyright 2003-. All Rights Reserved. 聯絡我們
|