Mql5-Micro-Grid-Scalper/grid-scalper
2026-09-02 00:54:14 +00:00

139 lines
4.8 KiB
Text

//+------------------------------------------------------------------+
//| AxiumMicroScalper.mq5|
//| Copyright 2026, Quant Dev Team |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026"
#property link ""
#property version "1.00"
#property strict
// Include Trade Library
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
//--- Input Parameters
input group "=== Strategy Settings ==="
input double InpLotSize = 0.01; // Base Lot Size
input double InpBasketTargetUSD = 1.50; // Basket Profit Target ($ per cycle)
input int InpGridDistance = 15; // Minimum Distance Between Grid Trades (Points)
input int InpMaxPositions = 15; // Maximum Concurrent Open Positions
input ulong InpMagicNumber = 888123; // EA Magic Number
input ulong InpSlippage = 10; // Max Slippage Points
//--- Global Objects
CTrade m_trade;
CPositionInfo m_position;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
m_trade.SetExpertMagicNumber(InpMagicNumber);
m_trade.SetDeviationInPoints(InpSlippage);
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(_Symbol);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 1. Calculate Floating Basket Profit & Count Open Positions
double currentBasketProfit = 0.0;
int buyCount = 0;
int sellCount = 0;
double lastBuyPrice = 0.0;
double lastSellPrice = 0.0;
int totalPositions = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
if(m_position.SelectByIndex(i))
{
if(m_position.Symbol() == _Symbol && m_position.Magic() == InpMagicNumber)
{
totalPositions++;
currentBasketProfit += m_position.Profit() + m_position.Swap() + m_position.Commission();
if(m_position.PositionType() == POSITION_TYPE_BUY)
{
buyCount++;
if(lastBuyPrice == 0.0 || m_position.PriceOpen() < lastBuyPrice)
lastBuyPrice = m_position.PriceOpen();
}
else if(m_position.PositionType() == POSITION_TYPE_SELL)
{
sellCount++;
if(lastSellPrice == 0.0 || m_position.PriceOpen() > lastSellPrice)
lastSellPrice = m_position.PriceOpen();
}
}
}
}
// 2. Execution Logic: Basket Profit Target Reached -> Close All Positions Immediately
if(totalPositions > 0 && currentBasketProfit >= InpBasketTargetUSD)
{
CloseAllPositions();
return;
}
// 3. Grid Entry Execution
if(totalPositions >= InpMaxPositions)
return;
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
// Initial cycle entry (opens buy/sell momentum starter if no positions exist)
if(totalPositions == 0)
{
m_trade.Buy(InpLotSize, _Symbol, ask, 0, 0, "Axium Start Buy");
m_trade.Sell(InpLotSize, _Symbol, bid, 0, 0, "Axium Start Sell");
return;
}
// Stack BUY positions if price dips by Grid Distance
if(buyCount > 0 && (lastBuyPrice - ask) >= (InpGridDistance * point))
{
m_trade.Buy(InpLotSize, _Symbol, ask, 0, 0, "Axium Grid Buy");
}
// Stack SELL positions if price rallies by Grid Distance
if(sellCount > 0 && (bid - lastSellPrice) >= (InpGridDistance * point))
{
m_trade.Sell(InpLotSize, _Symbol, bid, 0, 0, "Axium Grid Sell");
}
}
//+------------------------------------------------------------------+
//| Fast Basket Closure Routine |
//+------------------------------------------------------------------+
void CloseAllPositions()
{
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
if(m_position.SelectByIndex(i))
{
if(m_position.Symbol() == _Symbol && m_position.Magic() == InpMagicNumber)
{
m_trade.PositionClose(m_position.Ticket());
}
}
}
}
//+------------------------------------------------------------------+