Hey there, fellow traders! Today, I’m excited to dive into the AK-47 Scalper EA – a robust trading system designed for MetaTrader 5. Whether you're a newbie trying to get your feet wet or a seasoned pro looking to optimize your strategies, this EA could be a game-changer for you!
1. Input Parameters
#define ExtBotName "AK-47 EA" // Bot Name #define Version "1.00" // Import input classes #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> #include <Trade\OrderInfo.mqh> //--- Define variables for code readability #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID) //--- Input parameters input string EASettings = "---------------------------------------------"; // EA Settings input int InpMagicNumber = 124656; // Magic Number input string MoneySettings = "---------------------------------------------"; // Money Settings input bool isVolume_Percent = true; // Allow Volume Percent input double InpRisk = 3; // Risk Percentage of Balance (%) input string TradingSettings = "---------------------------------------------"; // Trading Settings input double Inpuser_lot = 0.01; // Lots input double InpSL_Pips = 3.5; // Stoploss in Pips input double InpTP_Pips = 7; // TP in Pips (0 = No TP) input int InpMax_slippage = 3; // Maximum slippage allowed in Pips input double InpMax_spread = 5; // Maximum allowed spread in Points (0 = floating) input string TimeSettings = "---------------------------------------------"; // Trading Time Settings input bool InpTimeFilter = true; // Trading Time Filter input int InpStartHour = 2; // Start Hour input int InpStartMinute = 30; // Start Minute input int InpEndHour = 21; // End Hour input int InpEndMinute = 0; // End Minute
2. Local Variables Initialization
//--- Variables int Pips2Points; // slippage 3 pips, 3=points, 30=points double Pips2Double; // Stoploss 15 pips, 0.015 bool isOrder = false; int slippage; long acSpread; string strComment = ""; CPositionInfo m_position; // trade position object CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object CAccountInfo m_account; // account info wrapper COrderInfo m_order; // pending orders object
3. Main Code
a/ Expert Initialization Function
int OnInit() {
// 3 or 5 digits detection
// Pip and point
if (_Digits % 2 == 1) {
Pips2Double = _Point * 10;
Pips2Points = 10;
slippage = 10 * InpMax_slippage;
} else {
Pips2Double = _Point;
Pips2Points = 1;
slippage = InpMax_slippage;
}
if (!m_symbol.Name(Symbol())) // sets symbol name
return(INIT_FAILED);
RefreshRates();
m_trade.SetExpertMagicNumber(InpMagicNumber);
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(m_symbol.Name());
m_trade.SetDeviationInPoints(slippage);
return(INIT_SUCCEEDED);
}b/ Expert Tick Function
void OnTick() { if (TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) == false) { Comment("LazyBot\nTrade not allowed."); return; } MqlDateTime structTime; TimeCurrent(structTime); structTime.sec = 0; // Set starting time structTime.hour = InpStartHour; structTime.min = InpStartMinute; datetime timeStart = StructToTime(structTime); // Set Ending time structTime.hour = InpEndHour; structTime.min = InpEndMinute; datetime timeEnd = StructToTime(structTime); acSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD); strComment = "\n" + ExtBotName + " - v." + (string)Version; strComment += "\nServer time = " + TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS) + " - " + DayOfWeekDescription(structTime.day_of_week); strComment += "\nTrading time = [" + (string)InpStartHour + "h" + (string)InpStartMinute + " --> " + (string)InpEndHour + "h" + (string)InpEndMinute + "]"; strComment += "\nCurrent Spread = " + (string)acSpread + " Points"; Comment(strComment); // Update Values UpdateOrders(); TrailingStop(); // Trading conditions based on time filter if (InpTimeFilter) { if (TimeCurrent() >= timeStart && TimeCurrent() 3.1 Calculate Signal to Send Orders
void OpenOrder() {
ENUM_ORDER_TYPE OrdType = ORDER_TYPE_SELL;
double TP = 0;
double SL = 0;
string comment = ExtBotName;
// Calculate Lots
double lot1 = CalculateVolume();
if (OrdType == ORDER_TYPE_SELL) {
double OpenPrice = Bid - NormalizeDouble(InpSL_Pips / 2 * Pips2Double, _Digits);
TP = OpenPrice - NormalizeDouble(InpTP_Pips * Pips2Double, _Digits);
SL = Ask + NormalizeDouble(InpSL_Pips / 2 * Pips2Double, _Digits);
if (CheckSpreadAllow() && CheckVolumeValue(lot1) && CheckOrderForFREEZE_LEVEL(ORDER_TYPE_SELL_STOP, OpenPrice) && CheckStopLoss(OpenPrice, SL, TP) && CheckMoneyForTrade(m_symbol.Name(), lot1, ORDER_TYPE_SELL)) {
if (!m_trade.SellStop(lot1, OpenPrice, m_symbol.Name(), SL, TP, ORDER_TIME_GTC, 0, comment))
Print(__FUNCTION__, "--> OrderSend error ", m_trade.ResultComment());
}
}
// Add more conditions for ORDER_TYPE_BUY similarly...
}3.2 Calculate Volume
double CalculateVolume() { double LotSize = 0; if (isVolume_Percent == false) { LotSize = Inpuser_lot; } else { LotSize = (InpRisk) * m_account.FreeMargin(); LotSize = LotSize / 100000; double n = MathFloor(LotSize / Inpuser_lot); LotSize = n * Inpuser_lot; if (LotSize m_symbol.LotsMax()) LotSize = m_symbol.LotsMax(); if (LotSize 3.3 EA's Trailing Stop Function
void TrailingStop() {
double SL_in_Pip = 0;
for (int i = PositionsTotal() - 1; i >= 0; i--) {
if (m_position.SelectByIndex(i)) {
if ((m_position.Magic() == InpMagicNumber) && (m_position.Symbol() == m_symbol.Name())) {
// For Buy orders
if (m_position.PositionType() == POSITION_TYPE_BUY) {
SL_in_Pip = NormalizeDouble(Bid - m_position.StopLoss(), _Digits) / Pips2Double;
if (SL_in_Pip > InpSL_Pips) {
double newSL = NormalizeDouble(Bid - InpSL_Pips * Pips2Double, _Digits);
if (!m_trade.PositionModify(m_position.Ticket(), newSL, m_position.TakeProfit())) {
Print(__FUNCTION__, "--> OrderModify error ", m_trade.ResultComment());
continue;
}
}
}
// For Sell orders... Add similar logic for sell...
}
}
}
}
Comments 0