261 lines
9.7 KiB
Bash
261 lines
9.7 KiB
Bash
function check_sell_conditions {
|
|
|
|
local f_ASSET_HIST_FILE="$1"
|
|
f_ASSET=$(basename ${f_ASSET_HIST_FILE} | cut -d\. -f1)
|
|
|
|
### from here: check for defined state to sell
|
|
f_SELL=""
|
|
|
|
# get data
|
|
get_vars_from_csv ${f_ASSET_HIST_FILE} || return 1
|
|
|
|
f_echo_prefix="SELL ${f_ASSET}@${CURRENCY}:${f_price} - "
|
|
|
|
### check current result
|
|
if [ -n "${BOT}" ]
|
|
then
|
|
f_TRADE_HIST_FILE="$(ls -1tr trade-histories/trade-*${f_ASSET}-open.history.csv | tail -n1)"
|
|
if ! [ -s "${f_TRADE_HIST_FILE}" ]
|
|
then
|
|
g_echo_note "${f_echo_prefix}No trade history file (${f_TRADE_HIST_FILE}) found - ignoring"
|
|
return 0
|
|
fi
|
|
f_TRADE_HIST_FILE_INTERIM=$(echo ${f_TRADE_HIST_FILE} | sed 's/-open\.history\.csv$/-interim.history.csv/')
|
|
local f_BUY_PRICE=$(grep ',BUY' $f_TRADE_HIST_FILE | tail -n1 | cut -d, -f5)
|
|
local f_BUY_PRICE_LAST_RATE_DIFF=$(g_percentage-diff ${f_BUY_PRICE} ${f_price})
|
|
# Store for overview
|
|
echo ${f_BUY_PRICE_LAST_RATE_DIFF} >DIFF_BUY_PRICE_${f_ASSET}
|
|
else
|
|
f_TRADE_HIST_FILE="${g_tmp}/open-${tmpfile}"
|
|
f_TRADE_HIST_FILE_INTERIM="${g_tmp}/interim-${tmpfile}"
|
|
f_BUY_PRICE_LAST_RATE_DIFF=$(g_percentage-diff ${BUY_PRICE} ${f_price})
|
|
f_BUY_PRICE=${BUY_PRICE}
|
|
result=${f_BUY_PRICE_LAST_RATE_DIFF}
|
|
echo "INTERIM RESULT: ${f_BUY_PRICE_LAST_RATE_DIFF}%"
|
|
fi
|
|
# store new interim result
|
|
echo ${f_BUY_PRICE_LAST_RATE_DIFF} >>${f_TRADE_HIST_FILE_INTERIM}
|
|
|
|
# run strategies
|
|
local f_strategy_path=../../strategies
|
|
[ -z "${BOT}" ] && f_strategy_path=strategies
|
|
for f_strategy in $(find ${f_strategy_path} -name "sell.*.conf" -type f)
|
|
do
|
|
f_echo_prefix="SELL ${f_ASSET}@${CURRENCY}:${f_price}:${f_strategy} - "
|
|
check_sell_conditions_strategy ${f_ASSET_HIST_FILE} ${f_strategy} ${f_TRADE_HIST_FILE} ${f_TRADE_HIST_FILE_INTERIM} ${f_BUY_PRICE} ${f_BUY_PRICE_LAST_RATE_DIFF}
|
|
if [ -n "$f_SELL" ]
|
|
then
|
|
f_SELL="${f_echo_prefix}${f_SELL}"
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -n "$f_SELL" ]
|
|
then
|
|
# Check for filled buy conditions - if filled don't sell
|
|
echo " ${f_echo_prefix}Checking for filled buy conditions"
|
|
if ! check_buy_conditions ${f_ASSET_HIST_FILE} SELL
|
|
then
|
|
echo " ${f_echo_prefix}Buy-Conditions met - dont sell"
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
|
|
### Sell or not sell?
|
|
# BOT
|
|
if [ -n "$f_SELL" ] && [ -n "${BOT}" ]
|
|
then
|
|
g_echo_note "$f_SELL"
|
|
echo "${f_last_line},${f_ASSET}" >>trade.log
|
|
f_ASSET=$(echo ${f_ASSET} | sed "s/${CURRENCY}//")
|
|
# binance_convert ${f_ASSET} ${CURRENCY} ${f_QUANTITY} sell "${f_SELL}"
|
|
if [ ${STOCK_EXCHANGE} = "BINANCE" ]
|
|
then
|
|
binance_convert ${f_ASSET} ${CURRENCY} ${f_QUANTITY} sell "${f_SELL}" ${f_QUANTITY_CURRENCY} || \
|
|
do_trade ${f_ASSET} ${CURRENCY} ${f_QUANTITY_CURRENCY} sell "${f_SELL}"
|
|
else
|
|
do_trade ${f_ASSET} ${CURRENCY} ${f_QUANTITY_CURRENCY} sell "${f_SELL}"
|
|
fi
|
|
fi
|
|
|
|
# ANALYZE
|
|
if [ -n "${f_SELL}" ] && [ -z "${BOT}" ]
|
|
then
|
|
echo "SELL: $f_date ${f_SELL}"
|
|
# echo "${csv_headline},Marketperformace
|
|
#${f_last_line}" | cut -d, -f 2-22 | perl -pe 's/([0-9].[0-9][0-9][0-9][0-9][0-9][0-9])[0-9]+/$1/g' | perl -pe 's/((?<=,)|(?<=^)),/ ,/g;' | column -t -s,
|
|
# echo "${f_SELL}"
|
|
result=$(g_percentage-diff ${BUY_PRICE} ${current})
|
|
result=$(echo "${result}-${FEE}" | bc | sed 's/^\./0./; s/^-\./-0./')
|
|
echo "${result}" >>${g_tmp}/result-${tmpfile}
|
|
rm -f "${f_TRADE_HIST_FILE}"
|
|
rm -f "${f_TRADE_HIST_FILE_INTERIM}"
|
|
echo "RESULT: ${result}% (${BUY_PRICE} -> ${current})"
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
function check_sell_conditions_strategy {
|
|
|
|
local f_ASSET_HIST_FILE="$1"
|
|
local f_strategy="$2"
|
|
local f_TRADE_HIST_FILE="$3"
|
|
local f_TRADE_HIST_FILE_INTERIM="$4"
|
|
local f_BUY_PRICE="$5"
|
|
local f_BUY_PRICE_LAST_RATE_DIFF="$6"
|
|
|
|
# never occur rsi defaults to suppress error messages if no values from strategy given
|
|
local SELL_RSI5_SIGNAL_UNTIL="0"
|
|
local SELL_RSI14_SIGNAL_UNTIL="0"
|
|
local SELL_RSI21_SIGNAL_UNTIL="0"
|
|
local SELL_RSI60_SIGNAL_UNTIL="0"
|
|
local SELL_RSI120_SIGNAL_UNTIL="0"
|
|
local SELL_RSI240_SIGNAL_UNTIL="0"
|
|
local SELL_RSI420_SIGNAL_UNTIL="0"
|
|
local SELL_RSI720_SIGNAL_UNTIL="0"
|
|
local SELL_RSI5_SIGNAL_FROM="101"
|
|
local SELL_RSI14_SIGNAL_FROM="101"
|
|
local SELL_RSI21_SIGNAL_FROM="101"
|
|
local SELL_RSI60_SIGNAL_FROM="101"
|
|
local SELL_RSI120_SIGNAL_FROM="101"
|
|
local SELL_RSI240_SIGNAL_FROM="101"
|
|
local SELL_RSI420_SIGNAL_FROM="101"
|
|
local SELL_RSI720_SIGNAL_FROM="101"
|
|
|
|
# never occur rsi defaults to suppress error messages if no values from strategy given
|
|
local SELL_MACD_RELATION_FROM="-101"
|
|
|
|
# default
|
|
local SELL_HOLD_IF_RESULT_NEGATIVE="0"
|
|
|
|
# run strategy
|
|
if [ -s "${f_strategy}" ]
|
|
then
|
|
local f_strategy_name=$(echo ${f_strategy} | cut -d. -f2)
|
|
if grep -q "buy.${f_strategy_name}.conf" ${f_TRADE_HIST_FILE}
|
|
then
|
|
. "${f_strategy}" || return 0
|
|
fi
|
|
else
|
|
g_echo_note "${f_echo_prefix}Strategy file not found"
|
|
return 1
|
|
fi
|
|
[ -n "${BOT}" ] && g_echo_note "${f_echo_prefix}Running SELL checks"
|
|
|
|
# check if the result (profit/loss until now) is lowering and sell if too low ()
|
|
if [ -f ${f_TRADE_HIST_FILE_INTERIM} ]
|
|
then
|
|
if [ -n "$SELL_IF_LAST_RATE_LOWER_THEN" ]
|
|
then
|
|
local f_BUY_PRICE_2ND_LAST_RATE_DIFF=$(tail -n2 ${f_TRADE_HIST_FILE_INTERIM} | head -n1)
|
|
local f_diff_result=$(echo "${f_BUY_PRICE_LAST_RATE_DIFF} - (${f_BUY_PRICE_2ND_LAST_RATE_DIFF})" | bc | sed 's/^\./0./; s/^-\./-0./')
|
|
if [ $(echo "${f_diff_result} < ${SELL_IF_LAST_RATE_LOWER_THEN}" | bc -l) -ne 0 ] && [ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} > ${FEE}" | bc -l) -ne 0 ]
|
|
then
|
|
f_SELL="Loss between last (${f_BUY_PRICE_LAST_RATE_DIFF}%) and 2nd last (${f_BUY_PRICE_2ND_LAST_RATE_DIFF}%) rate/result more then ${SELL_IF_LAST_RATE_LOWER_THEN}% (${f_diff_result}%)"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$SELL_IF_LOWER_THEN_FEE_AFTER_PERIOD" ]
|
|
then
|
|
# Sell if the last X time units is lower then FEE
|
|
if [ $(cat ${f_TRADE_HIST_FILE_INTERIM} | wc -l) -ge ${SELL_IF_LOWER_THEN_FEE_AFTER_PERIOD} ]
|
|
then
|
|
if [ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} < ${FEE}" | bc -l) -ne 0 ]
|
|
then
|
|
f_SELL="Result (${f_BUY_PRICE_LAST_RATE_DIFF}%) in more then ${SELL_IF_LOWER_THEN_FEE_AFTER_PERIOD} is under ${FEE}"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Sell on MACD Condition
|
|
if [ -n "$SELL_MACD_RELATION_FROM" ]
|
|
then
|
|
if [ $(echo "${f_macd_histogram_relation} < ${SELL_MACD_RELATION_FROM}" | bc -l) -ne 0 ]
|
|
then
|
|
f_SELL="MACD condition met"
|
|
fi
|
|
fi
|
|
|
|
# Sell on RSI conditions
|
|
if \
|
|
[ ${f_rsi5} -le ${SELL_RSI5_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi14} -le ${SELL_RSI14_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi21} -le ${SELL_RSI21_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi60} -le ${SELL_RSI60_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi120} -le ${SELL_RSI120_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi240} -le ${SELL_RSI240_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi420} -le ${SELL_RSI420_SIGNAL_UNTIL} ] && \
|
|
[ ${f_rsi720} -le ${SELL_RSI720_SIGNAL_UNTIL} ]&& \
|
|
[ ${f_rsi5} -ge ${SELL_RSI5_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi14} -ge ${SELL_RSI14_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi21} -ge ${SELL_RSI21_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi60} -ge ${SELL_RSI60_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi120} -ge ${SELL_RSI120_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi240} -ge ${SELL_RSI240_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi420} -ge ${SELL_RSI420_SIGNAL_FROM} ] && \
|
|
[ ${f_rsi720} -ge ${SELL_RSI720_SIGNAL_FROM} ]
|
|
then
|
|
f_SELL="RSI conditions met"
|
|
fi
|
|
|
|
|
|
# Take profit after positive results
|
|
if [ -n "${TAKE_PROFIT_CHECK_AFTER_POSTITIVE_RESULTS}" ] && [ -n "${TAKE_PROFIT_CHECK_AT_FEE_PLUS}" ] && [ -n "${TAKE_PROFIT_CHECK_AT_FACTOR}" ]
|
|
then
|
|
if [ $(grep -v "^-" ${f_TRADE_HIST_FILE_INTERIM} | wc -l) -ge ${TAKE_PROFIT_CHECK_AFTER_POSTITIVE_RESULTS} ]
|
|
then
|
|
# Only if result larger then fee
|
|
if [ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} > (${FEE}+${TAKE_PROFIT_CHECK_AT_FEE_PLUS})" | bc -l) -ne 0 ]
|
|
then
|
|
# Take profit if interim result falls over 20% (/1.25) from the highest result
|
|
local f_highest_profit=$(grep -v "^-" ${f_TRADE_HIST_FILE_INTERIM} | LANG=en_US.UTF-8 sort -n | tail -n1)
|
|
local f_take_profit=$(echo "${f_highest_profit} / ${TAKE_PROFIT_CHECK_AT_FACTOR}" | bc -l)
|
|
[ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} < ${f_take_profit}" | bc -l) -ne 0 ] && f_SELL="taking profit"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
|
|
# Take loss
|
|
if [ -n "${TAKE_LOSS_CHECK_AFTER_NEGATIVE_RESULTS}" ] && [ -n "${TAKE_LOSS_CHECK_AT_FEE_PLUS}" ] && [ -n "${TAKE_LOSS_CHECK_AT_FACTOR}" ]
|
|
then
|
|
if [ $(tail -n${TAKE_LOSS_CHECK_AFTER_NEGATIVE_RESULTS} ${f_TRADE_HIST_FILE_INTERIM} | grep "^-" | wc -l) -ge ${TAKE_LOSS_CHECK_AFTER_NEGATIVE_RESULTS} ]
|
|
then
|
|
# if result larger then fee
|
|
if [ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} > (${FEE}+${TAKE_LOSS_CHECK_AT_FEE_PLUS})" | bc -l) -ne 0 ]
|
|
then
|
|
f_SELL="taking profit by loss before"
|
|
else
|
|
# on loss
|
|
local f_highest_loss=$(grep "^-" ${f_TRADE_HIST_FILE_INTERIM} | LANG=en_US.UTF-8 sort -n | head -n1)
|
|
local f_take_loss=$(echo "${f_highest_loss} / ${TAKE_LOSS_CHECK_AT_FACTOR}" | bc -l)
|
|
[ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} > ${f_take_loss}" | bc -l) -ne 0 ] && f_SELL="taking loss"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
# hold on negative result
|
|
if [ "${SELL_HOLD_IF_RESULT_NEGATIVE}" -gt 0 ]
|
|
then
|
|
if [ $(echo "(${f_BUY_PRICE_LAST_RATE_DIFF} + -${FEE}) < 0" | bc -l) -ne 0 ]
|
|
then
|
|
echo " Result negative - holding (INTERIM RESULT ${f_BUY_PRICE_LAST_RATE_DIFF}% - FEE ${FEE}% < 0 --> Ignoring ${f_SELL}"
|
|
f_SELL=""
|
|
fi
|
|
fi
|
|
|
|
|
|
# check for SELL_PERCENTAGE_FROM_LAST_PURCHASE_NEGATIVE
|
|
if [ $(echo "${f_BUY_PRICE_LAST_RATE_DIFF} < ${SELL_PERCENTAGE_FROM_LAST_PURCHASE_NEGATIVE}" | bc -l) -ne 0 ]
|
|
then
|
|
f_SELL="SELL_PERCENTAGE_FROM_LAST_PURCHASE_NEGATIVE(${SELL_PERCENTAGE_FROM_LAST_PURCHASE_NEGATIVE}%) > Last rate (${f_BUY_PRICE_LAST_RATE_DIFF}%)"
|
|
fi
|
|
|
|
}
|