Функции постоянно возвращают -1

 

Прошу помощи. Ни как не могу разобраться. Обе функции почему то при любом раскладе возвращают-1.

Помогите плз разобраться

Вот код:

/+------------------------------------------------------------------+

//        Возвращает тикет сделки c положительным профитом           |

//+------------------------------------------------------------------+

int FindOrdPlus(){

    for(int i = OrdersTotal(); i > 0; i--){

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&OrderType()>1)

            switch(OrderType()){

                                case 0:{

                                        if(OrderOpenPrice() <= Bid - NormalizeDouble(Otkat * Point, Digits))

                                                return(OrderTicket());                                  

                                }

                                case 1:{

                                        if(OrderOpenPrice() >=  Ask + NormalizeDouble(Otkat * Point, Digits))

                                                return(OrderTicket());

                                }

                        }

    }

    return(-1);

}

//+------------------------------------------------------------------+

//        Возвращает тикет сделки c отрицательным профитом           |

//+------------------------------------------------------------------+

int FindOrdMinus(){

    for(int i = OrdersTotal(); i > 0; i--){

        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic&&OrderType()>1)

                        switch(OrderType()){

                                case 0:{

                                        if(OrderOpenPrice() > Bid)

                                                return(OrderTicket());                                  

                                }

                                case 1:{

                                        if(OrderOpenPrice() < Ask)

                                                return(OrderTicket());

                                }

                        }

    }

    return(-1);

}
 
&&OrderMagicNumber()==Magic&&OrderType()>1)
 
Arkadii Zagorulko:

Проверка на то что сделки либо бай либо селл...

Константа

Значение

Описание

OP_BUY

0

Покупка

OP_SELL

1

Продажа

 
int FindOrdMinus()
{
     for(int i = OrdersTotal()-1; i >= 0; i--)
     {
          if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if(OrderSymbol()!=Symbol()) continue;
          if(OrderMagicNumber()!=Magic) continue;

          switch(OrderType())
          {
               case ORDER_TYPE_BUY:
                    if(OrderOpenPrice() > Bid) return(OrderTicket());
                    break;
               case ORDER_TYPE_SELL:
                    if(OrderOpenPrice() < Ask) return(OrderTicket());
                    break;
         }
     }
     return(-1);
}
 

Спасибо код работает.

Вот это я только понять не могу. for(int i = OrdersTotal()-1; i >= 0; i--)

ОрдерТотал возвращает кол-во ордеров. получается если ордеров 2, то i равна 1 и  выбрав ордер по тикету  мы второй ордер так и не выделим... 

          if(OrderSymbol()!=Symbol()) continue; и вот тут вот, получается если символ не наш мы все равно продолжаем....
          if(OrderMagicNumber()!=Magic) continue; и даже если не наш магик.

и еще... тут 
if(OrderOpenPrice() > Bid) return(OrderTicket());
                    break;
зачем после ретурн брейк???? он же и так выйдет из функции
 

qroner:

и вот тут вот, получается если символ не наш мы все равно продолжаем....

зачем после ретурн брейк???? он же и так выйдет из функции

А если у вас пошел допустим BUY, но не прошло условие, зачем проходить по коду дальше, проверим следующий ордер. Return срабатывает только при  полном соответствии условия.

Оператор continue

Вот это я только понять не могу. for(int i = OrdersTotal()-1; i >= 0; i--)

Смотрите что было у вас и обратите на разницу в переборе. Массивы идут с ноля и последний индекс меньше на 1 от размера массива.

Если написать вот так

for(int i = 0; i < OrdersTotal(); i++)

То тогда ни каких -1 и = не нужно

 
Konstantin Nikitin:

А если у вас пошел допустим BUY, но не прошло условие, зачем проходить по коду дальше, проверим следующий ордер. Return срабатывает только при  полном соответствии условия.

Оператор continue

Смотрите что было у вас и обратите на разницу в переборе. Массивы идут с ноля и последний индекс меньше на 1 от размера массива.

Если написать вот

То тогда ни каких -1 и = не нужно

Все понял, спасибо большое.

 

Блин опять какая то ерунда... Чуть изменил функцию:

//+------------------------------------------------------------------+
//        Возвращает тикет сделки c положительным профитом           |
//+------------------------------------------------------------------+
int FindOrdPlus(int Dist){
    double dist = Dist_Normalize(Dist);
    for(int i = OrdersTotal()-1; i >= 0; i--){
        if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
        if(OrderSymbol()!=Symbol()) continue;
        if(OrderMagicNumber()!=Magic) continue;

        switch(OrderType()){
            case ORDER_TYPE_BUY:
                if(OrderOpenPrice() <= Bid - Dist) return(OrderTicket());       
                break;
            case ORDER_TYPE_SELL:
                if(OrderOpenPrice() >=  Ask + Dist) return(OrderTicket());
                break;  
        }
    }
    return(-1);
}

Возвращает положительный тикет при любом раскладе... Что сейчас то не так?

 
qroner:

Блин опять какая то ерунда... Чуть изменил функцию:

Возвращает положительный тикет при любом раскладе... Что сейчас то не так?

После любого "case" можно иметь только один оператор.

Пример из документации (ошибочен) : ... стилизация НЕ ЗАДАЕТ логику !!!!

switch(x)
  {
   case 'A':
      Print("CASE A");
      break;
   case 'B':
   case 'C':
      Print("CASE B or C");
      break;
   default:
      Print("NOT A, B or C");
      break;
  }

имеет смыслил :

switch(x)
  {
   case 'A': Print("CASE A");
   break; // в любом случае здесь происходить выход
   //  ....... далее никогда не доходим
   //case 'B':
   //case 'C': Print("CASE B or C");
   //break;
   //default : Print("NOT A, B or C");
   //break;
  }

а правильнее написать :

switch(x)
  {
   case 'A':
   { Print("CASE A"); break; }
   case 'B':
   case 'C':
   { Print("CASE B or C"); break; }
   default:
   { Print("NOT A, B or C"); break; }
  }

Заметили разницу : ( один оператор ) = { много операторы }

 
qroner:

Блин опять какая то ерунда... Чуть изменил функцию:

Возвращает положительный тикет при любом раскладе... Что сейчас то не так?

Входной параметр Dist нужно привести к пунктам. К примеру, цена открытия ордера 1.21, а дистанция, к примеру, указана 10. В итоге любой ордер будет попадать в пределы цены от -8.79 до 11.21.

 
Ivan Ivanov:

После любого "case" можно иметь только один оператор.

Пример из документации (ошибочен) : ... стилизация НЕ ЗАДАЕТ логику !!!!

Ошибаетесь. Проверьте на тех примерах, которые сами привели.

Причина обращения: