策略來自:
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