Ho Ho Ho- 8 months after the release of the last version I hereby proudly present
It is an Ichimoku-based trading system originally developed in libreoffice/ openoffice basic macro language and rewritten in C from scratch. To immediately jump to the shiny new page, use: The Ichinscratchy trading system (or continue reading to find out about the new features).
This release contains many brand new features and might be followed by some maintenance releases that do some polish and/or fix bugs. Most prominent new features include a complete money management system that is aware of an account currency, can handle markets in different currencies and does the per-position risk-management in the account currency. Besides that the new version introduces two different market regime filters that are targeted towards filtering out sideways markets, more verbose outputs, a new way to access the database using a wrapper script that will execute pre-canned sql scripts and a lot more. See the complete changelog at the end of this article.
Actually most of the code was stable (stable in a sense of "does the job for me as I roughly intended") since October. Ever since then I wanted to do some documentation cleanup, write a LOT more documentation (especially the "first steps" part needs extensive care, as I am aware of the fact that the software is not an easy "click and forget" one- in short: make it more accessible and user friendly. But as time went by, I found myself busy with my work, my family and other commitments while above actions somewhat stalled. Now I decided to release at is, because I think it is still far better than nothing. Maybe I will add the missing information piece-by-piece, maybe not (in this case I will continue working on the software).
The part of that release that I am most proud of is the introduction of the "money"-concept to the system. Before that, the software had no clue of underlying market currencies, account currencies, wins/losses in terms of money etc. All changes were in % for each market separate. To change that I had to dig deep within the entrails of the code, parts that I did not touch since writing them in early 2016- which again showed me how far I have come in terms of programming (translation: I used to be no programmer, now I became a lousy one).
changes in 0.3.0 from v0.2.1
- changed symbol file contents and layout, new symbol file includes information that is needed for money management:
comments still start with a '#', can be as a separate comment line or at the end of a line.
# Indices ========================================================================================= #symbol filename tradeable? ticks/pips contract size cur type # comment #-------------------------------------------------------------------------------------------------- DAX DAX.csv 1 0.01 1 EUR CFDFUT # DAX30 DJI DOW.csv 1 0.01 1 USD CFDFUT # Dow Jones # Futures ========================================================================================= #symbol filename tradeable? ticks/pips contract size cur type # comment #-------------------------------------------------------------------------------------------------- #BuFu BuFu.csv 1 0.01 1 EUR CFDFUT # Euro Bund Future # Forex =========================================================================================== #symbol filename tradeable? ticks/pips contract size cur type # comment #-------------------------------------------------------------------------------------------------- EURJPY EURJPY.csv 1 0.001 100000 EUR CFDCUR # Euro/ Japanese Yen EURUSD EURUSD.csv 0 0.00001 100000 EUR CFDCUR # Euro/US Dollar
Basic parsing and sanity checks are implemented, still user has to put some thought into the config. This change breaks compatibility of the symbol file with former releases.
- changed/ new program start parameters:
- added command line option
-c/--configfilewhich specifies the name of the configuration under
/config. This allows to run several systems/configurations from within one main folder (adjust database name accordingly)
- when using verbose option
-v/--verbosethe program now spits out the account info (balance, equity and risk- free equity) each day, together with the already known buy-/sell signals.
- when using the portfolio option
-p/--portfoliothe program shows the current account info (balance, equity and risk- free equity) in account currency, for each position current value (and risk free value) is shown
- when using the report option
-r/--reportall wins/losses are now calculated in account currency
- added command line option
- database changes: Please note that the changes mentioned below break compatibility with prior program versions!
- changed all
decimal(x,y). With float under certain circumstances strange behaviour occured, as floats are not represented/stored exactly. Fixed decimals are exact representations instead.
- added new table
accountthat stores some values which are needed to calculate profit/losses, your current cash, equity and such. The table hosts variables with their corresponding values. As in theory this table can store arbitrary variables and values, the following variables are currently needed by the program (and expected in the table):
- balance (current free cash in account)
- equity (free cash plus current value of positions- if sold right NOW)
- risk_free_equity (free cash plus current value of positions if all their stop losses were hit NOW)
- virgin_flag (initialized with 1 when creating db, valid until first position is bought- after that 0)
- added new table
currency_translationthat holds all information for translations from/to account currency
- added new fields to indicators_daily:
- the tables
ichimoku_daily_signalsnow have an additional column: daynr, which holds the date as "days since 1900-01-01"
- the table
orderbook_dailynow has 2 price fields:
pricewhich holds the price in the symbol´s currency and
cost_per_itemwhich holds the buying price in account´s currency
- the table
portfolionow has 3 price fields:
price_lastwhich hold the buying and the latest price in market´s currency and
cost_per_itemwhich holds the buying costs in accounts currency
- changed all
- changed/new config file options:
ACCOUNT_CURRENCY. This parameter sets the currency of your account. Currently implemented and valid values are:
- EUR (Euro)
- USD (US Dollar)
- JPY (Japanese Yen)
INDI_ADX_PERIOD. This option specifies the period, over which the ADX shall be smoothed. Basically, the ADX is an exponential average of the DMI, which in turn contains the ATR, an exponential average of the True Range.
INDI_ADX_PERIODspecifies the number of periods in those exponential moving averages. Default 14
SIGNAL_REGIME_FILTER. This option switches the market regime filter on (and choses which one to use). In sideways/non- trending markets signals will not be executed, resulting in lower trading frequency but higher quality signals. Following options are valid:
none (Turn market regime filter off)
ADX (Use Average Directional Index)
TNI (Trend Normality Indicator by @tasciccac)
SIGNAL_REGIME_FILTERis set to ADX, this option specifies the threshhold under which a market will be considered as sideways (=trendless). In this case signals in this specific market won't be executed. Default is 30.
STARTING_BALANCE, which sets starting account balance at begin of backtest/live trading
RISK_PER_POSITIONwhich sets risk of a new position in % of current equity. In conjunction with the calculated initial stop loss this determines the size of the new position (in terms of how many units will be bought).
/toolsa new script
sql2csvwas created. This little helper reads in the config, executes a sql script within the same directory and gives the results in a .csv file. Two example files
get_adx.sql(which gets date, close and ADX for a specific symbol) and
export_orderbook.sql(which replaces the former
export_trades.shscript) are already included (and likely to get more in the future)
- startmysql.sh now expects a command line option -c followed by config file name (located under ../config)
- small update to statistics report: now also display overall win/loss
- fixed a (longtime) bug that caused execution to exclude the last day of available data
ichinscratchy v0.2.1, released on April, 9th 2017
- database changes: added new fields to indicators_daily:
- added config file option
SIGNAL_EXECUTION_SUNDAYS. If set to false, signals that occur on sundays are not executed. This can easily happen depending on users local time/date: When some markets open on monday morning, in other regions of the world it is still sunday evening
- colored terminal output: errors -> red, warnings -> yellow, cyan -> SL, green -> signals
- streamlined/shortened terminal output for signal/SL execution
- colored html output: green -> uptrend/long, red -> downtrend/short, blue -> not trending
persistence1Dlibrary to find local minima and maxima in price data (see https://people.mpi-inf.mpg.de/~weinkauf/notes/persistence1d.html)
- added config file option
ICHI_KUMO_CONFIRM.If set to true for a Kumo breakout to be valid the price has to make a higher high/lower low on close above/below previous (horizontal) reaction high/ reaction low. This drastically improves signal quality of Kumo breakouts at the cost of making a Kumo breakout a pretty rare event. This filter is the first benefit of integrating the persistence1d library into ichinscratchy codebase (more to come :))
- Chandelier Stop now correctly use the
SL_CHANDELIER_ATR_PERIODnr. of days to determine highest highs/lowest lows (see database change). Prior to this fix the hh26/ll26 was used.
- fixed situation when initial SL (Chandelier) is above price for long or below price for short position. This can happen in situation when there were sharp volatility changes in past. Fallback is to use the percentage stop for those situations
- implemented portfolio management using spearman correlation
- new config option
PORTFOLIO_ALLOCATIONwhich selects the portfolio allocation model, currently
equal(all position sizes are equal) and
spearman(position size of new trade is determined by spearman correlation with existing portfolio entries)
- added config option
PORTFOLIO_SPEARMAN_PERIODwhich determines the period used for calculating Spearmans Rho
- added a bunch of config options
PORTFOLIO_PN_...to tailor position sizing based on correlation
- database changes: portfolio now has the column
pos_size; orderbook_daily column
sizewas renamed to
quantityand additional column
pos_sizewas added ==> THIS BREAKS DATABASE COMPATIBILTY WITH versions < v0.2.0!!
- added command line option
--portfolioto skip signal evaluation/execution and print out current portfolio to database
- added average (mean) and median holding days to orderbook analysis/ reporting function (use
-rcommand line option)
/toolsnow parse the config file under
/config, no more hardcoded db credentials in scripts
- release version now comes with example DAX30 data file for users to start experimenting with
- migrated source code documentation to doxygen-compatible style --> full reference in html/pdf now available under /docs
- if run twice without updating the quotes (with a couple of days to execute), the program would sell positions based on the last SL in database. If days to execute date back long enough, it selled even positions which were bought later
- when running backwards, the trend filter
ICHI_CHIKOU_CONFIRMdid not work properly
- if portfolio contained more than 1 position with same SL, for each day the SL was hit only 1 SL was executed
- when reporting statistics (-r/--report or config option) and there is no trade in db --> print message instead of crashing :)
(Mostly useless) statistics about the code:
- ~ 8 months development
- ~8400 lines of code (compared to 7000 in v0.2.1)
- ~5200 lines comments (compared to 4300 in v0.2.1)
- an unknown number of beers were harmed during this work
If you are interested, I visit the trading system category for it on my blog (see top menu), or follow this link: The Ichinscratchy trading system
Development is hosted over there at gitlab:
Feel free to join and contribute to this project!
Update of ichinscratchy trading system framework. Highlight of this version is money management between markets with different market currencies. Further highlights include market regime filters, a new way of accessing the database using standardised scripts and much more. For detailed changelog, see file changelog.md