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

 
int FindOrdPlus(int Dist){
    double dist = NormalizeDouble(Dist*Point, Digits);
    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);
}
 
Ivan Ivanov:

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

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

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

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

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

Хорошая ссылка на "case", но читаем внимательно

Сами попробуйте и все увидите, да можно заключать

switch(OrderType())
{
    case ORDER_TYPE_BUY:
        {
            /* что-то делаем */
        }
        break;
    case ORDER_TYPE_SELL:
        {
            /* что-то делаем */
        }
        break;
}

а можно и так

switch(OrderType())
{
    case ORDER_TYPE_BUY:
        /* что-то делаем */
        /* еще что-то делаем */
        /* и т.д, и т.п */
        break;
    case ORDER_TYPE_SELL:
        /* что-то делаем */
        /* еще что-то делаем */
        /* и т.д, и т.п */
        break;
}
 

Я согласен, я ошибся, но меня подвела документация.

Тогда здесь , в описание break :

"Оператор break прекращает выполнение ближайшего вложенного внешнего оператора switch, while, do-while или for."

вместо switch должно быть case.

 
Ihor Herasko:

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

Да, вот тут привожу

double dist = Dist_Normalize(Dist);
 
Konstantin Nikitin:

Нет не помогло.

Моя функция double dist = Dist_Normalize(Dist)

делает почти то же самое

//+------------------------------------------------------------------+
//                       Нормализация дистанции                      |
//+------------------------------------------------------------------+
double Dist_Normalize(int _Distancia){
   int Dig=int(MarketInfo(Symbol(),MODE_DIGITS));
   double Pip=MarketInfo(Symbol(), MODE_POINT);
   if(Dig==3 || Dig == 5) return(NormalizeDouble(_Distancia*10*Pip,Dig));
   else return(NormalizeDouble(_Distancia*Pip,Dig));   
}
 
Функция фозвращает тикет даже если ордер 1 и он в минусе. И даже тикет отложенного ордера какого то хрена...
 
qroner:
Функция фозвращает тикет даже если ордер 1 и он в минусе. 

Покажите код , который сейчас используете - здесь Вам выложили много примеров, не совсем ясно каким из них Вы пользуетесь...

И даже тикет отложенного ордера какого то хрена...

Ну что ищете , то и возвращает.

 
qroner:   Функция фозвращает тикет даже если ордер 1 и он в минусе. И даже тикет отложенного ордера какого то хрена...

тикет - это номер, под которым ордер числится на сервере брокера. Отложенный или активный, в плюс вышел или в минус ушел - номер остается

 
qroner:

Да, вот тут привожу

В том коде, который Вы выложили, этого нет. В функцию передается целочисленное значение. А оно для работы с ценой не подходит. Если Вы это делаете еще до вызова функции, то все равно ничего не изменится, т. к. аргумент функции - целое число. Нужно либо передать вещественное значение, либо приводить к цене непосредственно в функции.

 

Что здесь не так?

Ticket = FindOrdPlus(Tral+Step);
if(Ticket)  //Проверяет можно ли открыть безубыток. 
   Trailing_Stop(Ticket);//Если да то переходит в трейлинг стоп.}

Далее функция FindOrdPlus

//+------------------------------------------------------------------+
//        Возвращает тикет сделки c положительным профитом           |
//+------------------------------------------------------------------+
int FindOrdPlus(int Dist){
    double dist = NormalizeDouble(Dist*Point, Digits);
    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);
}
И функция нормализующая отступ
//+------------------------------------------------------------------+
//                       Нормализация дистанции                      |
//+------------------------------------------------------------------+
double Dist_Normalize(int _Distancia){
   int Dig=int(MarketInfo(Symbol(),MODE_DIGITS));
   double Pip=MarketInfo(Symbol(), MODE_POINT);
   if(Dig==3 || Dig == 5) return(NormalizeDouble(_Distancia*10*Pip,Dig));
   else return(NormalizeDouble(_Distancia*Pip,Dig));   
}

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