← Atrás

Стоп заявка

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

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

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

¿Le resultó útil este tema?

Compartir tema

Comentarios (25)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

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)
  					{

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