Orders Execution
Indicators Used
Miscellaneous
0
Views
0
Downloads
0
Favorites
FollowMe v05 Ron
//+--------+
//|FollowMe|
//+--------+
#property copyright "Ron Thompson"
#property link "http://www.ForexMT4.com/"
// This EA is NEVER to be SOLD individually
// This EA is NEVER to be INCLUDED as part of a collection that is SOLD
// user input
extern int IPeriod = 55 ;
extern double Lots = 0.01 ;
extern int TotalOrders = 1 ;
extern double ProfitMade = 0.0 ;
extern double LossLimit = 0.0 ;
extern double BasketProfit = 0.0 ;
// Trade control
int Slippage=2; // how many pips of slippage can you tolorate
int maxloop=25; // maximum number of attempts to handle errors
int LL2SL=10; // LossLimit to StopLoss server spread
int MagicNumber = 354656; // allows multiple experts to trade on same account
string TradeComment = "_follow05.txt"; // where to log information
// Bar handling
datetime bartime=0; // used to determine when a bar has moved
//objects
int i;
//info
string cmt;
// used for verbose error logging
#include <stdlib.mqh>
// EA specific
string sDir;
int currdir;
int prevdir;
bool WaitForNextTrend=true;
//+-------------+
//| Custom init |
//|-------------+
// Called ONCE when EA is added to chart or recompiled
int init()
{
if( IsTesting() ) LL2SL=50;
// current bar is current bar
// prevents trade when placing EA on chart
bartime=Time[0];
Comment(" ");
}
//+----------------+
//| Custom DE-init |
//+----------------+
// Called ONCE when EA is removed from chart
int deinit()
{
Comment(" ");
}
//+-----------+
//| Main |
//+-----------+
// Called EACH TICK and each Bar[]
int start()
{
// EA specific
double ma0, ma1;
int cnt=0;
int gle=0;
int ticket=0;
int OrdersPerSymbol=0;
// stoploss and takeprofit and close control
double SL=0;
double TP=0;
double CurrentProfit=0;
// order management
string oTK;
string oSL;
string oTP;
string oPM;
string oLL;
string oER;
// limit the orders
if(TotalOrders>0 && OrdersTotal()>=TotalOrders) WaitForNextTrend=true;
// bar open, so do all the calcs
if(bartime!=Time[0])
{
bartime=Time[0];
//+---------------------------------+
//| Insert your MA or iCustom here |
//+---------------------------------+
ma1=iMA(Symbol(),0,IPeriod,0,MODE_EMA,MODE_OPEN,1);
ma0=iMA(Symbol(),0,IPeriod,0,MODE_EMA,MODE_OPEN,0);
//+-------------+
//| END Insert |
//+-------------+
sDir=" Sideways";
//check for Rising including slope
if(ma0>ma1)
{
currdir=2;
sDir="Rising";
// has the direction changed
if(currdir!=prevdir)
{
prevdir=currdir;
CloseEverything();
WaitForNextTrend=false;
sDir="Rising was Falling";
}
if(!WaitForNextTrend) OpenBuy("BUY", Lots);
}//rising
//check for Falling including slope
if(ma0<ma1)
{
currdir=1;
sDir="Falling";
// has the direction changed
if(currdir!=prevdir)
{
prevdir=currdir;
CloseEverything();
WaitForNextTrend=false;
sDir="Falling was Rising";
}
if(!WaitForNextTrend) OpenSell("SELL", Lots);
}//falling
cmt="MA[0]="+ma0+" MA[1]="+ma1+" DIFF="+(ma0-ma1)+" DIRECTION="+sDir;
Comment(cmt);
}//bartime
//Basket profit
double CurrentBasket=0;
for(cnt=OrdersTotal();cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber )
{
CurrentBasket=CurrentBasket+OrderProfit();
}
}
Comment(cmt+" Profit="+CurrentBasket);
if( BasketProfit>0 && CurrentBasket>=BasketProfit)
{
CloseEverything();
WaitForNextTrend=true;
}
//
// Order Management
//
for(cnt=OrdersTotal();cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if( OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber )
{
if(OrderType()==OP_BUY)
{
CurrentProfit=(Bid-OrderOpenPrice()) ;
// Did we make a profit
//======================
if(ProfitMade>0 && CurrentProfit>=(ProfitMade*Point))
{
oTK=" Ticket="+OrderTicket();
oSL=" SL="+OrderStopLoss();
oTP=" TP="+OrderTakeProfit();
oPM=" PM="+ProfitMade;
oLL=" LL="+LossLimit;
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
}
// Did we take a loss
//====================
if(LossLimit>0 && CurrentProfit<=(LossLimit*(-1)*Point))
{
oTK=" Ticket="+OrderTicket();
oSL=" SL="+OrderStopLoss();
oTP=" TP="+OrderTakeProfit();
oPM=" PM="+ProfitMade;
oLL=" LL="+LossLimit;
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
}
} // if BUY
if(OrderType()==OP_SELL)
{
CurrentProfit=(OrderOpenPrice()-Ask);
// Did we make a profit
//======================
if( ProfitMade>0 && CurrentProfit>=(ProfitMade*Point) )
{
oTK=" Ticket="+OrderTicket();
oSL=" SL="+OrderStopLoss();
oTP=" TP="+OrderTakeProfit();
oPM=" PM="+ProfitMade;
oLL=" LL="+LossLimit;
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
}
// Did we take a loss
//====================
if( LossLimit>0 && CurrentProfit<=(LossLimit*(-1)*Point) )
{
oTK=" Ticket="+OrderTicket();
oSL=" SL="+OrderStopLoss();
oTP=" TP="+OrderTakeProfit();
oPM=" PM="+ProfitMade;
oLL=" LL="+LossLimit;
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
}
} //if SELL
} // if(OrderSymbol)
} // for
} // start()
//+-----------------+
//| CloseEverything |
//+-----------------+
// Closes all OPEN and PENDING orders
int CloseEverything()
{
double myAsk;
double myBid;
int myTkt;
double myLot;
int myTyp;
int mygle;
int i;
bool result = false;
for( i=(OrdersTotal()-1); i>=0; i-- )
{
OrderSelect(i, SELECT_BY_POS);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
{
myAsk=MarketInfo(OrderSymbol(),MODE_ASK);
myBid=MarketInfo(OrderSymbol(),MODE_BID);
myTkt=OrderTicket();
myLot=OrderLots();
myTyp=OrderType();
switch( myTyp )
{
//Close opened long positions
case OP_BUY :CloseBuy("CLOSEEVERYTHING BUY");
break;
//Close opened short positions
case OP_SELL :CloseSell("CLOSEEVERYTHING SELL");
break;
}
Sleep(500);
}//symbol&MagicNumber
} //for
} // closeeverything
//ENTRY LONG (buy, Ask)
void OpenBuy (string myInfo, double myLots)
{
int loopcount=0;
double SL,TP;
int ticket;
int gle;
if(!IsTradeAllowed())
{
return(0);
}
while(true)
{
if(LossLimit ==0) SL=0; else SL=Ask-((LossLimit+LL2SL)*Point );
if(ProfitMade==0) TP=0; else TP=Ask+((ProfitMade+LL2SL)*Point );
ticket=OrderSend(Symbol(),OP_BUY,myLots,Ask,Slippage,SL,TP,TradeComment,MagicNumber,White);
gle=GetLastError();
if(gle==0)
{
break;
}
loopcount++;
if(loopcount>maxloop)
{
Alert("Order failed to OPEN - See Journal for errors");
break;
}
Sleep(500);
RefreshRates();
}//while
}//OpenBuy
//ENTRY SHORT (sell, Bid)
void OpenSell (string myInfo, double myLots)
{
int loopcount=0;
double SL,TP;
int ticket;
int gle;
if(!IsTradeAllowed())
{
return(0);
}
while(true)
{
if(LossLimit ==0) SL=0; else SL=Bid+((LossLimit+LL2SL)*Point );
if(ProfitMade==0) TP=0; else TP=Bid-((ProfitMade+LL2SL)*Point );
ticket=OrderSend(Symbol(),OP_SELL,myLots,Bid,Slippage,SL,TP,TradeComment,MagicNumber,Red);
gle=GetLastError();
if(gle==0)
{
break;
}
loopcount++;
if(loopcount>maxloop)
{
Alert("Order failed to OPEN - See Journal for errors");
break;
}
Sleep(500);
RefreshRates();
}//while
}//SELLme
void CloseBuy (string myInfo)
{
int gle;
int cnt;
int loopcount=0;
while(true)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
gle=GetLastError();
if(gle==0)
{
break;
}
loopcount++;
if(loopcount>maxloop)
{
Alert("Order failed to CLOSE - See Journal for errors");
break;
}
Sleep(500);
RefreshRates();
}//while
}
void CloseSell (string myInfo)
{
int gle;
int cnt;
int loopcount=0;
while(true)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
gle=GetLastError();
if(gle==0)
{
break;
}
loopcount++;
if(loopcount>maxloop)
{
Alert("Order failed to CLOSE - See Journal for errors");
break;
}
Sleep(500);
RefreshRates();
}//while
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---