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


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


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

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

Теги:


Спасибо:




82 Ответов
< 1 2 3 4  >
Dmitriy Klimov

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


Нашел лог с последних торгов. Strategy.NewOrder от условных стоп-заявок тоже не возникает...
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 24.10.2010
Ответить


Dmitriy Klimov
Регистрирую через Strategy.RegisterOrder. При этом такая заявка не попадает в Strategy.StopOrders


В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder.
Спасибо:

Dmitriy Klimov

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


Mikhail Sukhov
В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder.

Проверял при возникновении события BaseTrader.StopOrdersChanged. По идее, раз это событие возникает, то в Strategy.StopOrders что-то должно быть. Но массив был всегда пустой....
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 24.10.2010
Ответить


Dmitriy Klimov
Mikhail Sukhov
В StopOrders она попадет после успешной регистрации, то есть когда будет событие Strategy.NewStopOrder.

Проверял при возникновении события BaseTrader.StopOrdersChanged. По идее, раз это событие возникает, то в Strategy.StopOrders что-то должно быть. Но массив был всегда пустой....


Приведите весь код проверки. Такое быть не может. В начале идет добавление в коллекцию Strategy.StopOrders, затем уже вызов события. Хоть что-то, но должно быть. Иначе и вызова не будет.
Спасибо:

Dmitriy Klimov

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


Mikhail Sukhov
Приведите весь код проверки. Такое быть не может. В начале идет добавление в коллекцию Strategy.StopOrders, затем уже вызов события. Хоть что-то, но должно быть. Иначе и вызова не будет.

Делаю так:
Код

class MyStrategy : Strategy
{
protected override void OnRunning()
{
Trader.StopOrdersChanged += OnStopOrderChanged;

base.OnRunning();
}

private void OnStopOrderChanged(IEnumerable<Order> orders)
{
File.AppendAllText("StopOrders.txt", "Stop orders: " + base.StopOrders.Count.ToString() + Environment.NewLine);
}
}


До этого еще пытался подписываться на Strategy.StopOrderChanged, но это событие так ни разу и не возникло. Условные стоп-заявки в Квике выставляются и исполняются нормально, только вот мой робот об этом ничего не знает Confused Что-то делаю не так?
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 25.10.2010
Ответить


Dmitriy Klimov

До этого еще пытался подписываться на Strategy.StopOrderChanged, но это событие так ни разу и не возникло. Условные стоп-заявки в Квике выставляются и исполняются нормально, только вот мой робот об этом ничего не знает Confused Что-то делаю не так?


И не нужно было с Strategy.StopOrderChanged уходить, потому что это как раз правильное событие. А как регистрируете заявку?
Спасибо:

Dmitriy Klimov

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


Mikhail Sukhov
И не нужно было с Strategy.StopOrderChanged уходить, потому что это как раз правильное событие. А как регистрируете заявку?

В стратегии регистрирую так:
Код

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);
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 25.10.2010
Ответить


Сорри за длительные интервалы в ответах. Сейчас занят новой версией...

Да, багу нашел. В текущей фиксить не хочу, так как отнимет время. 2.5 планирую выпустить на этой неделе. Нормально?
Спасибо:

sergun

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


Mikhail Sukhov
Сорри за длительные интервалы в ответах. Сейчас занят новой версией...

Да, багу нашел. В текущей фиксить не хочу, так как отнимет время. 2.5 планирую выпустить на этой неделе. Нормально?


Михаил, а бага касается и моей проблемы, проявившейся в асинхронном режиме?
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 25.10.2010
Ответить


А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.
Спасибо:

Dmitriy Klimov

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


Mikhail Sukhov
А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.

Да, так и поступлю. Сделаю простейший робот для теста.
Спасибо:

sergun

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


Mikhail Sukhov
А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.


Да, стабильно, не из разряда гайзенбаг :-) Разгребу дела и попробую.

Смотрю, Дмитрий тоже решил заняться этим вопросом ;)
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 25.10.2010
Ответить


Dmitriy Klimov
Mikhail Sukhov
А вот тут нет. Я так и не нашел багу. Сам лично работают только в аинхронном режиме (стопы вообще не использую). Ни не встречал, чтобы не приходили нотификации. У Вас стабильно не приходит событие (если да, то это будет совсем просто)? Может поробуете локализовать проблему? Сделайте небольшую программу с одной стратегией и регистрацией заявки. Если все работает - добавляйте логику из текущего робота.

Да, так и поступлю. Сделаю простейший робот для теста.


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

Dmitriy Klimov

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


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

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

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 27.10.2010
Ответить


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

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


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

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 - это сигнал к тому, что что-то не то в программе. Тут не может быть только.

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

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

loading
clippy