Ответить
08.04.2010, 18:08
Аватар для ass
ass ass вне форума Интересующийся
Регистрация: 14.01.2010 / Сообщений: 2
Поблагодарили 0 раз(а) / Репутация: -1

По умолчанию запрет повторного открывания позиции на одном баре.

Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
08.04.2010, 19:55
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,510 раз(а) / Репутация: 2536
Добавьте глобальную переменную (напр int glo.iLastOpenTime = 0), в которой будете хранить время выставления/открытия ордера. У текущего бара есть время открытия Time[0], оно не меняется пока бар не закроется. Перед выставлением каждого ордера cверяйте его с этой глобальной переменной if(Time[0] != glo.iLastOpenTime) если не совпадают - выставляйте новый ордер и запоминайте время glo.iLastOpenTime = Time[0]. Если совпадают - проходите мимо
ass 
08.04.2010, 20:17
Аватар для ass
ass ass вне форума Интересующийся
Регистрация: 14.01.2010 / Сообщений: 2
Поблагодарили 0 раз(а) / Репутация: -1
Добавьте глобальную переменную (напр int glo.iLastOpenTime = 0), в которой будете хранить время выставления/открытия ордера. У текущего бара есть время открытия Time[0], оно не меняется пока бар не закроется. Перед выставлением каждого ордера cверяйте его с этой глобальной переменной if(Time[0] != glo.iLastOpenTime) если не совпадают - выставляйте новый ордер и запоминайте время glo.iLastOpenTime = Time[0]. Если совпадают - проходите мимо
Это наверное больше касается отложенных ордеров, а как быть с немедленным исполнением ордеров в советнике в автомат. режиме?
09.04.2010, 05:00
Аватар для supervisor
supervisor supervisor вне форума Супер-модератор
Регистрация: 07.08.2008 / Сообщений: 903
Поблагодарили 192 раз(а) / Репутация: 318
по моему надо вначале определять таймфрейм
потом определять свечи как время начала и конца свечи, дата свечи
ну и сравнивать потом открытую позицию по параметрам с текущей свечей
ass 
09.04.2010, 07:02
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,510 раз(а) / Репутация: 2536
Это наверное больше касается отложенных ордеров, а как быть с немедленным исполнением ордеров в советнике в автомат. режиме?
Это без разницы, для любых. А почему сомнение? Могут быть более сложные варианты, напр:

- если советник пользует не тот ТФ на который он повешен вместо Time стоит пользовать iTime _http://docs.mql4.com/ru/series/iTime

- если у вас не советник а скрипт (нет памяти предыдущих запусков), то чтобы запомнить время можно пользовать GlobalVariableSet("glo.iLastOpenTime", glo.iLastOpenTime) _http://docs.mql4.com/ru/globals/GlobalVariableSet , вспомнить - glo.iLastOpenTime = GlobalVariableGet ("glo.iLastOpenTime") _http://docs.mql4.com/ru/globals/GlobalVariableGet

- если вы почему-то хотите часто вкл/выкл терминал с советником, тада придёццо при каждом запуске (т.е. в блоке init{} советника) прочёсывать все ордера открытые и уже закрытые, выбирать последний по времени открытия и сравнивать его время со временем открытия текущего бара Time[0]. Если ордер открыт на этом баре glo.iLastOpenTime = Time[0]. А дальше - всё по старому плану
ass 
13.04.2010, 20:05
Аватар для NecronFX
NecronFX NecronFX вне форума Интересующийся
Регистрация: 25.01.2010 / Сообщений: 3
Поблагодарили 4 раз(а) / Репутация: 5
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
Еще один вариант-добавить следующую функцию в начало или конец кода:
Код:
bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
В условие открытия ордера на покупку надо добавить && CheckExists(OP_BUY), в условие на продажу- && CheckExists(OP_SELL).
15.04.2010, 05:27
Аватар для ale002
ale002 ale002 вне форума ::: __,,,^._.^,,,__ :::
Регистрация: 28.02.2010 / Сообщений: 1,246
Поблагодарили 2,510 раз(а) / Репутация: 2536
NecronFX, это есть неудачный вариант - в самый тормозной из операторов (if) засовывать ещё и выполнение функции, содержащей ifы в циклах к тому-же по истории, которая может содержать сотни ордеров. И оно будет прокручиваться в этих if'ах по каждому тику при определении выставлять ордер или нет.. Но таки и это прокатит в несложном советнике, если он работает только по одной паре, только на текущем ТФ и если не забыть определить глобальную переменную с именем Magic. Прокатит даже несмотря на ацуцтвие здравого смысла Вот, скажем, вы надеваете кроссовки и бежите. Т.е. в начале работы программы определяете и запоминаете время последнего ордера и всякий раз его потом используете. А вычислять его по каждому тику - это типа надевать кроссовки заново перед каждым след шагом..
18.01.2015, 23:09
Аватар для DIW35902345
DIW35902345 DIW35902345 вне форума Местный житель
Регистрация: 12.10.2013 / Сообщений: 336
Поблагодарили 272 раз(а) / Репутация: 271
Еще один вариант-добавить следующую функцию в начало или конец кода:
Код:
bool CheckExists(int Type)                                  
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0]
        && OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
      Result = False;
    }

  return(Result);
  }
В условие открытия ордера на покупку надо добавить && CheckExists(OP_BUY), в условие на продажу- && CheckExists(OP_SELL).



вот этот код , имхмо .., более правдоподобный ...мне так каж

Последний раз редактировалось DIW35902345; 18.01.2015 в 23:19.
19.03.2015, 07:23
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 283
Поблагодарили 94 раз(а) / Репутация: 94
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
Попробуй событие отслеживать как в учебнике у Ковалёва С. Events.
Не всё актуально, но пользоваться можно, особенно в начале.

Последний раз редактировалось _SERG_; 19.03.2015 в 07:33.
19.03.2015, 07:33
Регистрация: 18.12.2011 / Адрес: Тюмень / Сообщений: 1,151
Поблагодарили 6,062 раз(а) / Репутация: 6061
  • Отправить сообщение для senchakv с помощью ICQ
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
Хернёй маешься.

Поставил ордер -> запомнил время бара либо текущего ТФ Time[0], либо заданного бара iTime(Symbol(),time_frame,0); -> сверяешь текущее время с тем временем, которое запомнил.
Далее
-> если совпадает, return(0);
-> если нет, делаешь там что хочешь (ордера ставь, например).
19.03.2015, 17:13
Регистрация: 16.10.2011 / Адрес: Новосибирск / Сообщений: 1,054
Поблагодарили 3,192 раз(а) / Репутация: 3197
оперативно..

Последний раз редактировалось tommy27; 19.03.2015 в 17:35.
olezok 
22.03.2015, 07:05
Аватар для _SERG_
_SERG_ _SERG_ на форуме Активный участник
Регистрация: 21.07.2009 / Сообщений: 283
Поблагодарили 94 раз(а) / Репутация: 94
оперативно..
Всё чудесно, в соответствии с лучшими традициями:
Обещанного три года ждут, а не дождавшись, через два года забывают. Итого- пять.
15.06.2016, 10:09
Аватар для audibmw
audibmw audibmw вне форума Активный участник
Регистрация: 05.10.2009 / Сообщений: 10
Поблагодарили 1 раз в 1 сообщении / Репутация: 1

- если вы почему-то хотите часто вкл/выкл терминал с советником, тада придёццо при каждом запуске (т.е. в блоке init{} советника) прочёсывать все ордера открытые и уже закрытые, выбирать последний по времени открытия и сравнивать его время со временем открытия текущего бара Time[0]. Если ордер открыт на этом баре glo.iLastOpenTime = Time[0]. А дальше - всё по старому плану
Можно это делать так:
//+----------------------------------------------------------------------+
//| Возвращает время открытия последней открытой позиций
//+----------------------------------------------------------------------+
datetime time22=0;
double r22=0;
// double openBUY=0;
// int type=0;
for(int iii3=OrdersTotal()-1; iii3>=0; iii3--)
{
if (OrderSelect(iii3, SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol())
{//2
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if (time22<OrderOpenTime())
{
time22=OrderOpenTime();
r22=OrderOpenTime();
}
}
}
}
}
if ((TimeCurrent() - r22) > Period()*60) r22=0;
//-------------------------------------------------
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доллар/йена. Курс валюты корректируется после повторного тестирования области трехмесячных минимумов... Алексей Новости, обзоры, рекомендации 0 21.05.2010 09:00


Текущее время: 04:39. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO