Неправильная цена отложки

 

Итак, есть ЗигЗаг. Вычисляю среднюю цену между его точками. Price = (ZZCur-ZZPrev)/2

Если ZZCur>ZZPrev то выставляем СеллСтоп по цене Price, если ZZCur<ZZPrev -- Байстоп. Но Ордера никак не хотят выствляться... подключил библиотеку stdlib для обработки ошибок. Ошибка постоянно одна и та же -- "Неправильная цена". В чём может быть причина ?

// первая точка
while(iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i)==0) i++;
 ZZCur=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
 
 
// вторая точка
j=i;
while( (iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,j) == 0) || 
       (iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,j) == ZZCur)) j++;
ZZPrev=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,j);



if (ZZCur>ZZPrev) Opn_SS=true;
if (ZZCur<ZZPrev) Opn_BS=true;


// расчитываем цену отложеных ордеров БайСтоп и СеллСтоп

if (ZZCur>ZZPrev || ZZCur< ZZPrev)
 { 
  Price=(ZZCur+ZZPrev)/2; // цена СеллСтоп\БайСтоп
  
  if (Price<=0)
  Alert("Сбой в работе эксперта. Неправильные цены!!!"); 
   }

....

// по цене Price -- BUYSTOP
if (Opn_BS==true && ZZCur<Price)
 { 
 RefreshRates();
 double BSL,BTP;  
  BSL=ZZCur + Step - New_Stop(StopLoss);
  BTP=ZZCur + Step + New_Stop(TakeProfit);
   
   TicketBuy=OrderSend(
   Symbol(), //символ
   OP_BUYSTOP, // тип ордера
   FixLot, // лот
   Price, //цена, расчитывается выше
   Slippage,
   BSL, //стоплосс
   BTP, // тейк профит
   "MiddleZZAdv",
   Magic,
   0,
   Green);
   
   if (TicketBuy<0)
   Alert("Не удалось установить BUYSTOP по цене ",Price,
   "\nсимвол ", Symbol(), ", ошибка № ", ErrorDescription(GetLastError()) );
   
   if (TicketBuy>0)
   Alert("Установлен BUYSTOP по цене ", Price,", ", Symbol() );  
  }
 
// по цене Price -- SELLSTOP  
if (Opn_SS && ZZCur>Price)
 { 
 double SSL,STP;  
  SSL=ZZCur - Step + New_Stop(StopLoss);
  STP=ZZCur - Step - New_Stop(TakeProfit);
   
   TicketSell=OrderSend(
   Symbol(), //символ
   OP_SELLSTOP, // тип ордера
   FixLot, // лот
   Price, // цена, расчитывается выше
   Slippage,
   SSL, //стоплосс
   STP, // тейк профит
   "MiddleZZAdv",
   Magic,
   0,
   OrangeRed);
   
   if (TicketSell<0)
   Alert("Не удалось установить SELLSTOP по цене ",Price,
   "\nсимвол ", Symbol(), ", ошибка №", ErrorDescription(GetLastError()) );
   
   if (TicketSell>0)
   Alert("Установлен SELLSTOP по цене ", Price,", ", Symbol() );  
  }  

выводил цену в коммент -- формат цены правильный.

Файлы:
 
Нормализуйте цену. посмотрите функцию NormalizeDouble()
 
не. не помогло. даже без нормализации в коменте цена в правильном формате выдаётся. типа 1.3205
 
PAZITIV:
не. не помогло. даже без нормализации в коменте цена в правильном формате выдаётся. типа 1.3205


А попробуйте

Alert("Не удалось установить SELLSTOP по цене ",DoubleToStr(Price,8), ..........

 
Sepulca:


А попробуйте

Alert("Не удалось установить SELLSTOP по цене ",DoubleToStr(Price,8), ..........



а смысл?

if (ZZCur>ZZPrev || ZZCur< ZZPrev)
{
Price=(ZZCur+ZZPrev)/2;

выдаёт, что Price=1.3033, а через DoubleToStr -- 1.30330000

 
PAZITIV:



а смысл?

if (ZZCur>ZZPrev || ZZCur< ZZPrev)
{
Price=(ZZCur+ZZPrev)/2;

выдаёт, что Price=1.3033, а через DoubleToStr -- 1.30330000


Да с этим вроде всё в порядке... Пока могу предположить что стоплосс с тейкпрофитом ненормализованы
 
PAZITIV:

Итак, есть ЗигЗаг. Вычисляю среднюю цену между его точками. Price = (ZZCur-ZZPrev)/2


Ваащета, средняя цена будет Price = (ZZCur+ ZZPrev)/2.

Мож я неправ?

 
Sepulca:

Да с этим вроде всё в порядке... Пока могу предположить что стоплосс с тейкпрофитом ненормализованы

И еще, к сожалению сейчас нет времени подробно разбираться, но насколько я помню, у ZigZaga если нет перелома на баре, значение при этом не НОЛЬ а EMPTY_VALUE. Посмотрите в документации https://docs.mql4.com/ru/constants/special
 
Sepulca:

Да с этим вроде всё в порядке... Пока могу предположить что стоплосс с тейкпрофитом ненормализованы


так вроде ж в цене ошибку выдаёт... пробовал нормализовать -- без толку
hhohholl:

Ваащета, средняя цена будет Price = (ZZCur+ ZZPrev)/2.

Мож я неправ?


как ни странно, но у меня "+" . по ходу скопировалось криво :(
Sepulca:

И еще, к сожалению сейчас нет времени подробно разбираться, но насколько я помню, у ZigZaga если нет перелома на баре, значение при этом не НОЛЬ а EMPTY_VALUE. Посмотрите в документации https://docs.mql4.com/ru/constants/special

спасибо. почитаю. так если и разница между точками счмтается и сама цена считается и это всё выводится в комент в нормальном формате, то значит не EMPTY_VALUE. и я же не рыночный пытаюсь открыть в точке перелома, а отложку по средней цене между двумя точками...
 
Возможно ошибка возникает из-за того, значение ZZCur появляется тогда, когда текущая цена уже выше расчётной цена для Байстоп или ниже расчётной цены для Селлстоп. Чтобы точно узнать выводите принтом при попытке установки ордера значения Ask, Bid и цену открытия ордера.
 
если расстояние от текущей цены до Вашей расчитанной будет менее чем MarketInfo(symb, MODE_STOPLEVEL) пунктов, то выставить отложку в этом месте не удастся (при этом в лог терминала будет записана ошибка:
ERR_INVALID_STOPS 130 Invalid stops.
Причина обращения: