Skip to content

Commit

Permalink
Merge pull request #76 from AsyncAlgoTrading/iexstrats
Browse files Browse the repository at this point in the history
Iexstrats
  • Loading branch information
timkpaine committed Aug 11, 2020
2 parents f3773aa + 0dacd03 commit df97c7f
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 8 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,4 @@ aat.db
python_junit.xml
.mypy_cache
.vscode
private_config
9 changes: 9 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@ run: ## Clean and make target, run target
iex: ## Clean and make target, run target
$(PYTHON) -m aat ./config/iex.cfg

iexintraday: ## Clean and make target, run target
$(PYTHON) -m aat ./config/iex_intraday.cfg

iexpintraday: ## Clean and make target, run target
$(PYTHON) -m aat ./private_config/iex_intraday.cfg

iexlive: ## Clean and make target, run target
$(PYTHON) -m aat ./config/iex_live.cfg

ib: ## Clean and make target, run target
$(PYTHON) -m aat ./config/ib.cfg

Expand Down
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# AAT

<img src="https://raw.githubusercontent.com/AsyncAlgoTrading/aat/master/docs/img/icon.png" width="200px"></img>

[![Build Status](https://dev.azure.com/tpaine154/aat/_apis/build/status/AsyncAlgoTrading.aat?branchName=master)](https://dev.azure.com/tpaine154/aat/_build/latest?definitionId=19&branchName=master)
[![Coverage](https://img.shields.io/azure-devops/coverage/tpaine154/aat/19/master)](https://dev.azure.com/tpaine154/aat/_apis/build/status/AsyncAlgoTrading.aat?branchName=master)
Expand Down
31 changes: 24 additions & 7 deletions aat/strategy/sample/golden_death.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@


class GoldenDeathStrategy(Strategy):
def __init__(self, symbol, long_ma=30, short_ma=5, *args, **kwargs):
def __init__(self, symbol, long_ma=30, short_ma=10, bail_hour=15, bail_minute=45, *args, **kwargs):
super(GoldenDeathStrategy, self).__init__(*args, **kwargs)

# Long moving average size
Expand All @@ -29,6 +29,10 @@ def __init__(self, symbol, long_ma=30, short_ma=5, *args, **kwargs):
self._volume = 0
self._sell_order = None

# bail time
self._bail_hour = bail_hour
self._bail_minute = bail_minute

async def onStart(self, event: Event):
# Get available instruments from exchange
self.subscribe(Instrument(name=self._symbol, type=InstrumentType.EQUITY))
Expand All @@ -48,9 +52,13 @@ async def onTrade(self, event: Event):
if len(self._long_ma_list) < self._long_ma:
return

# dont trade in first 15 minutes
if self.now().hour == 9 and self.now().minute <= 45:
return

long_mvg_av = pd.Series(self._long_ma_list).rolling(self._long_ma, min_periods=self._long_ma).mean().iloc[-1]
short_mvg_av = pd.Series(self._short_ma_list).rolling(self._short_ma, min_periods=self._short_ma).mean().iloc[-1]

long_mvg_av = long_mvg_av + (long_mvg_av * .005)
# States
#
# Not Entered, Not Triggered -> if long_ma > short_ma -> Not Entered, Triggered (Wait for short av to move above)
Expand All @@ -59,18 +67,17 @@ async def onTrade(self, event: Event):
# Not Entered, Triggered -> if long_ma <= short_ma -> Entered, Triggered (BUY)
# Entered, Triggered -> if long_ma > short_ma -> Not Entered, Triggered (SELL)
# Entered, Triggered -> if long_ma <= short_ma -> Entered, Triggered (Wait for short to move below)

if not self._entered:
if not self._triggered:
if long_mvg_av > short_mvg_av:
# Not Entered, Not Triggered -> if long_ma > short_ma -> Not Entered, Triggered (Wait for short av to move above)
self._triggered = True
else:
# Not Entered, Not Triggered -> if long_ma <= short_ma -> Not Entered, Not Triggered (Not ready yet)
pass
self._triggered = False
else:
if long_mvg_av > short_mvg_av:
# Not Entered, Triggered -> if long_ma > short_ma -> Not Entered, Triggered (Wait for short to move above)
# Not Entered, Triggered -> if long_ma > sh`ort_ma -> Not Entered, Triggered (Wait for short to move above)
pass
else:
# Not Entered, Triggered -> if long_ma <= short_ma -> Entered, Triggered (BUY)
Expand All @@ -90,7 +97,7 @@ async def onTrade(self, event: Event):
else:
if long_mvg_av > short_mvg_av:
# Entered, Triggered -> if long_ma > short_ma -> Not Entered, Triggered (SELL)
if not self.orders(trade.instrument):
if not self._sell_order:
self._sell_order = Order(side=Side.SELL,
price=trade.price,
volume=self._volume,
Expand All @@ -101,7 +108,17 @@ async def onTrade(self, event: Event):
await self.newOrder(self._sell_order)
else:
# Entered, Triggered -> if long_ma <= short_ma -> Entered, Triggered (Wait for short to move below)
pass

# exit if time to bail
if not self._sell_order and self.now().hour == self._bail_hour and self.now().minute >= self._bail_minute:
self._sell_order = Order(side=Side.SELL,
price=trade.price,
volume=self._volume,
instrument=trade.instrument,
order_type=Order.Types.MARKET,
exchange=trade.exchange)
print('submitting sell order: {}'.format(self._sell_order))
await self.newOrder(self._sell_order)

async def onTraded(self, event: Event):
trade: Trade = event.target # type: ignore
Expand Down
Binary file added docs/img/icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit df97c7f

Please sign in to comment.