//+-------------------------------------------------------------------------------------+ //| FarhadCrab1.mq4 | //| Copyright © 2006, Farhad Farshad | //| http://www.fxperz.com | //| http://farhadfarshad.com | //| This EA is optimized to work on | //| GBP/JPY & GBP/USD & EUR/USD M1 TimeFrame ... if you want the optimized | //| EA s for any currency pair please | //| mail me at: info@farhadfarshad.com | //| This is the first version of this EA. If | //| you want the second edition ('FarhadCrab2.mq4') | //| with considerably better performance mail me. 'FarhadMagic.mq4' and | //| 'Farhad2.mq4' are also available from this series. | //| (They are not free and they don't have trial version!) | //| Enjoy a better automatic investment:) with at least 100% a month. | //| If you get money from this EA please donate some to poor people of your country.| //+-------------------------------------------------------------------------------------+ #property copyright "Copyright © 2006, Farhad Farshad" #property link "http://www.fxperz.com" //---- #include <stdlib.mqh> //---- extern double lTakeProfit =10; // recomended no more than 20 extern double sTakeProfit =10; // recomended no more than 20 extern double takeProfit =10; // recomended no more than 20 extern double stopLoss =10; // do not use s/l at all. Take it easy man. I'll guarantee your profit :) extern int magicEA =114; // Magic EA identifier. Allows for several co-existing EA with different input values extern double lTrailingStop =8; // trail stop in points extern double sTrailingStop =8; // trail stop in points extern color clOpenBuy =Blue; //Different colors for different positions extern color clCloseBuy =Aqua; //Different colors for different positions extern color clOpenSell =Red; //Different colors for different positions extern color clCloseSell =Violet; //Different colors for different positions extern color clModiBuy =Blue; //Different colors for different positions extern color clModiSell =Red; //Different colors for different positions extern int Slippage =2; extern double Lots =0.1;// you can change the lot but be aware of margin. Its better to trade with 1/4 of your capital. extern string nameEA ="FarhadCrab1.mq4";// To "easy read" which EA place an specific order and remember me forever :) extern double vVolume; //---- double macdHistCurrent, macdHistPrevious, macdSignalCurrent, macdSignalPrevious, highCurrent, lowCurrent; double stochHistCurrent, stochHistPrevious, stochSignalCurrent, stochSignalPrevious; double sarCurrent, sarPrevious, momCurrent, momPrevious; double maLongCurrent, maShortCurrent, maLongPrevious, maShortPrevious, faRSICurrent; double realTP, realSL, faMiddle, faHighest, faLowest, closeCurrent, closeCurrentD, closePreviousD; int cnt, ticket; bool isBuying=false, isSelling=false, isBuyClosing=false, isSellClosing=false; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void deinit() { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { // *****This line is for some reason very important. you'd better settle all your account at the end of day.***** /*if (TimeHour(CurTime())==23 && MathAbs(faMiddle-faHighest)<MathAbs(faMiddle-faLowest)) { CloseBuyPositions(); return(0); } if (TimeHour(CurTime())==23 && MathAbs(faMiddle-faHighest)>MathAbs(faMiddle-faLowest) ) { CloseSellPositions(); return(0); } */ //System Stoploss based on LongTerm Moving Average (Fibo 55 day MA) //StopLoss For Buy Positions (Optional) if ((maLongCurrent>closeCurrentD) && (maLongPrevious<closePreviousD)) { CloseBuyPositions(); return(0); } //StopLoss For Sell Positions (Optional) if ((maLongCurrent<closeCurrentD) && (maLongPrevious>closePreviousD)) { CloseSellPositions(); return(0); } // Check for invalid bars and takeprofit if(Bars < 200) { Print("Not enough bars for this strategy - ", nameEA); return(0); } /* if(isBuying && !isSelling && !isBuyClosing && !isSellClosing) { // Check for BUY entry signal if(stopLoss > 0) realSL = Ask - stopLoss * Point; if(takeProfit > 0) realTP = Ask + takeProfit * Point; ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,realSL,realTP,nameEA+" - Magic: "+magicEA+" ",magicEA,0,Red); // Buy if(ticket < 0) { Print("OrderSend (" + nameEA + ") failed with error #" + GetLastError() + " --> " + ErrorDescription(GetLastError())); } else { } } if(isSelling && !isBuying && !isBuyClosing && !isSellClosing) { // Check for SELL entry signal if(stopLoss > 0) realSL = Bid + stopLoss * Point; if(takeProfit > 0) realTP = Bid - takeProfit * Point; ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,realSL,realTP,nameEA+" - Magic: "+magicEA+" ",magicEA,0,Red); // Sell if(ticket < 0) { Print("OrderSend (" + nameEA + ") failed with error #" + GetLastError() + " --> " + ErrorDescription(GetLastError())); } else { } } return(0); */ calculateIndicators(); // Calculate indicators' value //Check for TakeProfit Conditions if(lTakeProfit<10) { Print("TakeProfit less than 10 on this EA with Magic -", magicEA ); return(0); } if(sTakeProfit<10) { Print("TakeProfit less than 10 on this EA with Magic -", magicEA); return(0); } //Introducing new expressions double faClose0 =iLow(NULL,0,0); double faMA1 =iMA(NULL,0,9,0,MODE_EMA,PRICE_TYPICAL,0); //double faMA2 = iMAOnArray(faMA1,0,9,0,MODE_EMA,0); //double faMA4 = iMAOnArray(faMA2,0,9,0,MODE_EMA,0); double faClose2 =iHigh(NULL,0,0); double faMA3 =iMA(NULL,0,9,0,MODE_SMA,PRICE_OPEN,0); double stochHistCurrent =iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0); double sarCurrent =iSAR(NULL,0,0.002,0.2,0); // Parabolic Sar Current double sarPrevious =iSAR(NULL,0,0.002,0.2,1); //Parabolic Sar Previous double vVolume =iVolume(NULL,0,0); // Current Volume //double faMAvVolume = iMAOnArray(vVolume,0,9,0,MODE_SMA,0); //Simple Moving Average double faHighest =Highest(NULL,PERIOD_H4,MODE_HIGH,30,0); // Highest High in an interval of time double faLowest =Lowest(NULL,PERIOD_H4,MODE_LOW,30,0); //Lowest Low in an interval of time double faMiddle =(faHighest+faLowest)/2; //... //Check Margin Requirement if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //Buy Condition if (!takeBuyPositions()) { //if ((faClose0>faMA1 && faBandWidth<faMABandWidth)){ if ((faClose0>faMA1)) { OpenBuy(); //if (OrdersTotal()==1 && (faClose2<faMA3)) {OpenSell();} //if (OrdersTotal()==2 && (faClose2<faMA3)) {OpenSell();} //if (OrdersTotal()==3 && (faClose2<faMA3)) {OpenSell();} return(0); } } //Sell Condition //if ((faClose2<faMA3 && faBandWidth<faMABandWidth)){ if (!takeSellPositions()) { if ((faClose2<faMA3)) { OpenSell(); //if (OrdersTotal()==1 && (faClose0>faMA1)) {OpenBuy();} //if (OrdersTotal()==2 && (faClose0>faMA1)) {OpenBuy();} //if (OrdersTotal()==3 && (faClose0>faMA1)) {OpenBuy();} return(0); } //Close Buy Condition /* if ((faClose2<faMA3)) { CloseBuy(); return(0); } //Close Sell Condition if ((faClose2<faMA3)) { CloseSell(); return(0); } */ } //Trailing Expressions TrailingPositionsBuy(lTrailingStop); TrailingPositionsSell(sTrailingStop); return(0); } //Number of Buy Positions //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool takeBuyPositions() { int j ; if ((OrdersTotal()==0)) {j=0;} if (maLongCurrent<closeCurrent) { if ((CurTime()-OrderOpenTime()>300) && (sarCurrent<lowCurrent)) {j=1;} if ((CurTime()-OrderOpenTime()>600) && (sarCurrent<lowCurrent)) {j=2;} if ((CurTime()-OrderOpenTime()>900) && (sarCurrent<lowCurrent)) {j=3;} if ((CurTime()-OrderOpenTime()>1200) && (sarCurrent<lowCurrent)) {j=4;} if ((CurTime()-OrderOpenTime()>1500) && (sarCurrent<lowCurrent)) {j=5;} if ((CurTime()-OrderOpenTime()>1800) && (sarCurrent<lowCurrent)) {j=6;} if ((CurTime()-OrderOpenTime()>2100) && (sarCurrent<lowCurrent)) {j=7;} if ((CurTime()-OrderOpenTime()>2400) && (sarCurrent<lowCurrent)) {j=8;} if ((CurTime()-OrderOpenTime()>2700) && (sarCurrent<lowCurrent)) {j=9;} if ((CurTime()-OrderOpenTime()>3000) && (sarCurrent<lowCurrent)) {j=10;} if ((CurTime()-OrderOpenTime()>3300) && (sarCurrent<lowCurrent)) {j=11;} if ((CurTime()-OrderOpenTime()>3600) && (sarCurrent<lowCurrent)) {j=12;} if ((CurTime()-OrderOpenTime()>3900) && (sarCurrent<lowCurrent)) {j=13;} if ((CurTime()-OrderOpenTime()>4200) && (sarCurrent<lowCurrent)) {j=14;} if ((CurTime()-OrderOpenTime()>4500) && (sarCurrent<lowCurrent)) {j=15;} if ((CurTime()-OrderOpenTime()>4800) && (sarCurrent<lowCurrent)) {j=16;} if ((CurTime()-OrderOpenTime()>5100) && (sarCurrent<lowCurrent)) {j=17;} if ((CurTime()-OrderOpenTime()>5400) && (sarCurrent<lowCurrent)) {j=18;} if ((CurTime()-OrderOpenTime()>5700) && (sarCurrent<lowCurrent)) {j=19;} for(int i=j; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==magicEA) { return(True); } } } } return(false); } //Number of Sell Positions //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool takeSellPositions() { int j ; if ((OrdersTotal()==0)) {j=0;} if (maLongCurrent>closeCurrent) { if ((CurTime()-OrderOpenTime()>300) && (sarCurrent>highCurrent)) {j=1;} if ((CurTime()-OrderOpenTime()>600) && (sarCurrent>highCurrent)) {j=2;} if ((CurTime()-OrderOpenTime()>900) && (sarCurrent>highCurrent)) {j=3;} if ((CurTime()-OrderOpenTime()>1200) && (sarCurrent>highCurrent)) {j=4;} if ((CurTime()-OrderOpenTime()>1500) && (sarCurrent>highCurrent)) {j=5;} if ((CurTime()-OrderOpenTime()>1800) && (sarCurrent>highCurrent)) {j=6;} if ((CurTime()-OrderOpenTime()>2100) && (sarCurrent>highCurrent)) {j=7;} if ((CurTime()-OrderOpenTime()>2400) && (sarCurrent>highCurrent)) {j=8;} if ((CurTime()-OrderOpenTime()>2700) && (sarCurrent>highCurrent)) {j=9;} if ((CurTime()-OrderOpenTime()>3000) && (sarCurrent>highCurrent)) {j=10;} if ((CurTime()-OrderOpenTime()>3300) && (sarCurrent>highCurrent)) {j=11;} if ((CurTime()-OrderOpenTime()>3600) && (sarCurrent>highCurrent)) {j=12;} if ((CurTime()-OrderOpenTime()>3900) && (sarCurrent>highCurrent)) {j=13;} if ((CurTime()-OrderOpenTime()>4200) && (sarCurrent>highCurrent)) {j=14;} if ((CurTime()-OrderOpenTime()>4500) && (sarCurrent>highCurrent)) {j=15;} if ((CurTime()-OrderOpenTime()>4800) && (sarCurrent>highCurrent)) {j=16;} if ((CurTime()-OrderOpenTime()>5100) && (sarCurrent>highCurrent)) {j=17;} if ((CurTime()-OrderOpenTime()>5400) && (sarCurrent>highCurrent)) {j=18;} if ((CurTime()-OrderOpenTime()>5700) && (sarCurrent>highCurrent)) {j=19;} for(int i=j; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==magicEA) { return(True); } } } } return(false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void TrailingPositionsBuy(int trailingStop) { for(int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==magicEA) { if (OrderType()==OP_BUY) { if (Bid-OrderOpenPrice()>trailingStop*Point) { if (OrderStopLoss()<Bid-trailingStop*Point) ModifyStopLoss(Bid-trailingStop*Point); } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void TrailingPositionsSell(int trailingStop) { for(int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==magicEA) { if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>trailingStop*Point) { if (OrderStopLoss()>Ask+trailingStop*Point || OrderStopLoss()==0) ModifyStopLoss(Ask+trailingStop*Point); } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStopLoss) { bool fm; fm=OrderModify(OrderTicket(),OrderOpenPrice (),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OpenBuy() { double ldLot, ldStop, ldTake; string lsComm; ldLot=GetSizeLot(); ldStop=0; ldTake=GetTakeProfitBuy(); lsComm=GetCommentForOrder(); OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,ldStop,ldTake,nameEA,magicEA,0,clOpenBuy); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OpenSell() { double ldLot, ldStop, ldTake; string lsComm; //---- ldLot=GetSizeLot(); ldStop=0; ldTake=GetTakeProfitSell(); lsComm=GetCommentForOrder(); OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,ldStop,ldTake,nameEA,magicEA,0,clOpenSell); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ string GetCommentForOrder() { return(nameEA); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetSizeLot() { return(Lots); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetTakeProfitBuy() { return(Ask+lTakeProfit*Point); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetTakeProfitSell() { return(Bid-sTakeProfit*Point); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void calculateIndicators() { // Calculate indicators' value macdHistCurrent =iMACD(NULL,0,12,26,9,PRICE_OPEN,MODE_MAIN,0); macdHistPrevious =iMACD(NULL,0,12,26,9,PRICE_OPEN,MODE_MAIN,1); macdSignalCurrent =iMACD(NULL,0,12,26,9,PRICE_OPEN,MODE_SIGNAL,0); macdSignalPrevious =iMACD(NULL,0,12,26,9,PRICE_OPEN,MODE_SIGNAL,1); stochHistCurrent =iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0); stochHistPrevious =iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1); stochSignalCurrent =iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0); stochSignalPrevious=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1); sarCurrent =iSAR(NULL,0,0.009,0.2,0); // Parabolic Sar Current sarPrevious =iSAR(NULL,0,0.009,0.2,1); //Parabolic Sar Previous momCurrent =iMomentum(NULL,0,14,PRICE_OPEN,0); // Momentum Current momPrevious =iMomentum(NULL,0,14,PRICE_OPEN,1); // Momentum Previous highCurrent =iHigh(NULL,0,0); //High price Current lowCurrent =iLow(NULL,0,0); //Low Price Current closeCurrent =iClose(NULL,PERIOD_H4,0); //Close Price Current for H4 TimeFrame closeCurrentD =iClose(NULL,PERIOD_D1,0); //Close Price Current for D1 TimeFrame closePreviousD =iClose(NULL,PERIOD_D1,1); //Close Price Previous for D1 TimeFrame maLongCurrent =iMA(NULL,PERIOD_D1,55,1,MODE_SMMA,PRICE_TYPICAL,0); //Current Long Term Moving Average maLongPrevious =iMA(NULL,PERIOD_D1,55,1,MODE_SMMA,PRICE_TYPICAL,1); //Previous Long Term Moving Average maShortCurrent =iMA(NULL,0,2,1,MODE_SMMA,PRICE_TYPICAL,0); //Current Short Term Moving Average maShortPrevious =iMA(NULL,0,2,1,MODE_SMMA,PRICE_TYPICAL,1); //Previous Long Term Moving Average faRSICurrent =iRSI(NULL,0,14,PRICE_TYPICAL,0); //Current RSI // Check for BUY, SELL, and CLOSE signal isBuying =false; isSelling=false; isBuyClosing=false; isSellClosing=false; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseBuyPositions() { for(int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==magicEA) { if (OrderType()==OP_BUY) OrderClose(OrderTicket(),Lots,Bid,Slippage); } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseSellPositions() { for(int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==magicEA) { if (OrderType()==OP_SELL) OrderClose(OrderTicket(),Lots,Ask,Slippage); } } } } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains tick volumes of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Stochastic oscillator
Parabolic Stop and Reverse system
MACD Histogram
Momentum indicator
Relative strength index
Custom Indicators Used:
Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
It Closes Orders by itself
Other Features: