AminHP / gym-mtsim

A general-purpose, flexible, and easy-to-use simulator alongside an OpenAI Gym trading environment for MetaTrader 5 trading platform (Approved by OpenAI Gym)
MIT License
412 stars 101 forks source link

Overriding signal_features #6

Closed dancydancy closed 2 years ago

dancydancy commented 2 years ago

Hi Amin,

On gym-anytradnig it's possible to override _process_data and add your own custom indicators (from Finta etc).

Is it possible to do the same with mtsim - or how should I be thinking about this? Currently I can't even see how to add and format my own training data.

AminHP commented 2 years ago

Hi @dancydancy,

You can override this function in order to add your own indicators.

You can download data from MetaTrader using the download_data method of MtSimulator. Here is an example code. In case you want to put your own data frames into the simulator instead of downloading from MetaTrader, it might be helpful to read the source code of the download_data.

dancydancy commented 2 years ago

Thank-you :)

He1nr1chK commented 1 year ago

Hi @AminHP, could you provide an example of how to override the _process_data function with a simple indicator like MACD if you get a chance. I am having a lot of trouble figuring out how to add the data produced by the indicator to the signal_features being returned. Thanks in advance

AminHP commented 1 year ago

@He1nr1chK

You should also override _get_prices to store OHLC data.


    def _get_prices(self, keys: List[str]=['Open', 'High', 'Low', 'Close']) -> Dict[str, np.ndarray]:
        prices = {}

        for symbol in self.trading_symbols:
            get_price_at = lambda time: \
                self.original_simulator.price_at(symbol, time)[keys]

            if self.multiprocessing_pool is None:
                p = list(map(get_price_at, self.time_points))
            else:
                p = self.multiprocessing_pool.map(get_price_at, self.time_points)

            prices[symbol] = np.array(p)

        return prices

    def _process_data(self) -> np.ndarray:
        data = self.prices

        macd_features = []
        for pair, ohlc_data in data.items():
            open = ohlc_data[:, 0]
            high = ohlc_data[:, 1]
            low = ohlc_data[:, 2]
            close = ohlc_data[:, 3]
            pair_macd = calculate_macd_from_ohlc(open, high, low, close)
            macd_features.append(pair_macd)

        signal_features = np.column_stack(macd_features)
        return signal_features
He1nr1chK commented 1 year ago

When I do exactly this I get the error: AttributeError: 'NoneType' object has no attribute 'shape'. Any ideas? Sorry if this is a stupid question, my python knowledge is rather limited