//+------------------------------------------------------------------+ //| AutoKdj.mq4 | //| senlin ge | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "senlin ge" #property link "http://www.metaquotes.net" #define MAGICKDJ 20080220 //---- input parameters extern int whichmethod = 2;//1;//4; //1: no S/L,no T/P ²»ÉèÖ¹Ó®Ò²²»ÉèÖ¹Ëð //2: no S/L,has T/P ÉèÖ¹Ó®£¬µ«²»ÉèÖ¹Ëð //3: has S/L,no T/P //²»ÉèÖ¹Ó®£¬ÉèÖ¹Ëð //4: has T/P has S/L,ÉèÖ¹Ó®Ò²ÉèÖ¹Ëð extern double Lots=0.1; //×îµÍ±ê×¼ÊÖ extern double MaximumRisk=0.4; //¿ª²ÖÕ¼¿ÉÓÃ×ʽð±ÈÀý extern double DecreaseFactor=0.3; //¿ª²Ö¿÷Ëð¼õÉÙϵ¥ÊÖÊý extern int tp=200; //×î´óÓ®Àû Ö¹Ó®µãÊý extern int sl=100; //×î´óËðʧ Ö¹ËðµãÊý extern int Leverage=100; //½»Ò×±¶Êý1:100 //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- //---- return(0); } //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICKDJ) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- return orders volume if(buys>0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { //double ma; int res; double point =MarketInfo(Symbol(),MODE_POINT); Print("point=",point); //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average double valKDCCurrent=iCustom(NULL, 0, "kdj",5,0); //µ±Ç°Ò»ÖÜÆÚµÄKDCÖµ double valKDCPrevious=iCustom(NULL, 0, "kdj",5,1); //Ç°Ò»ÖÜÆÚµÄKDCÖµ double valKCurrent=iCustom(NULL, 0, "kdj",2,0); //µ±Ç°ÖÜÆÚµÄKÖµ double valKPrevious=iCustom(NULL, 0, "kdj",2,1); //Ç°Ò»ÖÜÆÚµÄKÖµ double valDCurrent=iCustom(NULL, 0, "kdj",3,0); //µ±Ç°ÖÜÆÚµÄDÖµ double valDPrevious=iCustom(NULL, 0, "kdj",3,1); //Ç°Ò»ÖÜÆÚµÄDÖµ Print("valKCurrent=",valKCurrent); Print("valDCurrent=",valDCurrent); Print("valKPrevious=",valKPrevious); Print("valDPrevious=",valDPrevious); //---- sell conditions if(valKDCPrevious>0 && valKDCCurrent<0|| (valKDCCurrent<0 && valKPrevious-valKCurrent>0)) //kÏ´©D K<d do short { switch (whichmethod) { case 1: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break; case 2: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+sl*point,0,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break; case 3: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-tp*point,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break; case 4: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,0,Bid+sl*point,Bid-tp*point,"¿ª¿Õ²Ö",MAGICKDJ,0,Red); break; default : res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICKDJ,0,Red); break; } if (res <=0) { int error=GetLastError(); if(error==134) Print("Received 134 Error after OrderSend() !! "); // not enough money if(error==135) RefreshRates(); // prices have changed if(error==131) Print("Received 131 Error after OrderSend() !! "); // not enough money } //Sleep(5000); return; } //---- buy conditions if(valKDCPrevious<0 && valKDCCurrent>0|| valKDCCurrent>0&& valKPrevious-valKCurrent<0)//kÉÏ´©D k>d ×ö¶à { switch (whichmethod) { case 1: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break; case 2: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-sl*point,0,"¿ª¶à²Ö",MAGICKDJ,0,Blue); break; case 3: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+tp*point,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break; case 4: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,0,Ask-sl*point,Ask+tp*point,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break; default : res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"¿ª¶à²Ö",MAGICKDJ,0,Blue);break; } if (res <=0) { error=GetLastError(); if(error==134) Print("Received 134 Error after OrderSend() !! "); // not enough money if(error==135) RefreshRates(); // prices have changed } Sleep(5000); return; } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get K[1],k[0],d[1],d[0] double valKDCCurrent=iCustom(NULL, 0, "kdj",5,0); //µ±Ç°Ò»ÖÜÆÚµÄKDCÖµ double valKDCPrevious=iCustom(NULL, 0, "kdj",5,1); //Ç°Ò»ÖÜÆÚµÄKDCÖµ double valKCurrent=iCustom(NULL, 0, "kdj",2,0); //µ±Ç°ÖÜÆÚµÄKÖµ double valKPrevious=iCustom(NULL, 0, "kdj",2,1); //Ç°Ò»ÖÜÆÚµÄKÖµ double valDCurrent=iCustom(NULL, 0, "kdj",3,0); //µ±Ç°ÖÜÆÚµÄDÖµ double valDPrevious=iCustom(NULL, 0, "kdj",3,1); //Ç°Ò»ÖÜÆÚµÄDÖµ //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICKDJ || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) //¶Ô¶à·½ÅÌƽ²Ö { if(valKDCPrevious>0 && valKDCCurrent<0|| valKPrevious>valKCurrent) //kÏ´©D »òÕßÊÇK ÔÚDÏÂÏÂÐÐ K<d do short OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Sleep(5000); break; } if(OrderType()==OP_SELL) //¶Ô¿Õ·½ÅÌƽ²Ö { if(valKDCPrevious<0 && valKDCCurrent>0||valKPrevious<valKCurrent)//kÉÏ´©D or k>d ×ö¶à OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Sleep(5000); break; } } //---- } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //---- select lot size lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk*Leverage/100000.0,1); //---- calcuulate number of losses orders without a break if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses*DecreaseFactor,1); } //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains tick volumes of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
kdj
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself
Other Features: