Добавьте проверку, что новое значение стопа выше чем текущее.
Извините, не понимаю как это исполнить и как это работать будет
Извините, не понимаю как это исполнить и как это работать будет
order_sl=OrderStopLoss();
Затем вычисляете новую цену, от текущей цены, не от стопа.
new_sl=NormalizeDouble(Bid-Point*TrailingStop,Digits);
и проверяете условие
if(new_sl>order_sl) Модифицируем.
Смысл в том чтобы не смещать стоп вниз, когда цена пошла в обратную сторону.
Вам нужно получить текущую цену стопа
Затем вычисляете новую цену, от текущей цены, не от стопа.
и проверяете условие
Смысл в том чтобы не смещать стоп вниз, когда цена пошла в обратную сторону.
Изменил свой код, вот что получилось (однако ничего не поменялось):
double order_sl;
double new_sl;
int start() {
if(OrdersTotal() == 0) {
OrderSend("EURUSD.oi", OP_BUY, 0.1, Ask, 0, Bid-100*Point, Bid+100000*Point, "", 001, 0, Red);
}
if(OrdersTotal() == 1) {
int TrailingStop=200;//--- модифицирует цену Stop Loss ордера на покупку
if(TrailingStop>0) {
OrderSelect(001,SELECT_BY_POS);
if(NormalizeDouble(Bid, Digits)>OrderOpenPrice()) {
if(NormalizeDouble(OrderStopLoss()+Point*TrailingStop,Digits) < NormalizeDouble(Bid, Digits)) {
RefreshRates();
order_sl= NormalizeDouble(OrderStopLoss(), Digits);
new_sl=NormalizeDouble(Bid-Point*TrailingStop,Digits);
Print("order_sl - ", order_sl, " ", "new_sl - ", new_sl);
if(new_sl>order_sl) {
bool res=OrderModify(001,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
}
}
}
}
}
}
Стоплосс также скачет и вверх и вниз на определенном расстоянии от цены. Я добавил Print, выводит: order_sl - 0 new_sl - 1.059 , т.е. OrderStopLoss не обновляется и всегда равен нулю, в этом проблема, как это можно исправить? Спасибо
Нужно выбрать позицию 0.
input int Magic = 100, TrailingStop=200; void start() { if(OrdersTotal() == 0) if( OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, NormalizeDouble(Bid-100*Point, Digits), NormalizeDouble(Bid+100000*Point, Digits), "", Magic, 0, Red) ) return; for(int cnt=0; cnt<OrdersTotal(); cnt++) { if( !OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ) continue; if( OrderMagicNumber() != Magic ) continue; if( OrderType() != OP_SELL && OrderType()!= OP_BUY ) continue; bool res = false; double order_sl = NormalizeDouble(OrderStopLoss(), Digits), new_sl = 0.0; RefreshRates(); switch(OrderType()) { case OP_SELL: new_sl = NormalizeDouble(Ask+Point*TrailingStop,Digits); if(order_sl<=new_sl && order_sl!=0) break; res = OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, Red); break; case OP_BUY: new_sl = NormalizeDouble(Bid-Point*TrailingStop,Digits); if(order_sl>=new_sl) break; res = OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, Blue); break; } if(!res) Print("Ошибка модификации ордера. Код ошибки=",GetLastError()); else Print("Цена Stop Loss ордера успешно модифицирована."); } }
Только я бы ещё уточнил что у позиции sell нужно проверять
if(order_sl<=new_sl && order_sl!=0) break;
Иначе при отсутствии стопа не будет работать.
Только я бы ещё уточнил что у позиции sell нужно проверять
Иначе при отсутствии стопа не будет работать.
Спасиб подправил, а то упустил. Так на коленке написал, пусть изучает )))
Здравствуйте! Нужно сделать, чтобы стоплосс двигался вслед за ценой только вверх на определенное количество пунктов, без снижения.
У меня стоплосс постоянно скачет на определенном расстоянии от текущей цены (без фиксации). Помогите решить проблему.
Автор. Вы через день ветки создаете на тему "Нужна помощь" Так научитесь код вставлять правильно в сообщение.
Нажимайте ALT+S и появится окно для вставки кода - куда его и надо вставить.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Нужно сделать, чтобы стоплосс двигался вслед за ценой только вверх на определенное количество пунктов, без снижения.
Вот мой код:
int start() {
if(OrdersTotal() == 0) {
OrderSend("EURUSD.oi", OP_BUY, 0.1, Ask, 0, Bid-100*Point, Bid+100000*Point, "", 001, 0, Red);
}
if(OrdersTotal() == 1) {
int TrailingStop=200;//--- модифицирует цену Stop Loss ордера на покупку
if(TrailingStop>0) {
OrderSelect(001,SELECT_BY_POS);
if(NormalizeDouble(Bid, Digits)>OrderOpenPrice()) {
if(NormalizeDouble(OrderStopLoss()+Point*TrailingStop,Digits) < NormalizeDouble(Bid, Digits)) {
bool res=OrderModify(001,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
}
}
}
}
}
У меня стоплосс постоянно скачет на определенном расстоянии от текущей цены (без фиксации). Помогите решить проблему.