вторник, 5 ноября 2019 г.

Options, Discussion

https://smart-lab.ru/blog/572246.php

Kot_Begemot, вы спросили лучше, чем я отвечу.
Ну вот смотрите. Я строю оценку справцены опциона. В принципе любого страйка, но интересен ЦС. У меня есть оценка по монте-карло, есть оценка как коэфф на волатильность, потому что от ЦС БА в среднем убегает на корень из времени на сигму. Там не совсем корень как оказалось. С учетом этих поправок получаю коэффициенты и модель. В итоге могу получить число, сравнить его с тем, что есть в стакане, чтобы представлять, на сколько я могу дороже продать. Моя оценка хорошая тем, что я её отбэктестил вдоль и поперек, посмотрел, сколько теряется в апреле 2018, в марте 2014, в 2008 и в 2011 году. Итого вывод. С плечами торговать нельзя. Исходя из бэктеста я могу примерно оценить вероятность 20-30-50% дродауна и выбрать подходящее плечо. 

Ну и есть два сценария: 1. Мы продаем до экспирации и терпим без ДХ. 2. Мы продаем больше и постоянно делаем ДХ. 

Для меня ключевое простейшее уравнение:
финрез на экспирацию = премия проданного страйка — насколько уйдет БА от проданного страйка. Прелесть такой конструкции для бэктеста в том, что всё можно просчитать без ошибок, если не ошибиться в вычислениях типа 2*2=4.

Алексей Теперев, сколько на споте сможешь купить, столько и «без плеча»..
1млн. примерно 15тыр. долл.на споте… Это 15шт. фьючей или 15шт. проданных опционов…

Алексей Теперев, ну сам посчитать не можешь?
Недельки по 300руб можно продать в среднем… 15х300=4500руб в неделю..
в месяце 4 недели: 4500х4=18000руб в мес… в год 18000х12=216000
216тыр с ляма это вероятно возможная доха с продаж(если счет обычный еще -13% налог)… это больше 6% ОФЗ с ляма или как?

Алексей Теперев, если войдет в деньги на 500пп., то минуса не будет… насыпят фьючей + премия 300… минус -200 будет если их фиксануть тут же… Далее возможны варианты:
1-подождать пока фьюч дернет вверх на 200пп. и закрыть неделю в ноль..
2-подождать пока фьюч дернет на 500пп и забрать свое..
3- продать уже покрытые колы (они чуть дороже при той же воле, по 400-420, т.е. ожидаемый профит 400-200=200)..
4- забить пока на минусующие фьючи и продать все равно путов, т.е. взять 2 плечо, что я лично считаю довольно безопасно..
5- комбинации вариантов..
Более того, ГО под 15 фьючей = 60тыр… т.е. достаточно на срочке держать 15 ну 20% от ляма, а остальное в ОФЗ-шках под 6%..
Ну а так -то конешно, сложнее все на практике… но доходность по любому выше можно вытянуть..

Алексей Теперев, это просто. 64000 рублей это номинал контракта. Делим 1000000 на 64000, получаем 15 контрактов. Вот столько можно продать без плеча. Ну и примерно можно считать прибыль и риски. 264*15=3960 рублей, почти полпроцента от миллиона за неделю — очень хорошая доходность. Какой риск? Берем текущую волатильность, сколько там она? процентов 6 годовых? Значит за неделю это 64000*6*sqrt(1/52)/100=532 рубля на контракт. Многовато? Значит мало продать путы, надо продать и колы. Тогда позиция имеет смысл. При только проданных путах у нас всё же направленная позиция.

Если мы делаем ДХ, то начинаются проблемы.
Принципиально два сценария. Если не переносим позиции через клиринг и на ночь мы в кэше, то можно плечо рассматривать как плечо на волатильность, а не номинал контракта. Тут сколько ГО хватит на покрытую продажу. Что-то типа 250 контрактов по номиналу. Но! У нас возможны планки и поднятие ГО. Значит уменьшаем до хотя бы 100 контрактов. Но тут мы обязаны на каждое движение сишки реагировать сделкой, т.е. что такое ДХ, это недопущение наращивания плеча. Растёт по модулю дельта — растёт реальное плечо позиции. Поэтому с переносом позиции через ночь, когда мы не можем регулировать это плечо, нельзя уходить с большим потенциально плечом.

Ну и тогда уместно вспомнить, что такое плечо. Плечо это чувствительность счета к рынку. В общем-то это почти дельта по смыслу и есть.

пятница, 11 октября 2019 г.

Moex, Projects

D:\VC\1305\gs.trade\GS.Moex

Moex, ISS

http://iss.moex.com/iss/reference/

https://www.moex.com/a2193
https://www.moex.com/s205

Примеры
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ0.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/Si64500BI9D.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/Si64500BU9D.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/Si65000BI9D.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/Si64500BV9.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/Si65000BJ9.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/BR55BK9.xml

Trade Results
https://www.moex.com/ru/derivatives/contractresults-exp.aspx?day1=20190927&day2=20191219&code=Si-12.19

History
https://iss.moex.com/iss/history/engines/futures/markets/options/securities/BR68BU9/candles.json?from=2019-09-01&start=0
https://iss.moex.com/iss/history/engines/futures/markets/forts/securities/BRU9/candles.json

iss.moex.com/iss/history/engines/futures/markets/forts/securities.json?assetcode=SI

Trades:
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ9/trades.json?start=0&limit=10

Candles:
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ9/candles.csv?from=2019-09-01&till=2019-09-30&interval=1&start=0

CandleBorders:
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ9/candleborders.xml

History
https://iss.moex.com/iss/history/engines/futures/markets/forts/securities/SiZ9.xml?from=2018-10-01&till=2019-12-30

http://iss.moex.com/iss/reference/

Sequence
http://iss.moex.com/iss/engines.xml
https://iss.moex.com/iss/engines/futures/markets.xml
{
https://iss.moex.com/iss/engines/futures/markets/forts.xml
https://iss.moex.com/iss/engines/futures/markets/forts/securities.xml
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ9.xml
}
{
https://iss.moex.com/iss/engines/futures/markets/options.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities.xml
https://iss.moex.com/iss/engines/futures/markets/options/securities/Si64500BV9.xml
}
Sequence
{
https://iss.moex.com/iss

}


Plaza, Moex, CGate

понедельник, 23 сентября 2019 г.

воскресенье, 8 сентября 2019 г.

GS.Trade.TradeTerminals

Updates in Strategies

SendTransactions,
ClearTransactions
1. OrderQueue2.cs
Clear All Queue

(Rejected only Transaction with SetOrder.
And Remove this Orders)

TransactionsReply:
File: QuikTradeTerminal.cs
Last Handler: TransactionReplyResolve(IEventArgs1 args)

Requirements Specification in Brief
1. NotConnecton:
{
TradeTerminal:  Clear All TransactionQueue
Strategy: ActiveOrdersCollection:
1. Remove Orders.Where(o=>o.TransactionOperation == SetOrder)
if(TransactionStatus == NotConnected)
OrderStatus = REJECTED and then will be REMOVED
Natural Delae after NotConnected: After TimeIntTime Strategy will Register new Order in NEW MARKET CONDITIONS AFTER CONNECTION RESTORE
2. Remain NoSended.Orders.ActiveOrders.Where(o=>o.TransactionOperation == CancelOrder);
ReTryToCancelActiveOrders in MainBase Cycle.
3.ReSend Order Registered only after Cancel all Previouse Orders.
After NotConnected need new Order in new Market conditions.
}

MainBase()
{
            EventHub?.DeQueueProcess();
            // Filled, Canceled, Rejected, NotSent
            RemoveClosedOrders();
            ReTryToCancelActiveOrders();
            RemoveOrdersSendedTimeOut(DateTime.Now) = 5 minutes;

            Main();
}

Total:
1. Удалены все Filled, Cancel, NosSended( Rejected) RemoveClosedOrders();
2. Все Активные ордера, требующие отмены, если не было Коннекта,
пытаются в Main ReTryToCancelActiveOrders();

19.09.15
           EventHub?.DeQueueProcess();
            // Remove Filled, Canceled, Rejected, NotSent
            RemoveClosedOrders();
            // Remove OrdersRegisteredReadyToUse When No Connection
            RemoveRegisteredWhenNoConnection(string.Empty);
            RemoveOrdersSendedTimeOut(DateTime.Now);
            // ReTry Cancel ActiveOrdersSoftReadyToUse which Not Seneded
            ReTryToCancelActiveOrders();
            // ReTry SetOrder2 for RegisteredReadyToUse in AciveOrderCollection (PocketOrder Implementation)
            TryToSetOrderRegisteredPending();




вторник, 27 августа 2019 г.

Process in TradeTerminals on the ProcessTask

ProcessTask:
public sealed partial class QuikTradeTerminal
    {
        public bool IsProcessTaskInUse { get; set; }
        [XmlIgnore]
        public ProcessTask<IEventArgs1> ProcessTask { get; private set; }
        private void SetupProcessTask()
        {
            if (!IsProcessTaskInUse)
            {
                Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY, ParentName, Name,
                MethodBase.GetCurrentMethod().Name, "ProcessTask Will NOT BE USED",
                ToString());
                return;
            }
            ProcessTask = new ProcessTask<IEventArgs1>
            {
                Parent = this,
                TimeInterval = 1000,
                IsEveryItemPushProcessing = true,
                ItemProcessingAction = ItemProcessingAction,
                IdlingCycleAction = ProcessTaskIdleAction
            };
            ProcessTask.Init();

            Evlm2(EvlResult.SUCCESS, EvlSubject.TECHNOLOGY, ParentName, Name,

                 MethodBase.GetCurrentMethod().Name, "ProcessTask IS USED NOW",
                 ProcessTask?.ToString());
        }
        public void Start()
        {
            SetupProcessTask();

            if(IsProcessTaskInUse)

                ProcessTask?.Start();
        }
        public void Stop()
        {
            if (IsProcessTaskInUse)
                ProcessTask?.Stop();
        }
        // ************************************************
        // ProcessTask Actions
        private void ItemProcessingAction(IEventArgs1 args)
        {
            try
            {
                args.ProcessingAction(args);
            }
            catch (Exception e)
            {
                SendException(e);
            }
        }
        // AdditionalWorks in IdlingCycleAction
        private void ProcessTaskIdleAction()
        {
            TradeResolveProcess2();
            OrderResolveProcess();
        }
    }

Process in TradeTerminal to linear Execution:
1. SendTransaction From Queue:

        public void SendTransaction(IQuikTransaction t)

        {
            if (t == null)
                return;

            if (IsProcessTaskInUse)

            {
                var eargs = new EventArgs1
                {
                    Process = "QuikTransactionsProcess",
                    Category = "QuikTransactions",
                    Entity = "TransactionSend",
                    Operation = "AddOrUpdate",
                    Object = t,
                    ProcessingAction = SendTransactionFromQueue
                };
                ProcessTask?.EnQueue(eargs);
            }
            else
                TransactionQueue.Push(t);
        }
2. Clear Transactions From Queue when Terminal is NOT_CONNECTED

public void ClearTransactionFromQueue()

        {
            if (IsProcessTaskInUse)
            {
                var eargs = new EventArgs1
                {
                    Process = "QuikTransactionsProcess",
                    Category = "QuikTransactions",
                    Entity = "TransactionClear",
                    Operation = "AddOrUpdate",
                    ProcessingAction = ClearOrderTransactionQueue3
                };
                ProcessTask?.EnQueue(eargs);
            }
            else
                ClearOrderTransactionQueue3(null);
        }

понедельник, 22 июля 2019 г.

TradeTerminalQuik Restore PocketOrder

Every Second from Strategy
public void MainBase()
        {         
            RemoveFilledOrders();
            SetPocketOrder();
            Main();
        }

private void RemoveFilledOrders()
        {         
            foreach (IOrder3 o in ClosedOrders)
            {
                ActiveOrderCollection.Remove(o);
            }
            // Remove All with TimeOut
            foreach (var o in ActiveOrderCollection.Items.Where(o=>o.IsRegisteredTimeOutExpired))
            {
                ActiveOrderCollection.Remove(o);
                Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY, StrategyTimeIntTickerString,
                    o.ShortInfo, "Remove(RegisteredTimeOutExpired)", o.ShortDescription,o.ToString());
            }
        }
Z007 Every Second
public override void SetPocketOrder()
        {
            if (PocketOrder == null)
                return;
            if (ActiveOrderCollection.Items.Any())
            {
                Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY, StrategyTimeIntTickerString, "Not Alowed Pocket" + PocketOrder.ShortInfo, PocketOrder.ShortDescription, "Not Alowed Due to Orders Exist", PocketOrder.ToString());
                foreach (var o in ActiveOrderCollection.Items)
                {
                    Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY, StrategyTimeIntTickerString, "Extra" + o.ShortInfo, o.ShortDescription, o.ToString(), "");
                }
                return;
            }

            ActiveOrderCollection.RegisterOrder(PocketOrder);
            TradeTerminal.SetLimitOrder(PocketOrder);

            Evlm2(EvlResult.SUCCESS, EvlSubject.TECHNOLOGY, StrategyTimeIntTickerString, "Set Pocket"+PocketOrder.ShortInfo, PocketOrder.ShortDescription, PocketOrder.ToString(), "");

            PocketOrder = null;
        }

From Z007 EveryBar

RemoveOrdersRegistered();

            KillAllOrders2();

            #region ValidOrdersSoft  
            // ValidSoft Order
            //public bool IsValidSoft => Status == OrderStatusEnum.Activated ||
            //                       Status == OrderStatusEnum.Sended ||
            //                       Status == OrderStatusEnum.Registered ||
            //                       Status == OrderStatusEnum.Confirmed ||
            //                       Status == OrderStatusEnum.PartlyFilled ||
            //                       Status == OrderStatusEnum.PendingToActivate;
            #endregion
            if (ValidOrdersSoft.Any())
            {
                foreach (var ord in ValidOrdersSoft.ToList())
                {
                    Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY,
                        StrategyTimeIntTickerString, "Extra" + ord.ShortInfo, ord.ShortDescription,
                        "SetOrder(Active Or Pending Orders Detected)", ord.ToString());
                }

                 PocketOrder = ActiveOrderCollection
                                .CreateOrder(this, operation, OrderTypeEnum.Limit, 0, _currentLimitPrice, contract, "");

                Evlm2(EvlResult.WARNING, EvlSubject.TECHNOLOGY, StrategyTimeIntTickerString,
                        "Try to Set Pocket" + PocketOrder.ShortInfo , PocketOrder.ShortDescription,
                         PocketOrder.ToString(), "");


                return;


protected void KillAllOrders2()
        {
            RemoveFilledOrders();

            try
            {
                foreach (IOrder3 o in ActiveOrdersSoft)
                {
                    TradeContext.Evlm(EvlResult.INFO, EvlSubject.TECHNOLOGY,
                        StrategyTimeIntTickerString, o.ShortInfo, o.ShortDescription,
                        "Try To KILL ORDER", o.ToString());
                    if (o.IsLimit)
                    {
                        TradeTerminal.KillLimitOrder(o);
                    }
                    else if (o.IsStopLimit)
                        TradeTerminal.KillStopOrder(Ticker.ClassCode, Ticker.Code, o.Number);
                }
            }
            catch (Exception e)
            {
                SendExceptionMessage3(StrategyTickerString, "Strategy.KillAllOrder2()", "", "", e);
                // throw;
            }
        }



понедельник, 15 июля 2019 г.

Strategy 212

case 212:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = Ticker.ToMinMove(Ma, +1);                           
                                boo = true;
                                }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = Ticker.ToMinMove(Ma, -1);                           
                                boo = true;
                            }
                            break;
                        // Flat + Impulse
                        case 2120:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = IsFlat
                                    ? Ticker.ToMinMove(Ma, +1)
                                    : Ticker.ToMinMove((Ma + High) / 2.0d, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = IsFlat
                                    ? Ticker.ToMinMove(Ma, -1)
                                    : Ticker.ToMinMove((Ma + Low) / 2.0d, -1);
                                boo = true;
                            }
                            break;
                        // Flat + Impulse
                        case 2123:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = IsImpulse
                                    ? Ticker.ToMinMove(Ma, +1)
                                    : Ticker.ToMinMove((Ma + High) / 2.0d, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = IsFlat
                                    ? Ticker.ToMinMove(Ma, -1)
                                    : Ticker.ToMinMove((Ma + Low) / 2.0d, -1);
                                boo = true;
                            }
                            break;
                        // ATR
                        case 2124:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = ((Atr2)Atr).IsSlowHigher
                                    ? Ticker.ToMinMove(Ma, +1)
                                    : Ticker.ToMinMove((Ma + High) / 2.0d, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = ((Atr2)Atr).IsSlowHigher
                                    ? Ticker.ToMinMove(Ma, -1)
                                    : Ticker.ToMinMove((Ma + Low) / 2.0d, -1);
                                boo = true;
                            }
                            break;
                        // ATR
                        case 2125:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = ((Atr2)Atr).IsFastHigher
                                    ? Ticker.ToMinMove(Ma, +1)
                                    : Ticker.ToMinMove((Ma + High) / 2.0d, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = ((Atr2)Atr).IsFastHigher
                                    ? Ticker.ToMinMove(Ma, -1)
                                    : Ticker.ToMinMove((Ma + Low) / 2.0d, -1);
                                boo = true;
                            }
                            break;

                        // Impulse
                        case 2121:
                            if (operation > 0)
                            {
                                comment = "Buy (MA+High)/2";
                                price = Ticker.ToMinMove((Ma + High) / 2.0d, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell (Ma+Low)/2";
                                price = Ticker.ToMinMove((Ma + Low) / 2.0d, -1);
                                boo = true;
                            }
                            break;
                        // Flat
                        case 2122:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = Ticker.ToMinMove(Ma, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = Ticker.ToMinMove(Ma, -1);
                                boo = true;
                            }
                            break;
                        case 221:
                            if (operation > 0)
                            {
                                comment = "Buy (MA+Low)/2";
                                price = Ticker.ToMinMove( (Ma + Low)/2.0d, +1);                   
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell (Ma+Hihg)/2";
                                price = Ticker.ToMinMove( (Ma + High)/2.0d, -1);
                                boo = true;
                            }
                            break;
                        case 19:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = Ticker.ToMinMove(Ma, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = Ticker.ToMinMove(Ma, -1);
                                boo = true;
                            }
                            break;
                        default:
                            if (operation > 0)
                            {
                                comment = "Buy MA";
                                price = Ticker.ToMinMove(Ma, +1);
                                boo = true;
                            }
                            else if (operation < 0)
                            {
                                comment = "Sell Ma";
                                price = Ticker.ToMinMove(Ma, -1);
                                boo = true;
                            }
                            break;
                    }