2014年7月21日 星期一

●金屬期貨商品 - 銅 [波段策略程式碼 ]

EasyTrader ArtNo 182
銅為工業用量最大的非鐵金屬,俗稱『Red Metal』,是仍在交易的最早金屬期貨合約。其與錫合金是為『青銅』,其與鋅合金是為『黃銅』。銅優異的導電性僅次於銀,加上其良好的延展性及抗蝕性,使之廣泛被用在電線電纜及建築業上。目前的兩個最熱絡的銅期貨合約分別為:COMEX於1933年,及LME於1883年開始交易。
全球四大銅礦來源:北美(美國、加拿大)、南美(智利、祕魯)、南非(尚比亞、薩伊)以及獨立國協;共佔全球產量2/3強,美國產區集中在西部,其中亞利桑納州產量佔全美2/3。工業之景氣攸關其消耗量之強弱,已開發國家如美國、日本、歐洲等為主要消費國。

價格影響因素

1.銅的供需關係
根據供需原理,當銅的供給大於需求時,其銅價下跌,反之則上漲。表現銅的供需關係的一個最重要指標就是銅的庫存,交易者不可不重視。一般來說,銅的庫存分為報告庫存和非報告庫存兩種。報告庫存是指交易所庫存,目前世界上較大的銅期貨交易所,有倫敦金屬交易所,紐約商品交易所和上海期貨交易所。三個交易所均定期公佈指定倉庫的庫存。而非報告庫存是指全球範圍內的生產商、貿易商和消費者手中持有的庫存。由於這些庫存不會定期對外公佈,因此難以統計,故一般都以交易所庫存來衡量銅的供需關係。

2.全球經濟景氣
銅是重要的原物料,其需求量與全球經濟情況相關。經濟景氣時,銅需求增加,從而帶動銅價上升,經濟蕭條時,銅需求萎縮,從而促使銅價下跌。因此投資人可觀察各項經濟指標,例如GDP增長率以及工業生產增長率,來了解全球景氣現況,藉以研判銅價中長期的漲跌趨勢。

3.主要產銅國與消耗國的政策
智利和美國分居世界前兩大產國,總合占世界銅產量的40%,美國的銅集中在西部,亞利桑那州就達全美產量的65%。美國是銅的最大消耗國,接著是俄國和日本,這三個國家的消耗量就佔全球的50%左右,其他的消耗大國還有英、德、中國大陸。這些國家有關銅的進出口或是關稅政策,也會影響國際銅價。

4.用銅產業發展趨勢的變化
銅的消費量是影響銅價的直接因素,而用銅行業的發展則是影響消費量的重要因素。80年代中期,美國、日本和西歐國家的銅消費中,電氣工業所占比重最大,而進入90年代後,建築業中管道用銅大幅增加,成為銅消耗量最大的業別,因此美國的住屋開工率也就成了影響銅價的因素之一,投資人可注意這一項經濟指標。

5.銅的生產成本
隨著煉銅發展,銅的生產成本不斷下降。目前國際上火法煉銅平均成本為1400-1600美元/噸,濕法煉銅成本為800-900美元/噸。預計將來使用濕法煉銅的總產量將會迅速增加,降低生產成本,壓低銅價。

6.法人基金的操作方向
由於法人基金對於經濟面與產業面的研究,較一般投資人更為深入,其操作的方向不容易違背基本面,因此要預先判斷銅價的漲跌,可先觀察法人基金的留倉部位的多空方向,其相關資料,交易所會定期公佈,通常兩者之間有非常好的相關性。

7.原油的價格波動會對銅價產生影響
原油和銅都是國際重要原物料,它們需求的旺盛與否最能反映經濟的好壞,所以從長期看,油價和銅價的高低與經濟發展的快慢有密切的相關性。因此就出現了銅價與油價一定程度上的正相關性。銅的交易者可參考原油價格漲跌來掌握銅價。如果說油價合理的上漲,表現經濟緩步復甦,那麼油價的上揚會帶動銅價上漲。但如果油價上漲到合理的水準後仍持續飆升,投資人會轉而關心油價的飆升對未來經濟發展產生負面影響,甚至導致通貨膨脹經濟衰退,這時油價的上揚反而成了銅市場的利空因素。因此輕原油期貨與銅期貨也有連帶性的波動。

8.匯率變化
國際上銅的交易一般以美元計價,以美元計價的國際銅價也會受到匯率的影響,不過決定銅價走勢的根本因素是銅的供求關係,匯率因素不能改變銅市場的基本格局,而只是在短線漲跌幅度上可能產生影響,對短線操作者而言,是可以注意研判的因素之一。
資料來源 - 元大寶來期貨資訊網


金屬銅期貨 60 分K 留倉 交易週期 2008/04/16 ~ 2014/5/30 交易成本 美金 50 元


金屬銅期貨 30 分K 留倉 交易週期 2008/04/16 ~ 2014/5/30 交易成本 美金 50 元


金屬銅期貨 15 分K 留倉 交易週期 2008/04/16 ~ 2014/5/30 交易成本 美金 50 元


15分K 測試程式碼
{ ***** System Code Start here *****}
{ Public inputs }
Inputs:LuckyNet(0),IntraDay(2), TradeStopLoss(0.023),TradeProfit(0.047) ;
Inputs:TradeInday(1),Time1SW(1),Time1B(700),Time1E(1600) ;
Inputs:Time2SW(0),Time2B(100),Time2E(1400),Time3SW(0) ;
Inputs:Time3B(900),Time3E(1300),PositionSW(0) ;
inputs:Frac_LMM(3.31),NBar_LM(2),Frac_SMM(2.25),NBar_SM(12) ;

{ Public Variables }
Vars:Cond_LE(false),Cond_SE(false),CondNet_L(false),CondNet_S(false),
UBuy(0),USell(0),BuyStop(0),SellStop(0),BuyStopA(0),SellStopA(0),
NewBuyStopA(0),NewSellStopA(0),PL(0),PS(0),LastTradeDay(false) ;
Vars:TimeOK1(true),TimeOK2(true),TimeOK3(true),PosSW(true) ;

{ BuyMode Setup }
inputs:NBar_LE(11),Frac_LE(3) ;

{ SellMode Setup }
inputs:Bar_S1(36),NBar_SE(5),Frac_SE(3.6) ;

{ Exit Long Position Setup }
inputs:TRLen_L(9),TRPct_L(79),Ratio_TL(4.92) ;

{ Exit Short Position Setup }
inputs:NBar_SX(92) ;

{ BuyMode Variable Setup }
Vars:LE_ATR(0) ;

{ SellMode Variable Setup }
Vars:SE_ATR(0) ;

{ Exit Long Position Variable Setup }
Vars:TL_ATR(0),Trigger_TLA(false) ;
Vars:LMM_ATR(0) ;

{ Exit Short Position Variable Setup }
Vars:SMM_ATR(0) ;

{ ***** LastTradeDay ***** }
{LastTradeDay = _MagicQS268_LTD ;}

{ initial profit and loss }
if MarketPosition = 0 then begin
PL = AvgPrice*TradeProfit ;
PS = AvgPrice*TradeStopLoss ;
end ;

{ ATR calculate for code }
LMM_ATR = AvgTrueRange(NBar_LM);
LE_ATR = AvgTrueRange(NBar_LE);
TL_ATR = AvgTrueRange(TRLen_L);
SMM_ATR = AvgTrueRange(NBar_SM);
SE_ATR = AvgTrueRange(NBar_SE);

{ Entry and Exit prices }
UBuy = LowD(0) + Frac_LE * LE_ATR ;
USell = Average(Close, Bar_S1) - Frac_SE * SE_ATR ;

{ Long and Short Entry Condition Setup }
Cond_LE = MOD(DayofMonth(Date),4) = 1 ;
Cond_SE = (MOD(DayofMonth(Date),6) = 2 or DayofWeek(Date) <> 6) ;

{ Combine Trade Number in day }
Cond_LE = Cond_LE and EntriesToday(date) <= TradeInDay ;
Cond_SE = Cond_SE and EntriesToday(date) <= TradeInDay ;

{ Combine Trade time zone in day }
if Time1SW = 0 then TimeOK1 = true else TimeOK1 = (time >= Time1B and time <= Time1E) ;
if Time2SW = 0 then TimeOK2 = true else TimeOK2 = (time >= Time2B and time <= Time2E) ;
if Time3SW = 0 then TimeOK3 = true else TimeOK3 = (time >= Time3B and time <= Time3E) ;

Cond_LE = Cond_LE and TimeOK1 ;
Cond_SE = Cond_SE and TimeOK1 ;

{ Check Position status for entry}
if PositionSW = 0 then PosSW = true else PosSW = (MarketPosition = 0) ;
Cond_LE = Cond_LE and PosSW ;
Cond_SE = Cond_SE and PosSW ;

{ Entry Long orders }
if Cond_LE then Buy next bar at UBuy Stop ;

{ Entry Short orders }
if Cond_SE then SellShort next bar at USell Stop ;

{ Exit orders, long trades }
If MarketPosition > 0 then begin
PL = EntryPrice(0)* TradeProfit;
PS = EntryPrice(0)* TradeStopLoss ;
If BarsSinceEntry = 0 then begin
BuyStop = EntryPrice - Frac_LMM * LMM_ATR;
BuyStopA = 0;
Trigger_TLA = false;
end;
If Close - EntryPrice > Ratio_TL * TL_ATR then
Trigger_TLA = true;
If Trigger_TLA then begin
NewBuyStopA = EntryPrice + TRPct_L * (Close - EntryPrice)/100.;
BuyStopA = MaxList(BuyStopA, NewBuyStopA);
end;
If Trigger_TLA then
Sell next bar at BuyStopA stop;
end;

{ Exit orders, short trades }
If MarketPosition < 0 then begin
PL = EntryPrice(0)* TradeProfit;
PS = EntryPrice(0)* TradeStopLoss ;
If BarsSinceEntry = 0 then begin
SellStop = EntryPrice + Frac_SMM * SMM_ATR;
end;
if BarsSinceEntry >= NBar_SX then BuytoCover next bar at Market ;
end;

if IntraDay = 0 then SetExitonClose
else if IntraDay = 1 and LastTradeDay then SetExitonClose ;
{***************** End of Strategy ************}

歷史資料來源 : 追日全球歷史數據下載

0 留言:

張貼留言

如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!

----------------------------------------------------------------------------------------------------
網站聲明(Disclaimer)
本教學網站內所提供之程式碼(包括函數、指標、訊號)屬開放程式碼,用意在於讓使用者學習程式語法之撰寫,使用者可以任意修改語法內容並調整參數。本網站所有之內容(包括文章、影片、歷史紀錄、程式碼、教材)限用於個人學習使用,請勿轉寄、濫用,嚴禁私自串接帳戶交易。
-------------------------------------------------------------------------------------------------