Пусть уж здесь лежит. Выкладывайте
Вот , дал ему пару подзатыльников и пообещал выдернуть штепсель , и он немного пошуршал . Наверно еще можно лучше сделать.
text
//+------------------------------------------------------------------+
//| Expert Advisor: SMA + RSI Touch (Optimized for MT4) |
//+------------------------------------------------------------------+
#property strict
// --- Оптимизируемые параметры ---
input int smaPeriod = 14; // Период SMA
input int rsiPeriod = 14; // Период RSI
input double lotSize = 0.1; // Размер лота
input int rsiLowLevel = 30; // Нижний уровень RSI для покупки
input int rsiHighLevel = 70; // Верхний уровень RSI для продажи
input int magic = 123456; // Магический номер
input int slippage = 3; // Проскальзывание
// Для отслеживания нового бара
datetime lastBarTime = 0;
// --- Проверка наличия открытой позиции по символу и magic ---
int GetOpenPositionType()
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY) return OP_BUY;
if(OrderType() == OP_SELL) return OP_SELL;
}
}
}
return -1; // Нет позиций
}
// --- Закрытие позиции по сигналу ---
bool ClosePosition(int type)
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic && OrderType() == type)
{
double price = (type == OP_BUY) ? Bid : Ask;
bool closed = OrderClose(OrderTicket(), OrderLots(), price, slippage, clrAqua);
if(closed)
Print((type == OP_BUY ? "Buy" : "Sell"), " order closed by RSI signal");
else
Print("Order close failed. Error: ", GetLastError());
return closed;
}
}
}
return false;
}
// --- Открытие позиции ---
bool OpenPosition(int type)
{
double price = (type == OP_BUY) ? Ask : Bid;
int ticket = OrderSend(Symbol(), type, lotSize, price, slippage, 0, 0, "SMA+RSI", magic, 0, (type == OP_BUY) ? clrBlue : clrRed);
if(ticket > 0)
{
Print((type == OP_BUY ? "Buy" : "Sell"), " order opened. Ticket: ", ticket);
return true;
}
else
{
Print("Order send failed. Error: ", GetLastError());
return false;
}
}
// --- Основная функция советника ---
void OnTick()
{
// Работаем только на новом баре
if (Time[0] == lastBarTime) return;
lastBarTime = Time[0];
double smaPrev = iMA(NULL, 0, smaPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
double smaCurr = iMA(NULL, 0, smaPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double closePrev = Close[2];
double closeCurr = Close[1];
double rsi = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE, 1);
int posType = GetOpenPositionType();
// --- Открытие позиции ---
if(posType == -1)
{
// Buy: закрытие предыдущего бара выше SMA, текущего — ниже/равно, RSI < rsiLowLevel
if(closePrev > smaPrev && closeCurr <= smaCurr && rsi < rsiLowLevel)
{
OpenPosition(OP_BUY);
}
// Sell: закрытие предыдущего бара ниже SMA, текущего — выше/равно, RSI > rsiHighLevel
else if(closePrev < smaPrev && closeCurr >= smaCurr && rsi > rsiHighLevel)
{
OpenPosition(OP_SELL);
}
}
// --- Закрытие позиции по противоположному сигналу RSI ---
if(posType == OP_BUY && rsi > rsiHighLevel)
ClosePosition(OP_BUY);
if(posType == OP_SELL && rsi < rsiLowLevel)
ClosePosition(OP_SELL);
}