標籤

二元樹 (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)
顯示具有 EA 標籤的文章。 顯示所有文章
顯示具有 EA 標籤的文章。 顯示所有文章

2016年4月21日 星期四

區間突破策略

常聽到的是突破/跌破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月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