#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 и нажмите кнопку, чтобы перейти к оплате.