Сам код на мт4:
Не проверял, кто хочет попробуйте:
//+------------------------------------------------------------------+
//| RSI_SMA.mq4 |
//| Внутридневная стратегия на RSI и SMA |
//+------------------------------------------------------------------+
#property strict
// Входные параметры
input int RSI_Period = 9; // Период RSI
input int SMA_Period = 34; // Период SMA
input int EMA_Period = 13; // Период EMA
input double LotSize = 0.1; // Размер лота
input int TakeProfit = 30; // Тейк-профит (пункты)
input int StopLoss = 12; // Стоп-лосс (пункты)
input int TrailingStop = 10; // Трейлинг-стоп (пункты)
input int MagicNumber = 123456; // Магический номер советника
input double RiskPercent = 1.0; // Риск на сделку (% от депозита)
// Глобальные переменные
int Ticket = 0; // Номер ордера
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// Проверка входных параметров
if (RSI_Period <= 0 SMA_Period <= 0 EMA_Period <= 0 LotSize <= 0 TakeProfit <= 0 || StopLoss <= 0)
{
Print("Ошибка: Некорректные входные параметры!");
return(INIT_PARAMETERS_INCORRECT);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Очистка при завершении
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Проверка наличия открытых ордеров
if (OrdersTotal() > 0) return;
// Расчет индикаторов
double RSI = iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, 0);
double SMA = iMA(NULL, 0, SMA_Period, 0, MODE_SMA, PRICE_CLOSE, 0);
double EMA = iMA(NULL, 0, EMA_Period, 0, MODE_EMA, PRICE_CLOSE, 0);
// Цены Bid и Ask
double Bid = NormalizeDouble(MarketInfo(Symbol(), MODE_BID), Digits);
double Ask = NormalizeDouble(MarketInfo(Symbol(), MODE_ASK), Digits);
// Управление рисками
double RiskAmount = AccountBalance() * RiskPercent / 100.0;
double Lot = NormalizeDouble(RiskAmount / (StopLoss * MarketInfo(Symbol(), MODE_TICKVALUE)), 2);
// Сигналы на покупку
if (RSI < 35 && Ask > SMA && Ask > EMA)
{
double SL = Ask - StopLoss * Point;
double TP = Ask + TakeProfit * Point;
Ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, SL, TP, "Buy Order", MagicNumber, 0, Blue);
}
// Сигналы на продажу
if (RSI > 65 && Bid < SMA && Bid < EMA)
{
double SL = Bid + StopLoss * Point;
double TP = Bid - TakeProfit * Point;
Ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, SL, TP, "Sell Order", MagicNumber, 0, Red);
}
// Трейлинг-стоп
if (Ticket > 0 && TrailingStop > 0)
{
if (OrderSelect(Ticket, SELECT_BY_TICKET))
{
if (OrderType() == OP_BUY)
{
double NewSL = Bid - TrailingStop * Point;
if (NewSL > OrderStopLoss())
{
OrderModify(Ticket, OrderOpenPrice(), NewSL, OrderTakeProfit(), 0, Blue);
}
}
else if (OrderType() == OP_SELL)
{
double NewSL = Ask + TrailingStop * Point;
if (NewSL < OrderStopLoss())
{
OrderModify(Ticket, OrderOpenPrice(), NewSL, OrderTakeProfit(), 0, Red);
}
}
}
}
}