Как правильно открыть ордер по рынку? - страница 8

 
Dmitry Fedoseev:
У вас не тот случай когда нужна пауза. 
То то и оно.
 
В общем, имхо, итог такой.

Глобально есть 2 путя:

1) анализ окружения (подсос истории сделок, проверка открытой позиции или объёма позиции);

2) анализ транзакций.

Первое работает медленнее. Зато надёжнее. Нужен компромисс. Наверное здесь нужно смотреть на стратегию и от неё плясать...

Да, на ФОРТСе есть полноценный стакан, так что работать нужно не с тиками, а с событием BookEvent.

Странно, что по теме не высказался Василий Соколов. Интересна его точка зрения...
 
Dennis Kirichenko:
В общем, имхо, итог такой.

Глобально есть 2 путя:

1) анализ окружения (подсос истории сделок, проверка открытой позиции или объёма позиции);

2) анализ транзакций.

Первое работает медленнее. Зато надёжнее. Нужен компромисс. Наверное здесь нужно смотреть на стратегию и от неё плясать...

Да, на ФОРТСе есть полноценный стакан, так что работать нужно не с тиками, а с событием BookEvent.

Странно, что по теме не высказался Василий Соколов. Интересна его точка зрения...
Может в скором времени и перейду на стакан, но пока так....по старинке.
 
Dennis Kirichenko:
В общем, имхо, итог такой.

Глобально есть 2 путя:

1) анализ окружения (подсос истории сделок, проверка открытой позиции или объёма позиции);

2) анализ транзакций.

Первое работает медленнее. Зато надёжнее. Нужен компромисс. Наверное здесь нужно смотреть на стратегию и от неё плясать...

Да, на ФОРТСе есть полноценный стакан, так что работать нужно не с тиками, а с событием BookEvent.

Странно, что по теме не высказался Василий Соколов. Интересна его точка зрения...
А кстати, возник вопрос, с событием BookEvent  можно пользоваться так же как и Тиком или Таймером?
т.е. полностью перенести туда свою стратегию?
 
Вспомнил по теме...

Работал я как-то по этому заказу, писал класс CiOnTrade:
class CiOnTrade : public CTrade
Интересная была задача. Потрепали мы с заказчиком нервы друг другу и копья поломали. Насколько помню, там была основная задача - купить\продать гарантированный объём. А если часть объёма не была залита, то эти ордера нужно было удалить и остаток уже по другой цене выполнить...

Так вот, оптимальное решение, которое я нашёл, заключалось в обработке состояний. А их было вот столько:
enum ENUM_TRADE_STATE
  {
   TRADE_STATE_NONE=0,      // "ничего"
   TRADE_STATE_ORDERS=1,    // "только ордера"
   TRADE_STATE_POSITION=2,  // "только позиция"
   TRADE_STATE_ALL=3,       // "все"
  };
1) "Ничего" - это начальное состояние, когда ничего не делали.

2) "Только ордера" - это состояние, когда выставлены ордера.

3) "Только позиция" - это состояние, когда ордера полностью исполнены.

4) "Все" - это состояние, когда ордера исполнены не полностью, и есть в рынке уже позиция.

Вот каждое состояние нужно было обработать... да, кстати, допускаю, что есть и промежуточные состояния. Так что мой класс можно усовершенствовать.
 
Gennady Mazur:
А кстати, возник вопрос, с событием BookEvent  можно пользоваться так же как и Тиком или Таймером?
т.е. полностью перенести туда свою стратегию?
Таки да! Но учтите, что стакан чаще генерирует события. Поэтому нужен некоторый фильтр, чтобы отсеивать ненужное. Например, цены не поменялись, а только объёмы некоторых заявок...
 
Dennis Kirichenko:
Таки да! Но учтите, что стакан чаще генерирует события. Поэтому нужен некоторый фильтр, чтобы отсеивать ненужное. Например, цены не поменялись, а только объёмы некоторых заявок...
Я понял спасибо...да и в некоторых случаях изменение объема важнее чем изменение цены, особенно возле сильных уровней.
 
Dennis Kirichenko:
В общем, имхо, итог такой.

Глобально есть 2 путя:

1) анализ окружения (подсос истории сделок, проверка открытой позиции или объёма позиции);

2) анализ транзакций.

Первое работает медленнее. Зато надёжнее. Нужен компромисс. Наверное здесь нужно смотреть на стратегию и от неё плясать...
Вариант OrderSend+Sleep(0) не работает медленней, чем OrderSend+OnTradeTransaction. Замерял. Поэтому второй вариант не для асинхронных транзакций не использую.
 
Dennis Kirichenko:
Предполагаю, что инфа о  сделке ещё не успела прийти. Вот тут (выделил красным) Вы полагаетесь на удачу. А она капризная дама :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}

Даже при ORDER_STATE_FILLED у Results.order может возникнуть проблема - Results.deal нулевой. 100%-е воспроизведение такой ситуации достигается на сервере FXOpen-MT5.

Рекомендую открыть много демок на разных серверах и добиться от кода полной работоспособности. Так сделал для MT4-библы. Поэтому с сабжем нет проблем.

 
fxsaber:
Вариант OrderSend+Sleep(0) не работает медленней, чем OrderSend+OnTradeTransaction. Замерял. Поэтому второй вариант не для асинхронных транзакций не использую.

Вариант OrderSend+Sleep(0)  - временный, т.к это недоратока разработчиков (не стоит приврдить это как пример :) ).

Кода поправят, останется только OrderSend 

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