ashell 發表於 11-1-17 11:11

[請益]停損的程式碼如何寫?

本帖最後由 ashell 於 11-1-17 11:14 AM 編輯

小弟最近在試著打造一下自動下單的系統,
目前寫到停損的部份,遇到了問題,

想請教站上的大大看有沒有人知道怎麼寫比較好?

或是有更好的解法,謝謝。

我現在的做法是滿足條件進場時就指定停損,

但因為之後可能仍然滿足進場條件,

所以停損價就會跟著最新的價格跳動,

請問該如何修改才能夠只指定一次停損價?

程式碼如下:


//先設定兩變數供存放停損價buystop=0;
sellstop=0;

//因為想可以馬上出訊號,所以用收盤價大於8000就買,滿足條件時同時指定停損價,目前有註解掉
/*
//c>8000 to buy for test
if (LastValue(C)>8000)
{
NowDateTime=Now(0);
NowPosition = 1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Buystop=Nowclose-10;
Sellstop=0;
}
*/

//同上
//c<9500 to sell for test
if (LastValue(C)<9500)
{
NowDateTime=Now(0);
NowPosition = -1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Sellstop=Nowclose+10;
Buystop=0;
}


//滿足條件的停損,並將buystop和sellstop歸零
if (LastValue(TimeNum())==134000OR LastValue(Close)==Buystop OR LastValue(Close)==Sellstop)
{
NowDateTime=Now(0);
NowPosition = 0;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",NowPosition,NowClose);
Buystop=0;
Sellstop=0;
}

舞太極 發表於 11-1-17 13:54

沒寫過 AB
但是邏輯上 不是把 NowPosition 納入條件裡面 就可以避免連續下單嗎

ashell 發表於 11-1-17 14:14

謝謝您的回覆,目前的情形是不會重覆下單,

但是因為滿足下單條件時會重新設定一次停損價,

結果就是停損價一直隨著現價移動,

例如:

if(收盤價>8000)
{
以現價買一口;
口數=1口;
停損價=現價-10;
}

在以上的例子中,只要現價在8000點以上,

那麼停損價就會隨著現價-10一直跳動,

我的問題是如何才能只要指定一次,

讓停損價不會再隨著現價跳動。

如果有什麼想法,再麻煩跟小弟說一聲,謝謝。

yesido0622 發表於 11-1-17 14:24

加個"是否已經進場的判斷"就好了
if_in_OK(預設為0)

if(收盤價>8000) and (if_in_OK=0)
{
以現價買一口;
口數=1口;
停損價=現價-10;
if_in_OK=1;
}

ashell 發表於 11-1-17 15:54

加個"是否已經進場的判斷"就好了
if_in_OK(預設為0)

if(收盤價>8000) and (if_in_OK=0)
{
以現價買一口; ...
yesido0622 發表於 11-1-17 02:24 PM http://coco-in.net/images/common/back.gif

啥米,就這麼簡單,
不過看一看應該這樣就能解決我的問題了,
來去測試看看,謝謝您的熱心指導。

frantz 發表於 11-1-17 18:06

0.0,剛剛借用ashell,的程式去測試後,發現無法正常執行在
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
會出現bug,錯誤@@,不知是什麼問題...

frantz 發表於 11-1-17 18:20

以下是剛剛依照版大的程式去編寫的沒有什麼變動@@
但無法執行出來
不知道是那裡的問題
//buystop=0;
sellstop=0;
if_in_OK=0;



//c>8000 to buy for test
if (LastValue(C)>8000)AND (if_in_OK=0)
{
NowDateTime=Now(0);
NowPosition = 1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Buystop=Nowclose-10;
Sellstop=0;
if_in_OK=1;
}

//c<9500 to sell for test
if (LastValue(C)<9500)
{
NowDateTime=Now(0);
NowPosition = -1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Sellstop=Nowclose+10;
Buystop=0;
}


//IF=OK!Abuystop AND sellstop =0
if (LastValue(TimeNum())==134000OR LastValue(Close)==Buystop OR LastValue(Close)==Sellstop)
{
NowDateTime=Now(0);
NowPosition = 0;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",NowPosition,NowClose);
Buystop=0;
Sellstop=0;
}

ashell 發表於 11-1-17 20:04

回復 7# frantz


   frantz大您好:
請參考這一篇

http://coco-in.net/viewthread.php?tid=6771&extra=page%3D3

我的範例是用下單大師所做的自動下單設定,

所以我想您應該是沒有執行下單大師在下單之前所需做的設定才會執行失敗,

您可以再試試看。

frantz 發表於 11-1-17 20:34

回復frantz


   frantz大您好:
請參考這一篇



我的範例是用下單大師所做的自動下單設定,

所以我想 ...
ashell 發表於 11-1-17 08:04 PM http://coco-in.net/images/common/back.gif
小弟我有依照版主前所分享的方式用大單大師做的自動下單設定
小弟是把版主之前分享的程式碼內新加此篇的程式碼
目前又出現另外一個問題
if ( LastValue(C)>8000) AND (if_in_OK=0)這段會出現bug,無法正常執行@@
這部份真的要好好請教你了。

frantz 發表於 11-1-17 20:40

小弟我有依照版主前所分享的方式用大單大師做的自動下單設定
小弟是把版主之前分享的程式碼內新加此篇的程 ...
frantz 發表於 11-1-17 08:34 PM http://coco-in.net/images/common/back.gif小弟找到原因了@@
原來以下代碼:
if (LastValue(C)>8000)AND (if_in_OK=0)
需要在增加()才行,如下:
if ((LastValue(C)>8000)AND (if_in_OK=0))

不過還是需要在請版主測試看看是否有問題@@
以下是結合版大所分享的代碼進行結合的

OMComAPI = CreateStaticObject("OMSignAPI.OMCOMAPI");
OMComAPI.IniDllAndPosition("MXF", 0);

up=Cross(MA(C,20),MA(C,50));
down=Cross(MA(C,50),MA(C,20));
Buy = up;
Sell = down;
Buy =ExRem(Buy,Sell);
Sell=ExRem(Sell,Buy);

if (Buy==True)
{
NowDateTime=Now(0);
NowPosition = 1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("MXF","","NowDateTime",Nowposition,Nowclose);

}

if (Sell==True)
{
NowDateTime=Now(0);
NowPosition = 0;
NowClose=LastValue(Close);
OMComAPI.GoOrder("MXF","","NowDateTime",NowPosition,NowClose);
}


Plot(MA(C,20),"MA20",colorRed,styleLine);
Plot(MA(C,50),"MA50",colorBlue,styleLine);
PlotShapes(IIf(Buy , shapeSmallUpTriangle, shapeNone) ,colorYellow, 0,L,-

50);
PlotShapes(IIf( Sell, shapeSmallDownTriangle, shapeNone) ,colorBlue, 0,H,-

45);

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo

%g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) )

));
Plot( C, "Close", IIf( C > O, ParamColor("Up Color", colorRed),

ParamColor("Down Color", colorGreen ) )
, styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();

buystop=0;
sellstop=0;
if_in_OK=0;



//c>8000 to buy for test
if ((LastValue(C)>8000)AND (if_in_OK=0))
{
NowDateTime=Now(0);
NowPosition = 1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Buystop=Nowclose-10;
Sellstop=0;
if_in_OK=1;
}

//c<9500 to sell for test
if (LastValue(C)<9500)
{
NowDateTime=Now(0);
NowPosition = -1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Sellstop=Nowclose+10;
Buystop=0;
}


//IF=OK!Abuystop AND sellstop =0
if (LastValue(TimeNum())==134000OR LastValue(Close)==Buystop OR LastValue(Close)==Sellstop)
{
NowDateTime=Now(0);
NowPosition = 0;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",NowPosition,NowClose);
Buystop=0;
Sellstop=0;
}

ashell 發表於 11-1-17 22:36

說來慚愧,今天忙到現在才有點時間可以來研究一下程式
不過我想yesido大所提的方法一看就覺得應該是沒問題的,
寫程式就是這樣,yesido大提出來的東西,
我一看覺得怎麼那麼簡單就可以解決問題,
但如果yesido大沒有提出來的話大概還要想幾天才能想出解法吧。

ashell 發表於 11-1-18 09:44

本帖最後由 ashell 於 11-1-18 10:39 AM 編輯

回復 4# yesido0622

經過昨天yesido大的提示之後,今天就實際上線測試,
不過情形還是一樣,停損價會隨著現價一直跳動,
程式碼如下,如果有大大知道問題出在哪的話,
請跟小弟說一聲,謝謝。





//初始化下單大師
OMComAPI = CreateStaticObject("OMSignAPI.OMCOMAPI");
OMComAPI.IniDllAndPosition("test", 0);

//設定停損的變數
Buystop=0;
Sellstop=0;
//設定手上是否有單的變數
bought =0;
sold=0;


//因為要馬上就可以進場,所以用收盤價大於8000為進場滿足條件
if (LastValue(C>8000) AND bought == 0 )
{
NowDateTime=Now(0);
NowPosition = 1;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",Nowposition,Nowclose);
Buystop=Nowclose-10;
Sellstop=0;
bought=1;
sold=0;
}

//收盤前平倉,或是滿足停損價則平倉
if (LastValue(TimeNum())==134000OR LastValue(Close)==Buystop OR LastValue(Close)==Sellstop)
{
NowDateTime=Now(0);
NowPosition = 0;
NowClose=LastValue(Close);
OMComAPI.GoOrder("test","","NowDateTime",NowPosition,NowClose);
Buystop=0;
Sellstop=0;
bought=0;
sold=0;
}

//把停損價和是否有倉位顯示出來,以便觀察
Plot(Sellstop,"\nsellstop",colorGreen,styleownscale|stylenolabel);
Plot(Buystop,"\nbuystop",colorYellow,styleownscale|stylenolabel);
Plot(bought,"\nbought",colorGreen,styleownscale|stylenolabel);
Plot(sold,"\nsold",colorGreen,styleownscale|stylenolabel);

yesido0622 發表於 11-1-18 10:50

先把這個判斷分成兩層: if (LastValue(C>8000) AND bought == 0 )
就是
if(LastValue(C>8000))
{
    if(bought == 0)
    {
      Buystop=Nowclose-10;
      bought = 1;
   }
}

先確定一下是否有進入與固定Buystop的值

ashell 發表於 11-1-18 10:58

收到,小弟先來試試看

ashell 發表於 11-1-18 11:19

回復 13# yesido0622


   不好意思,結果還是一樣,停損的值還是會一直跟著現價跳動,
想想也覺得很奇怪,
我覺得這兩個寫法應該都不會有這個問題,
可是卻遇到了,我再想想看還有什麼方法可以解,
也請yesido大幫我想想看還有什麼可能,謝謝。
頁: [1] 2
查看完整版本: [請益]停損的程式碼如何寫?