Условия возникновения событий Strategy.OrderChange, Strategy.NewOrder, Strategy.NewMyTrades


Условия возникновения событий Strategy.OrderChange, Strategy.NewOrder, Strategy.NewMyTrades
Atom
07.10.2010


Каковы условия возникновения этих событий у стратегии по сравнению с аналогичными событиями в Trader?

Они как-то фильтруются по стратегии? Если да, то как?

Теги:


Спасибо:


<< < 3 4 5 6 7  > >>
sergun

Фотография
Дата: 28.10.2010
Ответить


Mikhail Sukhov
sergun
Кстати по задумке NewOrders вызывается и нужен только для асинхронного режима?


Нет, для обоих... Я проверил сценарий. Все вызывается. Можете как-то локализовать проблему? Потому что, если я создаю стратегию, и регистрирую в ней заявку по рыночной цене, то все события вызыываются на ура. IsAsyncMode = true.

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

Если не в этом дело, то надо выделать проблемное место путем тестов.


Снова возникла такая ситуация. Но уже в синхронном режиме.
Симптом - по заявке не приходят никакие события у стратегии (NewMyTrades, NewOrder, OrderChanged)..
У QuikTrader пришло событие NewMyTrades, остальные события у трейдера не обрабатывал. Сейчас добавил обработчики и логирование.
Если еще возникнет ситуация скажу вызвались ли..

Но вот у Strategy- глухо.
Спасибо:

sergun

Фотография
Дата: 01.11.2010
Ответить


Mikhail Sukhov
Dmitriy Klimov
Mikhail Sukhov
Стойте, это не Вам ответ. Сорри что убрал цетирование. Это ответ sergun-у. С Вашей ошибкой все понятно, нашел и ее устраняю.

Михаил, простите что беспокою понапрасну. Но когда можно ожидать исправление ошибки?


Чуть выше я писал, что на этой неделе. Теперь точнее - пятница.


Снова проявился баг (пока я на 2.4).
Выставляю заявку, происходит полное исполнение разом. В квике вижу одну сделку.
Трейдер и стратегия подписаны на всевозможные события (свои новые сделки, новые заявки, изменение заявок).

Судя по логу вызывается только следующее:
2010-11-01 11:40:06,581 ITrader.NewOrder
2010-11-01 11:40:06,590 ITrader.OrderChanged
2010-11-01 11:40:06,590 ITrader.OrderChanged
2010-11-01 11:40:06,591 ITrader.OrderChanged
2010-11-01 11:40:06,618 Strategy.NewOrder

Про сделки - НИЧЕГО.

Михаил, может это даст какую-нибудь наводку?
Спасибо:

Dmitriy Klimov

Фотография
Дата: 01.11.2010
Ответить


Михаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа QuikStopConditionTypes.TakeProfitStopLimit и совершения сделки по этой заявки, у меня не возникают события Strategy.StopOrderChanged и Strategy.NewMyTrades. Соответственно, Strategy.PositionManager тоже не в курсе, что стратегия уже не в позиции.

Как быть? Самому пока дописывать класс Strategy, или вам недолго поправить эту ошибку?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 02.11.2010
Ответить


Dmitriy Klimov
Михаил, проблема с условными стоп-заявками так и не решилась. После выставления чере стратегию заявки типа QuikStopConditionTypes.TakeProfitStopLimit и совершения сделки по этой заявки, у меня не возникают события Strategy.StopOrderChanged и Strategy.NewMyTrades. Соответственно, Strategy.PositionManager тоже не в курсе, что стратегия уже не в позиции.

Как быть? Самому пока дописывать класс Strategy, или вам недолго поправить эту ошибку?


Я проверял на таком примере:

Код
private class MyStrategy : ActionStrategy
{
    public void CreateOrder()
    {
        Order order = base.CreateOrder(OrderDirections.Buy, 1600, 1);
        order.Type = OrderTypes.Conditional;
        order.StopCondition = new QuikStopCondition
        {
            Type = QuikStopConditionTypes.TakeProfitStopLimit,
            StopPrice = 1600,
            StopLimitPrice = 1600,
            Offset = new Unit(),
            Spread = new Unit()
        };
    }
}

...

_strategy.NewStopOrder += o => Debug.WriteLine("NewStopOrder " + o.Id);
_strategy.StopOrderChanged += o => Debug.WriteLine("StopOrderChanged " + o.Id);

_strategy.CrateOrder();


Событие вызывалось. Такой пример у Вас работает?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 02.11.2010
Ответить


sergun

Судя по логу вызывается только следующее:
2010-11-01 11:40:06,581 ITrader.NewOrder
2010-11-01 11:40:06,590 ITrader.OrderChanged
2010-11-01 11:40:06,590 ITrader.OrderChanged
2010-11-01 11:40:06,591 ITrader.OrderChanged
2010-11-01 11:40:06,618 Strategy.NewOrder

Михаил, может это даст какую-нибудь наводку?


Даст, например то, что Strategy.NewOrder вызывается после Trader.OrderChanged, а такое быть не может. Событие одного типа вызывается непрерывно, тоесть после ITrader.NewOrder должно было идти Strategy.NewOrder.

Все же мне кажется надо идти по пути упрощения кода. Выделить проблемный участок путем убирания и тестирования. Так какая то фантастика получается, в которой уже просто сложно разобраться. Где глючит, что боит - не понятно. Выделите стратегию в отдельный проект и потестируйте ее под нагрузкой на демо счете.
Спасибо:

Dmitriy Klimov

Фотография
Дата: 02.11.2010
Ответить


Mikhail Sukhov
Я проверял на таком примере:

Код
private class MyStrategy : ActionStrategy
{
    public void CreateOrder()
    {
        Order order = base.CreateOrder(OrderDirections.Buy, 1600, 1);
        order.Type = OrderTypes.Conditional;
        order.StopCondition = new QuikStopCondition
        {
            Type = QuikStopConditionTypes.TakeProfitStopLimit,
            StopPrice = 1600,
            StopLimitPrice = 1600,
            Offset = new Unit(),
            Spread = new Unit()
        };
    }
}

...

_strategy.NewStopOrder += o => Debug.WriteLine("NewStopOrder " + o.Id);
_strategy.StopOrderChanged += o => Debug.WriteLine("StopOrderChanged " + o.Id);

_strategy.CrateOrder();


Событие вызывалось. Такой пример у Вас работает?

Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай:
Код
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

using Ecng.Collections;
using Ecng.Trading.Algo;
using Ecng.Trading.Algo.Strategies;
using Ecng.Trading.BusinessEntities;
using Ecng.Trading.Quik;

namespace VolumeStrategy
{
class StopOrderStrategy : Strategy
{
public double StopLoss = 20;
public double TakeProfit = 40;
public double Offset = 5;
public double Spread = 5;
public int Slippage = 5;

public StopOrderStrategy()
: base()
{
base.Volume = 1;
}

protected override void OnRunning()
{
base.NewMyTrades += OnNewMyTrades;
base.StopOrderChanged += OnStopOrderChanged;

base.OnRunning();
}

protected override void OnStopping()
{
base.NewMyTrades -= OnNewMyTrades;
base.StopOrderChanged -= OnStopOrderChanged;

base.OnStopping();
}

protected override bool OnProcess()
{
if (base.ProcessState == StrategyProcessStates.Stopping)
{
base.CancelActiveOrders();

return false;
}

return true;
}

public void MakeTrade(OrderDirections direction)
{
double price = base.Security.GetMarketPrice(direction, MarketPriceTypes.Following);

Order order = base.CreateOrder(direction, price, this.Volume);

var strategy = new MarketQuotingStrategy(order, new Unit(), new Unit());
strategy.IsForts = true;
strategy.Start();
base.ChildStrategies.Add(strategy);
}

private void OnNewMyTrades(IEnumerable<MyTrade> trades)
{
foreach (var trade in trades)
{
File.AppendAllText("Trades.txt", trade.Trade.Time.ToString() + " " + trade.Order.Direction.ToString() + " " + trade.Trade.Price.ToString() + Environment.NewLine);
}

if (base.PositionManager.Position != 0)
{
// protect current position with stop order
CreateTakeProfitAndStopLimit();
}
}

private void OnStopOrderChanged(Order order)
{
File.AppendAllText("StopOrders.txt", "Stop Order: " + base.StopOrders.Count.ToString() + ": " + Environment.NewLine);
File.AppendAllText("StopOrders.txt", order.Time.ToString() + " " + order.Direction.ToString() + " " + order.Price.ToString() + Environment.NewLine);
}

private void CreateTakeProfitAndStopLimit()
{
MyTrade myTrade = base.MyTrades.Last<MyTrade>();
Trade trade = myTrade.Trade;
OrderDirections tradeDirection = myTrade.Order.Direction;

Unit offsetUnit = new Unit(this.Offset);
Unit spreadtUnit = new Unit(this.Spread);

OrderDirections direction = (tradeDirection == OrderDirections.Buy ? OrderDirections.Sell : OrderDirections.Buy);
double takeProfitPrice = trade.Price;
double stopLossLimitPrice = trade.Price;
double stopLossPrice = trade.Price;

if (tradeDirection == OrderDirections.Buy)
{
takeProfitPrice += this.TakeProfit;
stopLossLimitPrice -= this.StopLoss;
stopLossPrice = stopLossLimitPrice - this.Spread;
}
else
{
takeProfitPrice -= this.TakeProfit;
stopLossLimitPrice += this.StopLoss;
stopLossPrice = stopLossLimitPrice + this.Spread;
}

Order order = base.CreateOrder(direction, stopLossPrice, trade.Volume);
order.Type = OrderTypes.Conditional;
order.StopCondition = new QuikStopCondition
{
Type = QuikStopConditionTypes.TakeProfitStopLimit,
StopPrice = takeProfitPrice,
StopLimitPrice = stopLossLimitPrice,
Offset = offsetUnit,
Spread = spreadtUnit
};

base.RegisterOrder(order);
}
}
}


Котирование инициализирую после запуска стратегии методом MakeTrade из главного окна.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 05.11.2010
Ответить


[quote=Dmitriy Klimov]
Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай:
[/code]

Нашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.

К понедельнику выложу обновление.
Спасибо:

Dmitriy Klimov

Фотография
Дата: 08.11.2010
Ответить


Mikhail Sukhov
Нашел ситуацию, когда NewOrder + NewMyTrades у Strategy не вызывалось (бывает иногда так, что заявки приходят быстрее чем обновляет стоп). Если это Ваша ошибка, то хорошо. В остальном код рабочий. У меня стабильно вызывалось событие Strategy.StopOrderChanged. Если оно у Вас не вызывается, то я бы порекомендовал посмотреть на QuikTrader.ProcessDataError.

К понедельнику выложу обновление.


Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают. QuikTrader.ProcessDataError выводит только это:
Код
System.ArgumentException: Элемент с тем же ключом уже был добавлен.
в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qwlIQWfo3qufLtkzLgdg_0w==(IList`1 #=qxm4X8NPgjxU5efFmY7R3Lw==, Func`2 #=qVtb7jPsPoFV1EKgfGAxHlw==)
в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)
System.InvalidOperationException: Инструмент с кодом MRKHG для бумажной позиции не найден.
в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qXkUJcA3Ro6L4MDrPNg5BmA==(IList`1 #=qHmE5DnVpWK_g0VXdi3KT9A==, Func`2 #=qNjk1r8Yt4irfrN9i3uAhYw==)
в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)


Подписался еще на Strategy.Log. В нем тоже нет событий о выставлении стоп-заявки и ее исполнении. Хотя эта заявка успешно в Квик выставляется и исполняется. Уже не знаю, в какую сторону копать. Мистика какая-то. У вас работает, у меня - нет. Еще есть идеи?
Спасибо:

Mikhail Sukhov

Фотография
Дата: 08.11.2010
Ответить


Dmitriy Klimov

Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают.


На Вашем примере тестил. Так что видимо ошибка где-то в другом месте.

Dmitriy Klimov

QuikTrader.ProcessDataError выводит только это:


QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только.

Dmitriy Klimov

Код
System.ArgumentException: Элемент с тем же ключом уже был добавлен.
в System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
в Ecng.Trading.Quik.QuikTrader.
в Ecng.Trading.Quik.DdeTable.



Говорит о том, что по ДДЕ пришла два раза информация об одной и той же заявки (мало вероятно) или у вас в колонке TransId имеются дублирующиеся значения (более вероятно).

Dmitriy Klimov

Код
System.InvalidOperationException: Инструмент с кодом MRKHG для бумажной позиции не найден.
в Ecng.Trading.Quik.QuikTrader.#=qXtQgb_1Ivhr4cZlEBJS4ADM1O1bKVoCg9CtJr5uqcrk=.#=qXkUJcA3Ro6L4MDrPNg5BmA==(IList`1 #=qHmE5DnVpWK_g0VXdi3KT9A==, Func`2 #=qNjk1r8Yt4irfrN9i3uAhYw==)
в Ecng.Trading.Quik.DdeTable.#=qy8NUWUI7mXZMNnXZFsWcYg==(IList`1 #=qkc1RQGHvGXkONrB1lfHMpw==, Action`2 #=qe7FTlw34xv_zxSllAk2THw==, Action`1 #=qyr$xSlYGt0D7OlEnBcjGtw==)



Как насчет того, чтобы добавить инструмент в таблицу Инструментов?
Спасибо:

Dmitriy Klimov

Фотография
Дата: 09.11.2010
Ответить


Mikhail Sukhov
QuikTrader.ProcessDataError - это сигнал к тому, что что-то не то в программе. Тут не может быть только.

Отфильтровал таблицу "Позиции по бумагам" по счетам депо, ошибки исчезли. Но события от стоп-заявок так и не возникают. Что еще можно попробовать?
Спасибо:
<< < 3 4 5 6 7  > >>

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy