← Zurück

Стоп заявка

Добрый день. Сейчас фиксирую прибыль вот таким образом, просто выставляя лимитную заяку выше текущей цены цены на 30 рублей:

var order3 = new Order ; trader.RegisterOrder(order3); Но бывает так, что нужно в районе 30-ти рублей начать следить за ценой. Далее, например, при достижении 35 рублей при откате назад более чем на 3 рубля(до 32 рублей) выбросить лимитированную заявку с ценой 31,8. Т.е. эдакий трейлинг-стоп. Как это можно реализовать? Стратегии не используются.

Заранее спасибо!

War dieses Thema hilfreich?

Thema teilen

Kommentare (25)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

patermind
patermind Autor

Исходя из http://stocksharp.com/doc/html/a82865dd-98ed-4579-8f48-dd8f806c39e7.htm :

var order3 = new Order { Portfolio = _portfolio, Type = OrderTypes.Conditional, Volume = 5, Security = _instrument0, Direction = OrderDirections.Buy, StopCondition = new QuikStopCondition , }; trader.RegisterOrder(order3); Не работает - непонятно, что писать в Type = OrderTypes.Conditional Type = QuikStopConditionTypes.TakeProfit, ExpiryDate = this.ExpirationDate.SelectedDate, ActiveTime = this.ActiveTime,

Не могли бы вы подсказать, что я делаю неправильно и как поправить?

Mikhail Sukhov
Mikhail Sukhov

patermind: Не могли бы вы подсказать, что я делаю неправильно и как поправить?

Приведите настройки окна новой стоп заявки терминала Квик и я скажу как это сделать в коде.

patermind
patermind Autor

Прилагаю скриншот того, как выглядит заявка в версии Quik

http://s48.radikal.ru/i122/1106/52/0a0dbb268d45.jpg

Также прошу подсказать, как можно получить в рублях ТекСредства из таблицы Клиентский портфель. Пробовал _portfolio.CurrentAmount по подсказке с форума, и _portfolio.CurrentAmount.Value - возвращает всегда 0. Работаю на ММВБ. _portfolio.Name возвращает правильное имя торгового счета.

http://stocksharp.com/forum/1633/Svoistvo-Portfolio-u-position-v-sobytiiakh/ похожая, думаю, проблема у человека.

Mikhail Sukhov
Mikhail Sukhov

patermind: Прилагаю скриншот того, как выглядит заявка в версии Quik

http://s48.radikal.ru/i122/1106/52/0a0dbb268d45.jpg

Код выше должен корректен. Какие ошибки выдает код?

patermind: Также прошу подсказать, как можно получить в рублях ТекСредства из таблицы Клиентский портфель. Пробовал _portfolio.CurrentAmount по подсказке с форума, и _portfolio.CurrentAmount.Value - возвращает всегда 0. Работаю на ММВБ. _portfolio.Name возвращает правильное имя торгового счета.

http://stocksharp.com/forum/1633/Svoistvo-Portfolio-u-position-v-sobytiiakh/ похожая, думаю, проблема у человека.

Это особенности ММВБ и Квика.

patermind
patermind Autor

Mikhail Sukhov: Код выше должен корректен. Какие ошибки выдает код?

Это особенности ММВБ и Квика.

Сейчас не могу прислать ошибки, как буду у компа - вышлю.

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

Mikhail Sukhov
Mikhail Sukhov

patermind: т.е. получить текущий баланс счета невозможно?

Возможно. По той ссылке, что вы прислали, написано, как получать текущий баланс.

patermind
patermind Autor

Mikhail Sukhov:

patermind: т.е. получить текущий баланс счета невозможно?

Возможно. По той ссылке, что вы прислали, написано, как получать текущий баланс.

Если я правильно понял совет по ссылке, делаю

Console.WriteLine(trader.Portfolios.Any(p => p.CurrentAmount.Value > 0)); и получаю false. Не могли бы вы привести кусок кода?

patermind
patermind Autor

Выставляю стоп вот так:

var order1 = new Order
                                {
                                    Portfolio = _portfolio,
                                    Type = OrderTypes.Conditional,
                                    Volume = 5,
                                    Security = _instrument0,
                                    Direction = OrderDirections.Buy,
                                    StopCondition = new QuikStopCondition
                                    {
                                        Type = QuikStopConditionTypes.TakeProfit,
                                        ExpiryDate = DateTime.MaxValue,
                                        StopPrice = _instrument0.ShrinkPrice(_instrument0.BestBid.Price),
                                        Offset = 1,
                                        Spread = 0.02,
                                        ActiveTime = null,
                                    },
                                };

                                trader.RegisterOrder(order1);

получаю исключение:


16.06.2011 11:53:11 Ecng.Trading.Quik.ApiException: Код ошибки WrongSyntax Сообщение ACCOUNT=L01-00000F00; CLIENT_CODE=S#; TRANS_ID=42776524; CLASSCODE=EQBR; SECCODE=LKOH; QUANTITY=2; OPERATION=B; ACTION=NEW_STOP_ORDER; STOPPRICE=1761,3; EXPIRY_DATE=GTC; OFFSET=1; OFFSET_UNITS=PRICE_UNITS; SPREAD=0,02; SPREAD_UNITS=PRICE_UNITS; STOP_ORDER_KIND=TAKE_PROFIT_STOP_ORDER;
   в #=qIC0em_Y9ttPjTaH5wr0hvpkv3aFwj0mcqWF7VUdIyGgDQkOGVwQSHJIIeinlK4Kh.#=qCDnuvU0p0CmYCPNQKXjVgw==(Int32 #=qdHPN_yHFRnIcr2y57$QZhQ==, StringBuilder #=qkd$GlOpEqM23R4sq1opYsQ==)
   в #=q02UxtFgauWdhIXYFhRWq6VtvjMmAFpAfaARTqgq1_iM=.#=qT29nW$7XhRVru2DGAJ35k6fNpjLmr9Ele_hXAFXFvjA=(String #=qgMwZtGc9_lSOb6BuEDfw$A==, OrderStatus& #=q4OhwAp6Bp91L0oOCquhAOQ==, UInt32& #=q1Gak7Svd4JIb$RTAyb7eMw==, Int64& #=q5jtQ3tHDK6Hp5UbL3kchiw==, String& #=q6UEPR__avOY7mtynHNE46Q==)
   в Ecng.Trading.Quik.QuikTrader.#=qqAd0VW0iJb4GasgZxL8JSVy_pxzmQ1Tj65b3zqcRk1I=(Order #=q_bFETIlAa_FSSjI$vpvChQ==, TransactionBuilder #=qztYF4TzOhvmcC7KsmDFugw==)
   в Ecng.Trading.Quik.QuikTrader.OnRegisterOrder(Order order)
   в Ecng.Trading.Algo.BaseTrader.RegisterOrder(Order order)

ММВБ, аккаунт в исключении указывается правильный. что делать?

Mikhail Sukhov
Mikhail Sukhov

Я думаю дело в спреде.

patermind
patermind Autor

уже писал сообщение, что решил - не обращайте внимания. Спасибо! Дело действительно в спреде - нужно стаивть его согласно шагу цены инструмента. поставил 0,1 - и заработало. или 0 - тоже все ок.

а с балансом - как его забрать, подскажите плиз?

patermind
patermind Autor

need help for get balance! )))

Alexander
Alexander

patermind: need help for get balance! )))

Привидите скриншот таблицы из квика и все распечатку всех порфтелей которые приходят в квик

patermind
patermind Autor

Скриншот сделаю сегодня вечером и сразу выложу. А как вывести в консоль все портфели? У меня, если бы это получилось, наверное я бы смог выбрать с нужным балансом.

Alexander
Alexander

patermind: Скриншот сделаю сегодня вечером и сразу выложу. А как вывести в консоль все портфели? У меня, если бы это получилось, наверное я бы смог выбрать с нужным балансом.

подписываетесь на NewPortfolios, приходит коллекция портфелей. Для каждого печатаете всё что необходимо

patermind
patermind Autor

Alexander:

patermind: Скриншот сделаю сегодня вечером и сразу выложу. А как вывести в консоль все портфели? У меня, если бы это получилось, наверное я бы смог выбрать с нужным балансом.

подписываетесь на NewPortfolios, приходит коллекция портфелей. Для каждого печатаете всё что необходимо

Выглядит примерно вот так, как и в документации -


trader.NewPortfolios += portfolios =>
{
    if (_portfolio == null)
    {
        // находим sberbank и присваиваем ее переменной sber
        _portfolio = portfolios.FirstOrDefault(p => p.Name == account);

        if (_portfolio != null)
        {
            Console.WriteLine("Портфель {0} появился.", account);

            // если инструмент и стакан уже появились,
            // то извещаем об этом основной поток для выставления заявки
            if (_sber != null && _depth != null)
                waitHandle.Set();
        }
    }
};

куда здесь и что именно нужно добавить, чтобы вывелись все портфели?

Alexander
Alexander

patermind: куда здесь и что именно нужно добавить, чтобы вывелись все портфели?


trader.NewPortfolios += portfolios =>
{
//тут перебираем всю коллекцию portfolios с помощью foreach и выводим его поля
    if (_portfolio == null)
    {
//блаблабла
    }
};

patermind
patermind Autor

а что написать, чтобы все портфели вывелись?

Alexander
Alexander

patermind: а что написать, чтобы все портфели вывелись?

ну это уже чистый C#, тут секретов вроде и вопросов быть не должно

var portfolioString = "";
        foreach (var portfolio in portfolios)
        {
            portfolioString += portfolio.Name + " : " + portfolio.Exchange + " : " + portfolio.BeginAmount + " : " +
                               portfolio.CurrentAmount + " : " + portfolio.Commission + " : " + portfolio.Leverage + 
                               Environment.NewLine;
            portfolioString +=
        }

покажите строку portfolioString

patermind
patermind Autor

Благодарю!

L01-00000F00 : : 0 RUB : 0 RUB : 0 : 0;

вот такое вывел в лог.

portfolioString += portfolio.Name + " : " + portfolio.Exchange + " : " + portfolio.BeginAmount + " : " + portfolio.CurrentAmount + " : " + portfolio.Commission + " : " + portfolio.Leverage + ";\r\n";

т.е. нету там ничего, я так понимаю.

Alexander
Alexander

Благодарю!

L01-00000F00 : : 0 RUB : 0 RUB : 0 : 0;

вот такое вывел в лог.

portfolioString += portfolio.Name + " : " + portfolio.Exchange + " : " + portfolio.BeginAmount + " : " + portfolio.CurrentAmount + " : " + portfolio.Commission + " : " + portfolio.Leverage + ";\r\n";

т.е. нету там ничего, я так понимаю.

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

ещё так скриншота портфелей и не увидел :)

patermind
patermind Autor

Прошу прощения, забыл. Прилагаю скриншот из Квика - http://s001.radikal.ru/i193/1106/10/1270a893e96a.jpg

Рбаотаю на ммвб на боевом сервере, 80.253.20.46

если не получится из квика подтягивать - буду примерную цифру писать в конфиге робота, и менять ее раз в неделю. но это топорный вариант, не хотелось бы.

Alexander
Alexander

patermind: Прошу прощения, забыл. Прилагаю скриншот из Квика - http://s001.radikal.ru/i193/1106/10/1270a893e96a.jpg

Рбаотаю на ммвб на боевом сервере, 80.253.20.46

если не получится из квика подтягивать - буду примерную цифру писать в конфиге робота, и менять ее раз в неделю. но это топорный вариант, не хотелось бы.

так посмотрите на заголовок таблицы ("Клиентский портфель #0"), на столбцы и сравните с тем, что указано в документации. сходств не вижу :)

да величина депозита с ММВБ легко подтягивается, просто у вас квик не настроен судя по всему.

patermind
patermind Autor

вы наверное не поняли. или я неверно показал скриншот, вот новый - http://s19.radikal.ru/i192/1106/8f/720c3eb039d5.jpg

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

мне вот тут мысль пришла: может у меня дде экспорт не включен на эту таблицу? проверил, было

trader.Terminal.StartDde(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable, trader.StopOrdersTable, trader.OrdersTable);стало trader.Terminal.StartDde(trader.SecuritiesTable, trader.MyTradesTable, trader.EquityPositionsTable, trader.StopOrdersTable, trader.OrdersTable, trader.EquityPortfoliosTable);

проверил - не помогло :(

patermind
patermind Autor

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

P.S. ничего не получилось. пробовал trader.StartExport(), не помогло. не знаю, что делать...

patermind
patermind Autor

Сделал вот так, заработало!

trader.NewPortfolios += portfolios => { foreach (var portfolio in portfolios) { if (portfolio.Name == "MC0********") { balance = portfolio.CurrentAmount.Value;

                            }
                        };
                        if (_portfolio == null)
  					{

всем спасибо за помощь!