запрет повторного открывания позиции на одном баре.

ass

Прохожий
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
 

ale002

::: __,,,^._.^,,,__ :::
Добавьте глобальную переменную (напр int glo.iLastOpenTime = 0), в которой будете хранить время выставления/открытия ордера. У текущего бара есть время открытия Time[0], оно не меняется пока бар не закроется. Перед выставлением каждого ордера cверяйте его с этой глобальной переменной if(Time[0] != glo.iLastOpenTime) если не совпадают - выставляйте новый ордер и запоминайте время glo.iLastOpenTime = Time[0]. Если совпадают - проходите мимо :)
 
  • Like
Реакции: ass

ass

Прохожий
Добавьте глобальную переменную (напр int glo.iLastOpenTime = 0), в которой будете хранить время выставления/открытия ордера. У текущего бара есть время открытия Time[0], оно не меняется пока бар не закроется. Перед выставлением каждого ордера cверяйте его с этой глобальной переменной if(Time[0] != glo.iLastOpenTime) если не совпадают - выставляйте новый ордер и запоминайте время glo.iLastOpenTime = Time[0]. Если совпадают - проходите мимо :)
Это наверное больше касается отложенных ордеров, а как быть с немедленным исполнением ордеров в советнике в автомат. режиме?
 

supervisor

Местный житель
по моему надо вначале определять таймфрейм
потом определять свечи как время начала и конца свечи, дата свечи
ну и сравнивать потом открытую позицию по параметрам с текущей свечей
 
  • Like
Реакции: ass

ale002

::: __,,,^._.^,,,__ :::
Это наверное больше касается отложенных ордеров, а как быть с немедленным исполнением ордеров в советнике в автомат. режиме?

Это без разницы, для любых. А почему сомнение? Могут быть более сложные варианты, напр:

- если советник пользует не тот ТФ на который он повешен вместо 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]. А дальше - всё по старому плану
 
  • Like
Реакции: ass

NecronFX

Прохожий
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
Еще один вариант-добавить следующую функцию в начало или конец кода:
Код:
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).
 

ale002

::: __,,,^._.^,,,__ :::
NecronFX, это есть неудачный вариант - в самый тормозной из операторов (if) засовывать ещё и выполнение функции, содержащей ifы в циклах к тому-же по истории, которая может содержать сотни ордеров. И оно будет прокручиваться в этих if'ах по каждому тику при определении выставлять ордер или нет.. Но таки и это прокатит в несложном советнике, если он работает только по одной паре, только на текущем ТФ и если не забыть определить глобальную переменную с именем Magic. Прокатит даже несмотря на ацуцтвие здравого смысла :) Вот, скажем, вы надеваете кроссовки и бежите. Т.е. в начале работы программы определяете и запоминаете время последнего ордера и всякий раз его потом используете. А вычислять его по каждому тику - это типа надевать кроссовки заново перед каждым след шагом..
 

DIW35902345

Местный житель
Еще один вариант-добавить следующую функцию в начало или конец кода:
Код:
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).




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

_SERG_

Активный участник
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо

Попробуй событие отслеживать как в учебнике у Ковалёва С. Events.
Не всё актуально, но пользоваться можно, особенно в начале.
 
Последнее редактирование:

senchakv

VIP-участник
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо

Хернёй маешься.

Поставил ордер -> запомнил время бара либо текущего ТФ Time[0], либо заданного бара iTime(Symbol(),time_frame,0); -> сверяешь текущее время с тем временем, которое запомнил.
Далее
-> если совпадает, return(0);
-> если нет, делаешь там что хочешь (ордера ставь, например).
 

tommy27

Гуру форума
оперативно..
:)
 

Вложения

  • оперативность.jpg
    оперативность.jpg
    617 КБ · Просмотры: 96
Последнее редактирование:

audibmw

Новичок форума
- если вы почему-то хотите часто вкл/выкл терминал с советником, тада придёццо при каждом запуске (т.е. в блоке 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;
//-------------------------------------------------
 
Верх