EA Studio
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ea studio xauusd @lifeindreamsworld.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник EA Studio разработан для торговли на платформе MetaTrader 4 и обрабатывает рыночные события через OnTick и OnBar. Он анализирует ценовые данные с использованием двух индикаторов: Candle Color и Accelerator Oscillator, а также выполняет торговые операции через стандартные API MetaTrader.
Открытие позиций определяется цветом последовательных свечей: при достижении заданного количества медвежьих или бычьих свечей определённой минимальной высоты формируется сигнал на покупку или продажу. Закрытие позиции управляется значением индикатора Accelerator Oscillator относительно заданного уровня.
Советник поддерживает стоп-лосс, тейк-профит и трейлинг-стоп, а также работу в заданных торговых сессиях. Торговые запросы отправляются с механизмом повторных попыток и проверкой корректности ордера через OrderCheck.
Входные параметры настраиваются через диалог настроек советника и включают уровни стоп-лосса и тейк-профита в пипсах, параметры фильтра свечей и уровень индикатора Accelerator Oscillator.
Настройки программы
| Настройка | Описание |
|---|---|
| Stop_Loss | Значение стоп-лосса в пипсах, задающее расстояние от цены открытия до уровня защиты позиции. |
| Take_Profit | Значение тейк-профита в пипсах, задающее расстояние от цены открытия до уровня фиксации прибыли. При нулевом значении тейк-профит не устанавливается. |
| Ind0Param0 | Минимальная высота тела свечи в пипсах, используемая для определения значимого движения цены при анализе цветовой последовательности свечей. |
| Ind0Param1 | Количество последовательных свечей одного цвета, которое должно быть достигнуто для формирования сигнала на открытие позиции. |
| Ind1Param0 | Уровень индикатора Accelerator Oscillator, относительно которого определяется условие закрытия текущей позиции. |
Поиск по коду файла
#property version "3.3"
#property strict
static input string _Properties_ = "------"; // --- Expert Properties ---
static input double Entry_Amount = 1.00; // Entry lots
input int Stop_Loss = 2800; // Stop Loss (pips)
input int Take_Profit = 0; // Take Profit (pips)
static input string ___0______ = "------"; // --- Candle Color ---
input int Ind0Param0 = 45; // Min body height [pips]
input int Ind0Param1 = 3; // Consecutive candles
static input string ___1______ = "------"; // --- Accelerator Oscillator ---
input double Ind1Param0 = -10.0000; // Level
static input string _Settings___ = "------"; // --- Expert Settings ---
static input int Magic_Number = 70624374; // Magic Number
#define TRADE_RETRY_COUNT 4
#define TRADE_RETRY_WAIT 100
#define OP_FLAT -1
#define OP_BUY ORDER_TYPE_BUY
#define OP_SELL ORDER_TYPE_SELL
int sessionSundayOpen = 0; // 00:00
int sessionSundayClose = 86400; // 24:00
int sessionMondayThursdayOpen = 36000; // 10:00
int sessionMondayThursdayClose = 50400; // 14:00
int sessionFridayOpen = 36000; // 10:00
int sessionFridayClose = 50400; // 14:00
bool sessionIgnoreSunday = false;
bool sessionCloseAtSessionClose = false;
bool sessionCloseAtFridayClose = false;
const double sigma = 0.000001;
double posType = OP_FLAT;
ulong posTicket = 0;
double posLots = 0;
double posStopLoss = 0;
double posTakeProfit = 0;
datetime barTime;
double pip;
double stopLevel;
bool isTrailingStop=false;
ENUM_ORDER_TYPE_FILLING orderFillingType = ORDER_FILLING_FOK;
int indHandlers[1][12][2];
int OnInit()
{
// код доступен только после оплаты
}
void OnTick()
{
// код доступен только после оплаты
}
void OnBar()
{
UpdatePosition();
if (posType != OP_FLAT && IsForceSessionClose())
{
ClosePosition();
return;
}
if ( IsOutOfSession() )
return;
if (posType != OP_FLAT)
{
ManageClose();
UpdatePosition();
}
if (posType != OP_FLAT && isTrailingStop)
{
double trailingStop=GetTrailingStopPrice();
ManageTrailingStop(trailingStop);
UpdatePosition();
}
int entrySignal = GetEntrySignal();
if ((posType == OP_BUY && entrySignal == OP_SELL) ||
(posType == OP_SELL && entrySignal == OP_BUY ))
{
ClosePosition();
UpdatePosition();
}
if (posType == OP_FLAT && entrySignal != OP_FLAT)
{
OpenPosition(entrySignal);
UpdatePosition();
}
}
void UpdatePosition()
{
posType = OP_FLAT;
posTicket = 0;
posLots = 0;
int posTotal = PositionsTotal();
for (int posIndex = 0; posIndex < posTotal; posIndex++)
{
ulong ticket = PositionGetTicket(posIndex);
if (PositionSelectByTicket(ticket) &&
PositionGetString(POSITION_SYMBOL) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == Magic_Number)
{
posType = (int) PositionGetInteger(POSITION_TYPE);
posTicket = ticket;
posLots = NormalizeDouble(PositionGetDouble(POSITION_VOLUME), 2);
posStopLoss = NormalizeDouble(PositionGetDouble(POSITION_SL), _Digits);
posTakeProfit = NormalizeDouble(PositionGetDouble(POSITION_TP), _Digits);
break;
}
}
}
void InitIndicators()
{
indHandlers[0][0][0] = -1;
indHandlers[0][1][0] = iAC(NULL, 0);
}
int GetEntrySignal()
{
bool ind0long = false;
bool ind0short = false;
{
int consecutiveBullish = 0;
int consecutiveBearish = 0;
double pipVal = pip * Ind0Param0;
for (int b = Ind0Param1 + 2; b > 0; b--)
{
consecutiveBullish = Close(b) - Open(b) >= pipVal ? consecutiveBullish + 1 : 0;
consecutiveBearish = Open(b) - Close(b) >= pipVal ? consecutiveBearish + 1 : 0;
}
ind0long = consecutiveBearish >= Ind0Param1;
ind0short = consecutiveBullish >= Ind0Param1;
}
bool canOpenLong = ind0long;
bool canOpenShort = ind0short;
return canOpenLong && !canOpenShort ? OP_BUY
: canOpenShort && !canOpenLong ? OP_SELL
: OP_FLAT;
}
void ManageClose()
{
double ind1buffer[]; CopyBuffer(indHandlers[0][1][0], 0, 1, 3, ind1buffer);
double ind1val1 = ind1buffer[2];
bool ind1long = ind1val1 < Ind1Param0 - sigma;
bool ind1short = ind1val1 > -Ind1Param0 + sigma;
if ( (posType == OP_BUY && ind1long) ||
(posType == OP_SELL && ind1short) )
ClosePosition();
}
void OpenPosition(int command)
{
double stopLoss = GetStopLossPrice(command);
double takeProfit = GetTakeProfitPrice(command);
ManageOrderSend(command, Entry_Amount, stopLoss, takeProfit, 0);
}
void ClosePosition()
{
int command = posType == OP_BUY ? OP_SELL : OP_BUY;
ManageOrderSend(command, posLots, 0, 0, posTicket);
}
void ManageOrderSend(int command, double lots, double stopLoss, double takeProfit, ulong ticket)
{
for (int attempt = 0; attempt < TRADE_RETRY_COUNT; attempt++)
{
if (IsTradeContextFree())
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = lots;
request.type = command == OP_BUY ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
request.price = command == OP_BUY ? Ask() : Bid();
request.type_filling = orderFillingType;
request.deviation = 10;
request.sl = stopLoss;
request.tp = takeProfit;
request.magic = Magic_Number;
request.position = ticket;
request.comment = IntegerToString(Magic_Number);
bool isOrderCheck = CheckOrder(request);
bool isOrderSend = false;
if (isOrderCheck)
{
ResetLastError();
isOrderSend = OrderSend(request, result);
}
if (isOrderCheck && isOrderSend && result.retcode == TRADE_RETCODE_DONE)
return;
}
Sleep(TRADE_RETRY_WAIT);
Print("Order Send retry no: " + IntegerToString(attempt + 2));
}
}
void ModifyPosition(double stopLoss, double takeProfit, ulong ticket)
{
for (int attempt = 0; attempt < TRADE_RETRY_COUNT; attempt++)
{
if ( IsTradeContextFree() )
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
request.action = TRADE_ACTION_SLTP;
request.symbol = _Symbol;
request.sl = stopПоказано первые 50% кода (символов: 10185)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.