標籤

二元樹 (1) 字串常數池 (1) 投資 (3) 每月損益 (37) 例外處理 (1) 泛型 (2) 股票 (15) 指標 (5) 英文 (8) 基本資料型別 (1) 期貨 (1) 程式交易 (10) 量化投資 (5) 亂亂寫 (3) 概念 (3) 資料結構 (3) 演算法 (3) 數學 (3) 轉型 (1) AMA (1) ArrayList (1) assert (1) BeautifulSoup (1) C/C++ (8) casting (1) ClassCastException (1) classpath (1) Collection (4) Comparable (1) comparTo() (1) constructor (1) database (3) Debian (1) Dropbox (2) EA (2) enum (1) equals() (2) exception (3) extends (1) ffmpeg (1) final (1) Git (1) HashMap (1) HashSet (1) hasNext() (1) HTS (3) instanceof (1) IS-A (1) Iterator (1) JAVA (43) length (1) Linux (31) List (1) Mac (6) Map (1) ML (2) MT4 (6) MySQL (2) next() (1) NullPointerException (1) Number (1) Numpy (2) OpenCart (1) OpenCV (3) OSX (1) overloading (1) overriding (3) pandas (2) PHP (8) PriorityQueue (1) Python (11) Queue (1) random() (1) reverse() (1) Samba (1) SCJP (21) sqrt() (1) synchronized (1) talib (1) ufw (1) uTorrent (1) var-args (2) VHF (1) vim (2) Yhoo知識+ (4)

2016年4月8日 星期五

董詮通道(donchian channel)



計算方式:
上通道:過去N支K棒的最高價
下通道:過去N支K棒的最低價
中線:(上通道+下通道)/2

操作方式:
當價格碰觸上通道,做多。若碰觸下通道,做空。

這方法說穿了就是常聽到的,價格突破20日高點做多,跌破20低點做空; 董詮只是把圖畫出來,讓大家比較好觀察而已。

另外因為上下通道都是畫在最高最低價,價格不會超出通道,所以通常會把通道向右移2根,就可以看出突破跌破了。

參考:
http://www.ino.com/blog/how-to-use-donchian-channels/#.VwgYA2BdS9Q

2016年4月6日 星期三

VHF指標


To calculate the Vertical Horizontal Filter:
  1. Select the number of periods (n) to include in the indicator. This should be based on the length of the cycle that you are analyzing. The most popular is 28 days (for intermediate cycles).
  2. Determine the highest closing price (HCP) in n periods.
  3. Determine the lowest closing price (LCP) in n periods.
  4. Calculate the range of closing prices in n periods:
               HCP - LCP
  5. Next, calculate the movement in closing price for each period:
               Closing price [today] - Closing price [yesterday]
  6. Add up all price movements for n periods, disregarding whether they are up or down:
               Sum of absolute values of ( Close [today] - Close [yesterday] ) for n periods
  7. Divide Step 4 by Step 6:
               VHF = (HCP - LCP) / (Sum of absolute values for n periods)




這跟上次貼的ER雜訊比公式完全一模一樣啊:


跟ER一樣,VHF只在0與1之間震盪,當VHF向上時,表示趨勢(向上或向下)愈明確;VHF向下愈接近0時,表示愈接近盤整。VHF可與趨勢指標,如MACD, DMI搭配使用。當然短線就直接看股價,股價與VHF同時向上就做多,股價向下而VHF向上則做空。

以下參考自http://wiki.mbalib.com/zh-tw/十字过滤线

 1、VHF的值越高,代表目前正處於趨勢行情,應選擇趨勢指標為參考工具。
  2、VHF的值越低,代表目前正處於箱型行情,應選擇超買超賣指標為參考工具。
  3、VHF處於上升狀態時,代表股價處於趨勢行情。
  4、VHF處於下跌狀態時,代表股價處於箱型行情。
VHF指標的圖表上,可以切劃一條中界線,分隔趨勢和箱型的波動範圍。這一條中界線一般位於0.35~0.4之間,但是,不同的個股,其中界線位置稍有差異,讀者應自行設定最佳的中界線。
  將中界線視為X軸,另外設一條Y軸與X軸交叉成十字坐標軸,Y軸可任意左右移動。將Y軸移至VHF曲線穿越X軸處,如果VHF曲線位於十字坐標軸的右上方,代表股價處於趨勢行情。如果VHF曲線位於十字坐標軸的右下方,則代表股價處於箱型行情。
  5、如果動向指數(DMI)中的+DI值高於-DI值,而VHF曲線向上或向下突破X軸時,為中線買點。
  6、如果DMI指標中的+DI值低於-DI值,而VHF曲線向上或向下跌破X軸時,為中線賣點。

2016年3月31日 星期四

2016 3月損益 +1319 1319

代號名稱成交單價手續費交易稅損益報酬率當沖
5425台半43.7201318792.06%
2002中鋼22.5201351250.28%
6282康舒26.420792310.89%
2449京元電27.5522165910.17%
2489瑞軒19.1205730.02%
2511太子11.820358357.65%
3023信邦64.326192-944-1.45%
2511太子12.452037148313.59%
2634漢翔4220126-766-1.80%現股
2542興富發47.12014119694.38%
6187萬潤56.3231683860.69%現股
00640L日本2X15.482030100.03%現股
3105穩懋64.726194-947-1.45%現股
3673F-TPK70.629211-1269-1.77%現股
8105凌巨21.320127-767-1.77%現股
總計:-671182813190.13%
當沖勝率33%
非當沖勝率89%
總勝率67%

1.賺的都不夠手交費(手續費加交易稅)
2.我還是不要當沖好了
3.其中太子跟興富發都是追發佈股利的第二天漲停
4.消息面還是比技術面強


2016年3月26日 星期六

交易系統和方法筆記

雜訊測量的方法

1.效率比:(頭尾差/個別差之和),接近1表無雜訊,接近0表雜訊大










Remember that a ratio near 1 shows a strong trend, and a ratio near 0 only noise.

AMA 5分線,摩台2016.0105~0324

AMA 5分線,連續兩次波動進場,K棒整支低於或高於AMA出場。
摩台2016.0105~0324,交易時間:9:00到13:45




結果很糟,盤整根本被巴假的。
程式碼:

input double Lots          = 0.1;    
input int hands  = 1;
input int theMagicNum = 332;
extern double startTime = 8.75;
extern double endTime = 13.75;
input string str4= "AMA Trading short and long Timeframes 1,5,15,30,60,...";
input int    MATrendPeriod = 5;  


void OnTick(void){
  double theAMAupCurrent, theAMAupPrevious, theAMAdownCurrent, theAMAdownPrevious;
   int    cnt,ticket,total, symbolOrders;
   int     TradeMode  = 1;
double curTime = (Hour()+12)%24 + Minute()/60.0;

if(Month()==1 || Month()==2) curTime++;
   if(Bars<100){
      Print("bars less than 100");
      return;
   }


theAMAupCurrent = iCustom(NULL, MATrendPeriod, "AMA", 1, 0);
    theAMAupPrevious = iCustom(NULL, MATrendPeriod, "AMA", 1, 1);
    theAMAdownCurrent = iCustom(NULL, MATrendPeriod, "AMA", 2, 0);
    theAMAdownPrevious = iCustom(NULL, MATrendPeriod, "AMA", 2, 1);



   total=OrdersTotal();
   symbolOrders = 0;


   for(cnt=0; cnt<total; cnt++){
    if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))   continue;
    if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==theMagicNum)   symbolOrders++;  
  }
 
   
      //------send orders  starts -------
       if( symbolOrders < hands && (curTime>=startTime && curTime<=endTime-0.05)){
          if(AccountFreeMargin() < (1000*Lots)){  
             Print("We have no money. Free Margin = ",AccountFreeMargin());
             return;
          }
               if(   (theAMAupCurrent>theAMAupPrevious && theAMAupPrevious!=0) ){   //v.0.1
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"AMAtrading v.0.1", theMagicNum,0,Green);
                if(ticket>0){  
                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))    Print("BUY order opened : ",OrderOpenPrice());
                }else   Print("Error opening BUY order : ",GetLastError());
                return;
}else if( (theAMAdownCurrent<theAMAdownPrevious && theAMAdownPrevious!=0)){   //v.0.1
                ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading v.0.1", theMagicNum,0,Red);
                if(ticket>0){
                  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))    Print("SELL order opened : ",OrderOpenPrice());
                }else   Print("Error opening SELL order : ",GetLastError());  
              return;
            }
        }//------send orders  ends -------



    //-----orders handle starts-------  
   for(cnt=0;cnt<total;cnt++){  
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))   continue;
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()  && OrderMagicNumber()==theMagicNum ){
         if(OrderType()==OP_BUY){
if( iHigh(NULL,MATrendPeriod,0)< iCustom(NULL,MATrendPeriod,"AMA",0,0) || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))    Print("OrderClose error ",GetLastError());
                    return;
}
        }else{
   if(iLow(NULL,MATrendPeriod,0)> iCustom(NULL,MATrendPeriod,"AMA",0,0) || curTime>=endTime){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))    Print("OrderClose error ",GetLastError());
                      return;
              }
          }
      }
    }
  }



2016年3月25日 星期五

三重濾網

參考這篇文章寫出來的MT4版本。不過MT4沒有台指期,而且回測也不精準,所以跑出來(我測摩台)的績效沒有文章那麼好。


input double Lots          = 0.1;    
input int hands  = 1;

void OnTick(void){
   int    cnt,total;  
   if(Bars<100){
      Print("bars less than 100"); return;
     }

   total=OrdersTotal();

       if(total < hands){
          if(AccountFreeMargin() < (1000*Lots)){
             Print("We have no money. Free Margin = ",AccountFreeMargin());
             return;
          }
              if(iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0)>iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,1) &&
iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_MAIN, 0)<95 && iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0)<95 &&
iClose(NULL, 5, 0)>iMA(NULL, 5, 35, 8, MODE_SMA, PRICE_CLOSE, 0)){                                              
                OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0,0,"3ScreensSystem", 1234,0,Green);   return;
              }
if(iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,0)<iMACD(NULL,60,12,26,9,PRICE_CLOSE,MODE_MAIN,1) &&
iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_MAIN, 0)>5 && iStochastic(NULL, 15, 9, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0)>5 &&
iClose(NULL, 5, 0)<iMA(NULL, 5, 45, 8, MODE_SMA, PRICE_CLOSE, 0)){
                OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"3ScreensSystem", 1234,0,Red); return;
              }
        }

   for(cnt=0;cnt<total;cnt++){
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))   continue;
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()){
         if(OrderType()==OP_BUY){
               if(iClose(NULL,5,0)-OrderOpenPrice()>2){
                      OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return;
                }else if(OrderOpenPrice()-iClose(NULL,5,0)>0.5){
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return;
}
          }else{
        if(OrderOpenPrice()-iClose(NULL,5,0)>2){
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return;
}else if(iClose(NULL,5,0)-OrderOpenPrice()>0.5){
            OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return;
}
          }
      }
    }
  }

2016年3月6日 星期日

MT4內建的MACD EA程式註解

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"

input double TakeProfit    =50;   //停利點數
input double Lots          =0.1;  //每次下單0.1口
input double TrailingStop  =30;   //獲利達30點時,啟動移動停利
input double MACDOpenLevel =3;    //MACD快線在0軸上下3點時,才可觸發多空單
input double MACDCloseLevel=2;    //MACD快線在0軸上下2點時,才可觸發平倉
input int    MATrendPeriod =26;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   double MacdCurrent,MacdPrevious;
   double SignalCurrent,SignalPrevious;
   double MaCurrent,MaPrevious;
   int    cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
   if(Bars<100){
      Print("bars less than 100");    //K棒小於100根,程式退出
      return;
     }

   if(TakeProfit<10){
      Print("TakeProfit less than 10");   //輸入停利小於10點,程式退出
      return;
     }
//--- to simplify the coding and speed up access data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);   //抓目前K棒的MACD快線值
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);    //抓上一根K棒的MACD快線值
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);   //抓目前K棒的MACD慢線值
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);    //抓上一根K棒的MACD慢線值
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);      //抓目前K棒的MA值
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);     //抓上一根K棒的MA值

   total=OrdersTotal();   //取得帳戶所有單子數量
 
   if(total<1){
      //--- no opened orders identified
      if(AccountFreeMargin() < (1000*Lots)){    //如果原始保證金小於 1000*交易口數,結束程式(1口*1000 = 下1口的原始保證金)
         Print("We have no money. Free Margin = ",AccountFreeMargin());
         return;
      }

      //--- 偵測觸發buy單條件
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&     //如果MACD快線在0軸下,又與慢線金叉
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious){             //而且快線在0軸下3點以上,又均線上升
       
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);   //則下buy單,不停損,50停利
       
         if(ticket>0){    //若下buy單成功,印出buy單價格
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))    Print("BUY order opened : ",OrderOpenPrice());
          }else
            Print("Error opening BUY order : ",GetLastError());   //若失敗則印出錯誤訊息,結束程式
       
         return;
      }


      //--- 偵測觸發sell單條件
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&     //如果MACD快線在0軸上,又與慢線死叉
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious){                       //而且快線在0軸上3點以上,又均線下降{
       
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);    //則下sell單,不停損,50停利

         if(ticket>0){    //若下sell單成功,印出sell單價格
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))    Print("SELL order opened : ",OrderOpenPrice());
           }else
            Print("Error opening SELL order : ",GetLastError());    //若失敗則印出錯誤訊息,結束程式
          }
      //--- exit from the "no opened orders" block
      return;
     }


//--- 移動停損及停利
   for(cnt=0;cnt<total;cnt++){    //走訪所有訂單
      if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))   continue;
   
      if(OrderType()<=OP_SELL &&   // check for opened position
         OrderSymbol()==Symbol()){  // 如果是本商品
     
         //--- 如果是buy單
         if(OrderType()==OP_BUY){
         
            //--- 如果MACD在0軸上死叉,而且快線大於0軸3點以上
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point)){
               //--- 平倉buy 單
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))    Print("OrderClose error ",GetLastError());
             
               return;
            }
         
            //--- 移動停利
            if(TrailingStop>0){     //如果有設停利啟動點
               if(Bid-OrderOpenPrice() > Point*TrailingStop){   //如果獲利超過30點
                  if(OrderStopLoss() < Bid-Point*TrailingStop){ //如果獲利大於停利點
                     //--- 動態變更停利點
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                        Print("OrderModify error ",GetLastError());
                   
                     return;
                  }
                }
            }

          }else{ // 如果是sell單

            //--- 如果MACD在0軸下金叉,且快線小於0軸3點以上
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)){
               //--- 平倉sell單
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))    Print("OrderClose error ",GetLastError());
             
               return;
            }

            //--- 移動停利
            if(TrailingStop>0){   //如果有設停利啟動點
               if((OrderOpenPrice()-Ask) > (Point*TrailingStop)){   //如果獲利超過30點
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)){     //目前點數小於停利點
                     //--- 動態變更停利點
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                        Print("OrderModify error ",GetLastError());
                   
                     return;
                  }
                }
            }
          }
      }
    }
//---
  }
//+------------------------------------------------------------------+