Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 15
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Циклы нужно в обратном порядке считать, от 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", возможно она даёт два запроса, после первого запроса нет выхода с функции, и успевает посылать второй.
Если это так почему это происходит не всегда, что то происходит между тиками? Я в этом не очень силен.