2014年6月26日 星期四

Larry Williams - 最大振盪值 GSV [程式碼]


EasyTrader ArtNo 170
價格變動的原因並不是因為有多少股票或期貨契約被買進和賣出,而是因為它們最終會成交。價格振盪的原因是由其中一方(不管是買方或賣方)忽視了對方的存在。

換句話說,買賣的某一方為了自己的利益,因而願意付出更高的價格買進,或以更低的價格賣出。這種造成價格振盪失衡的原因,並不是因為成交量,而是急迫性……想要擁有,而且馬上就要擁有的那一方,因此就把價位拉高或殺低。

每一天你都會遇到買進振盪和賣出振盪,而收盤價加/減開盤價,則將告訴我們是哪一方獲勝。如果我把過去幾天從開盤價到最低價的振盪幅度加總,就可以得出過去幾天賣出振盪的平均值,據此可以推論,今天開盤後所出現的振盪值如果超過這個平均值,就可能是一個賣出信號。
最大振盪值(Greatest Swing Value)
我稱這種觀念為“最大振盪值”,它可以運用到許多能夠產生獲利的交易上。如果經常使用這個觀念,你就會更欣賞這種在下跌的日子裏找上漲振盪、在上漲的日子裏找下跌振盪的邏輯。我把這種振盪歸類為“失敗振盪”;雖然市場出現這麼大的振盪,可是無法堅持到底,收盤時反而出現相反方向的振盪變動。

讓我們看看你可以用振盪值做些什麼。你可以先確定過去幾個交易日的失敗振盪平均值是多少,然後將當天的開盤加加上或減去這個數值,得出你的進場點。或者你也可以根據X日的失敗振盪值所計算出的標準差,將標準差乘以1倍或2倍加上失敗振盪的平均值,作為你的進場點。 --- 摘譯 Larry Williams 短線交易祕訣

作多邏輯
  • 今天的收盤價必須低於前5天的收盤價。 
  • 前4天每天從開盤價到最高價的差距,加起來除以4,計算出“買進振盪”的平均值。 
  • 價格已經上漲超過開盤價加上4天振盪平均值的1.8倍。 
作空邏輯
  • 今天的收盤價必須高於前5天的收盤價。 
  • 把前4天從開盤價到最低價的差距除以4,計算出“賣出振盪”的平均值。 
  • 價格已經下跌超過開盤價加上4天振盪平均值的1.8倍。 
GSV 指標程式碼
input:Ref_L(4),Ref_S(4),Ratio_L(1.8),Ratio_S(1.8) ;
Vars:SW_L(0),SW_S(0) ;

if DataCompression < 2 then Begin { 判斷時間週期是日K或分K , < 2為分K }

{ 計算買進振盪值 }
Value2 = 0 ;
For value1 = 0 to Ref_L-1 Begin { 也可以使用 1 ~ Ref_L }
   Value2 = Value2 + HighD(Value1)-OpenD(Value1) ;
end;

Value3 = Value2/Ref_L*Ratio_L ;

{ 計算賣出振盪值 }
Value5 = 0 ;
For value4 = 0 to Ref_S-1 Begin
   Value5 = Value5 + OpenD(Value4)-LowD(Value4) ;
end;

Value6 = Value5/Ref_S*Ratio_S ;

{ 多空進場價格 }
SW_L = OpenD(0)+ Value3 ;
SW_S = OpenD(0)- Value6 ;

end else Begin { 計算日K }

   Value2 = 0 ;
   For value1 = 0 to Ref_L-1 Begin
       Value2 = Value2 + High[Value1]-Open[Value1] ;
   end;

   Value3 = Value2/Ref_L*Ratio_L ;
   Value5 = 0 ;

   For value4 = 0 to Ref_S-1 Begin
        Value5 = Value5 + Open[Value4]-Low[Value4] ;
   end;
   Value6 = Value5/Ref_S*Ratio_S ;

{ 多空進場價格 }
  SW_L = Open + Value3 ;
  SW_S = Open - Value6 ;

end;

Plot1(SW_L,"SW_L") ;
Plot2(SW_S,"SW_S") ;



策略程式碼
input:EntryType(1),ExitType(0);
input:Ref_L(4),Ratio_L(1.8),Ref_S(4),Ratio_S(1.8),TrendL(30),RetraceL(5),TrendS(30),RetraceS(5) ;
input: NBarL(2),NBarS(2),TradeProfit(0.05),TradeStopLoss(0.05),ATRs_L(2),ATRs_S(2);
Vars: SW_L(0),SW_S(0) ;
vars: IsBalanceDay(False),MP(0),PF(0),PL(0);

MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

if DataCompression < 2 then Begin

   Value2 = 0 ;
   For value1 = 0 to Ref_L-1 Begin
      Value2 = Value2 + HighD(Value1)-OpenD(Value1) ;
   end;
   Value3 = Value2/Ref_L*Ratio_L ;

   Value5 = 0 ;
   For value4 = 0 to Ref_S-1 Begin
      Value5 = Value5 + OpenD(Value4)-LowD(Value4) ;
   end;
   Value6 = Value5/Ref_S*Ratio_S ;

   SW_L = OpenD(0)+ Value3 ;
   SW_S = OpenD(0)- Value6 ;
end else Begin

   Value2 = 0 ;
    For value1 = 0 to Ref_L-1 Begin
       Value2 = Value2 + High[Value1]-Open[Value1] ;
    end;
    Value3 = Value2/Ref_L*Ratio_L ;
    Value5 = 0 ;

     For value4 = 0 to Ref_S-1 Begin
         Value5 = Value5 + Open[Value4]-Low[Value4] ;
     end;
     Value6 = Value5/Ref_S*Ratio_S ;

     SW_L = Open + Value3 ;
     SW_S = Open - Value6 ;
end;

if EntryType = 1 then Begin
   if Close < CloseD(RetraceL) then Buy next bar at SW_L stop ;
   if Close > CloseD(RetraceS) then Sell next bar at SW_S stop ;
end;

{ 加入均線濾網 }
if EntryType = 2 then Begin
   if Close > Average(Close,TrendL) and Close < CloseD(RetraceL) then Buy next bar at SW_L stop ;
   if Close < Average(Close,TrendS) and Close > CloseD(RetraceS) then Sell next bar at SW_S stop ;
end;

if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
   SetStopLoss(PL * BigPointValue) ;
   SetProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin
   if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
   if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;
end;

if ExitType = 4 then Begin
   SetStopLoss(PL * BigPointValue) ;
   SetProfitTarget(PF * BigPointValue) ;
   if MP > 0 and BarsSinceEntry = NBarL then Sell {ExitLong} next bar at Market ;
   if MP < 0 and BarsSinceEntry = NBarS then Buy {ExitShort} next bar at Market ;
end;

if ExitType = 5 then Begin

  {Inputs: ATRs_L(3);}
  Variables: PosHigh(0), ATRVal_L(0);
   ATRVal_L = AvgTrueRange(10) * ATRs_L;

   If BarsSinceEntry = 0 Then PosHigh = High;
   If MarketPosition = 1 Then Begin
      If High > PosHigh Then PosHigh = High;
      ExitLong ("ATR") Next Bar at PosHigh - ATRVal_L Stop;
   End else ExitLong ("ATR eb") Next bar at High - ATRVal_L Stop;
  {Inputs: ATRs_S(3);}
   Variables: PosLow(0), ATRVal_S(0);
   ATRVal_S = AvgTrueRange(10) * ATRs_S;

   If BarsSinceEntry = 0 Then PosLow = Low;

   If MarketPosition = -1 Then Begin
      If Low < PosLow Then PosLow = Low;
       ExitShort ("ATR_1") Next Bar at PosLow + ATRVal_S Stop;
    End else ExitShort ("ATR_1 eb") Next bar at Low + ATRVal_S Stop;
end;

if IsBalanceDay then setExitonClose ;

台指期 60分K 留倉 2004/5/31 ~ 2014/5/30 交易成本 1200
EntryTYpe = 1



EntryTYpe = 2


MagicQS087
結論
你隨時都可以利用最大振盪值的觀念,來確定市場的支撐或壓力區。依照Larry Williams外期商品實務經驗,逆勢反轉振盪1.8倍,搭配2.25倍的止損點效果相當好。

2 則留言:

  1. 編譯時出現如下問題:
    Next Bar' can only be applied to 'Open', 'Date', 'Time' or 'Time_s'
    errLine 64, errColumn 42, errLineEnd 64, errColumnEnd 42

    回覆刪除
  2. ExitLong -> sell , ExitShort -> BuytoCover 試試

    回覆刪除