Выбрать тикет 2-х позиций - страница 3

 
Natalya Dzerzhinskaya:

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

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

 
Alexey Valeev:

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

А как зная цену узнать какой тикет у ордера с такой ценой?

 
Natalya Dzerzhinskaya:

А как зная цену узнать какой тикет у ордера с такой ценой?

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

 
Natalya Dzerzhinskaya:

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

Так в чем проблема. Известна цена бай. Перебираем ордера, находим если есть ближайшие селлы выше и ниже. проблемы вообще ни какой.

void OnTick()
{
     int tickets[2] = {0,0};
     if( SearchPositions(ORDER_TYPE_BUY, OrderSellPrice, tickets) )
     {
          if( tickets[0] != 0 && OrderSelect(tickets[0],SELECT_BY_TICKET,MODE_TRADES) )
          {
               /* work */
          }
          if( tickets[1] != 0 && OrderSelect(tickets[1],SELECT_BY_TICKET,MODE_TRADES) )
          {
               /* work */
          }
     }
}
//+------------------------------------------------------------------+

bool SearchPositions(const ENUM_ORDER_TYPE type, const double price, int &tickets[])
{
     double _price[2] = {DBL_MAX, 0};
     
     for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
          if( !OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) ) continue;
          if( OrderSymbol() != _Symbol) continue;
          if( OrderType()!=type ) continue;
          if( OrderMagicNumber() != 12345 ) continue;
          
          if( OrderOpenPrice() > price )
          {
               if( OrderOpenPrice() > _price[0] ) continue;
               _price[0]  = OrderOpenPrice();
               tickets[0] = OrderTicket();
          }
          else if( OrderOpenPrice() < price )
          {
               if( OrderOpenPrice() < _price[1] ) continue;
               _price[1]  = OrderOpenPrice();
               tickets[1] = OrderTicket();
          }
     }
     if( tickets[0] > 0 || tickets[1] > 0 )
          return true;
     return false;
}
Как-то так. Не проверял, но вроде должно работать.
 
Konstantin Nikitin:

Так в чем проблема. Известна цена бай. Перебираем ордера, находим если есть ближайшие селлы выше и ниже. проблемы вообще ни какой.

Ну наконец-то, закрывает селл парами ближайшие к бай как и требовалось.


Спасибо))

 
Natalya Dzerzhinskaya:

Ну наконец-то, закрывает селл парами ближайшие к бай как и требовалось.


Спасибо))

Надеюсь закрываете через CloseBy(), чтоб сэкономить один спред

 
Natalya Dzerzhinskaya:

У меня вообще уже всё перепуталось.

Вы знаете тикет Buy. Соответственно, знаете его цену.

Делаете цикл по только позициям Sell и складываете абсолютную (MathAbs()) разницу их цен и известного вам Buy и тикеты Sell в двумерный массив array[абс.разница цен Buy и Sell][тикет Sell] (структуру не предлагаю - думаю, что рановато ещё вам).

Затем сортируете этот массив по возрастанию. В ячейках array[0][тикет] и array[1][тикет] во втором измерении будете иметь два нужных вам тикета

 
Konstantin Nikitin:

Так в чем проблема. Известна цена бай. Перебираем ордера, находим если есть ближайшие селлы выше и ниже. проблемы вообще ни какой.

Как-то так. Не проверял, но вроде должно работать.
Выбираете ордер по тикету, при этом зачем-то указываете MODE_TRADES (он игнорируется при выборе по тикету), и не проверяете из какого списка выбран ордер - из списка открытых или из списка закрытых ордеров.
 
NatashkaFX:

Ну наконец-то, закрывает селл парами ближайшие к бай как и требовалось.


Спасибо))

Добрый день, господа. Похоже Вы, Наталья, разбираетесь в программировании, поэтому хотел попросить Вас (если Вы не против) помочь (не бесплатно) доработать мой советник, плиз. В нем в дополнение к основному Первому ордеру необходимо при определенных условиях открыть встречный ордер большего объема, а также выставить отложенный стоп ордер ещё большего объема. Советник есть, проект доработки тоже имеется, вот только программиста найти не могу. Если есть возможности и желание, то напишите здесь, а я Вам адрес почты оставлю.
Причина обращения: