romanzif
Местный
Команда форума
Администратор
- Монет
- 126,654
Данную функцию имеет смысл использовать если вы разрабатываете усредняющий советник (сеточник)
В функцию нужно передать у какого типа ордеров пересчитывать и изменять Тейк Профит.
Соотвественно после открытия ордера на продажу вызываем функцию TrallTP(OP_SELL);
А после открытия ордера на покупку вызываем функцию TrallTP(OP_BUY);
В функцию нужно передать у какого типа ордеров пересчитывать и изменять Тейк Профит.
Соотвественно после открытия ордера на продажу вызываем функцию TrallTP(OP_SELL);
А после открытия ордера на покупку вызываем функцию TrallTP(OP_BUY);
Код:
//+------------------------------------------------------------------+
void TrallTP(int type)
{
double price = 0, lots = 0, avgprice = 0;
for (int i=OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i,SELECT_BY_POS))
{
if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol() && OrderType()==type)
{
price +=OrderOpenPrice() * OrderLots();
lots +=OrderLots();
}
}
}
if (price == 0) return; // если нет ордеров, то выходим из функции
avgprice = NormalizeDouble(price / lots, Digits); // высчитываем среднюю цену открытых ордеров
if (type == OP_BUY)
{
TP = NormalizeDouble(avgprice + Takeprofit * Point, Digits); // задаем ТП если ордера были на покупку
}
if (type == OP_SELL)
{
TP = NormalizeDouble(avgprice - Takeprofit * Point, Digits); // задаем ТП для ордеров на продажу
}
for (int i=OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i,SELECT_BY_POS))
{
if (OrderMagicNumber() == Magic && OrderType()==type && OrderSymbol() == Symbol())
{
if (TP == OrderTakeProfit()) continue; // не меняем ТП если он такой же, иначе будет ошибка.
if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP, OrderExpiration(), clrAliceBlue)) printf("Error: ", GetLastError());
}
}
}
}
//+------------------------------------------------------------------+