標籤

二元樹 (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月28日 星期四

日本央行未如預期放寬政策 日經大跌

日本央行意外保持貨幣政策不動,驚動市場,日股早盤漲幅完全擋不住這股巨大賣壓,目前日股已經大幅下挫,日元兌美元匯率也暴漲。


我在那根大黑K的高點有兩張日本2X,在低點又加碼2張,看來後勢不妙。

2016年4月21日 星期四

LSS通道

上下通道表示支撐及壓力,所突破就做多,跌破做空,只限日內交易。
公式參考自:http://rane1220.pixnet.net/blog/post/48867946

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Yellow

double buffer1[];
double buffer2[];

int init(){
int draw_begin;
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,buffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,buffer2);
return 0;
}

int start(){
int limit = Bars - IndicatorCounted();

for(int i=0; i<limit; i++){
buffer1[i] = LssUp(i);
buffer2[i] = LssDown(i);
}

return 0;
}

double LssUp(int shift){
double upv, buv, dup, lssup;

shift++;
upv = iLow(NULL,0,shift) + (iHigh(NULL,0,shift) - iLow(NULL,0,shift+1) +
   iHigh(NULL,0,shift+1) - iLow(NULL,0,shift+2) +
   iHigh(NULL,0,shift+2) - iLow(NULL,0,shift+3))/3;
buv = iHigh(NULL,0,shift) + (iHigh(NULL,0,shift) - iHigh(NULL,0,shift+1) +
    iHigh(NULL,0,shift+1) - iHigh(NULL,0,shift+2) +
    iHigh(NULL,0,shift+2) - iHigh(NULL,0,shift+3))/3;
dup = iHigh(NULL,0,shift);
lssup = 2*(iHigh(NULL,0,shift) + iLow(NULL,0,shift) + iClose(NULL,0,shift))/3 - iLow(NULL,0,shift);

return (upv+buv+dup+lssup)/4;
}

double LssDown(int shift){
double downv, bdv, ddown, lssdown;

shift++;
downv = iHigh(NULL,0,shift) - (iHigh(NULL,0,shift+1) - iLow(NULL,0,shift) +
      iHigh(NULL,0,shift+2) - iLow(NULL,0,shift+1) +
      iHigh(NULL,0,shift+3) - iLow(NULL,0,shift+2))/3;
bdv = iLow(NULL,0,shift) - (iLow(NULL,0,shift+1) - iLow(NULL,0,shift) +
   iLow(NULL,0,shift+2) - iLow(NULL,0,shift+1) +
   iLow(NULL,0,shift+3) - iLow(NULL,0,shift+2))/3;
ddown = iLow(NULL,0,shift);
lssdown = 2*(iHigh(NULL,0,shift) + iLow(NULL,0,shift) + iClose(NULL,0,shift))/3 - iHigh(NULL,0,shift);

return (downv+bdv+ddown+lssdown)/4;
}

區間突破策略

常聽到的是突破/跌破8:45~9:00就進場做多/空,我寫了一個可以突破任意時間前的高低才進場的EA,測了一下好像10點以後才進場比較好。不過參考就好,因為MT4的回測資料品質爛死惹(只能測到最近2個月的5分K)。

摩台指2/18~4/21,一天只進場一次

#property copyright   "2016, Bill Chen"

input double Lots = 0.1;    
input int hands  = 1;
extern int theMagicNum = 3732;

extern double startTime = 8.75;
extern double sendTime = 9;
extern double endTime = 13.5;

input string str4= "Timeframes 1,5,15,30,60,...";
input int    MATrendPeriod = 15;  

double takeProfit, highest15, lowest15;
datetime lastBarTime;
int flag = 0;

void OnTick(void){
   int    cnt,ticket,total, symbolOrders;    
   double curTime = (Hour()+12)%24 + Minute()/60.0;

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

   total=OrdersTotal();
   symbolOrders = 0;
 
   if(curTime==sendTime){
      int kbarnum = (sendTime-startTime)/0.083;
      highest15 = iHigh(NULL,MATrendPeriod,iHighest(NULL,MATrendPeriod,MODE_HIGH,kbarnum,0));
      lowest15 = iLow(NULL,MATrendPeriod,iLowest(NULL,MATrendPeriod,MODE_LOW,kbarnum,0));
      takeProfit = highest15 - lowest15;
      flag = 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>=sendTime && curTime<=endTime-0.05) && flag==0){
          if(AccountFreeMargin() < (1000*Lots)){  
             Print("We have no money. Free Margin = ",AccountFreeMargin());
             return;
          }
                                       
               if(iClose(NULL,MATrendPeriod,0) > highest15){    
              ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"AMAtrading v.0.1.3", theMagicNum,0,Green);  flag=1;            
                     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(iClose(NULL,MATrendPeriod,0) < lowest15){   //v.0.1.2
                     ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading v.0.1.3", theMagicNum,0,Red);  flag=1;
                     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(iClose(NULL,MATrendPeriod,0)<OrderOpenPrice()-takeProfit/2 || (Bid-OrderOpenPrice())>takeProfit*2 || curTime>=endTime){
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))    Print("OrderClose error ",GetLastError());
               return;
     }
        }else{
       if(iClose(NULL,MATrendPeriod,0)>OrderOpenPrice()+takeProfit/2 || (OrderOpenPrice()-Ask)>takeProfit*2 || curTime>=endTime ){
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))    Print("OrderClose error ",GetLastError());
               return;
              }
          }
      }
    }//-----orders handle ends-------

  }

2016年4月15日 星期五

HTS-新倉

IF condition1 then

    (此處為新倉進場寫法)

   End if



多單進場寫法

BUY                       [當根收盤買進]

Buy on close                  [當根收盤買進]

Buy("買進") on close                [當根收盤買進]

Buy("買進") this bar on close          [當根收盤買進]

Buy("買進") next bar on market         [下一根市價買進]

Buy("買進") 1 contract this bar at close     [當根收盤買進1口]

Buy("買進") 1 contract next bar at market   [下一根市價買進1口]



空單進場寫法

將Buy 改成sell ,及為空單進場寫法



如果是平倉

多單改為 Exitlong

空單改為 ExitShort


FROM


若您想在股價向上突破均線時(預設為10日均)買進,

向下跌破均線時賣出,語法如下

Parameter:Length(10)  

if close cross over average(close,length)  then buy next bar at market
end if

if close cross under average(close,length) then sell next bar at market
end if

2016年4月13日 星期三

Escalator Trading System

策略來自:http://www.bituzi.com/2014/03/EscalatorTradingSystem.html

簡單說就是,昨天是黑K,而今天是紅K,而且收盤又大於8MA和40MA,則明天高於這兩根的高點做多; 若昨天紅K,今天黑K,收盤又小於8MA和40MA,明天低於兩根的低點放空。
這兩根1黑1紅的K棒,看起來就像一邊上一邊下的電扶梯。

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

extern string str1 = "Timeframe Setting";
input int timeFrame = 5;

double stopLoss,takeProfit;

void OnTick(void){

 int    cnt,ticket,total, symbolOrders;

   if(Bars<100){
      Print("bars less than 100");
      return;
   }

   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 ){
          if(AccountFreeMargin() < (1000*Lots)){  
             Print("We have no money. Free Margin = ",AccountFreeMargin());
             return;
          }

          if(canBuy() && iClose(NULL,timeFrame,0)>=(High[iHighest(NULL,timeFrame,MODE_HIGH,2,1)]+1*Point)){
  ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask,3, 0, 0,"EscalatorTradingSystem.v.0.1", theMagicNum,0,Green);
  stopLoss = High[iHighest(NULL,timeFrame,MODE_HIGH,2,1)]+1*Point-(Low[iLowest(NULL,timeFrame,MODE_LOW,2,1)]-1*Point);
  takeProfit = stopLoss*2;

            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(canSell() && iClose(NULL,timeFrame,0)<=(Low[iLowest(NULL,timeFrame,MODE_LOW,2,1)]-1*Point)){
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3, 0, 0,"AMAtrading.v.0.3", theMagicNum,0,Red);
              stopLoss = High[iHighest(NULL,timeFrame,MODE_HIGH,2,1)]+1*Point-(Low[iLowest(NULL,timeFrame,MODE_LOW,2,1)]-1*Point);
           takeProfit = stopLoss*2;
               
                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((Bid-OrderOpenPrice())>takeProfit || (OrderOpenPrice()-Ask)>stopLoss ){
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))    Print("OrderClose error ",GetLastError());
                    return;
}
        }else{
   if((OrderOpenPrice()-Ask)>takeProfit || (Bid-OrderOpenPrice())>stopLoss ){
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))    Print("OrderClose error ",GetLastError());
                      return;
              }
          }
      }
    }//-----orders handle ends-------
  }


bool canBuy(){
   double kRange1 = iHigh(NULL,timeFrame,1)-iLow(NULL,timeFrame,1),
          kRange2 = iHigh(NULL,timeFrame,2)-iLow(NULL,timeFrame,2);
       
   if(iClose(NULL,timeFrame,2)<=iLow(NULL,timeFrame,2)+kRange2*0.25 &&
      iClose(NULL,timeFrame,1)>=iHigh(NULL,timeFrame,1)-kRange1*0.25){
      if(iClose(NULL,timeFrame,1)>iMA(NULL,timeFrame,8,0,MODE_SMA,PRICE_CLOSE,0) &&
         iClose(NULL,timeFrame,1)>iMA(NULL,timeFrame,40,0,MODE_SMA,PRICE_CLOSE,0))
            return true;
      else return false;
   }else return false;
}

bool canSell(){
   double kRange1 = iHigh(NULL,timeFrame,1)-iLow(NULL,timeFrame,1),
          kRange2 = iHigh(NULL,timeFrame,2)-iLow(NULL,timeFrame,2);
       
   if(iClose(NULL,timeFrame,1)<=iLow(NULL,timeFrame,1)+kRange1*0.25 &&
      iClose(NULL,timeFrame,2)>=iHigh(NULL,timeFrame,2)-kRange2*0.25){
      if(iClose(NULL,timeFrame,1)<iMA(NULL,timeFrame,8,0,MODE_SMA,PRICE_CLOSE,0) &&
         iClose(NULL,timeFrame,1)<iMA(NULL,timeFrame,40,0,MODE_SMA,PRICE_CLOSE,0))
            return true;
      else return false;
   }else return false;
}

2013.3 to 2016.4 摩台指日K

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軸時,為中線賣點。