[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 155

 
todem:
в определение тренда?

в смене тренда на отрезке времени... См https://www.mql5.com/ru/forum/131277/page148 и https://www.mql5.com/ru/forum/131277/page149
 

Подскажите почему OrderSelect мне возвращает TRUE даже когда ордера с таким тикетом нет (он удален)?


   if(OrderSelect(tickethigh1, SELECT_BY_TICKET, MODE_TRADES)==false)
 
100yan:

в смене тренда на отрезке времени...


Подскажите пожалуйста, здесь работает функция установления Tp и Slossa

if (total > 0) AveragePrice = NormalizeDouble(AveragePrice / Count, Digits);
if (NewOrdersPlaced) {
for (cnt = OrdersTotal() - 1; cnt >= 0; cnt--) {
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
if (OrderType() == OP_BUY) {
PriceTarget = AveragePrice + TakeProfit * Point;
BuyTarget = PriceTarget;
Stopper = AveragePrice - Stoploss * Point;
flag = TRUE;
}
}
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
if (OrderType() == OP_SELL) {
PriceTarget = AveragePrice - TakeProfit * Point;
SellTarget = PriceTarget;
Stopper = AveragePrice + Stoploss * Point;
flag = TRUE;

 
todem:
у меня прокомпилировался нормально

Извини, Индикатор работает - такой он был изначально, а ошибка в тхт-файле - он не компилируется.

Файлы:
 

а из init нельзя проводить расчёты для индикаторного буффера?

хотел в init пересчитывать все бары кроме нулевого а в start нулевой - не считаются..

 
Pyro:

Подскажите почему OrderSelect мне возвращает TRUE даже когда ордера с таким тикетом нет (он удален)?

А вы хорошо справку по функции прочитали?

Давайте ещё раз почитаем:

---------------------------------------------------------------------------------------------------------------------------------------------------------------

bool OrderSelect( int index, int select, int pool=MODE_TRADES)
Функция выбирает ордер для дальнейшей работы с ним. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.
Параметры:
index - Позиция ордера или номер ордера в зависимости от второго параметра.
select - Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS - в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET - в параметре index передается номер тикета.
pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.


---------------------------------------------------------------------------------------------------------------------------------------------------------------

Вот это:

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала.

Вы же делаете что?

if(OrderSelect(tickethigh1, SELECT_BY_TICKET, MODE_TRADES)==false)

Красным я выделил параметр pool, который при выборе по тикету игнорируется, и выбирается ордер из любого списка (открытых, либо закрытых) позиций терминала. Потому-то он вам и возвращает истину. Ведь такой тикет существует и ордер выбран, но из списка закрытых ордеров...

Нужно так:

   if (OrderSelect(tickethigh1,SELECT_BY_TICKET))
   if (OrderOpenTime()==0) {
      // ... код при успешном выборе ордера по тикету в списке рыночных ордеров
   }

... или:

if (OrderSelect(tickethigh1,SELECT_BY_TICKET))
   if (OrderOpenTime()>0) {
      // ... код при успешном выборе ордера по тикету в списке закрытых ордеров
   }

... ну, или:

   if (OrderSelect(tickethigh1,SELECT_BY_TICKET)) {
      if (OrderOpenTime()>0) {
         // ... код при успешном выборе ордера по тикету в списке закрытых ордеров
      }
      if (OrderOpenTime()==0) {
         // ... код при успешном выборе ордера по тикету в списке рыночных ордеров
      }
   }

Думаю, понятно объяснил... :)

 

artmedia70


Спасибо за такой подробный исчерпывающий ответ. Действительно максимально понятно :) THX!!!

 
Pyro:

artmedia70


Спасибо за такой подробный исчерпывающий ответ. Действительно максимально понятно :) THX!!!

:) Спасибо. Не за что.

Хочу предостеречь о некоей "коварности" выбора открытых позиций по их тикету. Дело в том, что в конце торгового дня при переносе позиции на следующий день, ДЦ делает переоткрытие ордера. Т.е. текущая позиция закрывается и открывается уже другая позиция тем же объёмом, но с новым тикетом с учётом свопа. Поэтому ваш советник должен отслеживать переоткрытие ордеров с запоминанием их новых тикетов, иначе всё "поплывёт" - ордер со старым тикетом окажется в списке закрытых ордеров и вы не сможете по старому тикету выбрать существующую позицию, перенесённую на новый торговый день. Та же участь ожидает и частично закрытые позиции - им также присваивается новый тикет.

Посему, ведите свой строгий учёт всех ордеров советника и вовремя отслеживайте все такие "коварные" изменения.

 
artmedia70:


Хочу предостеречь о некоей "коварности" выбора открытых позиций по их тикету. Дело в том, что в конце торгового дня при переносе позиции на следующий день, ДЦ делает переоткрытие ордера.

это на некоторых ДЦ делается, но подавляющее большинство такой фигней не страдают.
 
sergeev:
это на некоторых ДЦ делается, но подавляющее большинство такой фигней не страдают.

Не является ли правилом "хорошего тона" учесть и такое поведение ДЦ? Ведь ... да, не суть важно... Просто стараюсь учитывать всё, ну... или то, о чём осведомлён.

Предостережён - значит вооружён, а? ;)