В чем ошибка в коде ?

 

Добрый день,

не могу понять в чем ошибка

для 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);
 
Stells писал(а) >>

Добрый день,

не могу понять в чем ошибка

для 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);

Ничего не напутал. Цену открытия менять нельзя.

Да и логику было бы неплохо исправить. Считать новые стопы и тейки не от цены открытия, а от текущей цены.

 
Vinin >>:

Посмотри внимательно на это выражение

OrderModify(OrderTicket(),NormalizeDouble(OrderOpenPrice()-bu*Point,Digits), OrderStopLoss(),OrderTakeProfit(),3,Violet);

Ничего не напутал. Цену открытия менять нельзя.

Да и логику было бы неплохо исправить. Считать новые стопы и тейки не от цены открытия, а от текущей цены.

Там я исправил цену открытия, про логику не понял.

Я хочу в безубыток закрыть ордер.

 
Stells писал(а) >>

Там я исправил цену открытия, про логику не понял.

Я хочу в безубыток закрыть ордер.

Есть два случая. Когда Ask больше цены открытия, и когда меньше. Ты это не учитываешь.

 
Vinin >>:

Есть два случая. Когда Ask больше цены открытия, и когда меньше. Ты это не учитываешь.

Ask-OrderOpenPrice()>STP*Point это же тоже самое Ask()>OrderOpenPrice+ STP*Point или я путаю ?

 
Stells писал(а) >>

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)); } // в случае ошибки выводим в журнал
}
 
sergeev >>:

что то у меня обработка ошибки не работает, при компеляции ошибку выдает.

 

подключите 

#include <stderror.mqh>
#include <stdlib.mqh>
 
sergeev >>:

в код ещё 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)); } // в случае ошибки выводим в журнал
 }

Код сделали правильно. То что зацикливается - этого я не понял. В коде ведь нет никакого цикла. Смотрите на внешнее окружение.

Причина обращения: