Скачать MetaTrader 5

Получить данные от последнего закрытого ордера - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
IgorM М
4801
IgorM М  
VladislavVG:

 


чет никак не найду конкретной инфы:

 - почему нужно использовать  OrdersHistoryTotal() - 1, OrdersTotal() - 1 ?

 - ф-ция при выборе ордера OrderSelect() нумеруется с нуля?

 - после модификации ордера OrderModify(), нумерация ордеров через  OrderSelect() изменяется?

Роман
2355
Роман  
hasayama:
OrdersHistoryTotal() - 1
Можно пояснить, зачем -1 ?
Victor Nikolaev
Модератор
14971
Victor Nikolaev  
RomanS:
Можно пояснить, зачем -1 ?


OrdersHistoryTotal() возвращает количество ордеров (элементов в массиве)

в MQL индексы массивов от 0. Поэтому получается что последний элемент массива OrdersHistoryTotal() -1

Oleg
2338
Oleg  

А почему бы не воспользоваться уже готовым решением,

я только немного переделал, вместо OrderTicket() можно подставить любую другую функцию Order*()

//+----------------------------------------------------------------------------+
//|                                              test_GetTicketLastClosePos.mq4  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  18.05.2008  Скрипт для тестирования функции GetTicketLastClosePos().        |
//+----------------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link  "http://www.kimiv.ru"
#property show_confirm


void start() {
  Message(GetNameOP(GetTicketLastClosePos()));
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней закрытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastClosePos(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderTicket();
          }
        }
      }
    }
  }
  return(r);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+
Vladyslav Goshkov
2147
Vladyslav Goshkov  
IgorM:


чет никак не найду конкретной инфы:

- почему нужно использовать OrdersHistoryTotal() - 1, OrdersTotal() - 1 ?

- ф-ция при выборе ордера OrderSelect() нумеруется с нуля?

- после модификации ордера OrderModify(), нумерация ордеров через OrderSelect() изменяется?

Ордер с номером OrdersTotal() не существует, как правильно Vinin заметил. В данном случае при использовании ОрдерСелект от ошибки можно избавиться - просто пропустить.

Остальное, уверен, Вам известно - просто расшифрую свой подход, может кому и пригодится:

Сама по себе привычка перебирать элементы массива без учета размеров массивов (в терминах С - без учета размеров отведеной памяти) приводит к возникновению массы проблем, основная - конфликты доступа. Такие "плавающие" ошибки, которые очень тяжело отлавливать. В мкл4 это работает из-за наличия собственного менеджера памяти, в других языках не всегда. В С++, например, программисту гарантируется наличие адреса за выделенной памятью, но не гарантируется наличие значения и возможности доступа - результатом обращения туда запросто может стать крэш приложения. Поскольку жизнь на мкл4 не заканчивается, то лучше привычку писать обработку массивов с учетом выхода за пределы вырабатывать сразу, тем более, что в мкл5, это, похоже, уже ошибка.

Удачи.

Петро
13
Петро  
IgorM:
int history(){
int time = 0;double profit = 0;//обьявляем необходимые нам переменные куда мы положим интересующие нас характеристики ордера
for(int i = OrdersHistoryTotal();i>=0;i--){// Перебираем все закрытые ордера
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){//если ордер с таким номером (i) в списке закрытых ордеров есть ( не путать с тикетом)
    if(OrderSymbol() == Symbol()){//если выбранный ордер был открыт по нашей валютной паре
      if(time<OrderCloseTime()){//(сравниваем его с хранящимся в пероеменной time) 
        time=OrderCloseTime();//если время закрытия ордера больше - ложим его в переменную
        profit=OrderProfit();//и заодно запоминаем прибыль ордера
      }
    }
  }
}
//по окончании этой процедуры в наших переменных будут сидет наибольшее время закрытия, и его профит. Или по нулям если история чистая.
//теперь мы можем выставлять условия в зависимости от результата процедуры
   
if(profit == 0 &&time == 0){//действия если история чистая}

}
if(profit >= 0){//действия если последний ордер был прибыльным, или нулевым}

}
if(profit <  0 ){//действия если последний ордер был убыточным}

}
return(0);
}

Всем доброго времени суток! Господа подскажите, почему при компиляции данного кода выдаются ошибки? Функция крайне полезная!


o_o
Модератор
24048
o_o  
и много ошибок?
Петро
13
Петро  
sergeev:
и много ошибок?
порядка 4
o_o
Модератор
24048
o_o  
murchel:
порядка 4

ясно, вам надо любую книгу по c++ открыть и почитать хотя бы оглавление.

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