функция перебора ордеров

 
у меня вот вопрос : использую вот такую стандартную функцию перебора ордеров :
for (i=0; i<OrdersTotal(); i++)
       if (OrderSelect(i , SELECT_BY_POS, MODE_HISTORY)) {
            if (OrderComment()=="+Order_2")
         int   Profit2=OrderProfit();
         Print ("Profit +Order_2 = ",Profit2);
   }  
чтобы найти профит ордера "+Order_2", но выдает вот такое :

хотя в истории он есть :

почему функция его ненаходит?!
 
Мне кажется, скобочки криво стоят.
    for (i=0; i<OrdersTotal(); i++){
       if (OrderSelect(i , SELECT_BY_POS, MODE_HISTORY)) {
            if (OrderComment()=="+Order_2"){
                int   Profit2=OrderProfit();
                Print ("Profit +Order_2 = ",Profit2);
            }
       }
    }  
 
granit77 >>:
Мне кажется, скобочки криво стоят.


нет, также ненаходит ордер((......чтото вообще непонятно в чем причина...
 

Замени
if (OrderComment()=="+Order_2")
на
if (StringFind(OrderComment(),"+Order_2")!=-1)

 
А был ли мальчик (ордер)? Ставьте подряд принты на все: OrdersTotal, OrderComment на каждом проходе.
 
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
  На тестере после изменения все ок.
   //Print("OrderComment()", OrderComment());
   for (i=0; i<OrdersTotal(); i++){
       if (OrderSelect(i , SELECT_BY_POS, MODE_HISTORY)) {
            if (OrderComment()=="+Order_2[tp]");
                int   Profit2=OrderProfit();
                Print ("Profit +Order_2 = ",Profit2);
            }
       }
       //Print("error", GetLastError());
    } 
С комментариями сложно, их может менять торговый сервер.
Про это написано в справочнике:

comment  -  Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером

Куда проще и надежнее запомнить номер тикета, и искать по нему.

 
ToLik_SRGV >>:
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
С комментариями сложно, их может менять торговый сервер, про это написано и в справочнике:

Все в жизни просто, надо только приспособиться. :))

//if (OrderComment()=="+Order_2[tp]")           //старая строка

if(StringFind(OrderComment(),"+Order_2",0)>-1)  //новая строка 
//проверяет наличие в OrderComment() искомой подстроки "+Order_2"  
 
ToLik_SRGV >>:
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
  На тестере после изменения все ок.
С комментариями сложно, их может менять торговый сервер.
Про это написано в справочнике:

comment  -  Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером

Куда проще и надежнее запомнить номер тикета, и искать по нему.


Большое савсибо)! .......а по тикету, можете детально обьснить и показать ...что к чему)?
 
Тикет (он же номер ордера) возвращает функция OrderSend(), а ей соответственно торговый сервер, в виде числа типа int, или -1 в случае неудачи.
Его можно сохранить в static переменную (static для того чтобы значение переменной сохранилось при следующем вызове функции start())
if(/*условие откр. ордера*/){
   static int ticket = OrderSend(Symbol(), OP_BUY, Lot,....); //сохранение номера ордера
   if(ticket == -1)Print(">>>> Ошибка № ", GetLastError()); //проверка на ошибки
}
Номер тикета сохранен, теперь можно выбирать по нему ордер допустим так (из предыдущего примера)
if(OrderSelect(ticket, SELECT_BY_TICKET)){
   if(OrderCloseTime() != 0){
      Print("Profit Orders # ",ticket," = ", OrderProfit());
   }
}
Заметь разницу в параметрах функции OrderSelect(), не нужно писать где искать (MODE_HISTORY то есть в истории).
Если ордер был открыт, был получен тикет, то функция
OrderSelect() найдет его в любом случае, где угодно (при условии корректного номера тикета).
Для того чтобы понять ордер открыт или уже закрыт, нужно проанализировать время его закрытия.
Для этого и была вызвана функция
OrderCloseTime(). Открытые или отложенные ордера имеют время закрытия, равное 0 (просто потому, что они еще не успели закрыться),
нас же интересуют закрытые ордера, поэтому время их закрытия не будет равно 0.

 
ИМХО, работа с тикетами более сложный процесс, чем простой поиск ордеров перебором. По-хорошему, надо будет создавать систему учета ордеров по тикетам, хранить и обновлять базу, сложная и кропотливая работа. Для рутинных задач это просто нецелесообразно.
 
ToLik_SRGV >>:
Тикет (он же номер ордера) возвращает функция OrderSend(), а ей соответственно торговый сервер, в виде числа типа int, или -1 в случае неудачи.
Его можно сохранить в static переменную (static для того чтобы значение переменной сохранилось при следующем вызове функции start())
Номер тикета сохранен, теперь можно выбирать по нему ордер допустим так (из предыдущего примера)
Заметь разницу в параметрах функции OrderSelect(), не нужно писать где искать (MODE_HISTORY то есть в истории).
Если ордер был открыт, был получен тикет, то функция
OrderSelect() найдет его в любом случае, где угодно (при условии корректного номера тикета).
Для того чтобы понять ордер открыт или уже закрыт, нужно проанализировать время его закрытия.
Для этого и была вызвана функция
OrderCloseTime(). Открытые или отложенные ордера имеют время закрытия, равное 0 (просто потому, что они еще не успели закрыться),
нас же интересуют закрытые ордера, поэтому время их закрытия не будет равно 0.



спасиб,ето как один из вариантов перебора ордеров буду пробовать)