//+------------------------------------------------------------------+ //| PriceActionEA.mq4 | //| Copyright © 2011, Robert Hill | //| http://www.mrpipforex.com/ | //| | //+------------------------------------------------------------------+ #include #include // Add defines for signals #define LONG 1 #define SHORT -1 #define FLAT 0 //---- input parameters extern int MAPeriod = 6; // 4 to 9 good for immediate, and/or higher time frame, trend of ema and lwma extern int MAAppliedPrice = 0; extern double Lots=0.1; extern int MagicNumber = 12345; extern int TakeProfit = 0; extern int StopLoss=0; extern int Slippage = 3; extern int SignalCandle = 1; double myPoint; double TPprice, STprice; int init() { myPoint = SetPoint(); return(0); } int deinit() { return(0); } //+------------------------------------------------------------------+ //| GetSignal | //| | //+------------------------------------------------------------------+ int GetEntrySignal(int tf) { double MA_Cur, MA_Prev; MA_Cur = iLsma(tf, MAPeriod, MAAppliedPrice,SignalCandle); MA_Prev = iLsma(tf, MAPeriod, MAAppliedPrice,SignalCandle+1); if(MA_Cur < MA_Prev) return(SHORT); if(MA_Cur > MA_Prev) return (LONG); return(FLAT); } double iLsma(int TimeFrame, int LSMAPeriod, int LSMAPrice,int shift) { double wt; double ma1=iMA(NULL,TimeFrame,LSMAPeriod,0,MODE_SMA ,LSMAPrice,shift); double ma2=iMA(NULL,TimeFrame,LSMAPeriod,0,MODE_LWMA,LSMAPrice,shift); // Modified by Robert to make calculation to the whole pip level wt = MathFloor((3.0*ma2-2.0*ma1)/myPoint)*myPoint; return(wt); } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { RefreshRates(); int signal=GetEntrySignal(0); if (signal != FLAT) { if(signal == LONG) { OpenTrade(OP_BUY, Lots); return; } if(signal == SHORT) { OpenTrade(OP_SELL, Lots); } } return(0); //---- } int OpenTrade(int signal, double mLots) { int err, ticket; RefreshRates(); if (signal==OP_BUY) { ticket= OrderSend(Symbol(),OP_BUY,mLots,Ask,Slippage,0,0,"",MagicNumber,0,Green); if (ticket > 0) { TPprice = 0; STprice = 0; if (StopLoss != 0 || TakeProfit != 0) { OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); if (TakeProfit > 0) { TPprice=TakeLong(OrderOpenPrice(), TakeProfit); } if (StopLoss > 0) { STprice=StopLong(OrderOpenPrice(), StopLoss); } // Normalize stoploss / takeprofit to the proper # of digits. if (Digits > 0) { STprice = NormalizeDouble( STprice, Digits); TPprice = NormalizeDouble( TPprice, Digits); } OrderModify(ticket, OrderOpenPrice(), STprice, TPprice, 0, LightGreen); } } } else if (signal==OP_SELL) { ticket=OrderSend(Symbol(),OP_SELL,mLots,Bid,Slippage,0,0,"",MagicNumber,0,Red); if (ticket > 0) { TPprice = 0; STprice = 0; if (StopLoss != 0 || TakeProfit != 0) { OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); if (TakeProfit > 0) { TPprice=TakeShort(OrderOpenPrice(),TakeProfit); } if (StopLoss > 0) { STprice=StopShort(OrderOpenPrice() ,StopLoss); } // Normalize stoploss / takeprofit to the proper # of digits. if (Digits > 0) { STprice = NormalizeDouble( STprice, Digits); TPprice = NormalizeDouble( TPprice, Digits); } OrderModify(ticket, OrderOpenPrice(), STprice, TPprice, 0, LightGreen); } } } if(ticket<0) { err = GetLastError(); Print("OrderSend failed with error(" + err + ") " + ErrorDescription(err) ); } return(ticket); } double StopLong(double price,int stop) { if(stop==0) return(0); else return(price-(stop*myPoint)); } double StopShort(double price,int stop) { if(stop==0) return(0); else return(price+(stop*myPoint)); } double TakeLong(double price,int take) { if(take==0) return(0); else return(price+(take*myPoint)); } double TakeShort(double price,int take) { if(take==0) return(0); else return(price-(take*myPoint)); } double SetPoint() { double mPoint; if (Digits < 4) mPoint = 0.01; else mPoint = 0.0001; return(mPoint); } //+------------------------------------------------------------------+