Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Pazitiv
218
Pazitiv  

Итак, есть ЗигЗаг. Вычисляю среднюю цену между его точками. 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() );  
  }  

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

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


А попробуйте

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

Pazitiv
218
Pazitiv  
Sepulca:


А попробуйте

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



а смысл?

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

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

Mikhail Kozhemyako
1284
Mikhail Kozhemyako  
PAZITIV:



а смысл?

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

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


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

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


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

Мож я неправ?

Mikhail Kozhemyako
1284
Mikhail Kozhemyako  
Sepulca:

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

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

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


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

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

Мож я неправ?


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

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

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