Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 90

 
Vitaly Muzichenko:

Спасибо, почему-то с лотом так не получается.

 

double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
double   r=-1;
  if (sy=="0") sy=Symbol();
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (r>OrderLots() || r==-1) {
                r=OrderLots();
  }}}}}}}
  return(r);
}

Как вернуть лот четырнадцатого селл стопа на снимке лот= 0.03?



 

 
Marina Korotkih:

Спасибо, почему-то с лотом так не получается.

double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  if (sy=="0") sy=Symbol();
  double r=MarketInfo(sy, MODE_MINLOT);
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (r>OrderLots()) {
                r=OrderLots();
  }}}}}}}
  return(r);
}
Это минимальный, если нужен самого последнего ордера, тогда сейчас сделаю
 
Vitaly Muzichenko:

Это минимальный, если нужен самого последнего ордера, тогда сейчас сделаю

Вот ищет лот самого дальнего от цены

double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
datetime t=0;
double r=-1,l=0;
if (sy=="0") sy=Symbol();
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (r>OrderOpenPrice() || r==-1) {
                r=OrderOpenPrice();
                l=OrderLots();
  }}}}}}}
  return(l);
}
 
Marina Korotkih:

Спасибо, почему-то с лотом так не получается.

 

double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
double   r=-1;
  if (sy=="0") sy=Symbol();
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (r>OrderLots() || r==-1) {
                r=OrderLots();
  }}}}}}}
  return(r);
}

Как вернуть лот четырнадцатого селл стопа на снимке лот= 0.03?



 

Нет функция работает верно, почему возвращаемое значение не 1 и14 ордера а 2?

это тестер?

У меня работает верно. 

 
Vitaly Muzichenko:

Вот ищет лот самого дальнего от цены


Спасибо, так понятно. Нашли его, теперь можно всё что нужно о нём узнать )

 
Alekseu Fedotov:

Нет функция работает верно, почему возвращаемое значение не 1 и14 ордера а 2?

это тестер?

У меня работает верно. 

Нужно сортировать по цене, потому что искать по размеру не получится, сетка может быть разнолотной, и будете находить или самый большой, или самый маленький, но не первый и не последний
 
Marina Korotkih:

Спасибо, так понятно. Нашли его, теперь можно всё что нужно о нём узнать )

Чтобы узнать полную инфу об ордере или позиции, то лучше это делать по тикету

if(OrderSelect(i, SELECT_BY_TICKET)) {
  // всё что угодно
}
 
Alekseu Fedotov:

...почему возвращаемое значение не 1 и14 ордера а 2?


Потому что вызываю так

GetOrderOpenPrice(Symbol(),OP_SELLSTOP,_Magic)
 
Vitaly Muzichenko:

Чтобы узнать полную инфу об ордере или позиции, то лучше это делать по тикету

if(OrderSelect(i, SELECT_BY_TICKET)) {
  // всё что угодно
}

Но для этого сначала нужно узнать тикет последнего ордера 14

Поэтому ордер всё равно нужно сначала искать как в первой функции?

Или просто заменить SELECT_BY_POS на SELECT_BY_TICKET

 
Marina Korotkih:

Но для этого сначала нужно узнать тикет последнего ордера 14

Поэтому ордер всё равно нужно сначала искать как в первой функции?

Или просто заменить SELECT_BY_POS на SELECT_BY_TICKET

Смотря что нужно узнать. По сути, можно и тут всё узнать, выбрать ордер по цене, ну а дальше записать по нему нужные параметры и всё вернуть.

Использование циклов лишний раз, не есть хорошая идея, так что лучше всё реализовать в одном цикле, в реальной торговле это не заметно, а вот в тестере будут долго идти тесты. Хотя всё зависит от задачи, кто-то пишет программы для тестера, а кто-то для торговли, поэтому можно использовать не один цикл, а несколько. 

P.S. если конечно советник-пипсовщик, то лучше не использовать ни одного цикла)