JimmyHK 發表於 18-2-20 01:16

求每日高低波幅出場的語法

想用每日高低波幅超過一定點做數觸發出場訊號條件,例如下跌一定點數就觸發出場訊號.

先用1) :

condition1 = LowD(0) <= HighD(0) - 300 ;

但這個語法有bug,試過Day low出現在先,Day high出現在後變成上升了300點不是下跌了300點但仍然符合條件觸發出場訊號.

解決方法 : 如何限定Day high出現在先,Day low出現在後才觸發出場訊號?

再用2) :

condition2 = Close <=HighD(0) - 300 ;

但這個語法有要在Close <= Day high -300點才生效,Close 回升上去其他附帶條件才生效就不能觸發出場訊號.

解決方法 : 如何使Close <= Day high -300點一次就成為觸發出場訊號條件?

再用3) :

用True / False模式,但不能設定條件只在今天生效,條件成立後第二天仍然生效.

解決方法 : 如何設定條件只在今天生效?












easytrader788 發表於 18-2-22 22:51

試試這樣是否符合您的需求(當日振幅超過300才會生效)
If marketposition > 0 then sell next bar at HighD(0)-300 stop ;
If marketposition < 0 then buytocover next bar at LowD(0)+300 stop ;

JimmyHK 發表於 18-2-23 01:03

easytrader788 發表於 18-2-22 22:51
試試這樣是否符合您的需求(當日振幅超過300才會生效)
If marketposition > 0 then sell next bar at HighD ...

謝謝回覆!

我現在暫用 Close <=HighD(0) - 300做其中一個 condition 代替,但原先的概念是 Close <=HighD(0) - 300 只是其中一個 condition,不單止只要當天振幅超過300,還要幾個其他技術指標發出反向訊號才觸發出場訊號的,如果其他技術指標不發出反向訊號就不觸發出場訊號,但振幅超過300又縮回300以內,之後其他技術指標發出反向訊號一樣觸發出場訊號,easytrader大大的方案是振幅超過300立即觸發出場訊號,和我原先的概念不一樣了.


easytrader788 發表於 18-2-23 14:04

你可以將反像觸發條件放在if 條件式裡面,這樣條件為 true 且振幅超過300就會出場了

easytrader788 發表於 18-2-23 14:31

var:LongTrigger(false) ,MP(0);

MP=MarketPosition ;

// 換日或換部位先將 Trigger 設為 false 這樣隔日或部位改變就會重新判斷
if date <> date or MP <> MP then begin
   LongTrigger = false ;
   ShortTrigger = false ;
end ;

//當日高點回落超過300點啟動 LongTrigger
ifClose <= HighD(0)-300 then LongTrigger = true ;

//你的反向指標與振幅都成立觸發出場
if Condition1 and ... and MP > 0 then Sell next bar at HighD(0)-300 stop ;

//先發生振幅條件後回升+你的反向指標成立觸發出場
if Condition1 and ... and LongTrigger and MP > 0 then Sell next bar at Market ;

空單作法依樣畫葫蘆即可

參考看看囉

JimmyHK 發表於 18-2-25 01:06

easytrader788 發表於 18-2-23 14:31
var:LongTrigger(false) ,MP(0);

MP=MarketPosition ;


謝謝 easytrader 兄!會試試看,現在才看到 easytrader 兄有個人網站,會多多進去觀摩學習的! {:4_113:}


JimmyHK 發表於 18-2-25 01:11

順便在這裏請教 easytrader 兄,之前我上來問過在分鍾圖Plot過去幾天Highest High 或 Lowest Low語法,網友提供了好多方法都不成功,請問你能否幫我看看有沒法子做到?謝謝你!

http://www.coco-in.net/thread-91758-1-1.html

easytrader788 發表於 18-2-26 19:46

input: Barlookback(5) ;   { LookBack }
   
Vars: HighBand(0),LowBand(0);

   if DataCompression < 2 then Begin //判斷週期是分 K ( < 2 ) 或是 日 K (=2)
       HighBand = HighD(0) ; { 以今日高低點為基準,若以昨日為基準改為HighD(1)/LowD(1) }
   LowBand = LowD(0) ;
   for Value1 = 1 to BarlookBack Begin
           if HighD(Value1) > HighBand then HighBand = HighD(Value1) ;
           if LowD(Value1) < LowBand then LowBand = LowD(Value1) ;
       end;
   end else Begin //此段為日K
          HighBand = High ; { 以今日高低點為基準,若以昨日為基準改為High/Low }
         LowBand = Low ;
   for Value1 = 1 to BarlookBack Begin
           if High > HighBand then HighBand = High ;
           if Low < LowBand then LowBand = Low ;
       end;
   end;
        Plot1(HighBand , "NearDayHigh" ) ;
        Plot2(LowBand , "NearDayLow" ) ;

easytrader788 發表於 18-2-26 19:52

您可以參考部落格[觀盤篇]標籤的文章 有一些基本的語法
https://easytrader788.blogspot.tw/2013/09/ki.html

JimmyHK 發表於 18-2-27 12:37

easytrader788 發表於 18-2-26 19:46
input: Barlookback(5) ;   { LookBack }
   
Vars: HighBand(0),LowBand(0);


成了 ! 謝謝easytradder大大分享,但為什麼參數大過50就不能顯示的呢?

easytrader788 發表於 18-2-27 15:34

HighD()/LowD() 會呼叫內建 OHLCPeriodsAgo函數做計算 此函數的設計就只允許50

JimmyHK 發表於 18-2-28 00:53

easytrader788 發表於 18-2-27 15:34
HighD()/LowD() 會呼叫內建 OHLCPeriodsAgo函數做計算 此函數的設計就只允許50

原來如此,Multicharts程式內有可以用超過50天的語法可用嗎?

easytrader788 發表於 18-2-28 08:35

要自己修改OHLCperiodsAgo函數

JimmyHK 發表於 18-2-28 09:26

easytrader788 發表於 18-2-28 08:35
要自己修改OHLCperiodsAgo函數

是不是將50改成自己想要的數值就可以了?有沒有限製的?

inputs:
    PeriodType( numericsimple ),                                                
                           
    PeriodsAgo( numericsimple ),
    oPeriodOpen( numericref ),
    oPeriodHigh( numericref ),
    oPeriodLow( numericref ),
    oPeriodClose( numericref ) ;

variables:
    var0( 0 ) ;

arrays:
    arr0[ 4, 50 ]( -1 ) ;

condition1 = PeriodsAgo > 50 or BarType > PeriodType + 1 or BarType > 4 ;
if condition1 then
    begin
    oPeriodOpen = -1 ;
    oPeriodHigh = -1 ;
    oPeriodLow = -1 ;
    oPeriodClose = -1 ;
    OHLCPeriodsAgo = -1 ;
    end
else
    begin
                                                            
    if PeriodType = 1 then
      Condition1 = Date <> Date
    else if PeriodType = 2 then
      Condition1 = DayOfWeek( Date ) < DayOfWeek( Date )
    else if PeriodType = 3 then
      Condition1 = Month( Date ) <> Month( Date )
    else if PeriodType = 4 then
      Condition1 = Year( Date ) <> Year( Date ) ;

    condition1 = CurrentBar = 1 or Condition1 ;
    if condition1 then                                       
      begin
      var0 = var0 - 1 ;                                                      
      if var0 = -1
            then var0 = 50 ;                                    
                                                                              
      arr0[ 1, var0 ] = O ;
      arr0[ 2, var0 ] = H ;
      arr0[ 3, var0 ] = L ;
      arr0[ 4, var0 ] = C ;
      end
    else
                                                                              
                                                   
      begin
      condition1 = H > arr0[ 2, var0 ] ;
      if condition1 then arr0[ 2, var0 ] = H ;
      condition1 = L < arr0[ 3, var0 ] ;
      if condition1 then arr0[ 3, var0 ] = L ;
      arr0[ 4, var0 ] = C ;
      end ;

                                                                                    
                     
    oPeriodOpen = arr0[ 1, Mod( var0 + PeriodsAgo, 51 ) ] ;
    oPeriodHigh = arr0[ 2, Mod( var0 + PeriodsAgo, 51 ) ] ;
    oPeriodLow = arr0[ 3, Mod( var0 + PeriodsAgo, 51 ) ] ;
    oPeriodClose = arr0[ 4, Mod( var0 + PeriodsAgo, 51 ) ] ;

    OHLCPeriodsAgo = 1 ;
    end ;

                                                                                 
                                                            
if false then
    Value1 = OHLCPeriodsAgo ;


easytrader788 發表於 18-2-28 17:34

由于此函數有考慮到一年52週,所以它以50作限制,你可以自己先看懂程式碼,然後再去修改
頁: [1] 2
查看完整版本: 求每日高低波幅出場的語法