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

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


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

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

Tags:


Thanks:


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

Avatar
Date: 10/28/2010
Reply


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


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

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

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


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

Но вот у Strategy- глухо.
Thanks:

sergun

Avatar
Date: 11/1/2010
Reply


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

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

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

Dmitriy Klimov

Avatar
Date: 11/1/2010
Reply


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

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

Mikhail Sukhov

Avatar
Date: 11/2/2010
Reply


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

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


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

Code
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();


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

Mikhail Sukhov

Avatar
Date: 11/2/2010
Reply


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.

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

Dmitriy Klimov

Avatar
Date: 11/2/2010
Reply


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

Code
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();


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

Да, по сути делаю все то же самое. Написал даже отдельную тестовую стратегию, которая после котирования выставляет такую условную заявку. В Квике заявка появляется и срабатывает, но в стратегии ни одно событие на нее не реагирует. Ума не приложу, что не так. Привожу полный код стратегии на всякий случай:
Code
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 из главного окна.
Thanks:

Mikhail Sukhov

Avatar
Date: 11/5/2010
Reply


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

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

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

Dmitriy Klimov

Avatar
Date: 11/8/2010
Reply


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

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


Михаил, я обновился до последней версии S#, но у меня события Strategy.NewStopOrder и Strategy.StopOrderChanged так и не возникают. QuikTrader.ProcessDataError выводит только это:
Code
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. В нем тоже нет событий о выставлении стоп-заявки и ее исполнении. Хотя эта заявка успешно в Квик выставляется и исполняется. Уже не знаю, в какую сторону копать. Мистика какая-то. У вас работает, у меня - нет. Еще есть идеи?
Thanks:

Mikhail Sukhov

Avatar
Date: 11/8/2010
Reply


Dmitriy Klimov

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


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

Dmitriy Klimov

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


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

Dmitriy Klimov

Code
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

Code
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==)



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

Dmitriy Klimov

Avatar
Date: 11/9/2010
Reply


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

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

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy