четверг, 19 декабря 2019 г.
вторник, 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 контрактов. Но тут мы обязаны на каждое движение сишки реагировать сделкой, т.е. что такое ДХ, это недопущение наращивания плеча. Растёт по модулю дельта — растёт реальное плечо позиции. Поэтому с переносом позиции через ночь, когда мы не можем регулировать это плечо, нельзя уходить с большим потенциально плечом.
Ну и тогда уместно вспомнить, что такое плечо. Плечо это чувствительность счета к рынку. В общем-то это почти дельта по смыслу и есть.
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, 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
}
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
}
суббота, 28 сентября 2019 г.
Moex Usefull References
Индикативные курсы валюты
Instrument Specidication
https://www.moex.com/ru/derivatives/currency-rate.aspx
https://www.moex.com/export/derivatives/currency-rate.aspx?language=ru¤cy=CAD/RUB&moment_start=2019-08-28&moment_end=2019-09-28
WebRequests ISSInstrument Specidication
https://iss.moex.com/iss/engines/futures/markets/forts/securities/SiZ9.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
Trade Results
Bars ISS
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
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ9/candles.json?from=2019-09-01&till=2019-09-30&interval=1&start=0
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ9/candles.xml?from=2019-09-01&till=2019-09-30&interval=1&start=0
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ9/candles.json?from=2019-09-01&till=2019-09-30&interval=1&start=0
http://iss.moex.com/iss/engines/futures/markets/forts/boards/RFUD/securities/SiZ9/candles.xml?from=2019-09-01&till=2019-09-30&interval=1&start=0
понедельник, 23 сентября 2019 г.
Updates GS.Trade
Strategy:
Z007:
CloseAll -> new SetOrder2
TimeHandler: Start_MorningSession: MorningSessionStartPrefix(); together with StartNewDayInit()
Z007:
CloseAll -> new SetOrder2
TimeHandler: Start_MorningSession: MorningSessionStartPrefix(); together with StartNewDayInit()
воскресенье, 15 сентября 2019 г.
Moex shut down, Transaction Reply Code, Important
19.09.13
https://www.moex.com/n25015/?nt=101
Transactions:
[GW][4018] - Администратор ... - проблемы на Moex, а не у Сервера Quik
ReplyCode = 4
https://www.moex.com/n25015/?nt=101
Transactions:
[GW][4018] - Администратор ... - проблемы на Moex, а не у Сервера Quik
ReplyCode = 4
воскресенье, 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();
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();
пятница, 30 августа 2019 г.
вторник, 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);
}
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;
}
}
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;
}
Подписаться на:
Комментарии (Atom)

