diff --git a/.vscode/launch.json b/.vscode/launch.json index 163e814..f18f6af 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -30,12 +30,14 @@ "env": { "PYTHONPATH": "${workspaceFolder}/..", "CONFIG_SERVICE": "cloud16.cvtt.vpn:6789", - "MODEL_CONFIG": "vecm" + "MODEL_CONFIG": "vecm", + "CVTT_URL": "http://cvtt-tester-01.cvtt.vpn:23456", + // "CVTT_URL": "http://dev-server-02.cvtt.vpn:23456", }, "args": [ // "--config=${workspaceFolder}/configuration/pair_trader.cfg", "--config=http://cloud16.cvtt.vpn:6789/apps/pairs_trading/pair_trader", - "--book_id=TEST_BOOK_20250818", + "--book_id=TSTBOOK_PT_20260113", "--instrument_A=COINBASE_AT:PAIR-ADA-USD", "--instrument_B=COINBASE_AT:PAIR-SOL-USD", ], diff --git a/LIBRARIES b/LIBRARIES new file mode 100644 index 0000000..fc4f358 --- /dev/null +++ b/LIBRARIES @@ -0,0 +1,2 @@ +cvttpy_tools: 1.3.4 +cvttpy_trading: 2.4.1 \ No newline at end of file diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..7bcd0e3 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.0.2 \ No newline at end of file diff --git a/apps/pair_trader.py b/apps/pair_trader.py index 8045228..1914d68 100644 --- a/apps/pair_trader.py +++ b/apps/pair_trader.py @@ -142,7 +142,7 @@ class PairTrader(NamedObject): async def _on_md_summary(self, history: List[MdTradesAggregate], exch_inst: ExchangeInstrument) -> None: # URGENT before calling stragegy, make sure that **BOTH** instruments market data is combined. - Log.info(f"DEBUG got {exch_inst.details_short()} data") + Log.info(f"{self.fname()}: got {exch_inst.details_short()} data") self.latest_history_[exch_inst] = history if len(self.latest_history_) == 2: from itertools import chain diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..448df97 --- /dev/null +++ b/build.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +# ---------------- Settings + +repo=git@cloud21.cvtt.vpn:/works/git/cvtt2/research/pairs_trading.git + +dist_root=/home/cvttdist/software/cvtt2 +dist_user=cvttdist +dist_host="cloud21.cvtt.vpn" +dist_ssh_port="22" + +dist_locations="cloud21.cvtt.vpn:22 hs01.cvtt.vpn:22" +version_file="VERSION" + +prj=pairs_trading +brnch=master +interactive=N + +# ---------------- Settings + +# ---------------- cmdline + +usage() { + echo "Usage: $0 [-b -i (interactive)" + exit 1 +} + +while getopts "b:i" opt; do + case ${opt} in + b ) + brnch=$OPTARG + ;; + i ) + interactive=Y + ;; + \? ) + echo "Invalid option: -$OPTARG" >&2 + usage + ;; + : ) + echo "Option -$OPTARG requires an argument." >&2 + usage + ;; + esac +done +# ---------------- cmdline + +confirm() { + if [ "${interactive}" == "Y" ]; then + echo "--------------------------------" + echo -n "Press to continue" && read + fi +} + + +if [ "${interactive}" == "Y" ]; then + echo -n "Enter project [${prj}]: " + read project + if [ "${project}" == "" ] + then + project=${prj} + fi +else + project=${prj} +fi + +# repo=${git_repo_arr[${project}]} +if [ -z ${repo} ]; then + echo "ERROR: Project repository for ${project} not found" + exit -1 +fi +echo "Project repo: ${repo}" + +if [ "${interactive}" == "Y" ]; then + echo -n "Enter branch to build release from [${brnch}]: " + read branch + if [ "${branch}" == "" ] + then + branch=${brnch} + fi +else + branch=${brnch} +fi + +tmp_dir=$(mktemp -d) +function cleanup { + cd ${HOME} + rm -rf ${tmp_dir} +} +trap cleanup EXIT + + +prj_dir="${tmp_dir}/${prj}" + +cmd_arr=() +Cmd="git clone ${repo} ${prj_dir}" +cmd_arr+=("${Cmd}") + +Cmd="cd ${prj_dir}" +cmd_arr+=("${Cmd}") + +if [ "${interactive}" == "Y" ]; then + echo "------------------------------------" + echo "The following commands will execute:" + echo "------------------------------------" + for cmd in "${cmd_arr[@]}" + do + echo ${cmd} + done +fi + +confirm + +for cmd in "${cmd_arr[@]}" +do + echo ${cmd} && eval ${cmd} +done + +Cmd="git checkout ${branch}" +echo ${Cmd} && eval ${Cmd} +if [ "${?}" != "0" ]; then + echo "ERROR: Branch ${branch} is not found" + cd ${HOME} && rm -rf ${tmp_dir} + exit -1 +fi + + +release_version=$(cat ${version_file} | awk -F',' '{print $1}') +whats_new=$(cat ${version_file} | awk -F',' '{print $2}') + + +echo "--------------------------------" +echo "Version file: ${version_file}" +echo "Release version: ${release_version}" + +confirm + +version_tag="v${release_version}" +version_comment="'${version_tag} ${project} ${branch} $(date +%Y-%m-%d)\n${whats_new}'" + +cmd_arr=() +Cmd="git tag -a ${version_tag} -m ${version_comment}" +cmd_arr+=("${Cmd}") + +Cmd="git push origin --tags" +cmd_arr+=("${Cmd}") + +Cmd="rm -rf .git" +cmd_arr+=("${Cmd}") + +SourceLoc=../${project} + +dist_path="${dist_root}/${project}/${release_version}" + +for dist_loc in ${dist_locations}; do + dhp=(${dist_loc//:/ }) + dist_host=${dhp[0]} + dist_port=${dhp[1]} + Cmd="rsync -avzh" + Cmd="${Cmd} --rsync-path=\"mkdir -p ${dist_path}" + Cmd="${Cmd} && rsync\" -e \"ssh -p ${dist_ssh_port}\"" + Cmd="${Cmd} $SourceLoc ${dist_user}@${dist_host}:${dist_path}/" + cmd_arr+=("${Cmd}") +done + +if [ "${interactive}" == "Y" ]; then + echo "------------------------------------" + echo "The following commands will execute:" + echo "------------------------------------" + for cmd in "${cmd_arr[@]}" + do + echo ${cmd} + done +fi + +confirm + +for cmd in "${cmd_arr[@]}" +do + pwd && echo ${cmd} && eval ${cmd} +done + +echo "$0 Done ${project} ${release_version}" diff --git a/lib/pt_strategy/live/live_strategy.py b/lib/pt_strategy/live/live_strategy.py index 4a6c79a..1520308 100644 --- a/lib/pt_strategy/live/live_strategy.py +++ b/lib/pt_strategy/live/live_strategy.py @@ -270,6 +270,7 @@ class PtLiveStrategy(NamedObject): issued_ts_ns=current_nanoseconds(), data=TargetPositionSignal( strength=side_a * self._strength(scaled_disequilibrium), + exchange_id=pair.get_instrument_a().exchange_id_, base_asset=pair.get_instrument_a().base_asset_id_, quote_asset=pair.get_instrument_a().quote_asset_id_, user_data={} @@ -284,6 +285,7 @@ class PtLiveStrategy(NamedObject): issued_ts_ns=current_nanoseconds(), data=TargetPositionSignal( strength=side_b * self._strength(scaled_disequilibrium), + exchange_id=pair.get_instrument_b().exchange_id_, base_asset=pair.get_instrument_b().base_asset_id_, quote_asset=pair.get_instrument_b().quote_asset_id_, user_data={} @@ -304,6 +306,7 @@ class PtLiveStrategy(NamedObject): issued_ts_ns=current_nanoseconds(), data=TargetPositionSignal( strength=0, + exchange_id=pair.get_instrument_a().exchange_id_, base_asset=pair.get_instrument_a().base_asset_id_, quote_asset=pair.get_instrument_a().quote_asset_id_, user_data={} @@ -318,6 +321,7 @@ class PtLiveStrategy(NamedObject): issued_ts_ns=current_nanoseconds(), data=TargetPositionSignal( strength=0, + exchange_id=pair.get_instrument_b().exchange_id_, base_asset=pair.get_instrument_b().base_asset_id_, quote_asset=pair.get_instrument_b().quote_asset_id_, user_data={}