//+------------------------------------------------------------------+ //| AutoTStop.mq4 | //| Copyright 2014, MetaQuotes Software Corp. | //| http://www.mql5.com | //| Create: 17/10/2014 http://www.gol2you.com ~ Forex Videos | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" /* Last Update (Update_01 ~ 2014-12-05). Last Update (Update_02 ~ 2015-01-05). Last Update (Update_03 ~ 2015-03-27). Last Update (Update_04 ~ 2015-06-13). */ //-- #property description "AutoTStop EA does not work to open the order, but only help trader for" #property description "optimization TakeProfit, put a BEP, StopLoss and implement TrailingStop." //--- User Input input string AutoTStop = "Copyright © 2014 3RJ ~ created by Roy Philips-Jacobs"; extern bool FridayTrade = True; // If True, EA still trading at Friday extern bool UseTrailingStop = True; // Use Trailing Stop, True (Yes) or False (Not) extern bool AutoTrailingStop = True; // Default Trailing Stop value = 24.0 extern double TrailingStop = 24.0; // If Auto Trailing Stop False, input Trailing Stop Value extern double TrailingStopStep = 1.0; // Input Trailing Stop Step Value (default 1.0) input string AutomaticSystemTP = "Set AutomaticTakeProfit=True or False"; extern bool OptimizationTakeProfit = True; // TP will calculation by EA and Automatic TP by EA extern bool NoMinimumTakeProfit = True; // True or False -> If Set True, 100% TP by EA not use minimum TP. input string MinimumSystemTP = "If Set NoMinimumTakeProfit=False"; // TP by EA on minimum TP values extern double MinimumTP = 12; // Minimum TP by EA on the AutomaticTakeProfit=True function, default value 12 input string ManualSystemTP = "If Set AutomaticTakeProfit=False"; // TP by Terminal MT4 (same as manual trading) extern double TakeProfit = 20; // TP by System, values can adjust by user, default 20 input string AutomaticSystemSL = "Set AutomaticStopLoss=True or False"; extern bool AutomaticStopLoss = True; // SL will calculation by EA input string ManualSystemSL = "If Set AutomaticStopLoss=False"; // SL values can adjusted by user extern double StopLoss = 108; // SL adjusted by user, default 88 //--- //--- Global scope double pp,sl,tp; double ask,bid,dev; double lastAsk,lastBid; double dvab,slA,slB,tpA,tpB,tpABS; double difB,difS,pBo,pSo,pdifB,pdifS; double tsstv,tstpv,trstart,bep,beplmt; //--- bool nomintp; bool fClB,fClS; bool TrlStp,opttp,autsl; bool mdHC,mdLC,mdUp,mdDn; //--- int beh; int bel; int trxb; int trxs; int step; int bar=100; int stxb,stxs; int hb,hs,ob,os,s,ip; int totalord,totalpft,totalhst; //--- string CopyR; //---- //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit(void) { //--- CopyR="Copyright © 2014 3RJ ~ created by Roy Philips-Jacobs"; if(AutoTStop!=CopyR) {return(0);} //--- //-- Checking the Digits Point if(Digits==3||Digits==5||_Symbol=="XAUUSD"||_Symbol=="GOLD") {pp=Point*10;} else {pp=Point;} //--- stxb=0; stxs=0; trxb=0; trxs=0; difB=0.8; difS=0.8; //--- autsl=AutomaticStopLoss; opttp=OptimizationTakeProfit; nomintp=NoMinimumTakeProfit; TrlStp=UseTrailingStop; //-- //--- initialization done return(INIT_SUCCEEDED); } //---- //+------------------------------------------------------------------+ //| expert proccess working function | //+------------------------------------------------------------------+ //---- void CalcSTP() //-- function: for calculation Automatic Take Profit. { //---- RefreshRates(); fClB=false; fClS=false; double spread=Ask-Bid; int tfr[]={30,240}; // timeframes arrays tp double bstp[]={24,48,72}; //arrays tp value double BSma2[],BSma6[]; ArrayResize(BSma2,bar); ArrayResize(BSma6,bar); ArraySetAsSeries(BSma2,true); ArraySetAsSeries(BSma6,true); bep=NormalizeDouble(pp*6.2,Digits); beplmt=NormalizeDouble(bep+spread,Digits); //- for(int fm=bar-1; fm>=0; fm--) {BSma2[fm]=iMA(_Symbol,0,2,0,1,4,fm);} for(int fn=bar-1; fn>=0; fn--) {BSma6[fn]=iMAOnArray(BSma2,0,6,0,3,fn);} double bsma0=BSma2[0]-BSma6[0]; double bsma1=BSma2[1]-BSma6[1]; if((bsma0>bsma1)) {bool stB=true;} if((bsma0=tfr[0])&&(_Period=tfr[1])) {tp=NormalizeDouble((bstp[2]*pp),Digits);} //- dvab=tp*0.5; //-- if((stB==true)&&(!stN)) {fClS=true;} if((stS==true)&&(!stN)) {fClB=true;} //-- } //-- else if((opttp==true)&&(!nomintp)) { //-- if(_Period=tfr[0])&&(_Period=tfr[1])) {tp=NormalizeDouble((bstp[2]*pp),Digits);} //- tpABS=NormalizeDouble((MinimumTP*pp),Digits); //-- } else {tp=NormalizeDouble(TakeProfit*pp,Digits);} //-- if(autsl) {sl=NormalizeDouble((pp*108)+spread,Digits);} else {sl=StopLoss*pp;} //-- if(AutoTrailingStop) {tstpv=NormalizeDouble(bstp[0]*pp,Digits);} else {tstpv=NormalizeDouble(TrailingStop*pp,Digits);} tsstv=NormalizeDouble(TrailingStopStep*pp,Digits); if(tstpvpdifB); mdLC=(pSo>pdifS); mdUp=(Close[0]<(lastBid-pdifB)); mdDn=(Close[0]>(lastAsk+pdifS)); //-- return; //---- } //-end CalcSTP() //---------// void CkOpen() //-- function: CheckOpenTrade. { //---- ob=0; os=0; totalord=OrdersTotal(); //-- for (s=0; s0; s--) { //-- if(OrderSelect(s,SELECT_BY_POS,MODE_HISTORY)==True) { if(OrderSymbol()==_Symbol) { //-- if(OrderType()==OP_BUY) { RefreshRates(); octm=OrderCloseTime(); if((octm>0)&&(ob0)&&(os=0; ip--) { if(OrderSelect(ip,SELECT_BY_POS,MODE_TRADES)==True) { if(OrderSymbol()==_Symbol) { if(OrderType()==OP_BUY) { //--- if((stxb==0)&&(OrderStopLoss()==0.00||OrderTakeProfit()==0.00)) { for(int stb=ob; stb>0; stb--) { if(OrderStopLoss()==0.00) {slA=NormalizeDouble(OrderOpenPrice()-sl,Digits);} else {slA=OrderStopLoss();} if(OrderTakeProfit()==0.00) {tpA=NormalizeDouble(OrderOpenPrice()+tp,Digits);} else {tpA=OrderTakeProfit();} modst=OrderModify(OrderTicket(),OrderOpenPrice(),slA,tpA,0,clrGreen); if(modst!=true) {error=GetLastError();} if(error>0) { ResetLastError(); Sleep(500); RefreshRates(); modst=OrderModify(OrderTicket(),OrderOpenPrice(),slA,tpA,0,clrGreen); } } if(modst==true) {stxb++;} else {stxb=0;} } //-- RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); if((opttp)&&(!nomintp)&&((OrderOpenPrice()<(bid-tpABS))&&(mdHC||mdUp))) //-check if order buy is profit { for(int opb=ob; opb>0; opb--) { RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); result=OrderClose(OrderTicket(),OrderLots(),bid,dev,clrAqua); if(result!=true) {error=GetLastError();} if(error>0) { ResetLastError(); Sleep(500); RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); result=OrderClose(OrderTicket(),OrderLots(),bid,dev,clrAqua); } //-- if(error==0 && result==true) { Print("-----AutoTStop has CLOSED BUY ORDER ",_Symbol," - Automatic Min Take profit..OK!"); PlaySound("ping.wav"); } } break; } //-end BUY Order Profit minimum TP //-- RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); if((opttp)&&(nomintp)&&(fClB)&&(OrderOpenPrice()<(bid-dvab))) //-check if order buy is profit { for(int nob=ob; nob>0; nob--) { RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); result=OrderClose(OrderTicket(),OrderLots(),bid,dev,clrAqua); if(result!=true) {error=GetLastError();} if(error>0) { ResetLastError(); Sleep(500); RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); result=OrderClose(OrderTicket(),OrderLots(),bid,dev,clrAqua); } //-- if(error==0 && result==true) { Print("-----AutoTStop has CLOSED BUY ORDER ",_Symbol," - Forcibly closed Automatic Take profit..OK!"); PlaySound("ping.wav"); } } break; } //-end BUY Order Profit Auto TP //-- BEP, Trailing Stop & Step RefreshRates(); bid=MarketInfo(_Symbol,MODE_BID); if((bid>(OrderOpenPrice()+beplmt))&&(beh0; be--) {trest=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+bep,OrderTakeProfit(),0);} beh++; } //-- if(TrlStp && (trxb==0) && (bid>(OrderOpenPrice()+tstpv))) { for(int tsb=ob; tsb>0; tsb--) {trest=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+trstart,OrderTakeProfit(),0);} trxb++; } //-- if(TrlStp && (trxb>0) && (bid>(OrderStopLoss()+(trstart*0.6)))) { trxb++; for(int tbx=ob; tbx>0; tbx--) { if(opttp) {double otpb=OrderTakeProfit()+(step*pp);} else {otpb=OrderTakeProfit();} trest=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+(trxb*tsstv),otpb,0); } } // end BUY Order Trailing Stop. //--- } //---- if(OrderType()==OP_SELL) { //--- if((stxs==0)&&(OrderStopLoss()==0.00||OrderTakeProfit()==0.00)) { for(int sts=os; sts>0; sts--) { if(OrderStopLoss()==0.00) {slB=NormalizeDouble(OrderOpenPrice()+sl,Digits);} else {slB=OrderStopLoss();} if(OrderTakeProfit()==0.00) {tpB=NormalizeDouble(OrderOpenPrice()-tp,Digits);} else {tpB=OrderTakeProfit();} modst=OrderModify(OrderTicket(),OrderOpenPrice(),slB,tpB,0,clrRed); if(modst!=true) {error=GetLastError();} if(error>0) { ResetLastError(); Sleep(500); RefreshRates(); modst=OrderModify(OrderTicket(),OrderOpenPrice(),slB,tpB,0,clrRed); } } if(modst==true) {stxs++;} else {stxs=0;} } //-- RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); if((opttp)&&(!nomintp)&&((OrderOpenPrice()>(ask+tpABS))&&(mdLC||mdDn))) //-check if order sell is profit { for(int ops=os; ops>0; ops--) { RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); result=OrderClose(OrderTicket(),OrderLots(),ask,dev,clrYellow); if(result!=true) {error=GetLastError();} if(error>0) { ResetLastError(); Sleep(500); RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); result=OrderClose(OrderTicket(),OrderLots(),ask,dev,clrYellow); } //-- if(error==0 && result==true) { Print("-----AutoTStop has CLOSED SELL ORDER ",_Symbol," - Automatic Min Take profit..OK!"); PlaySound("ping.wav"); } } break; } //-end SELL Order Profit minimum TP //-- RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); if((opttp)&&(nomintp)&&(fClS)&&(OrderOpenPrice()>(ask+dvab))) //-check if order sell is profit { for(int nos=os; nos>0; nos--) { RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); result=OrderClose(OrderTicket(),OrderLots(),ask,dev,clrYellow); if(result!=true) {error=GetLastError();} if(error>0) { ResetLastError(); Sleep(500); RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); result=OrderClose(OrderTicket(),OrderLots(),ask,dev,clrYellow); } //-- if(error==0 && result==true) { Print("-----AutoTStop has CLOSED SELL ORDER ",_Symbol," - Forcibly closed Automatic Take profit..OK!"); PlaySound("ping.wav"); } } break; } //-end SELL Order Profit Auto TP //-- BEP, Trailing Stop & Step RefreshRates(); ask=MarketInfo(_Symbol,MODE_ASK); if((ask<(OrderOpenPrice()-beplmt))&&(bel0; se--) {trest=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-bep,OrderTakeProfit(),0);} bel++; } //-- if(TrlStp && (trxs==0) && (ask<(OrderOpenPrice()-tstpv))) { for(int tss=os; tss>0; tss--) {trest=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-trstart,OrderTakeProfit(),0);} trxs++; } //-- if(TrlStp && (trxs>0) && (ask<(OrderStopLoss()-trstart))) { trxs++; for(int tsx=os; tsx>0; tsx--) { if(opttp) {double otps=OrderTakeProfit()-(step*pp);} else {otps=OrderTakeProfit();} trest=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-(trxs*tsstv),otps,0); } } // end SELL Order Trailing Stop. //---- } } } } //--- return; //---- } //-end TpSlTrlS() //---------// void StartAction() //-- function: start take action for Auto TP or Trailing Stop. { //---- RefreshRates(); CkClose(); CkOpen(); if((ob+os>0)&&((stxb+stxs==0)||opttp||TrlStp)) {TpSlTrlS();} //---- return; //---- } //-end StartAction() //---------// //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- GlobalVariablesDeleteAll(); //-- return; //---- } //-end OnDeinit() //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ int start() { //---- RefreshRates(); if (IsTradeAllowed()==false) {return(0);} if (DayOfWeek()==0 || DayOfWeek()==6) {return(0);} if(FridayTrade==false && DayOfWeek()==5) {return(0);} else StartAction(); //-- return(0); //---- } //-end start() //---------// //+------------------------------------------------------------------+