[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 517

 

Люди, я тут уже спрашивал про то как сделать так чтобы ордер открывался только при появлении новой свечки. ТФ D1 использую.

Решил ставить отложки на определенных уровнях (buystop_lvl и sellstop_lvl), исходя из анализа предыдущих свечек.

Так вот, нужно чтобы в начале дня они поставились, а если наступает новая свечка то удалить их, и пофиг активировались отложки или нет, если сработали то рыночные ордера также закрыть надо. Максимум 2 ордера, buystop и sellstop.

Вот что я написал:

1. Вначале проверяю есть ли отложки или рыночные ордера, если есть то удаляю\закрываю их.

int total=OrdersTotal();
   if (total!=0 && NewBar()==true){
                 for (int i=0; i<total; i++)
                    {
                     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
                     if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,10);
                     if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,10);
                     if(OrderType()==OP_BUYSTOP)  OrderDelete(OrderTicket());
                     if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
                    }
                }

2. Потом ставлю отложки по рассчитанным уровням:

if(NewBar() == True && OrdersTotal()==0)
    {
     OrderSend(Symbol(),OP_BUYSTOP ,Lot,buystop_lvl ,10,buystop_SL ,buystop_TP,"Expert buystop\sellstop");
     Sleep(10000);
     OrderSend(Symbol(),OP_SELLSTOP,Lot,sellstop_lvl,10,sellstop_SL,sellstop_TP,"Expert buystop\sellstop");
     
    }

3. Функция нового бара (NewBar), которую мне тут подсказали:

//Функция нового бара
bool NewBar()
{
  static datetime lastbar = 0;
  datetime curbar = iTime(Symbol(),1440,0);
  if(lastbar != curbar)
  {
    lastbar = curbar;
    return(true);
  }
  else return(false);
}

В итоге имею то что с открытием свечки ордера выставляются и сразу удаляются. И так постоянно.

Когда закомментировал код из пункта (1), то вообще пипец, в тестере цена подходила к отложкам но они не открывались, т.е. не становились рыночными.

Вот, подскажите в чем дело может быть?

 

Эту функцию NewBar() нельзя использовать два раза подряд

Лучше что-нибудь так:

bool newBar = NewBar();

// и дальше по тексту заменяя NewBar() на newBar

 
Блин, всё равно не понимаю как это сделать. Нужно чтобы код с удалением и закрытием ордеров сработал только на следующей свечке. Но на ней же еще и открыться другие должны будут. Значит прога опять залезет в удаление. Какой-то флаг нужен, но уже мозги вспотели чтобы понять как это соорудить :)
 
Noterday:
И вообще выкидываете NewBar нафиг, смотрите время открытия последнего ордера и сравниваете с Time[0]. Если больше -- значит ваш случай, можно все удалять.
 
trend_lab:
И вообще выкидываете NewBar нафиг, смотрите время открытия последнего ордера и сравниваете с Time[0]. Если больше -- значит ваш случай, можно все удалять.

Да, видимо так и придется сделать. Спасибо и на этом :)
 
Noterday:
Блин, всё равно не понимаю как это сделать. Нужно чтобы код с удалением и закрытием ордеров сработал только на следующей свечке. Но на ней же еще и открыться другие должны будут. Значит прога опять залезет в удаление. Какой-то флаг нужен, но уже мозги вспотели чтобы понять как это соорудить :)

Почитайте внимательно про функцию OrderSend(). Для отложенных ордеров в ней имеется параметр: 

expiration - Срок истечения отложенного ордера.

 Открывая отложенный ордер в начале текущих суток = iTime (Symbol(), PERIOD_D1, 0), добавляете  к этому времени ещё одни сутки - 1440 * 60. И не сработавшие отложенные ордера сами удалятся в начале следующих суток.

P.S. Окончание текущего бара можно ещё контролировать через функцию iBarShift(): 

    if (iBarShift (Symbol(), PERIOD_D1, OrderOpenTime()) == 0) return(0);

 или по этому условию какие-то другие "телодвижения", отследив OrderTicket() последнего ордера.

 
TarasBY:

Почитайте внимательно про функцию OrderSend(). Для отложенных ордеров в ней имеется параметр: 

 Открывая отложенный ордер в начале текущих суток = iTime (Symbol(), PERIOD_D1, 0), добавляете  к этому времени ещё одни сутки - 1440 * 60. И не сработавшие отложенные ордера сами удалятся в начале следующих суток.


Читал, ДЦ походу не поддерживает.
 
Noterday:
Читал, ДЦ походу не поддерживает.
а такое бывает???
 
Ну видимо да, а может просто косяк какой-то с терминалом с моим. Я тут в соседней ветке уже говорил что у меня и отчеты из вкладки ИСТОРИЯ СЧЕТА не сохраняются...
 
Noterday:
Ну видимо да, а может просто косяк какой-то с терминалом с моим. Я тут в соседней ветке уже говорил что у меня и отчеты из вкладки ИСТОРИЯ СЧЕТА не сохраняются...
Как ни странно - у меня тоже, правда, билд у меня 416. Правда, к процессу удаления не сработавшегно отложенного ордера по его истечении, терминал НИКАКОГО отношения не имеет - это компетенция сервера ДЦ.