Neron_76: Здравствуйте! Поставил своего робота на демо счет, второй месяц работает. Сегодня открываю терминал, выставлены два ордера по одному сигналу, хотя до этого выставлялся один ордер. Ограничение на количество ордеров есть. В чем может быть причина?
Судя по коду, у Вас вторым по счету выставляется не рыночный ордер, а отложенный.
Ограничение по количеству открытых ордеров действует только на рыночные ордера.
//=============================================================================================== //------------------------------- Возвращает количество позиций --------------------------------+ //=============================================================================================== int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int kp=0; if(sy=="") sy=Symbol(); for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if(mn<0 || OrderMagicNumber()==mn) kp++; }}}} return(kp); } //=============================================================================================== //------------------------------- Возвращает количество ордеров --------------------------------+ //=============================================================================================== int NumberOfOrders(string sy="", int op=-1, int mn=-1) { int kp=0; if(sy=="") sy=Symbol(); for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) { if(OrderType()>1 && OrderType()<6) { if(mn<0 || OrderMagicNumber()==mn) kp++; }}}} return(kp); }
Функции заменил, на тесте идет нормально. Посмотрим как будет в торговле на демо. Но почему то, мне кажется, в моем случае и те, и эти функции выполняют одну и ту же задачу, т.е. отвечают на вопрос есть ли ордера и позиции.
Neron_76: Функции заменил, на тесте идет нормально. Посмотрим как будет в торговле на демо. Но почему то, мне кажется, в моем случае и те, и эти функции выполняют одну и ту же задачу, т.е. отвечают на вопрос есть ли ордера и позиции.
Если повториться двойная установка ордера, тогда нужно пересматривать функцию "SetOrder", возможно она даёт два запроса, после первого запроса нет выхода с функции, и успевает посылать второй.
Vitaly Muzichenko: Если повториться двойная установка ордера, тогда нужно пересматривать функцию "SetOrder", возможно она даёт два запроса, после первого запроса нет выхода с функции, и успевает посылать второй.
Если это так почему это происходит не всегда, что то происходит между тиками? Я в этом не очень силен.
Neron_76: Если это так почему это происходит не всегда, что то происходит между тиками? Я в этом не очень силен.
Между тиками одного символа могут происходить тики другого символа. Если советник мультивалютный, то он видит тики с другого символа. Ещё между тиками могут происходить события таймера - OnTimer() и события OnChartEvent() - чуть не написал "события событий"... была бы подстава подстав...
Циклы нужно в обратном порядке считать, от OrdersTotal()-1 до 0.
Циклы нужно в обратном порядке считать, от OrdersTotal()-1 до 0.
Здравствуйте! Поставил своего робота на демо счет, второй месяц работает. Сегодня открываю терминал, выставлены два ордера по одному сигналу, хотя до этого выставлялся один ордер. Ограничение на количество ордеров есть. В чем может быть причина?
Судя по коду, у Вас вторым по счету выставляется не рыночный ордер, а отложенный.
Ограничение по количеству открытых ордеров действует только на рыночные ордера.
Поэтому ошибки и соответственно проблемы нет.
Судя по коду, у Вас вторым по счету выставляется не рыночный ордер, а отложенный.
Ограничение по количеству открытых ордеров действует только на рыночные ордера.
Поэтому ошибки и соответственно проблемы нет.
Ограничение действует на открытые и отложенные ордера. За полтора месяца у меня это второй случай, во всех остальных выставляется как надо.
Попробуйте так:
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Попробуйте так:
SetOrder(NULL,OP_BUYSTOP,Lts,sar,sar-SL*Point(),sar+TP*Point(),Magik_number);
return(0);
}
if(NumberOfPositions(Symb,-1,Magik_number)==0 && NumberOfOrders(Symb,-1,Magik_number)==0 && Delta_Sell>High[1] && sar<Close[1]) {
SetOrder(NULL,OP_SELLSTOP,Lts,sar,sar+SL*Point(),sar-TP*Point(),Magik_number);
return(0);
}
//===============================================================================================
//------------------------------- Возвращает количество позиций --------------------------------+
//===============================================================================================
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
//===============================================================================================
//------------------------------- Возвращает количество ордеров --------------------------------+
//===============================================================================================
int NumberOfOrders(string sy="", int op=-1, int mn=-1) {
int kp=0;
if(sy=="") sy=Symbol();
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if(OrderType()>1 && OrderType()<6) {
if(mn<0 || OrderMagicNumber()==mn) kp++;
}}}}
return(kp);
}
Функции заменил, на тесте идет нормально. Посмотрим как будет в торговле на демо. Но почему то, мне кажется, в моем случае и те, и эти функции выполняют одну и ту же задачу, т.е. отвечают на вопрос есть ли ордера и позиции.
Если повториться двойная установка ордера, тогда нужно пересматривать функцию "SetOrder", возможно она даёт два запроса, после первого запроса нет выхода с функции, и успевает посылать второй.
Если это так почему это происходит не всегда, что то происходит между тиками? Я в этом не очень силен.