//+------------------------------------------------------------------+ //| Phoenix_5_6_03.mq4 | //| Copyright © 2006, Hendrick | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Hendrick." #define MAGICMA_A 20050610 #define MAGICMA_B 20060611 #define MAGICMA01 20050612 #define MAGICMA02 20060613 #define MAGICMA03 20060614 extern string GeneralSettings = "===== General Settings ============================"; extern int PhoenixMode = 3; extern double Lots = 1; extern double MaximumRisk = 0.05; extern int DecreaseFactor = 0; extern bool MM = true; extern bool AccountIsMicro = false; extern bool PrefSettings = true; extern int CloseAfterHours = 0; extern int BreakEvenAfterPips = 0; extern string Mode1 = "====== Phoenix Mode 1 (Classic) =================="; extern int TakeProfit = 0; extern int StopLoss = 0; extern int TrailingStop = 0; extern string Mode2 = "====== Phoenix Mode 2 (Second trade)=============="; extern int Mode2_OpenTrade_2 = 0; extern int Mode2_TakeProfit = 0; extern int Mode2_StopLoss = 0; extern bool Mode2_CloseFirstTrade = false; extern string Mode3 = "====== Phoenix Mode 3 (Three trades at once) ====="; extern int Mode3_CloseTrade2_3 = 0; extern int Mode3_TakeProfit = 0; extern int Mode3_StopLoss = 0; extern string Signal1 = "====== Signal 1 ==================================="; extern bool UseSignal1 = true; extern double Percent = 0; extern int EnvelopePeriod = 0; extern string Signal2 = "====== Signal 2 =================================="; extern bool UseSignal2 = true; extern int SMAPeriod = 0; extern int SMA2Bars = 0; extern string Signal3 = "====== Signal 3 =================================="; extern bool UseSignal3 = true; extern int OSMAFast = 0; extern int OSMASlow = 0; extern double OSMASignal = 0; extern string Signal4 = "====== Signal 4 =================================="; extern bool UseSignal4 = true; extern int Fast_Period = 0; extern int Fast_Price = PRICE_OPEN; extern int Slow_Period = 0; extern int Slow_Price = PRICE_OPEN; extern double DVBuySell = 0; extern double DVStayOut = 0; extern string Signal5 = "====== Signal 5 ================================="; extern bool UseSignal5 = true; extern int TradeFrom1 = 0; extern int TradeUntil1 = 24; extern int TradeFrom2 = 0; extern int TradeUntil2 = 0; extern int TradeFrom3 = 0; extern int TradeUntil3 = 0; extern int TradeFrom4 = 0; extern int TradeUntil4 = 0; double Poin; int init() { //Checking for unconvetional Point digits number if (Point == 0.00001) Poin = 0.0001; //5 digits else if (Point == 0.001) Poin = 0.01; //3 digits else Poin = Point; //Normal //+------------------------------------------------------------------+ //| START Preffered Settings | //+------------------------------------------------------------------+ if(PrefSettings == true) { if((Symbol() == "USDJPY") || (Symbol() == "USDJPYm")) { Mode2_OpenTrade_2 = 0; Mode2_TakeProfit = 50; Mode2_StopLoss = 60; Mode3_CloseTrade2_3 = 30; Mode3_TakeProfit = 100; Mode3_StopLoss = 55; Percent = 0.0032; EnvelopePeriod = 2; TakeProfit = 42; StopLoss = 84; TrailingStop = 0; SMAPeriod = 2; SMA2Bars = 18; OSMAFast = 5; OSMASlow = 22; OSMASignal = 2; Fast_Period = 25; Slow_Period = 15; DVBuySell = 0.0029; DVStayOut = 0.024; } if((Symbol() == "EURJPY") || (Symbol() == "EURJPYm")) { Mode2_OpenTrade_2 = 18; Mode2_TakeProfit = 70; Mode2_StopLoss = 30; Mode3_CloseTrade2_3 = 55; Mode3_TakeProfit = 70; Mode3_StopLoss = 80; Percent = 0.007; EnvelopePeriod = 2; TakeProfit = 42; StopLoss = 84; TrailingStop = 0; SMAPeriod = 4; SMA2Bars = 16; OSMAFast = 11; OSMASlow = 20; OSMASignal = 14; Fast_Period = 20; Slow_Period = 10; DVBuySell = 0.0078; DVStayOut = 0.026; } if((Symbol() == "GBPJPY") || (Symbol() == "GBPJPYm")) { Mode2_OpenTrade_2 = 2; Mode2_TakeProfit = 130; Mode2_StopLoss = 80; Mode3_CloseTrade2_3 = 40; Mode3_TakeProfit = 90; Mode3_StopLoss = 80; Percent = 0.0072; EnvelopePeriod = 2; TakeProfit = 42; StopLoss = 84; TrailingStop = 0; SMAPeriod = 8; SMA2Bars = 12; OSMAFast = 5; OSMASlow = 36; OSMASignal = 10; Fast_Period = 17; Slow_Period = 28; DVBuySell = 0.0034; DVStayOut = 0.063; } if((Symbol() == "USDCHF") || (Symbol() == "USDCHFm")) { Mode2_OpenTrade_2 = 10; Mode2_TakeProfit = 90; Mode2_StopLoss = 65; Mode3_CloseTrade2_3 = 85; Mode3_TakeProfit = 130; Mode3_StopLoss = 80; Percent = 0.0056; EnvelopePeriod = 10; TakeProfit = 42; StopLoss = 84; TrailingStop = 0; SMAPeriod = 5; SMA2Bars = 9; OSMAFast = 5; OSMASlow = 12; OSMASignal = 11; Fast_Period = 5; Slow_Period = 20; DVBuySell = 0.00022; DVStayOut = 0.0015; } if((Symbol() == "GBPUSD") || (Symbol() == "GBPUSDm")) { Mode2_OpenTrade_2 = 5; Mode2_TakeProfit = 95; Mode2_StopLoss = 90; Mode3_CloseTrade2_3 = 90; Mode3_TakeProfit = 110; Mode3_StopLoss = 80; Percent = 0.0023; EnvelopePeriod = 6; TakeProfit = 42; StopLoss = 84; TrailingStop = 0; SMAPeriod = 3; SMA2Bars = 14; OSMAFast = 23; OSMASlow = 17; OSMASignal = 15; Fast_Period = 25; Slow_Period = 37; DVBuySell = 0.00042; DVStayOut = 0.05; } } return(0); } //+------------------------------------------------------------------+ //| END Preffered Settings | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START EA | //+------------------------------------------------------------------+ void start() { if(Bars<100) { Print("bars less than 100"); return(0); } if(PhoenixMode==1)//Phoenix Classic { CheckOpenTrade(); if(CloseAfterHours != 0) CheckCloseAfterHours(); if(!StopLoss==0) CheckTrailingStop(); if(BreakEvenAfterPips != 0) CheckBreakEven(); } if(PhoenixMode==2)//Phoenix Second Trade { CheckOpenTrade(); if(CloseAfterHours != 0) CheckCloseAfterHours(); CheckSecondTrade(); } if(PhoenixMode==3)//Phoenix 123 { CheckOpenTradeMode123(); Mode3_MoveSL_Trade_2_3(); Mode3_MoveSL_Trade_3(); if(Mode3_CloseTrade2_3 != 0) CheckCloseTrade23(); } } //+------------------------------------------------------------------+ //| END EA | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int count=0; for(int i=0;i= 0; z --) { if(!OrderSelect( z, SELECT_BY_POS)) { err = GetLastError(); Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == MAGICMA_B) break; if(OrderMagicNumber() != MAGICMA_A) continue; if(OrderType() == OP_BUY && (Bid-OrderOpenPrice() > Poin*Mode2_OpenTrade_2)) { if(OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask - Mode2_StopLoss * Poin,Ask + Mode2_TakeProfit * Poin,"Mode2_SecondTrade",MAGICMA_B,0,Blue) < 0) { err = GetLastError(); Print("Error Ordersend(",err,"): "); return(-1); } if(Mode2_CloseFirstTrade==true) {CloseFirstTrade();} return(0); } if(OrderType() == OP_SELL && (OrderOpenPrice()-Ask > Poin*Mode2_OpenTrade_2)) { if(OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid + Mode2_StopLoss * Poin,Bid - Mode2_TakeProfit*Poin,"Mode2_SecondTrade",MAGICMA_B,0,Red) < 0) { err = GetLastError(); Print("Error Ordersend(",err,"): "); return(-1); } if(Mode2_CloseFirstTrade==true) {CloseFirstTrade();} return(0); } } } //+------------------------------------------------------------------+ //| END Function Check Second Trade | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Check Close Trade 2 And 3 | //+------------------------------------------------------------------+ void CheckCloseTrade23() { int err = 0, total = OrdersTotal(); bool CloseTrade=false; for(int z = total - 1; z >= 0; z --) { if(!OrderSelect( z, SELECT_BY_POS)) { err = GetLastError(); Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() != MAGICMA01) continue; if(OrderType() == OP_BUY && (OrderOpenPrice()-Bid > Poin * Mode3_CloseTrade2_3)) {CloseTrade=true;} if(OrderType() == OP_SELL && (Ask-OrderOpenPrice() > Poin * Mode3_CloseTrade2_3)) {CloseTrade=true;} if(CloseTrade) { for(int y = total - 1; y >= 0; y --) { if(!OrderSelect( y, SELECT_BY_POS)) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == MAGICMA02 || OrderMagicNumber() == MAGICMA03) { if(OrderType() == OP_BUY) { if(OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)<0) { err = GetLastError(); Print("Error Ordersend(",err,"): "); return(-1); } return(0); } if(OrderType() == OP_SELL) { if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)<0) { err = GetLastError(); Print("Error Ordersend(",err,"): "); return(-1); } return(0); } } } } } } //+------------------------------------------------------------------+ //| END Function Check Close Trade 2 And 3 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Check First Trade Mode3 | //+------------------------------------------------------------------+ void Mode3_MoveSL_Trade_2_3() { int err = 0, total = OrdersTotal(), history = HistoryTotal(); bool ChangeStopLoss = false; for(int z = history - 1; z >= 0; z --) { if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY)) { err = GetLastError(); Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == MAGICMA03) break; if(OrderMagicNumber() == MAGICMA02) break; if(OrderMagicNumber() != MAGICMA01) continue; if(OrderProfit() > 0) { ChangeStopLoss=true; break; } } if(ChangeStopLoss==true) { for(int y = total - 1; y >= 0; y --) { if(!OrderSelect(y,SELECT_BY_POS)) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == MAGICMA02 || OrderMagicNumber() == MAGICMA03) { if(OrderType()==OP_BUY) { if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,GreenYellow)<0) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } // return(0); } if(OrderType()==OP_SELL) { if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,GreenYellow)<0) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } // return(0); } } } } } //} //+------------------------------------------------------------------+ //| END Check First Trade Mode 3 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Check Second Trade Mode3 | //+------------------------------------------------------------------+ void Mode3_MoveSL_Trade_3() { double NewSLTrade3B,NewSLTrade3S; int err = 0, total = OrdersTotal(), history = HistoryTotal(); bool ChangeStopLoss = false; for(int z = history - 1; z >= 0; z --) { if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY)) { err = GetLastError(); Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == MAGICMA03) break; if(OrderMagicNumber() == MAGICMA01) break; if(OrderMagicNumber() != MAGICMA02) continue; if(OrderProfit() > 0) { for(int y = total - 1; y >= 0; y --) { if(!OrderSelect(y,SELECT_BY_POS)) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } if(OrderSymbol() != Symbol()) continue; if(OrderMagicNumber() == MAGICMA03) { if(OrderType()==OP_BUY) { NewSLTrade3B=OrderOpenPrice()+NormalizeDouble(((OrderTakeProfit()-OrderOpenPrice())/2),Digits); if(OrderModify(OrderTicket(),OrderOpenPrice(),NewSLTrade3B,OrderTakeProfit(),0,GreenYellow)<0) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } return(0); } if(OrderType()==OP_SELL) { NewSLTrade3S=OrderOpenPrice()-NormalizeDouble(((OrderOpenPrice()-OrderTakeProfit())/2),Digits); if(OrderModify(OrderTicket(),OrderOpenPrice(),NewSLTrade3S,OrderTakeProfit(),0,GreenYellow)<0) { err = GetLastError(); Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err ); continue; } return(0); } } } } } } //+------------------------------------------------------------------+ //| END Check Second Trade Mode 3 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Diverge | //+------------------------------------------------------------------+ double divergence(int F_Period, int S_Period, int F_Price, int S_Price, int mypos) { int i; double maF1, maF2, maS1, maS2; maF2 = iMA(Symbol(), 0, F_Period, 0, MODE_SMA, F_Price, mypos + 1); maS2 = iMA(Symbol(), 0, S_Period, 0, MODE_SMA, S_Price, mypos + 1); return(maF2-maS2); } //+------------------------------------------------------------------+ //| END Function Diverge | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Valid Trade Time | //+------------------------------------------------------------------+ bool F_ValidTradeTime (int iHour) { if(((iHour >= TradeFrom1) && (iHour <= (TradeUntil1-1)))||((iHour>= TradeFrom2) && (iHour <= (TradeUntil2-1)))||((iHour >= TradeFrom3)&& (iHour <= (TradeUntil3-1)))||((iHour >= TradeFrom4) && (iHour <=(TradeUntil4-1)))) { return (true); } else return (false); } //+------------------------------------------------------------------+ //| END Function Valid Trade Time | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Check Close Trade After x Hours | //+------------------------------------------------------------------+ void CheckCloseAfterHours() { int total = OrdersTotal(); for(int cnt=0;cnt(CloseAfterHours*3600) && OrderProfit()<0) { OrderClose(OrderTicket(),OrderLots(),Bid,10,Violet); } } } } //+------------------------------------------------------------------+ //| END Check Close Trade After x Hours | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Check Signals | //+------------------------------------------------------------------+ //=====================SIGNAL1======================== int CheckSignal(int Signal) { Signal=0; bool BuySignal1=false, SellSignal1=false; double HighEnvelope1 = iEnvelopes(NULL,0,EnvelopePeriod,MODE_SMA,0,PRICE_CLOSE,Percent,MODE_UPPER,1); double LowEnvelope1 = iEnvelopes(NULL,0,EnvelopePeriod,MODE_SMA,0,PRICE_CLOSE,Percent,MODE_LOWER,1); double CloseBar1 = iClose(NULL,0,1); if(UseSignal1) { if(CloseBar1 > HighEnvelope1) {SellSignal1 = true;} if(CloseBar1 < LowEnvelope1) {BuySignal1 = true;} } else {SellSignal1=true;BuySignal1=true;} //=====================SIGNAL2======================== bool BuySignal2=false, SellSignal2=false; double SMA1=iMA(NULL,0,SMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); double SMA2=iMA(NULL,0,SMAPeriod,0,MODE_SMA,PRICE_CLOSE,SMA2Bars); if(UseSignal2) { if(SMA2-SMA1>0) {BuySignal2 = true;} if(SMA2-SMA1<0) {SellSignal2 = true;} } else {SellSignal2=true;BuySignal2=true;} //=====================SIGNAL3======================== bool BuySignal3=false, SellSignal3=false; double OsMABar2=iOsMA(NULL,0,OSMASlow,OSMAFast,OSMASignal,PRICE_CLOSE,2); double OsMABar1=iOsMA(NULL,0,OSMASlow,OSMAFast,OSMASignal,PRICE_CLOSE,1); if(UseSignal3) { if(OsMABar2 > OsMABar1) {SellSignal3 = true;} if(OsMABar2 < OsMABar1) {BuySignal3 = true;} } else {SellSignal3=true;BuySignal3=true;} //=====================SIGNAL4======================== double diverge; bool BuySignal4=false,SellSignal4=false; diverge = divergence(Fast_Period, Slow_Period, Fast_Price, Slow_Price,0); if(UseSignal4) { if(diverge >= DVBuySell && diverge <= DVStayOut) {BuySignal4 = true;} if(diverge <= (DVBuySell*(-1)) && diverge >= (DVStayOut*(-1))) {SellSignal4 = true;} } else {SellSignal4=true;BuySignal4=true;} //=====================SIGNAL5======================= bool BuySignal5=false, SellSignal5=false; if(UseSignal5) { int iHour=TimeHour(LocalTime()); int ValidTradeTime = F_ValidTradeTime(iHour); if(ValidTradeTime==true) { BuySignal5=true; SellSignal5=true; } } else {SellSignal5=true;BuySignal5=true;} if((SellSignal1==true) && (SellSignal2==true) && (SellSignal3==true) && (SellSignal4==true) && (SellSignal5==true)) return(1); if((BuySignal1==true) && (BuySignal2==true) && (BuySignal3==true) && (BuySignal4==true) && (BuySignal5==true)) return(2); } //+------------------------------------------------------------------+ //| END Function Check Signals | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { if(MM==false) return(Lots); double lot=Lots; int orders=HistoryTotal(); int losses=0; int decimalPlaces=1; if(AccountIsMicro==true) decimalPlaces=2; lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,decimalPlaces); if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,decimalPlaces); } if(lot<0.1 && AccountIsMicro==false) lot=0.1; if(lot<0.01 && AccountIsMicro==true) lot=0.01; if(lot>99) lot=99; return(lot); } //+------------------------------------------------------------------+ //| END Calculate optimal lot size | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Check TrailingStop | //+------------------------------------------------------------------+ void CheckTrailingStop() { for(int i=0;i (Poin * TrailingStop)) && (OrderStopLoss() < (Bid - Poin * TrailingStop))) OrderModify( OrderTicket(), OrderOpenPrice(), Bid - Poin * TrailingStop, OrderTakeProfit(), 0, GreenYellow); } if(OrderType() == OP_SELL) { if(((OrderOpenPrice() - Ask) > (Poin * TrailingStop)) && (OrderStopLoss() > (Ask + Poin * TrailingStop))) OrderModify( OrderTicket(), OrderOpenPrice(), Ask + Poin * TrailingStop, OrderTakeProfit(), 0, Red); } } } //+------------------------------------------------------------------+ //| END Function Check TrailingStop | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Check BreakEven | //+------------------------------------------------------------------+ void CheckBreakEven() { for(int i=0;i (Poin*BreakEvenAfterPips)) OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, GreenYellow); } if(OrderType() == OP_SELL) { if((OrderOpenPrice()-Ask) > (Poin*BreakEvenAfterPips)) OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red); } } } //+------------------------------------------------------------------+ //| END Function Check BreakEven | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| START Function Close First Trade | //+------------------------------------------------------------------+ int CloseFirstTrade() { for(int i=0;i