├── user_data ├── strategies │ ├── E0V1E_20231013_172149.json │ ├── E0V1E_20231017_0502.json │ ├── E0V1E_20231017_1059.json │ ├── E0V1E_20231004_085308.json │ ├── E0V1E_20231014_0847.json │ ├── E0V1E_20231016_1325.json │ ├── E0V1E_20231019_1032.json │ ├── E0V1E_20231109_0108.json │ ├── E0V1E_20231128_0712.json │ ├── E0V1E.old.20230104.json │ ├── E0V1E_20231026_1225.json │ ├── E0V1E_20231029_0938.json │ ├── E0V1E_20231029_1251.json │ ├── E0V1E_20231102_0416.json │ ├── E0V1E_20231103_1754.json │ ├── E0V1E_20231105_1716.json │ ├── E0V1E_20231107_1044.json │ ├── E0V1E_20231112_1531.json │ ├── E0V1E_20231114_1913.json │ ├── E0V1E_20231116_1318.json │ ├── E0V1E_20231123_1120.json │ ├── E0V1E_20231130_0104.json │ ├── E0V1E_20231201_1539.json │ ├── E0V1E_20231203_0503.json │ ├── E0V1E_20231208_0232.json │ ├── E0V1E_20231209_1945.json │ ├── E0V1E_20231211_1713.json │ ├── E0V1E_20231213_0538.json │ ├── E0V1E_20231215_0902.json │ ├── E0V1E_20231217_0403.json │ ├── E0V1E_20231218_1653.json │ ├── E0V1E_20231220_1549.json │ ├── E0V1E_20231222_0709.json │ ├── E0V1E_20240101_2031.json │ ├── E0V1E_20231025_0106.json │ ├── E0V1E_20231031_1143.json │ ├── E0V1E_20231110_1905.json │ ├── E0V1E_20231118_0324.json │ ├── E0V1E_20231121_0740.json │ ├── E0V1E_20231125_1107.json │ ├── E0V1E_20231204_2129.json │ ├── E0V1E_20231206_0747.json │ ├── E0V1E_20231028_0333.json │ ├── E0V1E_20231113_0651.json │ ├── E0V1E_20231119_2216.json │ ├── E0V1E_20231223_1908.json │ ├── create_new_strategy_version.sh │ ├── E0V1E_20231014_0847.py │ ├── E0V1E_20231016_1325.py │ ├── E0V1E_20231017_0502.py │ ├── E0V1E_20231004_085308.py │ ├── E0V1E_20231013_172149.py │ ├── E0V1E_20231017_1059.py │ ├── E0V1E.py │ ├── E0V1E_20240814_0713.py │ ├── E0V1E_20240816_0035.py │ ├── E0V1E_20240817_0748.py │ ├── E0V1E_20240818_1123.py │ ├── E0V1E_20240819_0722.py │ ├── E0V1E_20240820_1116.py │ ├── E0V1E_20240820_2054.py │ ├── E0V1E_20240821_1411.py │ ├── E0V1E_20240822_2351.py │ ├── E0V1E_20240824_1618.py │ ├── E0V1E_20240825_0216.py │ ├── E0V1E_20240825_1217.py │ ├── E0V1E_20240826_0105.py │ ├── E0V1E_20240826_1218.py │ ├── E0V1E_20240826_2130.py │ ├── E0V1E_20240827_1042.py │ ├── E0V1E_20240828_0127.py │ ├── E0V1E_20240828_1406.py │ ├── E0V1E_20240829_0250.py │ ├── E0V1E_20240829_1844.py │ ├── E0V1E_20240830_0515.py │ ├── E0V1E_20240830_1556.py │ ├── E0V1E_20240831_0551.py │ ├── E0V1E_20240831_2132.py │ ├── E0V1E_20240901_0801.py │ ├── E0V1E_20240901_2011.py │ ├── E0V1E_20240902_0952.py │ ├── E0V1E_20240902_1858.py │ └── E0V1E_20240903_0801.py ├── exchange.json └── config.json ├── auto.sh ├── Makefile └── docker-compose.yml /user_data/strategies/E0V1E_20231013_172149.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.62, 18 | "buy_rsi_32": 42, 19 | "buy_rsi_fast_32": 27, 20 | "buy_sma15_32": 0.945 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.131, 26 | "17": 0.078, 27 | "71": 0.032, 28 | "106": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-13 17:17:14.027299+00:00" 33 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231017_0502.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231017_0502", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.19, 18 | "buy_rsi_32": 16, 19 | "buy_rsi_fast_32": 38, 20 | "buy_sma15_32": 0.935 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.119, 26 | "35": 0.061, 27 | "53": 0.032, 28 | "123": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-17 05:00:22.863422+00:00" 33 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231017_1059.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231017_1059", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.19, 18 | "buy_rsi_32": 16, 19 | "buy_rsi_fast_32": 38, 20 | "buy_sma15_32": 0.935 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.119, 26 | "35": 0.061, 27 | "53": 0.032, 28 | "123": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-17 10:58:42.656771+00:00" 33 | } -------------------------------------------------------------------------------- /auto.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Infinite loop 4 | while true; do 5 | echo "Running 'make ho'..." 6 | make ho 7 | make up 8 | 9 | # Check the exit status of the 'make ho' command 10 | if [ $? -eq 0 ]; then 11 | echo "Successfully ran 'make ho'." 12 | 13 | cd ./user_data/strategies/ 14 | bash ./create_new_strategy_version.sh 15 | cd - 16 | # Run git add and git commit 17 | echo "Running 'git add'..." 18 | git add user_data/strategies/. 19 | git add -u 20 | echo "Running 'git commit'..." 21 | git commit -m "Auto commit" 22 | git push origin 23 | 24 | # Sleep for a few seconds before running 'make ho' again 25 | sleep 10 26 | else 27 | echo "Failed to run 'make ho'. Retrying." 28 | sleep 10 29 | fi 30 | done 31 | 32 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231004_085308.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231004_085308", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.49, 18 | "buy_rsi_32": 41, 19 | "buy_rsi_fast_32": 24, 20 | "buy_sma15_32": 0.981 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.245, 26 | "19": 0.087, 27 | "36": 0.04, 28 | "120": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-04 08:28:20.994855+00:00" 33 | } 34 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231014_0847.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231014_0847", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": 0.0, 18 | "buy_rsi_32": 15, 19 | "buy_rsi_fast_32": 65, 20 | "buy_sma15_32": 0.933 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.131, 26 | "14": 0.07200000000000001, 27 | "67": 0.034, 28 | "118": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-14 08:35:32.588653+00:00" 33 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231016_1325.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231016_1325", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.65, 18 | "buy_rsi_32": 41, 19 | "buy_rsi_fast_32": 28, 20 | "buy_sma15_32": 0.945 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.10700000000000001, 26 | "25": 0.042, 27 | "52": 0.013, 28 | "141": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-16 13:18:19.740811+00:00" 33 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231019_1032.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231019_1032", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.13 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.08, 18 | "buy_rsi_32": 26, 19 | "buy_rsi_fast_32": 44, 20 | "buy_sma15_32": 0.937 21 | }, 22 | "sell": {}, 23 | "protection": {}, 24 | "roi": { 25 | "0": 0.11000000000000001, 26 | "35": 0.07, 27 | "92": 0.022, 28 | "140": 0 29 | } 30 | }, 31 | "ft_stratparam_v": 1, 32 | "export_time": "2023-10-19 10:32:14.926018+00:00" 33 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231109_0108.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231109_0108", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.3, 18 | "buy_rsi_32": 38, 19 | "buy_rsi_fast_32": 29, 20 | "buy_sma15_32": 0.925 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.1, 28 | "36": 0.077, 29 | "68": 0.01, 30 | "92": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-09 01:03:44.521559+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231128_0712.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231128_0712", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.6, 18 | "buy_rsi_32": 30, 19 | "buy_rsi_fast_32": 34, 20 | "buy_sma15_32": 0.92 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.107, 28 | "16": 0.09, 29 | "53": 0.039, 30 | "83": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-28 07:07:42.989859+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E.old.20230104.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 5 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.93, 18 | "buy_rsi_32": 15, 19 | "buy_rsi_fast_32": 22, 20 | "buy_sma15_32": 0.944 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.182, 28 | "37": 0.08800000000000001, 29 | "57": 0.02, 30 | "83": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2024-11-10 12:00:32.359024+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231026_1225.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231026_1225", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.05, 18 | "buy_rsi_32": 41, 19 | "buy_rsi_fast_32": 38, 20 | "buy_sma15_32": 0.91 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.122, 28 | "19": 0.061, 29 | "43": 0.01, 30 | "71": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-10-26 12:21:18.124248+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231029_0938.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231029_0938", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.44, 18 | "buy_rsi_32": 16, 19 | "buy_rsi_fast_32": 31, 20 | "buy_sma15_32": 0.935 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.191, 28 | "19": 0.092, 29 | "75": 0.028, 30 | "175": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-10-29 09:34:29.517204+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231029_1251.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231029_1251", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.04, 18 | "buy_rsi_32": 41, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.922 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.183, 28 | "13": 0.043, 29 | "29": 0.022, 30 | "78": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-10-29 12:47:05.651799+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231102_0416.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231102_0416", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.45, 18 | "buy_rsi_32": 34, 19 | "buy_rsi_fast_32": 22, 20 | "buy_sma15_32": 0.918 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.164, 28 | "27": 0.069, 29 | "81": 0.013, 30 | "188": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-02 04:12:24.059226+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231103_1754.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231103_1754", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.69, 18 | "buy_rsi_32": 38, 19 | "buy_rsi_fast_32": 20, 20 | "buy_sma15_32": 0.904 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.153, 28 | "20": 0.077, 29 | "67": 0.015, 30 | "124": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-03 17:49:52.522993+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231105_1716.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231105_1716", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.87, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 39, 20 | "buy_sma15_32": 0.937 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.179, 28 | "16": 0.095, 29 | "66": 0.032, 30 | "85": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-05 17:11:54.862572+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231107_1044.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231107_1044", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.5, 18 | "buy_rsi_32": 38, 19 | "buy_rsi_fast_32": 25, 20 | "buy_sma15_32": 0.927 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.148, 28 | "18": 0.077, 29 | "37": 0.021, 30 | "72": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-07 10:40:18.919264+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231112_1531.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231112_1531", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.5, 18 | "buy_rsi_32": 26, 19 | "buy_rsi_fast_32": 27, 20 | "buy_sma15_32": 0.939 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.259, 28 | "35": 0.081, 29 | "83": 0.017, 30 | "161": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-12 15:30:35.190227+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231114_1913.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231114_1913", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.76, 18 | "buy_rsi_32": 37, 19 | "buy_rsi_fast_32": 20, 20 | "buy_sma15_32": 0.936 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.131, 28 | "35": 0.086, 29 | "67": 0.023, 30 | "149": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-14 19:08:58.066636+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231116_1318.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231116_1318", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.35, 18 | "buy_rsi_32": 38, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.924 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.23, 28 | "13": 0.065, 29 | "73": 0.013, 30 | "94": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-16 13:13:41.366379+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231123_1120.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231123_1120", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.79, 18 | "buy_rsi_32": 42, 19 | "buy_rsi_fast_32": 35, 20 | "buy_sma15_32": 0.945 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.179, 28 | "18": 0.047, 29 | "77": 0.013, 30 | "101": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-23 11:15:40.679583+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231130_0104.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231130_0104", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.71, 18 | "buy_rsi_32": 37, 19 | "buy_rsi_fast_32": 22, 20 | "buy_sma15_32": 0.934 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.116, 28 | "11": 0.097, 29 | "27": 0.033, 30 | "76": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-30 00:59:44.781809+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231201_1539.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231201_1539", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.73, 18 | "buy_rsi_32": 42, 19 | "buy_rsi_fast_32": 29, 20 | "buy_sma15_32": 0.949 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.203, 28 | "24": 0.032, 29 | "72": 0.014, 30 | "180": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-01 15:35:10.244705+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231203_0503.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231203_0503", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.87, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 67, 20 | "buy_sma15_32": 0.941 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.121, 28 | "36": 0.081, 29 | "69": 0.011, 30 | "97": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-03 04:58:59.850510+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231208_0232.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231208_0232", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": 0.0, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 26, 20 | "buy_sma15_32": 0.915 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.14, 28 | "26": 0.039, 29 | "61": 0.016, 30 | "172": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-08 02:28:08.960965+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231209_1945.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231209_1945", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.55, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 31, 20 | "buy_sma15_32": 0.913 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.127, 28 | "16": 0.088, 29 | "65": 0.024, 30 | "75": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-09 19:41:00.631177+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231211_1713.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231211_1713", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.02, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 24, 20 | "buy_sma15_32": 0.922 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.207, 28 | "12": 0.066, 29 | "69": 0.034, 30 | "83": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-11 17:09:01.442197+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231213_0538.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231213_0538", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.66, 18 | "buy_rsi_32": 36, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.927 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.129, 28 | "19": 0.071, 29 | "53": 0.01, 30 | "92": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-13 05:33:35.772296+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231215_0902.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231215_0902", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.77, 18 | "buy_rsi_32": 36, 19 | "buy_rsi_fast_32": 20, 20 | "buy_sma15_32": 0.931 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.239, 28 | "37": 0.073, 29 | "59": 0.012, 30 | "160": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-15 08:57:36.566738+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231217_0403.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231217_0403", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.03, 18 | "buy_rsi_32": 37, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.923 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.063, 28 | "15": 0.025, 29 | "59": 0.014, 30 | "89": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-17 03:59:14.180147+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231218_1653.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231218_1653", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.79, 18 | "buy_rsi_32": 37, 19 | "buy_rsi_fast_32": 25, 20 | "buy_sma15_32": 0.936 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.251, 28 | "16": 0.079, 29 | "64": 0.012, 30 | "98": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-18 16:49:09.257266+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231220_1549.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231220_1549", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.87, 18 | "buy_rsi_32": 34, 19 | "buy_rsi_fast_32": 25, 20 | "buy_sma15_32": 0.937 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.28, 28 | "14": 0.091, 29 | "44": 0.04, 30 | "135": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-20 15:44:41.745986+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231222_0709.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231222_0709", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.01, 18 | "buy_rsi_32": 37, 19 | "buy_rsi_fast_32": 23, 20 | "buy_sma15_32": 0.914 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.193, 28 | "38": 0.03, 29 | "48": 0.01, 30 | "99": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-22 07:04:48.406718+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240101_2031.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20240101_2031", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": Infinity 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.45, 18 | "buy_rsi_32": 16, 19 | "buy_rsi_fast_32": 60, 20 | "buy_sma15_32": 0.936 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.073, 28 | "40": 0.062, 29 | "93": 0.012, 30 | "138": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2024-01-01 20:22:44.929757+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231025_0106.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231025_0106", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.75, 18 | "buy_rsi_32": 38, 19 | "buy_rsi_fast_32": 23, 20 | "buy_sma15_32": 0.936 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.141, 28 | "38": 0.020999999999999998, 29 | "86": 0.011, 30 | "111": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-10-25 01:01:58.603434+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231031_1143.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231031_1143", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.03, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 22, 20 | "buy_sma15_32": 0.903 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.165, 28 | "11": 0.08600000000000001, 29 | "39": 0.017, 30 | "66": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-10-31 11:38:38.854522+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231110_1905.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231110_1905", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.82, 18 | "buy_rsi_32": 34, 19 | "buy_rsi_fast_32": 20, 20 | "buy_sma15_32": 0.924 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.138, 28 | "29": 0.10200000000000001, 29 | "68": 0.032, 30 | "163": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-10 19:00:29.709519+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231118_0324.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231118_0324", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.66, 18 | "buy_rsi_32": 43, 19 | "buy_rsi_fast_32": 23, 20 | "buy_sma15_32": 0.96 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.10200000000000001, 28 | "16": 0.039, 29 | "73": 0.01, 30 | "186": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-18 03:19:51.385687+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231121_0740.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231121_0740", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.06, 18 | "buy_rsi_32": 39, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.918 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.14500000000000002, 28 | "13": 0.048, 29 | "72": 0.011, 30 | "116": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-21 07:36:14.400369+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231125_1107.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231125_1107", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.75, 18 | "buy_rsi_32": 36, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.93 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.08399999999999999, 28 | "15": 0.044, 29 | "66": 0.012, 30 | "76": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-25 11:02:56.811910+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231204_2129.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231204_2129", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.72, 18 | "buy_rsi_32": 37, 19 | "buy_rsi_fast_32": 21, 20 | "buy_sma15_32": 0.929 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.14200000000000002, 28 | "16": 0.069, 29 | "74": 0.02, 30 | "177": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-04 21:25:10.349008+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231206_0747.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231206_0747", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.82, 18 | "buy_rsi_32": 35, 19 | "buy_rsi_fast_32": 24, 20 | "buy_sma15_32": 0.929 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.254, 28 | "23": 0.08499999999999999, 29 | "73": 0.031, 30 | "165": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-06 07:43:10.802429+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231028_0333.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231028_0333", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.78, 18 | "buy_rsi_32": 42, 19 | "buy_rsi_fast_32": 29, 20 | "buy_sma15_32": 0.945 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.13899999999999998, 28 | "19": 0.08399999999999999, 29 | "64": 0.022, 30 | "77": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-10-28 03:28:50.621137+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231113_0651.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231113_0651", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.46, 18 | "buy_rsi_32": 42, 19 | "buy_rsi_fast_32": 22, 20 | "buy_sma15_32": 0.941 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.07200000000000001, 28 | "23": 0.045000000000000005, 29 | "67": 0.01, 30 | "100": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-13 06:46:31.491918+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231119_2216.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231119_2216", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.77, 18 | "buy_rsi_32": 34, 19 | "buy_rsi_fast_32": 20, 20 | "buy_sma15_32": 0.923 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.10300000000000001, 28 | "28": 0.08900000000000001, 29 | "40": 0.02, 30 | "146": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-11-19 22:12:10.791134+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231223_1908.json: -------------------------------------------------------------------------------- 1 | { 2 | "strategy_name": "E0V1E_20231223_1908", 3 | "params": { 4 | "stoploss": { 5 | "stoploss": -0.18 6 | }, 7 | "trailing": { 8 | "trailing_stop": false, 9 | "trailing_stop_positive": null, 10 | "trailing_stop_positive_offset": 0.0, 11 | "trailing_only_offset_is_reached": false 12 | }, 13 | "max_open_trades": { 14 | "max_open_trades": 3 15 | }, 16 | "buy": { 17 | "buy_cti_32": -0.8, 18 | "buy_rsi_32": 42, 19 | "buy_rsi_fast_32": 35, 20 | "buy_sma15_32": 0.948 21 | }, 22 | "sell": { 23 | "sell_fastx": 75 24 | }, 25 | "protection": {}, 26 | "roi": { 27 | "0": 0.10400000000000001, 28 | "10": 0.08600000000000001, 29 | "69": 0.017, 30 | "101": 0 31 | } 32 | }, 33 | "ft_stratparam_v": 1, 34 | "export_time": "2023-12-23 19:04:07.721089+00:00" 35 | } -------------------------------------------------------------------------------- /user_data/strategies/create_new_strategy_version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Define the Python class file and JSON config file 4 | python_file="E0V1E.py" 5 | json_file="E0V1E.json" 6 | 7 | # Get the current datetime in a suitable format (e.g., YYYYMMDDHHMMSS) 8 | current_datetime=$(date +"%Y%m%d_%H%M") 9 | 10 | # Generate the new class name and file names 11 | new_class_name="E0V1E_$current_datetime" 12 | new_python_file="$new_class_name.py" 13 | new_json_file="$new_class_name.json" 14 | 15 | # Rename the Python class file 16 | cp "$python_file" "$new_python_file" 17 | # Rename the JSON config file 18 | mv "$json_file" "$new_json_file" 19 | 20 | # Replace the class name inside the Python file 21 | sed -i "s/class E0V1E/class $new_class_name/g" "$new_python_file" 22 | sed -i "s/E0V1E/$new_class_name/g" "$new_json_file" 23 | 24 | echo "Renamed Python class file to: $new_python_file" 25 | echo "Renamed JSON config file to: $new_json_file" 26 | 27 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | up: 2 | docker compose run --rm freqtrade backtesting --strategy E0V1E --timeframe 5m --timeframe-detail 1m -c user_data/config.json -c user_data/exchange.json --timerange 20231215-20240615 > README.txt && cat README.txt 3 | 4 | ho: 5 | docker compose run --rm freqtrade hyperopt --random-state 100 --hyperopt-loss SortinoHyperOptLossDaily --strategy E0V1E --timeframe 5m --timeframe-detail 1m -c user_data/config.json -c user_data/exchange.json --space buy roi --timerange 20231215-20240615 -e 1000 -j 4 6 | 7 | list: 8 | docker compose run --rm freqtrade hyperopt-list --profitable --min-avg-profit 1.0 --min-total-profit 100 9 | 10 | data: 11 | docker compose run --rm freqtrade download-data --timeframe 5m 1m -c user_data/exchange.json --timerange 20231215-20240615 12 | 13 | edit: 14 | sudo -E vim user_data/strategies/E0V1E.py 15 | 16 | dca-edit: 17 | sudo -E vim user_data/strategies/E0V1E_DCA.py 18 | 19 | json: 20 | sudo -E vim user_data/strategies/E0V1E_DCA.json 21 | -------------------------------------------------------------------------------- /user_data/exchange.json: -------------------------------------------------------------------------------- 1 | { 2 | "exchange": { 3 | "name": "binance", 4 | "ccxt_config": {"enableRateLimit": true}, 5 | "ccxt_async_config": { 6 | "enableRateLimit": true, 7 | "rateLimit": 200 8 | }, 9 | "pair_whitelist": 10 | ["BTC/USDT","ETH/USDT","SOL/USDT","BNB/USDT","XRP/USDT","DOGE/USDT","AVAX/USDT","SHIB/USDT","SEI/USDT","PEPE/USDT","NEAR/USDT","JUP/USDT","ADA/USDT","WIF/USDT","ARB/USDT","MATIC/USDT","FLOKI/USDT","LINK/USDT","DOT/USDT","LTC/USDT","RUNE/USDT","WLD/USDT","SUI/USDT","BCH/USDT","FET/USDT","FIL/USDT","APT/USDT","BONK/USDT","WBTC/USDT","ID/USDT","TRX/USDT","ETC/USDT","RNDR/USDT","PYTH/USDT","ATOM/USDT","OP/USDT","FTM/USDT","INJ/USDT","ZRX/USDT","CFX/USDT","STRK/USDT","AEVO/USDT","GALA/USDT","ORDI/USDT","UNI/USDT","FRONT/USDT","SAND/USDT","JTO/USDT","EOS/USDT","PIXEL/USDT","GRT/USDT","RAY/USDT","CAKE/USDT","WAVES/USDT","XLM/USDT","AGIX/USDT","TIA/USDT","BAT/USDT","ARPA/USDT","ICP/USDT","ALGO/USDT","LRC/USDT","FLOW/USDT","AAVE/USDT","MANA/USDT","MINA/USDT","MEME/USDT","MKR/USDT","ARKM/USDT","MANTA/USDT","BLUR/USDT","STX/USDT","ACH/USDT","JASMY/USDT","GMT/USDT","AXS/USDT","KEY/USDT","APE/USDT","LPT/USDT","THETA/USDT","MASK/USDT","REI/USDT" 11 | ], 12 | "pair_blacklist": [] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | freqtrade: 5 | image: freqtradeorg/freqtrade:stable 6 | # image: freqtradeorg/freqtrade:develop 7 | # Use plotting image 8 | # image: freqtradeorg/freqtrade:develop_plot 9 | # Build step - only needed when additional dependencies are needed 10 | # build: 11 | # context: . 12 | # dockerfile: "./docker/Dockerfile.custom" 13 | restart: unless-stopped 14 | container_name: freqtrade 15 | volumes: 16 | - "./user_data/config.json:/freqtrade/user_data/config.json" 17 | - "./user_data/exchange.json:/freqtrade/user_data/exchange.json" 18 | - "./user_data/strategies:/freqtrade/user_data/strategies" 19 | - "./user_data/hyperopts:/freqtrade/user_data/hyperopts" 20 | - "./user_data/hyperopt_results:/freqtrade/user_data/hyperopt_results" 21 | - "/ft_data:/freqtrade/user_data/data" 22 | # Expose api on port 8080 (localhost only) 23 | # Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation 24 | # before enabling this. 25 | ports: 26 | - "127.0.0.1:8080:8080" 27 | # Default command used when running `docker compose up` 28 | command: > 29 | trade 30 | --logfile /freqtrade/user_data/logs/freqtrade.log 31 | --db-url sqlite:////freqtrade/user_data/tradesv3.sqlite 32 | --config /freqtrade/user_data/config.json 33 | --strategy SampleStrategy 34 | -------------------------------------------------------------------------------- /user_data/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "max_open_trades": 5, 3 | "stake_currency": "USDT", 4 | "stake_amount": "unlimited", 5 | "tradable_balance_ratio": 0.99, 6 | "fiat_display_currency": "USD", 7 | "dry_run": false, 8 | "dry_run_wallet": 1000, 9 | "cancel_open_orders_on_exit": false, 10 | "use_exit_signal": false, 11 | "exit_profit_only": false, 12 | "ignore_roi_if_entry_signal": false, 13 | "unfilledtimeout": { 14 | "entry": 10, 15 | "exit": 10, 16 | "exit_timeout_count": 0, 17 | "unit": "minutes" 18 | }, 19 | "entry_pricing": { 20 | "price_side": "other", 21 | "use_order_book": true, 22 | "order_book_top": 1, 23 | "price_last_balance": 0.0, 24 | "check_depth_of_market": { 25 | "enabled": false, 26 | "bids_to_ask_delta": 1 27 | } 28 | }, 29 | "exit_pricing": { 30 | "price_side": "other", 31 | "use_order_book": true, 32 | "order_book_top": 1 33 | }, 34 | "exchange": { 35 | "name": "binance", 36 | "key": "", 37 | "secret": "", 38 | "ccxt_config": { 39 | "enableRateLimit": true 40 | }, 41 | "ccxt_async_config": { 42 | "enableRateLimit": true, 43 | "rateLimit": 50 44 | }, 45 | "pair_whitelist": [], 46 | "pair_blacklist": [ 47 | "(BTCUSDT_.*|ETHUSDT_.*)", 48 | "(GT|HT|BTC|ETH|BNB|VITE|DGB|NMR|ZIL|QKC|REI)/.*", 49 | "(WBTC|BSV|BTCDOM|DEFI)/.*", 50 | ".*(_PREMIUM|BEAR|BULL|HALF|HEDGE|DOWN|UP|[1235][SL])/.*", 51 | "(AUD|BRZ|CAD|CHF|EUR|GBP|HKD|IDRT|JPY|NGN|RUB|SGD|TRY|UAH|USD|ZAR|UST)/.*", 52 | "(BUSD|CUSDT|DAI|PAX|PAXG|SUSD|TUSD|USDC|USDT|VAI|USDN)/.*" 53 | ] 54 | }, 55 | "pairlists": [ 56 | { 57 | "method": "StaticPairList" 58 | }, 59 | { 60 | "method": "ShuffleFilter" 61 | } 62 | ], 63 | "edge": { 64 | "enabled": false, 65 | "process_throttle_secs": 3600, 66 | "calculate_since_number_of_days": 14, 67 | "allowed_risk": 0.01, 68 | "stoploss_range_min": -0.01, 69 | "stoploss_range_max": -0.1, 70 | "stoploss_range_step": -0.01, 71 | "minimum_winrate": 0.60, 72 | "minimum_expectancy": 0.20, 73 | "min_trade_number": 10, 74 | "max_trade_duration_minute": 1440, 75 | "remove_pumps": false 76 | }, 77 | "telegram": { 78 | "enabled": true, 79 | "token": "", 80 | "chat_id": "", 81 | "keyboard": [ 82 | [ 83 | "/daily", 84 | "/stats", 85 | "/balance", 86 | "/profit" 87 | ], 88 | [ 89 | "/status table", 90 | "/performance", 91 | "/whitelist" 92 | ], 93 | [ 94 | "/reload_config", 95 | "/count", 96 | "/logs" 97 | ] 98 | ], 99 | "notification_settings": { 100 | "status": "silent", 101 | "warning": "on", 102 | "startup": "silent", 103 | "entry": "off", 104 | "exit": "off", 105 | "entry_cancel": "silent", 106 | "exit_cancel": "silent", 107 | "entry_fill": "silent", 108 | "exit_fill": "silent", 109 | "protection_trigger": "silent", 110 | "protection_trigger_global": "silent" 111 | }, 112 | "reload": true, 113 | "balance_dust_level": 0.01 114 | }, 115 | "api_server": { 116 | "enabled": false, 117 | "listen_ip_address": "0.0.0.0", 118 | "listen_port": 8080, 119 | "verbosity": "info", 120 | "jwt_secret_key": "somethingrandom", 121 | "CORS_origins": [], 122 | "username": "", 123 | "password": "" 124 | }, 125 | "bot_name": "freqtrade", 126 | "initial_state": "running", 127 | "force_entry_enable": false, 128 | "internals": { 129 | "process_throttle_secs": 5 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231014_0847.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | 10 | 11 | class E0V1E_20231014_0847(IStrategy): 12 | minimal_roi = { 13 | "0": 0.02, 14 | "120": 0.01 15 | } 16 | 17 | timeframe = '5m' 18 | 19 | process_only_new_candles = True 20 | startup_candle_count = 120 21 | position_adjustment_enable = True 22 | 23 | order_types = { 24 | 'entry': 'market', 25 | 'exit': 'market', 26 | 'emergency_exit': 'market', 27 | 'force_entry': 'market', 28 | 'force_exit': "market", 29 | 'stoploss': 'market', 30 | 'stoploss_on_exchange': False, 31 | 32 | 'stoploss_on_exchange_interval': 60, 33 | 'stoploss_on_exchange_market_ratio': 0.99 34 | } 35 | 36 | stoploss = -0.13 37 | 38 | is_optimize_32 = True 39 | buy_rsi_fast_32 = IntParameter(20, 70, default=46, space='buy', optimize=is_optimize_32) 40 | buy_rsi_32 = IntParameter(15, 50, default=19, space='buy', optimize=is_optimize_32) 41 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.942, decimals=3, space='buy', optimize=is_optimize_32) 42 | buy_cti_32 = DecimalParameter(-1, 0, default=-0.86, decimals=2, space='buy', optimize=is_optimize_32) 43 | 44 | def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, 45 | proposed_stake: float, min_stake: float, max_stake: float, 46 | leverage: float, entry_tag: str, side: str, 47 | **kwargs) -> float: 48 | return proposed_stake * 0.7 49 | 50 | def adjust_trade_position(self, trade: Trade, current_time: datetime, 51 | current_rate: float, current_profit: float, 52 | min_stake: float, max_stake: float, 53 | current_entry_rate: float, current_exit_rate: float, 54 | current_entry_profit: float, current_exit_profit: float, 55 | **kwargs) -> float: 56 | #Take half of profit 57 | count_of_exits = trade.nr_of_successful_exits 58 | if current_profit >= 0.02 and count_of_exits == 0: 59 | return -0.5 * trade.stake_amount 60 | #DCA 61 | count_of_entries = trade.nr_of_successful_entries 62 | filled_entries = trade.select_filled_orders(trade.entry_side) 63 | initial_stake = filled_entries[0].cost 64 | 65 | if current_profit < -0.05 and count_of_entries == 1 : 66 | return initial_stake / 0.7 * 0.3 67 | return None 68 | 69 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 70 | 71 | # buy_1 indicators 72 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 73 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 74 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 75 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 76 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 77 | 78 | # profit sell indicators 79 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 80 | dataframe['fastk'] = stoch_fast['fastk'] 81 | 82 | return dataframe 83 | 84 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 85 | 86 | conditions = [] 87 | dataframe.loc[:, 'enter_tag'] = '' 88 | 89 | buy_1 = ( 90 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 91 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 92 | (dataframe['rsi'] > self.buy_rsi_32.value) & 93 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 94 | (dataframe['cti'] < self.buy_cti_32.value) 95 | ) 96 | 97 | conditions.append(buy_1) 98 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 99 | 100 | if conditions: 101 | dataframe.loc[ 102 | reduce(lambda x, y: x | y, conditions), 103 | 'enter_long'] = 1 104 | 105 | return dataframe 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | 109 | dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out') 110 | 111 | return dataframe 112 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231016_1325.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | 10 | 11 | class E0V1E_20231016_1325(IStrategy): 12 | minimal_roi = { 13 | "0": 0.02, 14 | "120": 0.01 15 | } 16 | 17 | timeframe = '5m' 18 | 19 | process_only_new_candles = True 20 | startup_candle_count = 120 21 | position_adjustment_enable = True 22 | 23 | order_types = { 24 | 'entry': 'market', 25 | 'exit': 'market', 26 | 'emergency_exit': 'market', 27 | 'force_entry': 'market', 28 | 'force_exit': "market", 29 | 'stoploss': 'market', 30 | 'stoploss_on_exchange': False, 31 | 32 | 'stoploss_on_exchange_interval': 60, 33 | 'stoploss_on_exchange_market_ratio': 0.99 34 | } 35 | 36 | stoploss = -0.13 37 | 38 | is_optimize_32 = True 39 | buy_rsi_fast_32 = IntParameter(20, 70, default=46, space='buy', optimize=is_optimize_32) 40 | buy_rsi_32 = IntParameter(15, 50, default=19, space='buy', optimize=is_optimize_32) 41 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.942, decimals=3, space='buy', optimize=is_optimize_32) 42 | buy_cti_32 = DecimalParameter(-1, 0, default=-0.86, decimals=2, space='buy', optimize=is_optimize_32) 43 | 44 | def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, 45 | proposed_stake: float, min_stake: float, max_stake: float, 46 | leverage: float, entry_tag: str, side: str, 47 | **kwargs) -> float: 48 | return proposed_stake * 0.7 49 | 50 | def adjust_trade_position(self, trade: Trade, current_time: datetime, 51 | current_rate: float, current_profit: float, 52 | min_stake: float, max_stake: float, 53 | current_entry_rate: float, current_exit_rate: float, 54 | current_entry_profit: float, current_exit_profit: float, 55 | **kwargs) -> float: 56 | #Take half of profit 57 | count_of_exits = trade.nr_of_successful_exits 58 | if current_profit >= 0.02 and count_of_exits == 0: 59 | return -0.5 * trade.stake_amount 60 | #DCA 61 | count_of_entries = trade.nr_of_successful_entries 62 | filled_entries = trade.select_filled_orders(trade.entry_side) 63 | initial_stake = filled_entries[0].cost 64 | 65 | if current_profit < -0.05 and count_of_entries == 1 : 66 | return initial_stake / 0.7 * 0.3 67 | return None 68 | 69 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 70 | 71 | # buy_1 indicators 72 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 73 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 74 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 75 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 76 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 77 | 78 | # profit sell indicators 79 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 80 | dataframe['fastk'] = stoch_fast['fastk'] 81 | 82 | return dataframe 83 | 84 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 85 | 86 | conditions = [] 87 | dataframe.loc[:, 'enter_tag'] = '' 88 | 89 | buy_1 = ( 90 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 91 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 92 | (dataframe['rsi'] > self.buy_rsi_32.value) & 93 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 94 | (dataframe['cti'] < self.buy_cti_32.value) 95 | ) 96 | 97 | conditions.append(buy_1) 98 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 99 | 100 | if conditions: 101 | dataframe.loc[ 102 | reduce(lambda x, y: x | y, conditions), 103 | 'enter_long'] = 1 104 | 105 | return dataframe 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | 109 | dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out') 110 | 111 | return dataframe 112 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231017_0502.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | 10 | 11 | class E0V1E_20231017_0502(IStrategy): 12 | minimal_roi = { 13 | "0": 0.02, 14 | "120": 0.01 15 | } 16 | 17 | timeframe = '5m' 18 | 19 | process_only_new_candles = True 20 | startup_candle_count = 120 21 | position_adjustment_enable = True 22 | 23 | order_types = { 24 | 'entry': 'market', 25 | 'exit': 'market', 26 | 'emergency_exit': 'market', 27 | 'force_entry': 'market', 28 | 'force_exit': "market", 29 | 'stoploss': 'market', 30 | 'stoploss_on_exchange': False, 31 | 32 | 'stoploss_on_exchange_interval': 60, 33 | 'stoploss_on_exchange_market_ratio': 0.99 34 | } 35 | 36 | stoploss = -0.13 37 | 38 | is_optimize_32 = True 39 | buy_rsi_fast_32 = IntParameter(20, 70, default=46, space='buy', optimize=is_optimize_32) 40 | buy_rsi_32 = IntParameter(15, 50, default=19, space='buy', optimize=is_optimize_32) 41 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.942, decimals=3, space='buy', optimize=is_optimize_32) 42 | buy_cti_32 = DecimalParameter(-1, 0, default=-0.86, decimals=2, space='buy', optimize=is_optimize_32) 43 | 44 | def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, 45 | proposed_stake: float, min_stake: float, max_stake: float, 46 | leverage: float, entry_tag: str, side: str, 47 | **kwargs) -> float: 48 | return proposed_stake * 0.7 49 | 50 | def adjust_trade_position(self, trade: Trade, current_time: datetime, 51 | current_rate: float, current_profit: float, 52 | min_stake: float, max_stake: float, 53 | current_entry_rate: float, current_exit_rate: float, 54 | current_entry_profit: float, current_exit_profit: float, 55 | **kwargs) -> float: 56 | #Take half of profit 57 | count_of_exits = trade.nr_of_successful_exits 58 | if current_profit >= 0.02 and count_of_exits == 0: 59 | return -0.5 * trade.stake_amount 60 | #DCA 61 | count_of_entries = trade.nr_of_successful_entries 62 | filled_entries = trade.select_filled_orders(trade.entry_side) 63 | initial_stake = filled_entries[0].cost 64 | 65 | if current_profit < -0.05 and count_of_entries == 1 : 66 | return initial_stake / 0.7 * 0.3 67 | return None 68 | 69 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 70 | 71 | # buy_1 indicators 72 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 73 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 74 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 75 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 76 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 77 | 78 | # profit sell indicators 79 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 80 | dataframe['fastk'] = stoch_fast['fastk'] 81 | 82 | return dataframe 83 | 84 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 85 | 86 | conditions = [] 87 | dataframe.loc[:, 'enter_tag'] = '' 88 | 89 | buy_1 = ( 90 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 91 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 92 | (dataframe['rsi'] > self.buy_rsi_32.value) & 93 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 94 | (dataframe['cti'] < self.buy_cti_32.value) 95 | ) 96 | 97 | conditions.append(buy_1) 98 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 99 | 100 | if conditions: 101 | dataframe.loc[ 102 | reduce(lambda x, y: x | y, conditions), 103 | 'enter_long'] = 1 104 | 105 | return dataframe 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | 109 | dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out') 110 | 111 | return dataframe 112 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231004_085308.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | 10 | 11 | class E0V1E_20231004_085308(IStrategy): 12 | minimal_roi = { 13 | "0": 0.02, 14 | "120": 0.01 15 | } 16 | 17 | timeframe = '5m' 18 | 19 | process_only_new_candles = True 20 | startup_candle_count = 120 21 | position_adjustment_enable = True 22 | 23 | order_types = { 24 | 'entry': 'market', 25 | 'exit': 'market', 26 | 'emergency_exit': 'market', 27 | 'force_entry': 'market', 28 | 'force_exit': "market", 29 | 'stoploss': 'market', 30 | 'stoploss_on_exchange': False, 31 | 32 | 'stoploss_on_exchange_interval': 60, 33 | 'stoploss_on_exchange_market_ratio': 0.99 34 | } 35 | 36 | stoploss = -0.13 37 | 38 | is_optimize_32 = True 39 | buy_rsi_fast_32 = IntParameter(20, 70, default=46, space='buy', optimize=is_optimize_32) 40 | buy_rsi_32 = IntParameter(15, 50, default=19, space='buy', optimize=is_optimize_32) 41 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.942, decimals=3, space='buy', optimize=is_optimize_32) 42 | buy_cti_32 = DecimalParameter(-1, 0, default=-0.86, decimals=2, space='buy', optimize=is_optimize_32) 43 | 44 | def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, 45 | proposed_stake: float, min_stake: float, max_stake: float, 46 | leverage: float, entry_tag: str, side: str, 47 | **kwargs) -> float: 48 | return proposed_stake * 0.7 49 | 50 | def adjust_trade_position(self, trade: Trade, current_time: datetime, 51 | current_rate: float, current_profit: float, 52 | min_stake: float, max_stake: float, 53 | current_entry_rate: float, current_exit_rate: float, 54 | current_entry_profit: float, current_exit_profit: float, 55 | **kwargs) -> float: 56 | #Take half of profit 57 | count_of_exits = trade.nr_of_successful_exits 58 | if current_profit >= 0.02 and count_of_exits == 0: 59 | return -0.5 * trade.stake_amount 60 | #DCA 61 | count_of_entries = trade.nr_of_successful_entries 62 | filled_entries = trade.select_filled_orders(trade.entry_side) 63 | initial_stake = filled_entries[0].cost 64 | 65 | if current_profit < -0.05 and count_of_entries == 1 : 66 | return initial_stake / 0.7 * 0.3 67 | return None 68 | 69 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 70 | 71 | # buy_1 indicators 72 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 73 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 74 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 75 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 76 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 77 | 78 | # profit sell indicators 79 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 80 | dataframe['fastk'] = stoch_fast['fastk'] 81 | 82 | return dataframe 83 | 84 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 85 | 86 | conditions = [] 87 | dataframe.loc[:, 'enter_tag'] = '' 88 | 89 | buy_1 = ( 90 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 91 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 92 | (dataframe['rsi'] > self.buy_rsi_32.value) & 93 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 94 | (dataframe['cti'] < self.buy_cti_32.value) 95 | ) 96 | 97 | conditions.append(buy_1) 98 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 99 | 100 | if conditions: 101 | dataframe.loc[ 102 | reduce(lambda x, y: x | y, conditions), 103 | 'enter_long'] = 1 104 | 105 | return dataframe 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | 109 | dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out') 110 | 111 | return dataframe 112 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231013_172149.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | 10 | 11 | class E0V1E_20231013_172149(IStrategy): 12 | minimal_roi = { 13 | "0": 0.02, 14 | "120": 0.01 15 | } 16 | 17 | timeframe = '5m' 18 | 19 | process_only_new_candles = True 20 | startup_candle_count = 120 21 | position_adjustment_enable = True 22 | 23 | order_types = { 24 | 'entry': 'market', 25 | 'exit': 'market', 26 | 'emergency_exit': 'market', 27 | 'force_entry': 'market', 28 | 'force_exit': "market", 29 | 'stoploss': 'market', 30 | 'stoploss_on_exchange': False, 31 | 32 | 'stoploss_on_exchange_interval': 60, 33 | 'stoploss_on_exchange_market_ratio': 0.99 34 | } 35 | 36 | stoploss = -0.13 37 | 38 | is_optimize_32 = True 39 | buy_rsi_fast_32 = IntParameter(20, 70, default=46, space='buy', optimize=is_optimize_32) 40 | buy_rsi_32 = IntParameter(15, 50, default=19, space='buy', optimize=is_optimize_32) 41 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.942, decimals=3, space='buy', optimize=is_optimize_32) 42 | buy_cti_32 = DecimalParameter(-1, 0, default=-0.86, decimals=2, space='buy', optimize=is_optimize_32) 43 | 44 | def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, 45 | proposed_stake: float, min_stake: float, max_stake: float, 46 | leverage: float, entry_tag: str, side: str, 47 | **kwargs) -> float: 48 | return proposed_stake * 0.7 49 | 50 | def adjust_trade_position(self, trade: Trade, current_time: datetime, 51 | current_rate: float, current_profit: float, 52 | min_stake: float, max_stake: float, 53 | current_entry_rate: float, current_exit_rate: float, 54 | current_entry_profit: float, current_exit_profit: float, 55 | **kwargs) -> float: 56 | #Take half of profit 57 | count_of_exits = trade.nr_of_successful_exits 58 | if current_profit >= 0.02 and count_of_exits == 0: 59 | return -0.5 * trade.stake_amount 60 | #DCA 61 | count_of_entries = trade.nr_of_successful_entries 62 | filled_entries = trade.select_filled_orders(trade.entry_side) 63 | initial_stake = filled_entries[0].cost 64 | 65 | if current_profit < -0.05 and count_of_entries == 1 : 66 | return initial_stake / 0.7 * 0.3 67 | return None 68 | 69 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 70 | 71 | # buy_1 indicators 72 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 73 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 74 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 75 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 76 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 77 | 78 | # profit sell indicators 79 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 80 | dataframe['fastk'] = stoch_fast['fastk'] 81 | 82 | return dataframe 83 | 84 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 85 | 86 | conditions = [] 87 | dataframe.loc[:, 'enter_tag'] = '' 88 | 89 | buy_1 = ( 90 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 91 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 92 | (dataframe['rsi'] > self.buy_rsi_32.value) & 93 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 94 | (dataframe['cti'] < self.buy_cti_32.value) 95 | ) 96 | 97 | conditions.append(buy_1) 98 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 99 | 100 | if conditions: 101 | dataframe.loc[ 102 | reduce(lambda x, y: x | y, conditions), 103 | 'enter_long'] = 1 104 | 105 | return dataframe 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | 109 | dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out') 110 | 111 | return dataframe 112 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20231017_1059.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | 10 | 11 | class E0V1E_20231017_1059(IStrategy): 12 | minimal_roi = { 13 | "0": 0.02, 14 | "120": 0.01 15 | } 16 | 17 | timeframe = '5m' 18 | 19 | process_only_new_candles = True 20 | startup_candle_count = 120 21 | position_adjustment_enable = False 22 | 23 | order_types = { 24 | 'entry': 'market', 25 | 'exit': 'market', 26 | 'emergency_exit': 'market', 27 | 'force_entry': 'market', 28 | 'force_exit': "market", 29 | 'stoploss': 'market', 30 | 'stoploss_on_exchange': False, 31 | 32 | 'stoploss_on_exchange_interval': 60, 33 | 'stoploss_on_exchange_market_ratio': 0.99 34 | } 35 | 36 | stoploss = -0.13 37 | 38 | is_optimize_32 = True 39 | buy_rsi_fast_32 = IntParameter(20, 70, default=46, space='buy', optimize=is_optimize_32) 40 | buy_rsi_32 = IntParameter(15, 50, default=19, space='buy', optimize=is_optimize_32) 41 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.942, decimals=3, space='buy', optimize=is_optimize_32) 42 | buy_cti_32 = DecimalParameter(-1, 0, default=-0.86, decimals=2, space='buy', optimize=is_optimize_32) 43 | 44 | def custom_stake_amount(self, pair: str, current_time: datetime, current_rate: float, 45 | proposed_stake: float, min_stake: float, max_stake: float, 46 | leverage: float, entry_tag: str, side: str, 47 | **kwargs) -> float: 48 | return proposed_stake * 0.7 49 | 50 | def adjust_trade_position(self, trade: Trade, current_time: datetime, 51 | current_rate: float, current_profit: float, 52 | min_stake: float, max_stake: float, 53 | current_entry_rate: float, current_exit_rate: float, 54 | current_entry_profit: float, current_exit_profit: float, 55 | **kwargs) -> float: 56 | #Take half of profit 57 | count_of_exits = trade.nr_of_successful_exits 58 | if current_profit >= 0.02 and count_of_exits == 0: 59 | return -0.5 * trade.stake_amount 60 | #DCA 61 | count_of_entries = trade.nr_of_successful_entries 62 | filled_entries = trade.select_filled_orders(trade.entry_side) 63 | initial_stake = filled_entries[0].cost 64 | 65 | if current_profit < -0.05 and count_of_entries == 1 : 66 | return initial_stake / 0.7 * 0.3 67 | return None 68 | 69 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 70 | 71 | # buy_1 indicators 72 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 73 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 74 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 75 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 76 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 77 | 78 | # profit sell indicators 79 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 80 | dataframe['fastk'] = stoch_fast['fastk'] 81 | 82 | return dataframe 83 | 84 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 85 | 86 | conditions = [] 87 | dataframe.loc[:, 'enter_tag'] = '' 88 | 89 | buy_1 = ( 90 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 91 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 92 | (dataframe['rsi'] > self.buy_rsi_32.value) & 93 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 94 | (dataframe['cti'] < self.buy_cti_32.value) 95 | ) 96 | 97 | conditions.append(buy_1) 98 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 99 | 100 | if conditions: 101 | dataframe.loc[ 102 | reduce(lambda x, y: x | y, conditions), 103 | 'enter_long'] = 1 104 | 105 | return dataframe 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | 109 | dataframe.loc[(), ['exit_long', 'exit_tag']] = (0, 'long_out') 110 | 111 | return dataframe 112 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240814_0713.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240814_0713(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240816_0035.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240816_0035(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240817_0748.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240817_0748(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240818_1123.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240818_1123(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240819_0722.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240819_0722(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240820_1116.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240820_1116(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240820_2054.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240820_2054(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240821_1411.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240821_1411(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240822_2351.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240822_2351(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240824_1618.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240824_1618(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240825_0216.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240825_0216(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240825_1217.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240825_1217(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240826_0105.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240826_0105(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240826_1218.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240826_1218(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240826_2130.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240826_2130(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240827_1042.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240827_1042(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240828_0127.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240828_0127(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240828_1406.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240828_1406(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240829_0250.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240829_0250(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240829_1844.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240829_1844(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240830_0515.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240830_0515(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240830_1556.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240830_1556(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240831_0551.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240831_0551(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240831_2132.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240831_2132(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240901_0801.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240901_0801(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240901_2011.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240901_2011(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240902_0952.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240902_0952(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240902_1858.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240902_1858(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | -------------------------------------------------------------------------------- /user_data/strategies/E0V1E_20240903_0801.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | import talib.abstract as ta 3 | import pandas_ta as pta 4 | from freqtrade.persistence import Trade 5 | from freqtrade.strategy.interface import IStrategy 6 | from pandas import DataFrame 7 | from freqtrade.strategy import DecimalParameter, IntParameter 8 | from functools import reduce 9 | import warnings 10 | 11 | warnings.simplefilter(action="ignore", category=RuntimeWarning) 12 | 13 | 14 | class E0V1E_20240903_0801(IStrategy): 15 | minimal_roi = { 16 | "0": 1 17 | } 18 | timeframe = '5m' 19 | process_only_new_candles = True 20 | startup_candle_count = 240 21 | order_types = { 22 | 'entry': 'market', 23 | 'exit': 'market', 24 | 'emergency_exit': 'market', 25 | 'force_entry': 'market', 26 | 'force_exit': "market", 27 | 'stoploss': 'market', 28 | 'stoploss_on_exchange': False, 29 | 'stoploss_on_exchange_interval': 60, 30 | 'stoploss_on_exchange_market_ratio': 0.99 31 | } 32 | 33 | stoploss = -0.25 34 | trailing_stop = True 35 | trailing_stop_positive = 0.003 36 | trailing_stop_positive_offset = 0.03 37 | trailing_only_offset_is_reached = True 38 | 39 | is_optimize_32 = True 40 | buy_rsi_fast_32 = IntParameter(20, 70, default=30, space='buy', optimize=is_optimize_32) 41 | buy_rsi_32 = IntParameter(15, 50, default=24, space='buy', optimize=is_optimize_32) 42 | buy_sma15_32 = DecimalParameter(0.900, 1, default=0.96, decimals=3, space='buy', optimize=is_optimize_32) 43 | buy_cti_32 = DecimalParameter(-1, 1, default=0.69, decimals=2, space='buy', optimize=is_optimize_32) 44 | 45 | sell_fastx = IntParameter(50, 100, default=84, space='sell', optimize=True) 46 | 47 | cci_opt = True 48 | sell_loss_cci = IntParameter(low=0, high=600, default=80, space='sell', optimize=cci_opt) 49 | sell_loss_cci_profit = DecimalParameter(-0.15, 0, default=-0.1, decimals=2, space='sell', optimize=cci_opt) 50 | 51 | def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 52 | # buy_1 indicators 53 | dataframe['sma_15'] = ta.SMA(dataframe, timeperiod=15) 54 | dataframe['cti'] = pta.cti(dataframe["close"], length=20) 55 | dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14) 56 | dataframe['rsi_fast'] = ta.RSI(dataframe, timeperiod=4) 57 | dataframe['rsi_slow'] = ta.RSI(dataframe, timeperiod=20) 58 | # profit sell indicators 59 | stoch_fast = ta.STOCHF(dataframe, 5, 3, 0, 3, 0) 60 | dataframe['fastk'] = stoch_fast['fastk'] 61 | 62 | dataframe['cci'] = ta.CCI(dataframe, timeperiod=20) 63 | 64 | dataframe['ma120'] = ta.MA(dataframe, timeperiod=120) 65 | 66 | return dataframe 67 | 68 | def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 69 | conditions = [] 70 | dataframe.loc[:, 'enter_tag'] = '' 71 | buy_1 = ( 72 | (dataframe['rsi_slow'] < dataframe['rsi_slow'].shift(1)) & 73 | (dataframe['rsi_fast'] < self.buy_rsi_fast_32.value) & 74 | (dataframe['rsi'] > self.buy_rsi_32.value) & 75 | (dataframe['close'] < dataframe['sma_15'] * self.buy_sma15_32.value) & 76 | (dataframe['cti'] < self.buy_cti_32.value) 77 | ) 78 | conditions.append(buy_1) 79 | dataframe.loc[buy_1, 'enter_tag'] += 'buy_1' 80 | 81 | if conditions: 82 | dataframe.loc[ 83 | reduce(lambda x, y: x | y, conditions), 84 | 'enter_long'] = 1 85 | return dataframe 86 | 87 | def custom_exit(self, pair: str, trade: 'Trade', current_time: 'datetime', current_rate: float, 88 | current_profit: float, **kwargs): 89 | dataframe, _ = self.dp.get_analyzed_dataframe(pair=pair, timeframe=self.timeframe) 90 | current_candle = dataframe.iloc[-1].squeeze() 91 | 92 | if current_profit > 0: 93 | if current_candle["fastk"] > self.sell_fastx.value: 94 | remove_pubid(trade.id) 95 | return "fastk_profit_sell" 96 | 97 | if current_profit > self.sell_loss_cci_profit.value: 98 | if current_candle["cci"] > self.sell_loss_cci.value: 99 | remove_pubid(trade.id) 100 | return "cci_loss_sell" 101 | 102 | if current_candle["open"] < current_candle["ma120"]: 103 | return "ma120_sell" 104 | 105 | return None 106 | 107 | def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: 108 | dataframe.loc[:, ['exit_long', 'exit_tag']] = (0, 'long_out') 109 | return dataframe 110 | --------------------------------------------------------------------------------