Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Миллионы трейдеров качают коды из библиотеки MQL5. Поделись своей программой!
Pazitiv
130
Pazitiv 2012.04.16 12:16 

Итак, есть ЗигЗаг. Вычисляю среднюю цену между его точками. 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 2012.04.16 12:45  
Нормализуйте цену. посмотрите функцию NormalizeDouble()
Pazitiv
130
Pazitiv 2012.04.16 12:52  
не. не помогло. даже без нормализации в коменте цена в правильном формате выдаётся. типа 1.3205
Mikhail Kozhemyako
1235
Mikhail Kozhemyako 2012.04.16 14:53  
PAZITIV:
не. не помогло. даже без нормализации в коменте цена в правильном формате выдаётся. типа 1.3205


А попробуйте

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

Pazitiv
130
Pazitiv 2012.04.16 15:07  
Sepulca:


А попробуйте

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



а смысл?

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

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

Mikhail Kozhemyako
1235
Mikhail Kozhemyako 2012.04.16 17:29  
PAZITIV:



а смысл?

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

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


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

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


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

Мож я неправ?

Mikhail Kozhemyako
1235
Mikhail Kozhemyako 2012.04.16 17:41  
Sepulca:

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

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

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


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

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

Мож я неправ?


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

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

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