Объясните мне зачем и почему (про OrderSelect()) - страница 2

 
Korey:

to Cronex

Ага, т.е. ордер имеет два поля для нас - текстовую строку и номер магик.
И серверу он не нужен. И можно торговать даже с разных МТ разными советнками одним счетом с различеним их по магику.
Но хотелось бы быть в это вопросе более уверенным т.е. иметь Pуководящий Tехнический Mатериал.

Текстовая строка (в смысле коменты) часто меняются ДЦ при закрытии части позиции (пишут текст типа: "split from ticket #3214561"). Тикет тоже при этом изменяется.

За все время я пока не встречал что бы магик изменялся ДЦ, хотя и могут. Серверу он точно не нужен.

У меня на данный момент работает три советника на одном счете, с разных терминалов, на одном инструменте, но с разными магиками, проблем не замечено.

 
Rosh:
Думаю, источник проблемы кроется в этом:
kharko:

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

i--;
RefreshRates();


Зачем связывать события удаления ордера и декремента переменной?

После удаления ордера, общее количество открытых ордеров изменилось.. А у нас осталось старое значение.... Т.о. обновляя количество открытых ордеров и делая шаг назад я наверняка знаю, что тикет ордера не будет устаревшим...

 
Из обсуждения получается, чо OrderSelect() берет данные из окружения терминала,
Вопрос: список ордеров обновляется на каждом тике(в 21 веке живем))) или только по рефреш?
 
Korey:
Из обсуждения получается, чо OrderSelect() берет данные из окружения терминала,
Вопрос: список ордеров обновляется на каждом тике(в 21 веке живем))) или только по рефреш?

на каждом тике... но когда ваш советник работает то рефреш....

 

to rid

А где проверка OrderCloseTime()? -Иначе будет грести все подряд!


to kharko

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

 
rid:

особенно - if ((OrderType() <= OP_SELL)

OP_BUY - позиция на покупку,
OP_SELL - позиция на продажу,
OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.

Все это просто алиасы для цифровых значений, данное выражение выбирает только активные ордера BUY и SELL, отсеивая все остальные отложенные ордера.

 
rid:

Добрый день всем! Очень вовремя ветка всплыла! Вот сейчас разбираю код эксперта и привожу в удобно/читаемый вид после декомпеллирования.

Эксперт в тестере работает. Но не совсем понятно небольшая деталь.

//----- закрытие позиций----------------------
for (i = 0; i < ordtotal; i++)   {//ЕСЛИ есть открытые позиции, - выбираем - 
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   if ((OrderType() <= OP_SELL) && (OrderSymbol() == Symbol()))
      {
      if (OrderType() == OP_BUY)
         {
         if (OrderOpenPrice() >= Bid + StopLoss * Point)
            {
            OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);
            return(0);
            }
         if ((var_start_80 > 0) && (var_start_112 <= var_start_128)
          && (var_start_120 < var_start_136 - var_start_16) && (macd_H_0 > 0)
           && (macd_H_0 > var_start_96) && (macd_152 < var_start_168))
            {
            OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
            return(0);
            }

Мне здесь совершенно непонятно - что означает вот эти строчки. Пож. подскажите, кто сможет и знает -

if ((OrderType() <= OP_SELL) && (OrderSymbol() == Symbol()))
      {
      if (OrderType() == OP_BUY)
         {

особенно - if ((OrderType() <= OP_SELL)

И мне не понятно зачем делать такое условие, если удаляются только бай позиции... или это не весь код :(

 
Korey
Korey:

to rid

А где проверка OrderCloseTime()? -Иначе будет грести все подряд!


писал (а):

to rid

А где проверка OrderCloseTime()? -Иначе будет грести все подряд!

Ничего не пойму! Куда это мой пост вылетел? (я его не удалял...)

 
kharko:
rid:

И мне не понятно зачем делать такое условие, если удаляются только бай позиции...

Ну это просто остатки стандартного кода из примера - там обрабатываются все активные ордера: и BUY и SELL.

Логика : отобрать только активные ордера OrderSelect(i,SELECT_BY_POS,MODE_TRADES);(для уменьшения времени на итерации), потом по типу конкретного ордера (BUY или SELL) отпределить что с ним делать. Отложенные ордера тоже входят в MODE_TRADES, но они пропускаются по фильтру OrderType() <= OP_SELL

 

if ((OrderType() <= OP_SELL) - получается, что эта строка означает примерно так:

"если среди ордеров и позиций нет открытой позиции на продажу...?"

Причина обращения: