RCIで底を捉えて、ナンピンしていく仕様に変更しました。
強制ロスカットになる可能性を低下させるために、底を捉えてからナンピンしています。
また、利確にフィボナッチの考えを取り入れることにより、利益確定のタイミングを最適化しています。
問題は下落しないとポジションを取らないため、トレード回数が非常に少ないということです。
8年間で96回のトレードでは少なすぎるため、今後、改良していきます。
(クリックで拡大)
8年間で資産が10倍になりました。
//+------------------------------------------------------------------+ //| JK_Carry_Trade_EA_1.1.mq4 | //| 作成日:2008.01.12 | //| 著作者:人生解放 | //+------------------------------------------------------------------+ #property copyright "人生解放" #property link "http://winnerlife.blog35.fc2.com/" #define MAGIC 2000 //---- Input Parameters extern int OrderModifyTime = 0; extern double Lots = 0.1; extern double MaxLots = 0.4; extern int CalBars_H1 = 72; extern double Fibo_Re1 = 0.236; extern double Fibo_Re2 = 0.382; extern double Fibo_Re3 = 0.500; extern double Fibo_Re4 = 0.618; extern double Fibo_Re5 = 0.764; extern double Swap1dayPoint = 1; extern double TakeProfit; extern double FreeMargin = 5000; extern double FreeMargin2 = 2800; extern int Slippage = 3; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start(){ //---- Leverage if(AccountFreeMargin() > FreeMargin){ FreeMargin=FreeMargin+FreeMargin2; FreeMargin2=FreeMargin2*2; Lots=Lots+0.1; } //---- RCI int rangeN = 26; double RCI1 = iCustom(NULL,0,"SpearmanRankCorr",rangeN,0,1); rangeN = 52; double RCI2 = iCustom(NULL,0,"SpearmanRankCorr",rangeN,0,1); rangeN = 104; double RCI3 = iCustom(NULL,0,"SpearmanRankCorr",rangeN,0,1); double Highest1 = iHigh(NULL, PERIOD_H1, iHighest(NULL, PERIOD_H1, MODE_HIGH, CalBars_H1, 0)); double Lowest1 = iLow(NULL, PERIOD_H1, iLowest(NULL, PERIOD_H1, MODE_LOW, CalBars_H1, 0)); //---- Buy if(OrdersTotal() == 0){ TakeProfit = (Highest1-Lowest1)*Fibo_Re1; if(RCI1 < -0.90 && RCI2 < -0.90){ OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Red); return(0); } } if(OrdersTotal() == 1){ OrderSelect(0,SELECT_BY_POS,MODE_TRADES); if(OrderOpenTime()+60*60*3 >= TimeCurrent()) return(0); // Print("OrderOpenTime = ",OrderOpenTime()); TakeProfit = (Highest1-Lowest1)*Fibo_Re2; if(RCI1 < -0.90 && RCI2 < -0.90 && RCI3 < -0.80){ OrderSend(Symbol(),OP_BUY,Lots*2,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Blue); return(0); } } if(OrdersTotal() == 2){ OrderSelect(1,SELECT_BY_POS,MODE_TRADES); if(OrderOpenTime()+60*60*3 >= TimeCurrent()) return(0); TakeProfit = (Highest1-Lowest1)*Fibo_Re3; if(RCI1 < -0.90 && RCI2 < -0.90 && RCI3 < -0.90){ OrderSend(Symbol(),OP_BUY,Lots*3,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Yellow); return(0); } } if(OrdersTotal() == 3){ OrderSelect(2,SELECT_BY_POS,MODE_TRADES); if(OrderOpenTime()+60*60*3 >= TimeCurrent()) return(0); TakeProfit = (Highest1-Lowest1)*Fibo_Re4; if(RCI1 < -0.95 && RCI2 < -0.95 && RCI3 < -0.95){ OrderSend(Symbol(),OP_BUY,Lots*4,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Lime); return(0); } } if(OrdersTotal() == 4){ OrderSelect(3,SELECT_BY_POS,MODE_TRADES); if(OrderOpenTime()+60*60*3 >= TimeCurrent()) return(0); TakeProfit = (Highest1-Lowest1)*Fibo_Re5; if(RCI1 < -0.95 && RCI2 < -0.95 && RCI3 < -0.95){ OrderSend(Symbol(),OP_BUY,Lots*5,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Orange); return(0); } } if(OrdersTotal() == 5){ OrderSelect(3,SELECT_BY_POS,MODE_TRADES); if(OrderOpenTime()+60*60*3 >= TimeCurrent()) return(0); TakeProfit = (Highest1-Lowest1)*Fibo_Re5; if(RCI1 < -0.95 && RCI2 < -0.95 && RCI3 < -0.95){ OrderSend(Symbol(),OP_BUY,Lots*6,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Gold); return(0); } } if(OrdersTotal() == 6){ OrderSelect(3,SELECT_BY_POS,MODE_TRADES); if(OrderOpenTime()+60*60*3 >= TimeCurrent()) return(0); TakeProfit = (Highest1-Lowest1)*Fibo_Re5; if(RCI1 < -0.95 && RCI2 < -0.95 && RCI3 < -0.95){ OrderSend(Symbol(),OP_BUY,Lots*7,Ask,Slippage,0,Ask+TakeProfit, "",MAGIC,0,Gray); return(0); } } //---- OrderModify for(int i = 0; i < OrdersTotal(); i++){ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break; if(OrderMagicNumber() != MAGIC || OrderSymbol() != Symbol()) continue; if(TimeHour(TimeCurrent())==OrderModifyTime && TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0){ OrderModify(OrderTicket(),OrderOpenPrice(),0 ,OrderTakeProfit()-Swap1dayPoint*Point,0,White); } } //---- return(0); } //+------------------------------------------------------------------+