Алексей Боровков – 10 роботов для автоматической торговли на Форекс (страница 9)
}
}
//+–+
//| Функция открытия позиции |
//+–+
void OpenPosition(ENUM_ORDER_TYPE orderType)
{
MqlTradeRequest request = {};
MqlTradeResult result = {};
request.action = TRADE_ACTION_DEAL;
request.symbol = _Symbol;
request.volume = LotSize;
request.type = orderType;
request.type_filling = ORDER_FILLING_FOK;
request.deviation = 10;
request.magic = MagicNumber;
// Установка цен
if(orderType == ORDER_TYPE_BUY)
{
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = request.price – StopLoss_Points * _Point;
request.tp = request.price + TakeProfit_Points * _Point;
}
else // ORDER_TYPE_SELL
{
request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
request.sl = request.price + StopLoss_Points * _Point;
request.tp = request.price – TakeProfit_Points * _Point;
}
// Отправка ордера
if(!OrderSend(request, result))
{
Print("Ошибка открытия позиции: ", GetLastError());
}
else
{
Print("Позиция успешно открыта. Тикет: ", result.order);
}
}
//+–+
//| Функция трейлинг-стопа |
//+–+
void TrailingStop()
{
ulong posTicket = PositionGetTicket(0);
if(!PositionSelectByTicket(posTicket)) return;
double currentSL = PositionGetDouble(POSITION_SL);
double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
double newSL = currentSL;
double trailingStep = TrailingStop_Points * _Point;
if(posType == POSITION_TYPE_BUY)
{
if(currentPrice – currentSL > trailingStep)
{
newSL = currentPrice – trailingStep;
if(newSL > currentSL)
{
ModifyPositionSL(newSL);
}
}
}
else if(posType == POSITION_TYPE_SELL)
{
if(currentSL – currentPrice > trailingStep)