Idea by: Vladimir Gribachev.
MQL5 code by: Vladimir Karputov.
An EA without using any custom indicators; positions are opened pseudorandomly. The EA can show the current statistics in two languages:
Trailing modifies the Stop Loss of open positions. In case of loss, the lots increase using Martingale. How to monitor losses: In OnTradeTransaction, we catch transaction DEAL_REASON_SL - the sign of the Stop Loss triggered:
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
//--- get transaction type as enumeration value
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
if(type==TRADE_TRANSACTION_DEAL_ADD)
{
long deal_ticket =0;
long deal_order =0;
long deal_time =0;
long deal_time_msc =0;
long deal_type =-1;
long deal_entry =-1;
long deal_magic =0;
long deal_reason =-1;
long deal_position_id =0;
double deal_volume =0.0;
double deal_price =0.0;
double deal_commission =0.0;
double deal_swap =0.0;
double deal_profit =0.0;
string deal_symbol ="";
string deal_comment ="";
string deal_external_id ="";
if(HistoryDealSelect(trans.deal))
{
deal_ticket =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
deal_order =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
deal_time =HistoryDealGetInteger(trans.deal,DEAL_TIME);
deal_time_msc =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
deal_type =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
deal_entry =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_magic =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
deal_reason =HistoryDealGetInteger(trans.deal,DEAL_REASON);
deal_position_id =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);
deal_volume =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
deal_price =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
deal_commission =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
deal_swap =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
deal_profit =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);
deal_symbol =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
deal_comment =HistoryDealGetString(trans.deal,DEAL_COMMENT);
deal_external_id =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
}
else
return;
if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
if(deal_entry==DEAL_ENTRY_OUT)
{
PrevBars=0;
if(deal_reason==DEAL_REASON_SL && deal_commission+deal_swap+deal_profit<0.0)
last_lots_sl=deal_volume;
else
last_lots_sl=0.0;
}
}
}
Input parameters
- Stop Loss - Stop Loss;
- Take Profit - Take Profit;
- Trailing Stop - trailing;
- Trailing Step - trailing step;
- Lots - lot size is set manually (if Lots is above zero, then Risk must be equal to zero);
- Risk - lot size is calculated automatically (if Risk is above zero, then Lots must be equal to zero);
- Martingale - lot increase ratio, if the preceding position was closed by Stop Loss and the profit gained was negative;
- Max lots - the maximum position size; if this size is exceeded, then the EA terminates its operation abnormally;
- magic number - unique identifier for the EA.
Then testing was interrupted (the EA was unloaded from the chart forcedly), since the reference lot exceeded the Max lots parameter: