///+------------------------------------------------------------------+ // | | // | DeanvH | // | | // +------------------------------------------------------------------+ #property copyright "DeanvH" #property link "" #property version "3.0" #include input int StopLoss = 200; // Stop loss in points input int TakeProfit1 = 300; // Take profit 1 in points input int TakeProfit2 = 450; // Take profit 2 in points input int TakeProfit3 = 800; // Take profit 3 in points input int BECheck = 200; // When Trade goes to BE input double riskPercentage = 1; // Risk % input int StartLondon = 3; // Hour when the bot becomes active for London input int EndLondon = 14; // Hour when the bot stops being active for London input int StartNY = 16; // Hour when the bot becomes active for NY input int EndNY = 22; // Hour when the bot stops being active for NY input int MaxTrades = 6; // Maximum Trades allowed at once input int PosMax = 3; // Maximum Set(3) of Trades per Pair at once (Amount devided by 3) input int RSIStocMax = 70; // Over Bought Stochastic level input int RSIStocMin = 30; // Over Sold Stochastic level //Fibo values datetime highTime = 0; datetime lowTime = 0; double highestHigh = 0; double lowestLow = 0; int period = 150; bool trendUp = false; bool trendDown = false; bool GoldZoneDown = false; bool GoldZoneUp = false; double golden = 0; //Creat CTrade CTrade trade; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool InTradingTime() { datetime Now = TimeCurrent(); MqlDateTime NowStruct; TimeToStruct(Now,NowStruct); int StartTradingSeconds1 = (StartLondon*3600); int EndTradingSeconds1 = (EndLondon*3600); int StartTradingSeconds2 = (StartNY*3600); int EndTradingSeconds2 = (EndNY*3600); int runningseconds = (NowStruct.hour*3600); ZeroMemory(NowStruct); if(((runningseconds>StartTradingSeconds1)&&(runningsecondsStartTradingSeconds2)&&(runningseconds lowTime) { trendUp = true; trendDown = false; } if(lowTime > highTime) { trendUp = false; trendDown = true; } //+------------------------------------------------------------------+ //| Defining Gold Zone | //+------------------------------------------------------------------+ if(trendDown && (currentHigh > golden || LastHigh > golden || SecondLastHigh > golden)) { GoldZoneDown = true; GoldZoneUp = false; } else if(trendUp && (currentLow < golden || LastLow < golden || SecondLastLow < golden)) { GoldZoneDown = false; GoldZoneUp = true; } else { GoldZoneDown = false; GoldZoneUp = false; } UpdateFibonacciRetracement(); //------------------------------------------------------------------------------------------------------------------------------------------------ double MacdArrayH1[]; //Define MACD int macdDefH1 = iMACD(NULL, PERIOD_H1, 5, 15, 9, PRICE_WEIGHTED); //Add values to MACD Array ArraySetAsSeries(MacdArrayH1,true); CopyBuffer(macdDefH1,0,0,3,MacdArrayH1); double macdValueH1 = MacdArrayH1[0]; double LastmacdValueH1 = MacdArrayH1[1]; double Last2macdValueH1 = MacdArrayH1[2]; //-------------------------------------------------------------- //STOCHASTIC //Stochastic ArrayH1 double stochKArrayH1[]; double stochDArrayH1[]; //Define Stochastic int stochDefH1 = iStochastic(NULL, PERIOD_H1, 7, 3, 2, MODE_EMA, STO_CLOSECLOSE); //Add values ArraySetAsSeries(stochKArrayH1,true); ArraySetAsSeries(stochDArrayH1,true); //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CopyBuffer(stochDefH1,0,0,3,stochKArrayH1); CopyBuffer(stochDefH1,1,0,3,stochDArrayH1); double stochKValue0H1 = stochKArrayH1[0]; double stochDValue0H1 = stochDArrayH1[0]; double stochKValue1H1 = stochKArrayH1[1]; double stochDValue1H1 = stochDArrayH1[1]; //---------------------- //-------------------------------------------------------------- //RSI //RSI Array H1 double rsiArrayH1[]; //Define RSI H1 int rsiDefH1 = iRSI(NULL, PERIOD_H1, 8, PRICE_TYPICAL); //Add values to array ArraySetAsSeries(rsiArrayH1,true); CopyBuffer(rsiDefH1,0,0,3,rsiArrayH1); double rsiValueH1 = NormalizeDouble(rsiArrayH1[0],2); //-------------------------------------------------------------- //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ Comment(/*" StochDArray[1] = ", stochDArrayH1[1], "\n StochKArray[1] = ", stochKArrayH1[1], "\n Last MACD Value = ", LastmacdValueH1, "\n 2nd Last MACD Value = ", Last2macdValueH1, "\n Current Open Price = ", CurrentOpen, "\n Last Open Price = ", LastOpen, "\n 2nd Last Open = ", Last2Open, "\n RSI Current = ", rsiArrayH1[0], "\n RSI Last = ", rsiArrayH1[1], "\nHigh1 = ",High1, " ", HighIndex1, "\nHigh2 = ", High2, " ", HighIndex2, " Green", "\nHigh3 = ", High3, " ", HighIndex3, " Magenta", "\n Highest = ", Highest,*/ "\n C.Low = ", currentLow, "\n 1.Low = ", LastLow, "\n 2.Low = ", SecondLastLow, "\n C.High = ", currentHigh, "\n 1.High = ", LastHigh, "\n 2.High = ", SecondLastHigh, "\n Golden 61.8% = ", golden, "\n trendUp = ", trendUp, "\n trendDown = ", trendDown, "\n GoldZoneUp = ", GoldZoneUp, "\n GoldZoneDown = ", GoldZoneDown); if(InTradingTime()) { if(trendDown && GoldZoneDown) { // Check for sell trade condition if(stochDArrayH1[1] > stochKArrayH1[1] && stochDArrayH1[1] > RSIStocMax && LastmacdValueH1 < Last2macdValueH1 && CurrentOpen < LastOpen && CurrentOpen < Last2Open && rsiArrayH1[0] < rsiArrayH1[2] ) { signal="sell"; } if(signal == "sell" && OpenTrades() < PosMax && PositionsTotal() < MaxTrades) { trade.Sell(LotSize,NULL,BidPrice,(BidPrice + StopLoss * _Point),(BidPrice - TakeProfit1 * _Point)); trade.Sell(LotSize,NULL,BidPrice,(BidPrice + StopLoss * _Point),(BidPrice - TakeProfit2 * _Point)); trade.Sell(LotSize,NULL,BidPrice,(BidPrice + StopLoss * _Point),(BidPrice - TakeProfit3 * _Point)); } //Call Break Even Check CheckBreakEvenSell(BidPrice); } } //------------------------------------------------------------------ // Check for buy trade condition if(InTradingTime()) { // Check for buy trade condition if(trendUp && GoldZoneUp) { if(stochDArrayH1[1] < stochKArrayH1[1] && stochDArrayH1[1] < RSIStocMin && LastmacdValueH1 > Last2macdValueH1 && CurrentOpen > LastOpen && CurrentOpen > Last2Open && rsiArrayH1[0] > rsiArrayH1[2] ) { signal="buy"; } if(signal == "buy" && OpenTrades() < PosMax && PositionsTotal() < MaxTrades) { trade.Buy(LotSize,NULL,AskPrice,(AskPrice - StopLoss * _Point),(AskPrice + TakeProfit1 * _Point)); trade.Buy(LotSize,NULL,AskPrice,(AskPrice - StopLoss * _Point),(AskPrice + TakeProfit2 * _Point)); trade.Buy(LotSize,NULL,AskPrice,(AskPrice - StopLoss * _Point),(AskPrice + TakeProfit3 * _Point)); } //Call Break Even Check CheckBreakEvenBuy(AskPrice); //-------------------------------------------- } } //END } //--------------------------------------------------------------------- //Check for amount of open trades //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OpenTrades() { int count = 0; for(int i=PositionsTotal()-1; i>=0; i--) { string symbol = PositionGetSymbol(i); ulong PositionType = PositionGetInteger(POSITION_TYPE); if(Symbol() == symbol) { if(PositionType==POSITION_TYPE_BUY || PositionType ==POSITION_TYPE_SELL) { count++; } } } return count; } //--------------------------------------------------------------------- //+------------------------------------------------------------------+ //|BreakEven Function | //+------------------------------------------------------------------+ void CheckBreakEvenBuy(double AskPrice) { for(int i=PositionsTotal()-1; i>=0; i--) { string symbol = PositionGetSymbol(i); ulong PositionTicket = PositionGetInteger(POSITION_TICKET); double PositionBuyPrice = PositionGetDouble(POSITION_PRICE_OPEN); double PositionSL = PositionGetDouble(POSITION_SL); double PositionTP = PositionGetDouble(POSITION_TP); double PositionCP = PositionBuyPrice + BECheck*_Point; ulong PositionType = PositionGetInteger(POSITION_TYPE); if(_Symbol == symbol) { if(PositionType==POSITION_TYPE_BUY) { if(PositionSL PositionCP) { trade.PositionModify(PositionTicket,PositionBuyPrice+10*_Point,PositionTP); Print("BE Achieved"); } } } } } } //--------------------------------------------------------------------- //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CheckBreakEvenSell(double BidPrice) { for(int i=PositionsTotal()-1; i>=0; i--) { string symbol = PositionGetSymbol(i); ulong PositionTicket = PositionGetInteger(POSITION_TICKET); double PositionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); double PositionSL = PositionGetDouble(POSITION_SL); double PositionTP = PositionGetDouble(POSITION_TP); double PositionCP = PositionOpenPrice - BECheck*_Point; ulong PositionType = PositionGetInteger(POSITION_TYPE); if(_Symbol == symbol) { if(PositionType==POSITION_TYPE_SELL) { if(PositionSL>PositionOpenPrice) { if(BidPrice < PositionCP) { trade.PositionModify(PositionTicket,PositionOpenPrice-10*_Point,PositionTP); Print("BE Achieved"); } } } } } } //+--------------------------------------------------------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CreateFibonacciRetracementDown(string name, datetime highTime, double highestHigh, datetime lowTime, double lowestLow) { // Create Fibonacci retracement object if(ObjectFind(0, name) < 0) { ObjectCreate(0, name, OBJ_FIBO, 0, highTime, highestHigh, lowTime, lowestLow); ObjectSetInteger(0, name, OBJPROP_COLOR, clrBlue); // Set color of Fibonacci retracement ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_SOLID); // Set style ObjectSetInteger(0, name, OBJPROP_WIDTH, 1); // Set width ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0, name, OBJPROP_LEVELCOLOR,clrAntiqueWhite); golden = highestHigh - (highestHigh - lowestLow) * 0.382; } else { // Update existing Fibonacci retracement object ObjectSetDouble(0, name, OBJPROP_PRICE, highestHigh); ObjectSetDouble(0, name, OBJPROP_PRICE, lowestLow); ObjectSetInteger(0, name, OBJPROP_TIME, highTime); ObjectSetInteger(0, name, OBJPROP_TIME, lowTime); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CreateFibonacciRetracementUp(string name, datetime highTime, double highestHigh, datetime lowTime, double lowestLow) { // Create Fibonacci retracement object if(ObjectFind(0, name) < 0) { ObjectCreate(0, name, OBJ_FIBO, 0, lowTime, lowestLow, highTime, highestHigh); ObjectSetInteger(0, name, OBJPROP_COLOR, clrBlue); // Set color of Fibonacci retracement ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DASH); // Set style ObjectSetInteger(0, name, OBJPROP_WIDTH, 1); // Set width ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT,true); ObjectSetInteger(0, name, OBJPROP_LEVELCOLOR,clrAntiqueWhite); // Optional: Set properties for Fibonacci retracement levels (percentage, etc.) //ObjectSetDouble(0, name, OBJPROP_LEVELVALUE, 0.000); // 0% level //sixty = ObjectGetDouble(0, name, OBJPROP_PRICE , 0.618); // 61.8% level //zero = ObjectGetDouble(0, name, OBJPROP_PRICE, 3); // 76.4% level golden = lowestLow + (highestHigh - lowestLow) * 0.382; } else { // Update existing Fibonacci retracement object ObjectSetDouble(0, name, OBJPROP_PRICE, highestHigh); ObjectSetDouble(0, name, OBJPROP_PRICE, lowestLow); ObjectSetInteger(0, name, OBJPROP_TIME, highTime); ObjectSetInteger(0, name, OBJPROP_TIME, lowTime); } } //+--------------------------------------------------------------------------------------------------------------------------------------------------+ void UpdateFibonacciRetracement() { // Find the highest high and lowest low in the specified period highestHigh = iHigh(NULL, PERIOD_H1, iHighest(NULL, PERIOD_H1, MODE_HIGH, period, 0)); lowestLow = iLow(NULL, PERIOD_H1, iLowest(NULL, PERIOD_H1, MODE_LOW, period, 0)); highTime = iTime(NULL, PERIOD_H1, iHighest(NULL, PERIOD_H1, MODE_HIGH, period, 0)); lowTime = iTime(NULL, PERIOD_H1, iLowest(NULL, PERIOD_H1, MODE_LOW, period, 0)); // Remove old Fibonacci retracement if it exists RemoveFibonacciRetracement(); // Create a new Fibonacci retracement object if(trendUp) { CreateFibonacciRetracementUp("FiboRetracement", highTime, highestHigh, lowTime, lowestLow); } else { CreateFibonacciRetracementDown("FiboRetracement", highTime, highestHigh, lowTime, lowestLow); } } //+--------------------------------------------------------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void RemoveFibonacciRetracement() { // Remove Fibonacci retracement if it exists string name = "FiboRetracement"; if(ObjectFind(0, name) >= 0) { ObjectDelete(0, name); } } //+------------------------------------------------------------------+