Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаешь C++? MQL5 очень схож с ним, убедись в этом сам!
akc
125
akc 2012.11.26 07:11 

Уже сломал голову. Помогите разобраться.

Я ищу пару ордеров с одним Магиком, вот код:

  int total=OrdersTotal(), ipos=0;
   ArrayInitialize(mOnePare, -1);
  // ищем ордер с нужным магиком
  for(int ip = 0; ip<total; ip++)
  {
     ipos++; // при ip = 0, ipos = 1, т.е. ipos = ip+1
     if(OrderSelect(ipos,SELECT_BY_POS,MODE_TRADES)==false) continue;
     if((OrderSymbol()!=Symb) || (OrderMagicNumber()!=gNM)) continue;
     mOnePare[0] = OrderMagicNumber();
     mOnePare[1] = OrderTicket();
     mOnePare[2] = OrderType();
     break;
  }
  if (ipos == total) // если 1-й оказался последним в списке, значит второго нет
  {
     Print(StringConcatenate("одномерный массив по магик ",gNM," - ",mOnePare[0]," ",mOnePare[1]," ",mOnePare[2]," ",mOnePare[3]," ",mOnePare[4]));
     return(-1); 
  }
  //продолжаем со следующей позиции
  for(int jp = ipos; jp<total; jp++)
  {
     if(OrderSelect(ipos,SELECT_BY_POS,MODE_TRADES)==false) continue;
     if((OrderSymbol()!=Symb) || (OrderMagicNumber()!=gNM)) continue;
     mOnePare[3] = OrderTicket();
     mOnePare[4] = OrderType();
     break;
  }
  Print(StringConcatenate("одномерный массив по магик ",gNM," - ",mOnePare[0]," ",mOnePare[1]," ",mOnePare[2]," ",mOnePare[3]," ",mOnePare[4]));
  Print("ipos = " + ipos + " total = " + total + " ip = " + ip + " jp = " + jp);

 Код перегруженный из-за поиска одного бага - при выборке в одном случае нормально выдает разные ордера.

В другом - два ордера с одним тикетом и типом входа.

Вот выходные принты, по ним видно, что это 2 ордера в разных позициях.

одномерный массив по магик 110028 - 110028 27 1 27 1

ipos = 8 total = 11 ip = 7 jp = 8 

 

Я уж думал, что за время поиска выставился еще ордер, и позы ордеров сдвинулись, искал в цикле, пока одинаковые номера тикетов. Но эксперт не вышел из этого цикла.

В чем проблема? 

o_O
Модератор
23314
o_O 2012.11.26 07:16  

1. Почему пропускаете первый ордер?

     ipos++; // при ip = 0, ipos = 1, т.е. ipos = ip+1
     if(OrderSelect(ipos,SELECT_BY_POS,MODE_TRADES)==false) continue;


2. почему во втором цикле не выбираете ордера дальше?

 for(int jp = ipos; jp<total; jp++)
  {
     if(OrderSelect(ipos,SELECT_BY_POS,MODE_TRADES)==false) continue;
PapaYozh
3768
PapaYozh 2012.11.26 07:21  
AKC:

Уже сломал голову. Помогите разобраться.

Я ищу пару ордеров с одним Магиком, вот код:

 Код перегруженный из-за поиска одного бага - при выборке в одном случае нормально выдает разные ордера.

В другом - два ордера с одним тикетом и типом входа.

Вот выходные принты, по ним видно, что это 2 ордера в разных позициях.

одномерный массив по магик 110028 - 110028 27 1 27 1

ipos = 8 total = 11 ip = 7 jp = 8 

 

Я уж думал, что за время поиска выставился еще ордер, и позы ордеров сдвинулись, искал в цикле, пока одинаковые номера тикетов. Но эксперт не вышел из этого цикла.

В чем проблема? 

В первом случае перебор начинается с 0, во втором - с единицы. Теперь сами подумайте, что будет, если в первом переборе подходящий под условия номер оказался на 1 или более дальней позиции.

akc
125
akc 2012.11.26 07:27  

Да, это я зациклился.

Спасибо!!! Думаю, тему можно удалить. 

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий