Это наверное больше касается отложенных ордеров, а как быть с немедленным исполнением ордеров в советнике в автомат. режиме?Добавьте глобальную переменную (напр int glo.iLastOpenTime = 0), в которой будете хранить время выставления/открытия ордера. У текущего бара есть время открытия Time[0], оно не меняется пока бар не закроется. Перед выставлением каждого ордера cверяйте его с этой глобальной переменной if(Time[0] != glo.iLastOpenTime) если не совпадают - выставляйте новый ордер и запоминайте время glo.iLastOpenTime = Time[0]. Если совпадают - проходите мимо
Это наверное больше касается отложенных ордеров, а как быть с немедленным исполнением ордеров в советнике в автомат. режиме?
Еще один вариант-добавить следующую функцию в начало или конец кода:Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
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).Код: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); }
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
Я новичек в програмировании. Подскажите пожалуйста, может кто то сталкивался, при написании советника возникла проблема: как реализовать запрет повторного открывания позиции или установки отложенного ордера на одном баре. Заранее спасибо
Всё чудесно, в соответствии с лучшими традициями:оперативно..
Можно это делать так:- если вы почему-то хотите часто вкл/выкл терминал с советником, тада придёццо при каждом запуске (т.е. в блоке init{} советника) прочёсывать все ордера открытые и уже закрытые, выбирать последний по времени открытия и сравнивать его время со временем открытия текущего бара Time[0]. Если ордер открыт на этом баре glo.iLastOpenTime = Time[0]. А дальше - всё по старому плану