//+------------------------------------------------------------------+ //| TriplePlay.mq4 | //| Copyright © 2006, GwadaTradeBoy | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, GwadaTradeBoy" #property link "http://www.metaquotes.net" //---- Include #include #include //---- Money Management extern bool MoneyManagement = true; extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; double lot; int orders, losses, spread; bool AcountIsMini = false; //---- Prise de position int MagicNumber = 170107; string NameEA = "100in30.mq4"; int ticket; double myPrice, myStopLoss, myTakeProfit, myLots, digits; double StopLoss = 0; double Slippage = 0; //|Profit controls | //extern double StopLoss = 70; // Maximum pips willing to lose per position. extern int FirstLevel = 10; extern int SecondLevel = 20; extern double TakeProfit1 = 30; extern double TakeProfit2 = 20; extern double TakeProfit3 = 10; //---- Autres Variables int TradesInThisSymbol; //---- Indicateurs double Units, LotMM; double MACD,RSI,MA13,MACDPrevious,RSIPrevious,MA13Previous; int Hours; //---- Debugage extern bool Debug; int OrderErr; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- //---- Verification du contexte de trade Units = MathFloor((AccountBalance( ) /5000)*0.5); if (Units < 0.05) Units = 0.01; Hours = TimeHour(TimeCurrent()); if (Hours >= 7 && Hours <= 8) { GetIndicators(); if(CheckEntryCondition(OP_BUY) ) { //CloseOpenOrders(OP_SELL); OpenBuyOrders(); return(0); } if(CheckEntryCondition(OP_SELL) ) { //CloseOpenOrders(OP_BUY); OpenSellOrders(); } } //else //----*Fonctions qui serviront pour la partie si target atteind avant ou a 10H //+------------------------------------------------------------------+ //| Check for Open Position | //+------------------------------------------------------------------+ HandleOpenPositions(); // Check if any open positions were not closed TradesInThisSymbol = CheckOpenPositions(); if (Hours <= 10 && TradesInThisSymbol == 0) { GetIndicators(); if(CheckEntryCondition(OP_BUY) ) { //CloseOpenOrders(OP_SELL); OpenBuyOrders(); return(0); } if(CheckEntryCondition(OP_SELL) ) { //CloseOpenOrders(OP_BUY); OpenSellOrders(); } } //---- return(0); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| GetIndicators | //+------------------------------------------------------------------+ void GetIndicators() { MACD,RSI,MA13,MACDPrevious,RSIPrevious,MA13Previous MACD = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,SignalCandle); MACDPrevious = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,SignalCandle + 1); SignalCurrent = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,SignalCandle); SignalPrevious = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,SignalCandle + 1); RSI = iRSI(NULL,0,12,PRICE_CLOSE,SignalCandle); RSIPrevious = iRSI(NULL,0,12,PRICE_CLOSE,SignalCandle + 1); MA13 = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,SignalCandle); MA13Previous = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,SignalCandle + 1);*/ } //+------------------------------------------------------------------+ //| CheckEntryCondition | //+------------------------------------------------------------------+ bool CheckEntryCondition(int type) { switch (type) { case OP_BUY : if (MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { return(true); } break; case OP_SELL : if (MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent 0 ) myStopLoss = myPrice - StopLoss * Point ; myTakeProfit = myPrice + TakeProfit1 * Point; // Normalize all price / stoploss / takeprofit to the proper # of digits. digits = MarketInfo(Symbol( ), MODE_DIGITS) ; if (digits > 0) { myPrice = NormalizeDouble( myPrice, digits); myStopLoss = NormalizeDouble( myStopLoss, digits); myTakeProfit = NormalizeDouble( myTakeProfit, digits); } // First Buy ticket=OrderSend( Symbol(), OP_BUY, LotMM, myPrice, Slippage, myStopLoss, myTakeProfit, "FirstBuy", MagicNumber, 0, Green); if (ticket > 0) { if (OrderSelect( ticket,SELECT_BY_TICKET, MODE_TRADES) ) { if (Debug) Print("BUY order opened : ", OrderOpenPrice( )); myPrice = OrderOpenPrice() + FirstLevel*Point; myStopLoss = 0; if ( StopLoss > 0 ) myStopLoss = myPrice - StopLoss * Point ; myTakeProfit = myPrice + TakeProfit2*Point; if (digits > 0) { myPrice = NormalizeDouble( myPrice, digits); myStopLoss = NormalizeDouble( myStopLoss, digits); myTakeProfit = NormalizeDouble( myTakeProfit, digits); } ticket=OrderSend( Symbol(), OP_BUYSTOP, 2*LotMM, myPrice, Slippage, myStopLoss, myTakeProfit, "Second Buy", MagicNumber, 0, Green); myPrice = OrderOpenPrice() + SecondLevel*Point; myStopLoss = 0; if ( StopLoss > 0 ) myStopLoss = myPrice - StopLoss * Point ; myTakeProfit = myPrice + TakeProfit3*Point; if (digits > 0) { myPrice = NormalizeDouble( myPrice, digits); myStopLoss = NormalizeDouble( myStopLoss, digits); myTakeProfit = NormalizeDouble( myTakeProfit, digits); } ticket=OrderSend( Symbol(), OP_BUYSTOP, 3*LotMM, myPrice, Slippage, myStopLoss, myTakeProfit, "Third Buy", MagicNumber, 0 ,Green); } } else { OrderErr = GetLastError(); Print("Error opening BUY order : (" + OrderErr + ") " + ErrorDescription( OrderErr) ); } } //---- * Sell void OpenSellOrders( ) { myPrice = MarketInfo(Symbol( ), MODE_BID); myStopLoss = 0; if ( StopLoss > 0 ) myStopLoss = myPrice + StopLoss * Point ; myTakeProfit = myPrice - TakeProfit1 * Point; // Normalize all price / stoploss / takeprofit to the proper # of digits. digits = MarketInfo(Symbol( ), MODE_DIGITS) ; if (digits > 0) { myPrice = NormalizeDouble( myPrice, digits); myStopLoss = NormalizeDouble( myStopLoss, digits); myTakeProfit = NormalizeDouble( myTakeProfit, digits); } // First Sell ticket=OrderSend( Symbol(), OP_SELL, LotMM, myPrice, Slippage, myStopLoss ,myTakeProfit, "First Sell", MagicNumber, 0, Red); if (ticket > 0) { if (OrderSelect( ticket,SELECT_BY_TICKET, MODE_TRADES) ) { if (Debug) Print("Sell order opened : ", OrderOpenPrice()); myPrice = OrderOpenPrice() - FirstLevel*Point; myStopLoss = 0; if ( StopLoss > 0 ) myStopLoss = myPrice + StopLoss * Point ; myTakeProfit = myPrice - TakeProfit2*Point; if (digits > 0) { myPrice = NormalizeDouble( myPrice, digits); myStopLoss = NormalizeDouble( myStopLoss, digits); myTakeProfit = NormalizeDouble( myTakeProfit, digits); } ticket=OrderSend( Symbol(), OP_SELLSTOP, 2*LotMM, myPrice, Slippage, myStopLoss, myTakeProfit, "Second Sell", MagicNumber, 0, Red); myPrice = OrderOpenPrice() - SecondLevel*Point; myStopLoss = 0; if ( StopLoss > 0 ) myStopLoss = myPrice + StopLoss * Point ; myTakeProfit = myPrice - TakeProfit3*Point; if (digits > 0) { myPrice = NormalizeDouble( myPrice, digits); myStopLoss = NormalizeDouble( myStopLoss, digits); myTakeProfit = NormalizeDouble( myTakeProfit, digits); } ticket=OrderSend( Symbol(), OP_SELLSTOP, 3*LotMM, myPrice, Slippage, myStopLoss, myTakeProfit, "Third Sell", MagicNumber, 0, Red); } } else { OrderErr = GetLastError(); Print("Error opening Sell order : (" + OrderErr + ") " + ErrorDescription( OrderErr) ); } } //+------------------------------------------------------------------+ //| Check Open Position Controls | //+------------------------------------------------------------------+ int CheckOpenPositions() { int cnt, total, NumPositions; NumPositions = 0; total=OrdersTotal(); for(cnt=OrdersTotal()-1;cnt>=0;cnt--) { OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES); if ( OrderSymbol() != Symbol()) continue; if ( OrderMagicNumber() != MagicNumber) continue; if(OrderType() == OP_BUY ) NumPositions++; if(OrderType() == OP_SELL ) NumPositions++; } return (NumPositions); }