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

 
Ihor Herasko:

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

Передается целочисленное а возвращается то вещественное...

 
STARIJ:

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

Суть функции как раз в том что бы найти если ордера с положительным профитом. Если да то возвращаем его тикет. Если нет то возвращаем -1

 
qroner:

Суть функции как раз в том что бы найти если ордера с положительным профитом. Если да то возвращаем его тикет. Если нет то возвращаем -1

if(OrderProfit()>0) return OrderTicket(); else return -1;
 
qroner:

Суть функции как раз в том что бы найти если ордера с положительным профитом. Если да то возвращаем его тикет. Если нет то возвращаем -1

Сначала уточните логику этой функции.

Ну допустим есть у Вас позиции с положительным профитом(именно позици , а не 1 позиция).  Далее идем по списку ордеров , находим первую позицию с положительным профитом и возвращаем её тикет , выходим из функции. И так будет при каждой интеграции функции т. к. позиции стоят в списке в строгом порядке. А что делать с остальными позициями с положительным профитом? Ведь их тикет вы никогда не получите пока есть позиция , тикет которой Вы нашли и профит у неё положительный.

p.s. В том виде, в котором сейчас написана функция тикеты ВСЕХ позиций с профитом Вы не получите.
 
Логика такая что открытых сделок может быть всего две на бай и на сел. И с плюсом может быть только одна... А плюс еще и должен быть OrderOpenPrice() <= Bid - dist или OrderOpenPrice() >=  Ask + dist соответственно...
 
qroner:

Суть функции как раз в том что бы найти если ордера с положительным профитом. Если да то возвращаем его тикет. Если нет то возвращаем -1

int FindOrdPlus(){
    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;
        if(OrderType()!=ORDER_TYPE_BUY && OrderType()!=ORDER_TYPE_SELL) continue;

        if(OrderProfit()+OrderSwap()+OrderCommission() > 0) return(OrderTicket());
    }
    return(-1);
}

Но опять будет возвращать первый встретившийся ордер с положительным профитом

 
qroner:
Логика такая что открытых сделок может быть всего две на бай и на сел. И с плюсом может быть только одна... А плюс еще и должен быть OrderOpenPrice() <= Bid - dist или OrderOpenPrice() >=  Ask + dist соответственно...

Ну тогда так:

//+------------------------------------------------------------------+
//        Возвращает тикет сделки c положительным профитом           |
//+------------------------------------------------------------------+
int FindOrdPlus(int Dist)
{
   double dist = NormalizeDouble(Dist * Point, Digits);
   int type = -1;
   for(int i = OrdersTotal()-1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         type = OrderType();
         if((type == OP_BUY || type == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(type == OP_BUY)
            {
               if(OrderOpenPrice() <= Bid - dist) return(OrderTicket());
            }
            if(type == OP_SELL)
            {
               if(OrderOpenPrice() >=  Ask + dist) return(OrderTicket());
            }
         }
      }
   }
   return(-1);
}
 
Konstantin Nikitin:

Но опять будет возвращать первый встретившийся ордер с положительным профитом

  Ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, "", Magic, 0, clrRed);

  int TicPlus = FindOrdPlus(80);    //Возвращает тикет сделки c положительным профитом
  if(TicPlus != -1)
      Comment("TicPlus = ", TicPlus);

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;
        if(OrderType()!=ORDER_TYPE_BUY && OrderType()!=ORDER_TYPE_SELL) 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);
}

Начал все на новом листе писать. Сразу открываю сделку на сел. Передаю 80 пунктов в "функцию". И в случае нормального срабатывания сценария вывожу на экран для наглядности. А он все равно как только запускаю тестер выводит тикет на экран... Что за х? Не пойму

 
Sergey Kolemanov:

Ну тогда так:

То же самое. Может Переустановить метатрейдер

 

Кому не трудно, скомпилируйте плз. Какой результат будет?

#property strict
extern int Magic = 111;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit(){
 
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+

void OnDeinit(const int reason){

}
void OnTick(){
    int ord[8];
    double ma=iMA(NULL,PERIOD_H1,12,1,MODE_SMA,PRICE_CLOSE,1);
    int Ticket = 0;
        
    Uchet_Orderov_Function(ord); 
    if(ord[6] == 0 && ord[7] == 0){
       if(Ask < ma){
           Ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 5, 0, 0, "", Magic, 0, clrRed);
       }
       else if(Bid > ma){
           Ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 5, 0, 0, "", Magic, 0, clrBlueViolet);
       }
    }
    if(ord[6] == 1){
       int TicPlus = FindOrdPlus(80);    //Возвращает тикет сделки c положительным профитом
        if(TicPlus != -1)
            Comment("TicPlus = ", TicPlus);
    }
}
//+------------------------------------------------------------------+
//        Возвращает тикет сделки c положительным профитом           |
//+------------------------------------------------------------------+
int FindOrdPlus(int Dist){
   double dist = NormalizeDouble(Dist * Point, Digits);
   int type = -1;
   for(int i = OrdersTotal()-1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
         type = OrderType();
         if((type == OP_BUY || type == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){
            if(type == OP_BUY){
               if(OrderOpenPrice() <= Bid + dist) return(OrderTicket());
            }
            if(type == OP_SELL){
               if(OrderOpenPrice() >=  Ask - dist) return(OrderTicket());
            }
         }
      }
   }
   return(-1);
}
//+-----------------------------------------------------------+
//|                     Учет ордеров                          |
//|mas[0] - покупки                                           |
//|mas[1] - продажи                                           |
//|mas[2] - buylimit                                          |
//|mas[3] - selllimit                                         |
//|mas[4] - buystop                                           |
//|mas[5] - sellstop                                          |
//|mas[6] - сделки                                            |
//|mas[7] - отложки                                           |
//+-----------------------------------------------------------+
void Uchet_Orderov_Function(int &_Mas[8]){
   ArrayInitialize(_Mas, 0);
   int Ticket=-1;
   for(int pos=OrdersTotal()-1; pos>=0; pos--){
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) &&  OrderSymbol()==Symbol()&&
         OrderMagicNumber()==Magic && OrderTicket()!=Ticket){
            Ticket=OrderTicket();
            switch(OrderType()){
               case 0:{_Mas[0]++;_Mas[6]++;break;}
               case 1:{_Mas[1]++;_Mas[6]++;break;}
               case 2:{_Mas[2]++;_Mas[7]++;break;}
               case 3:{_Mas[3]++;_Mas[7]++;break;}
               case 4:{_Mas[4]++;_Mas[7]++;break;}
               case 5:{_Mas[5]++;_Mas[7]++;break;}
            }
         }
   }
}
Причина обращения: