//+------------------------------------------------------------------+ //| AlmightyEAforSignalIndicators.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "keiji" #property link "http://www.dr-ea.com/meta-blog/" #include //Parameter extern string _MAIN_SETTING = "------Main Setting"; extern double Lots = 0.1; //ロット数 extern double TakeProfit = 0; //リミットのPIPS数 0の場合リミットなし extern double StopLoss = 0; //ストップロスのPIPS数 0の場合ストップロスなし extern int TrailingStop = 50; //トレーリングのPIPS数 0の場合トレーリングなし extern double Slippage = 3; //スリッページ extern int MagicNumber = 20130606; //マジックナンバー extern string _TIME_SETTING = "------Entry Time Setting"; extern bool UseTradeTime = false; extern int Trade_StartHour = 0; extern int Trade_StartMinute = 0; extern int Trade_EndHour = 0; extern int Trade_EndMinute = 0; extern string _SIGNAL_SETTING = "------Signal Setting"; extern string CustomIndicatorName = ""; extern int BuyEntrySignalIndex = -1; extern int BuyEntrySignalShift = 1; extern int SellEntrySignalIndex = -1; extern int SellEntrySignalShift = 1; extern int BuyExitSignalIndex = -1; extern int BuyExitSignalShift = 1; extern int SellExitSignalIndex = -1; extern int SellExitSignalShift = 1; extern string _PARAMETER_SETTING = "------Parameter of Singal Indicator Setting"; extern double Para1 = 0; extern double Para2 = 0; extern double Para3 = 0; extern double Para4 = 0; extern double Para5 = 0; extern double Para6 = 0; extern double Para7 = 0; extern double Para8 = 0; extern double Para9 = 0; extern double Para10 = 0; extern double Para11 = 0; extern double Para12 = 0; extern double Para13 = 0; extern double Para14 = 0; extern double Para15 = 0; extern double Para16 = 0; extern double Para17 = 0; extern double Para18 = 0; extern double Para19 = 0; extern double Para20 = 0; //memo int stoplevel; double _point; double maxlot; double minlot; int lotdigit; int bar; int trade_mode; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); _point = Point; if (Digits % 2 == 1) { _point *= 10; Slippage *= 10; } //ブローカーのロット数に関する情報を取得 maxlot = MarketInfo(Symbol(), MODE_MAXLOT); minlot = MarketInfo(Symbol(), MODE_MINLOT); double lotstep = MarketInfo(Symbol(), MODE_LOTSTEP); if(NormalizeDouble(lotstep, 3) <= 0.001) lotdigit = 3; else if(NormalizeDouble(lotstep, 2) <= 0.01) lotdigit = 2; else if(NormalizeDouble(lotstep, 1) <= 0.1) lotdigit = 1; else lotdigit = 0; trade_mode = 0; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int i; //pos:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: int pos=-1; for(i=OrdersTotal()-1; i>=0; i--) { OrderSelect(i, SELECT_BY_POS); if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() != MagicNumber) continue; if(OrderType() == OP_BUY || OrderType() == OP_SELL) { pos=i; break; } } //sign::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: int entrysign; if(BuyEntrySignalIndex >= 0) { double buyentrysignal = iCustom(NULL, 0, CustomIndicatorName, Para1, Para2, Para3, Para4, Para5,Para6, Para7, Para8, Para9, Para10, Para11, Para12, Para13, Para14, Para15, Para16, Para17, Para18, Para19, Para20, BuyEntrySignalIndex, BuyEntrySignalShift); if(buyentrysignal != EMPTY_VALUE && buyentrysignal != 0) entrysign = 1; } if(SellEntrySignalIndex >= 0) { double sellentrysignal = iCustom(NULL, 0, CustomIndicatorName, Para1, Para2, Para3, Para4, Para5,Para6, Para7, Para8, Para9, Para10, Para11, Para12, Para13, Para14, Para15, Para16, Para17, Para18, Para19, Para20, SellEntrySignalIndex, SellEntrySignalShift); if(sellentrysignal != EMPTY_VALUE && sellentrysignal != 0) entrysign = -1; } int exitsign; if(BuyExitSignalIndex >= 0) { double buyexitsignal = iCustom(NULL, 0, CustomIndicatorName, Para1, Para2, Para3, Para4, Para5,Para6, Para7, Para8, Para9, Para10, Para11, Para12, Para13, Para14, Para15, Para16, Para17, Para18, Para19, Para20, BuyExitSignalIndex, BuyExitSignalShift); if(buyexitsignal != EMPTY_VALUE && buyexitsignal != 0) exitsign = -1; } if(SellExitSignalIndex >= 0) { double sellexitsignal = iCustom(NULL, 0, CustomIndicatorName, Para1, Para2, Para3, Para4, Para5,Para6, Para7, Para8, Para9, Para10, Para11, Para12, Para13, Para14, Para15, Para16, Para17, Para18, Para19, Para20, SellExitSignalIndex, SellExitSignalShift); if(sellexitsignal != EMPTY_VALUE && sellexitsignal != 0) exitsign = 1; } if(exitsign != 0) if(entrysign != exitsign) entrysign = 0; //some pos::::::::::::::::::::::::::::::::::::::::::::::::::::::::: if(pos>=0) { //トレーリングストップ if(TrailingStop > 0) { double ts; if(OrderType() == OP_BUY) { ts = NormalizeDouble(Bid - TrailingStop * _point, Digits); if(ts >= OrderOpenPrice()) { if(ts > NormalizeDouble(OrderStopLoss(), Digits)) { OrderModify(OrderTicket(), 0, ts, OrderTakeProfit(), 0, Red); } } } if(OrderType() == OP_SELL) { ts = NormalizeDouble(Ask + TrailingStop * _point, Digits); if(ts <= OrderOpenPrice()) { if(ts < NormalizeDouble(OrderStopLoss(), Digits) || OrderStopLoss() == 0) { OrderModify(OrderTicket(), 0, ts, OrderTakeProfit(), 0, Red); } } } } //Exit bool b_exit = false; if(OrderType() == OP_BUY) if(exitsign == -1) b_exit = true; if(OrderType() == OP_SELL) if(exitsign == 1) b_exit = true; if(b_exit) { if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Yellow)) pos=-1; else FuncPrintError("Close"); } } //Entry::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: int ticket=-1; double sl=0,tp=0; if(isTradeTime()) if(pos<0 && bar!=Bars) { double lots=Lots; //切捨て lots = MathFloor(lots*MathPow(10,lotdigit))*MathPow(0.1,lotdigit); //ブローカー制限 lots = MathMax(minlot, MathMin(maxlot, lots)); if(entrysign==1 && trade_mode != 2) //買い { if(StopLoss>0) sl=MathMin(Bid-stoplevel*Point,Ask-StopLoss*_point); if(TakeProfit>0) tp=MathMax(Bid+stoplevel*Point,Ask+TakeProfit*_point); ticket=OrderSend(Symbol(),OP_BUY,lots,Ask,Slippage,0,0,NULL,MagicNumber,0,Blue); if(ticket>=0) { bar=Bars; if(sl!=0 || tp!=0) { OrderSelect(ticket,SELECT_BY_TICKET); OrderModify(ticket,OrderOpenPrice(),sl,tp,0,Red); } } else FuncPrintError("Buy"); } if(entrysign==-1 && trade_mode != 1) //売り { if(StopLoss>0) sl=MathMax(Ask+stoplevel*Point,Bid+StopLoss*_point); if(TakeProfit>0) tp=MathMin(Ask-stoplevel*Point,Bid-TakeProfit*_point); ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,Slippage,0,0,NULL,MagicNumber,0,Red); if(ticket>=0) { bar=Bars; if(sl!=0 || tp!=0) { OrderSelect(ticket,SELECT_BY_TICKET); OrderModify(ticket,OrderOpenPrice(),sl,tp,0,Red); } } else FuncPrintError("Sell"); } } return(0); } //+------------------------------------------------------------------+ //Error出力 void FuncPrintError(string ope) { int error = GetLastError(); if(error==4110) trade_mode = 2; if(error==4111) trade_mode = 1; Print(ope," operation failed - error(", error, "): ", ErrorDescription(error)); } bool isTradeTime() { if(!UseTradeTime) return(true); int nowtime = Hour() * 100 + Minute(); int start = Trade_StartHour * 100 + Trade_StartMinute; int end = Trade_EndHour * 100 + Trade_EndMinute; if(start < end) { if(start <= nowtime && nowtime < end) return(true); } else if(start > end) { if(start <= nowtime || nowtime < end) return(true); } else return(true); return(false); }