Добрый день,
не могу понять в чем ошибка
для Sell, если ордер в убытке и расстояние от цены до ордера больше мин. допустимого расстояния, модифицируем TP на расстояние bu
если в плюсе, модифицируем SL на расстояние bu:
int STP=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (Ask-OrderOpenPrice()>STP*Point) OrderModify(OrderTicket(),OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(OrderOpenPrice()-bu*Point,Digits),3,Violet);
else if (Ask-OrderOpenPrice()<STP*Point) OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice()-bu*Point,Digits), OrderStopLoss(),OrderTakeProfit(),3,Violet);
Посмотри внимательно на это выражение
OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice()-bu*Point,Digits), OrderStopLoss(),OrderTakeProfit(),3,Violet);
Ничего не напутал. Цену открытия менять нельзя.
Да и логику было бы неплохо исправить. Считать новые стопы и тейки не от цены открытия, а от текущей цены.
Посмотри внимательно на это выражение
OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice()-bu*Point,Digits), OrderStopLoss(),OrderTakeProfit(),3,Violet);
Ничего не напутал. Цену открытия менять нельзя.
Да и логику было бы неплохо исправить. Считать новые стопы и тейки не от цены открытия, а от текущей цены.
Там я исправил цену открытия, про логику не понял.
Я хочу в безубыток закрыть ордер.
Ask-OrderOpenPrice()>STP*Point это же тоже самое Ask()>OrderOpenPrice+ STP*Point или я путаю ?
Нет не путаешь.
Рассмотрим
первый случай Ask>OrderOpenPrice() - Ask-OrderOpenPrice()>STP*Point
второй случай Ask<OrderOpenPrice() - OrderOpenPrice()-Ask>STP*Point
В обоих случаях сравниваем положительные числа. Проблем нет
У тебя
(Ask-OrderOpenPrice()>STP*Point) все нормально (случай когда Ask>OrderOpenPrice()
(Ask-OrderOpenPrice()<STP*Point) отрицательное число меньше положительного (случай когда Ask<OrderOpenPrice())
double STP=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point; // стопуровень double tp, sl; int err; if (Ask-OrderOpenPrice()>STP) // если цена отошла в убыток на размер стопуровня { tp=NormalizeDouble(MathMin(OrderOpenPrice()-bu*Point, Ask-STP), Digits); // вычисляем требуемый профит с учётом стопуровня if (tp>OrderTakeProfit()) // если профит ещё ниже требуемого if (!OrderModify(OrderTicket(),OrderOpenPrice(), OrderStopLoss(), tp, 3)) // модифицируем { err=GetLastError(); if (err>1) Print(ErrorDescription(err)); } // в случае ошибки выводим в журнал } else if (OrderOpenPrice()-Ask>STP) // если пошли в профит на размер стопуровня { sl=NormalizeDouble(MathMax(OrderOpenPrice()-bu*Point, Ask+STP) ,Digits); // находим требуемый стоплос if (sl<OrderStopLoss()) // если стоплос ещё выше требуемого if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(),3)) // модифицируем { err=GetLastError(); if (err>1) Print(ErrorDescription(err)); } // в случае ошибки выводим в журнал }
подключите
#include <stderror.mqh> #include <stdlib.mqh>
в код ещё return (0) надо вставить ?
а то зациклинивается вроде. Проверьте, как для бай сделал (по аналогии), правильно или нет ?
if (OrderOpenPrice()-Bid>STP) // если цена отошла в убыток на размер стопуровня
{
tpb=NormalizeDouble(MathMax(OrderOpenPrice()+bu*Point*mn, Bid+STP), Digits); // вычисляем требуемый профит с учётом стопуровня
if (tpb<OrderTakeProfit()) // если профит ещё выше требуемого
if (!OrderModify(OrderTicket(),OrderOpenPrice(), OrderStopLoss(), tpb, 3)) // модифицируем
{ err=GetLastError(); if (err>1) Print(ErrorDescription(err)); } // в случае ошибки выводим в журнал
}
else if (Bid-OrderOpenPrice()>STP) // если пошли в профит на размер стопуровня
{
slb=NormalizeDouble(MathMin(OrderOpenPrice()+bu*Point*mn, Bid-STP),Digits); // находим требуемый стоплос
if (slb>OrderStopLoss()) // если стоплос ещё ниже требуемого
if (!OrderModify(OrderTicket(), OrderOpenPrice(), slb, OrderTakeProfit(),3)) // модифицируем
{ err=GetLastError(); if (err>1) Print(ErrorDescription(err)); } // в случае ошибки выводим в журнал
}return(0);}
double tp, sl; if (OrderOpenPrice()-Bid>STP) // если цена отошла в убыток на размер стопуровня { tp=NormalizeDouble(MathMax(OrderOpenPrice()+bu*Point*mn, Bid+STP), Digits); // вычисляем требуемый профит с учётом стопуровня if (tp<OrderTakeProfit()) // если профит ещё выше требуемого if (!OrderModify(OrderTicket(),OrderOpenPrice(), OrderStopLoss(), tp, 3)) // модифицируем { err=GetLastError(); if (err>1) Print(ErrorDescription(err)); } // в случае ошибки выводим в журнал } else if (Bid-OrderOpenPrice()>STP) // если пошли в профит на размер стопуровня { sl=NormalizeDouble(MathMin(OrderOpenPrice()+bu*Point*mn, Bid-STP),Digits); // находим требуемый стоплос if (sl>OrderStopLoss()) // если стоплос ещё ниже требуемого if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(),3)) // модифицируем { err=GetLastError(); if (err>1) Print(ErrorDescription(err)); } // в случае ошибки выводим в журнал }
Код сделали правильно. То что зацикливается - этого я не понял. В коде ведь нет никакого цикла. Смотрите на внешнее окружение.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день,
не могу понять в чем ошибка
для Sell, если ордер в убытке и расстояние от цены до ордера больше мин. допустимого расстояния, модифицируем TP на расстояние bu
если в плюсе, модифицируем SL на расстояние bu:
int STP=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (Ask-OrderOpenPrice()>STP*Point) OrderModify(OrderTicket(),OrderOpenPrice(), OrderStopLoss(),NormalizeDouble(OrderOpenPrice()-bu*Point,Digits),3,Violet);
else if (Ask-OrderOpenPrice()<STP*Point) OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-bu*Point,Digits),OrderTakeProfit(),3,Violet);