Всем привет! Это мой первый пост на открытую аудиторию, так что прошу не судить строго.
Очень многие, в том числе новички не знают как работает торговля, как работает стакан, да и вообще как торговать.
Они ищут магические точки входа, ощущают надежду на сверх прибыль при каждой сделке и конечно же мечтают отбить того самого лося, без которого они бы уже точно купили себе яхту.
Я же хочу чтобы они на деле посмотрели, как по большей части работает рынок, как можно торговать «по другому», чтобы они почувствовали себя тем самым маркет-мейкером.
И это на самом деле очень просто сделать при торговле алгоритмов.
В этой статье я хочу разобрать самый простой алгоритм, который в простонародье называется ЕРШ. Возможно вы его уже видели, например на парах с акциями маркетплейса ОЗОН, там работает абсолютно такой же алгоритм и если вы поймете, как он работает, то понимание рынка, стакана и в целом торговли не заставит себя долго ждать.
Разбор будет на примере криптовалютной пары UNP/USDT на бирже MEXC, но поверьте, подобных монет и алгоритмов бесчисленное множество, о том как их находить я буду писать дальше в отдельных статьях, а сам UNP на 22.12.2025 г. торгуется именно так как я буду его вам описывать.
#property copyright "Copyright 2019, Example Inc."
#property link "https://www.example.com"
input int LotSize = 1;
input int Period = 30;
input double VolatilityThreshold = 0.1;
input int ExitAfterMinutes = 60;
int buyOrderId;
int sellOrderId;
datetime entryTime;
void OnTick()
{
// Get the last Period candlesticks
ArraySetAsSeries(candles, true);
CopyRates(Symbol(), PERIOD_M1, TimeCurrent() - Period, Period, candles);
// Calculate the maximum and minimum prices
double maxPrice = High(candles);
double minPrice = Low(candles);
// Calculate the standard deviation of the closing prices
double stdev = iStdDev(candles, MODE_CLOSE, 0);
// Check if the volatility is above the threshold
if (stdev > VolatilityThreshold)
{
// Check if the current ask price is higher than the maximum price
if (Ask > maxPrice)
{
// Place a buy order
if (OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, 0, "My order", 16384, 0, Green))
{
Print("Buy order placed");
buyOrderId = OrderTicket();
entryTime = TimeCurrent();
}
else
{
Print("Error placing buy order : ", ErrorDescription(GetLastError()));
}
}
// Check if the current bid price is lower than the minimum price
if (Bid < minPrice)
{
// Place a sell order
if (OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, 0, 0, "My order", 16384, 0, Red))
{
Print("Sell order placed");
sellOrderId = OrderTicket();
entryTime = TimeCurrent();
}
else
{
Print("Error placing sell order : ", ErrorDescription(GetLastError()));
}
}
}
if (buyOrderId > 0)
{
if (TimeCurrent() - entryTime >= ExitAfterMinutes * 60)
{
if (OrderClose(buyOrderId, LotSize, Bid, 3, clrNONE))
{
Print("Buy order closed");
buyOrderId = 0;
}
else
{
Print("Error closing buy order : ", ErrorDescription(GetLastError()));
}
}
}
if (sellOrderId > 0)
{
if (TimeCurrent() - entryTime >= ExitAfterMinutes * 60)
{
if (OrderClose(sellOrderId, LotSize, Ask, 3, clrNONE))
{
Print("Sell order closed");
sellOrderId = 0;
}
else
{
Print("Error closing sell order : ", ErrorDescription(GetLastError()));
}
}
}
}
