pixiu


Namepixiu JSON
Version 0.109.0 PyPI version JSON
download
home_pagehttps://github.com/tradepython/pixiu
SummaryPiXiu - A trading backtesting tool similar to MT4/MT5
upload_time2023-12-07 08:42:06
maintainer
docs_urlNone
authortradepython
requires_python>=3.8
license
keywords trading backtest forex stocks mt4 mt5 metatrade
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [comment]: <> (![alt pixiu-icon]&#40;pixiu-128x128-8bit.png&#41;)

<p align="center">
<img width="128" height="128" src="https://raw.githubusercontent.com/tradepython/pixiu/main/pixiu-128x128-8bit.png">
</p>
<p align="center" style="font-size:xx-small;">PiXiu - A Chinese mythological creature that brings fortune to people.</p>


PiXiu
======
A trading backtesting tool similar to MT4/MT5.

It has a standard set of API definitions, and backtesting code written using these APIs can be run on www.TradePython.com without changes.

Install
=======
```
pip install pixiu
```
If you have problems installing TA-Lib, please refer to https://github.com/mrjbq7/ta-lib



How to use
=======
Parameters :

    -c/--testconfig         test config
    -n/--testname           test name (in the test configuration file)
    -s/--scriptpath         script file
    -o/--logpath            log file
    -p/--printlogtype       print log type
    -m/--multiprocessing    multiprocessing mode
    -r/--compare            compare with the tags list
    -t/--tag                tag
    -l/--datafile           data file name

    Basic

    pixiu -c pixiu_sample.json -n testUSDCHF_TP -s pixiu_sample.py
    pixiu -c pixiu_sample.json -n testUSDCHF_TP -s pixiu_sample.py
    pixiu -c pixiu_sample.json -n testUSDCHF -s pixiu_sample2.py -o log.txt

    Compare multiple strategies

    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.0.py -p report -t 2.10.0 -l ea2_7.json
    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.1.py -p report -t 2.10.1 -l ea2_7.json
    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.2.py -p report -t 2.10.2 -l ea2_7.json

    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json

    Output:
    +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+
    |    |                                      | testAUDUSD_TP_Demo1 | testGBPUSD_TP_Demo1 | testNZDUSD_TP_Demo1 | testEURUSD_TP_Demo1 | testUSDCHF_TP_Demo1 | testUSDJPY_TP_Demo1 | testUSDCAD_TP_Demo1 | Total/Avg          |
    +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+
    | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |
    | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |
    | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |
    ...
    | 7  | Balance(2.10.0)                      | 4988.31             | 5064.61             | 5041.77             | 5071.6              | 4994.96             | 4996.97             | 4996.94             | 35155.16 / 5022.17 |
    | 7  | Balance(2.10.1)                      | 5003.42 ↑           | 5061.26 ↓           | 5000.58 ↓           | 4965.65 ↓           | 5009.12 ↑           | 5033.44 ↑           | 4931.17 ↓           | 35004.64 / 5000.66 |
    | 7  | Balance(2.10.2)                      | 4981.59 ↓           | 5076.74 ↑           | 5000.58 ↓           | 4985.02 ↓           | 5023.02 ↑           | 5029.35 ↑           | 4965.34 ↓           | 35061.64 / 5008.81 |
    | 8  | Total Net Profit(2.10.0)             | -11.69              | 64.61               | 41.77               | 71.6                | -5.05               | -3.02               | -3.05               | 155.17 / 22.17     |
    | 8  | Total Net Profit(2.10.1)             | 3.42 ↑              | 61.26 ↓             | 0.58 ↓              | -34.35 ↓            | 9.14 ↑              | 33.44 ↑             | -68.84 ↓            | 4.65 / 0.66        |
    | 8  | Total Net Profit(2.10.2)             | -18.41 ↓            | 76.74 ↑             | 0.58 ↓              | -14.98 ↓            | 23.04 ↑             | 29.35 ↑             | -34.68 ↓            | 61.64 / 8.81       |
    | 9  | Total Net Profit Rate(2.10.0)        | -0.23 %             | 1.29 %              | 0.84 %              | 1.43 %              | -0.1 %              | -0.06 %             | -0.06 %             | 3.11 % / 0.44 %    |
    | 9  | Total Net Profit Rate(2.10.1)        | 0.07 % ↑            | 1.23 % ↓            | 0.01 % ↓            | -0.69 % ↓           | 0.18 % ↑            | 0.67 % ↑            | -1.38 % ↓           | 0.09 % / 0.01 %    |
    | 9  | Total Net Profit Rate(2.10.2)        | -0.37 % ↓           | 1.53 % ↑            | 0.01 % ↓            | -0.3 % ↓            | 0.46 % ↑            | 0.59 % ↑            | -0.69 % ↓           | 1.23 % / 0.18 %    |
    ...

    pixiu -c pixiu.json -n testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json
    Output:
    +----+--------------------------------------+---------------------+-------------------+
    |    |                                      | testUSDCAD_TP_Demo1 | Total/Avg         |
    +----+--------------------------------------+---------------------+-------------------+
    | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0 / 5000.0   |
    | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0 / 5000.0   |
    | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0 / 5000.0   |
    ...
    | 7  | Balance(2.10.0)                      | 4996.94             | 4996.94 / 4996.94 |
    | 7  | Balance(2.10.1)                      | 4931.17 ↓           | 4931.17 / 4931.17 |
    | 7  | Balance(2.10.2)                      | 4965.34 ↓           | 4965.34 / 4965.34 |
    | 8  | Total Net Profit(2.10.0)             | -3.05               | -3.05 / -3.05     |
    | 8  | Total Net Profit(2.10.1)             | -68.84 ↓            | -68.84 / -68.84   |
    | 8  | Total Net Profit(2.10.2)             | -34.68 ↓            | -34.68 / -34.68   |
    | 9  | Total Net Profit Rate(2.10.0)        | -0.06 %             | -0.06 % / -0.06 % |
    | 9  | Total Net Profit Rate(2.10.1)        | -1.38 % ↓           | -1.38 % / -1.38 % |
    | 9  | Total Net Profit Rate(2.10.2)        | -0.69 % ↓           | -0.69 % / -0.69 % |
    ...


Test configuration file format
=======
JSON format:

```json
{
 "accounts": {
    "default": {
      "balance": 10000.0,
      "equity": 10000.0,
      "margin": 0,
      "free_margin": 10000.0,
      "credit": 0.0,
      "profit": 0.0,
      "margin_level": 0,
      "leverage": 100,
      "currency": "USD",
      "free_margin_mode": 0,
      "stop_out_level": 0,
      "stop_out_mode": 0,
      "company": "TradePython.com",
      "name": "PXTester",
      "number": "000",
      "server": "PXTester",
      "trade_mode": 0,
      "limit_orders": 500,
      "margin_so_mode": 0,
      "trade_allowed": true,
      "trade_expert": 1,
      "margin_so_call": 0.0,
      "margin_so_so": 0.0,
      "commission": 0.0
    }
  },
  "symbols": {
    "USDCHF": {
      "symbol": "USDCHF",
      "spread": 2,
      "digits": 5,
      "stop_level": 0,
      "volume_min": 0.01,
      "trade_contract_size": 100000,
      "point": 0.00001,
      "currency_profit": "CHF",
      "currency_base": "USD",
      "currency_margin": "USD"
    }
  },
  "tests": {
    "testUSDCHF": {
      "symbol": "USDCHF",
      "tick_data": "usdchf_m1_20210315-0415.csv",
      "start_time": "2021-03-15",
      "end_time": "2021-04-16",
      "max_tick": 100,
      "balance": 10000,
      "leverage": 100,
      "currency": "USD",
      "account": "default",
      "spread_point": 15
    },
    "testUSDCHF_TP": {
      "symbol": "USDCHF",
      "tick_data": {
         "channel": "tradepython.com",
         "api_token": "YOUR-API-TOKEN",
         "source": "12345678@PixiuServer01",
         "format": "json",
         "period": 30,
         "timeframe": "m1"
      },
      "max_tick": 100,
      "balance": 10000,
      "leverage": 100,
      "currency": "USD",
      "account": "default",
      "spread_point": 15
    },
    "testUSDCHF_TP2": {
      "symbol": "USDCHF",
      "tick_data": {
         "channel": "tradepython.com",
         "api_token": "YOUR-API-TOKEN",
         "source": {"type": "public", "name": "Demo1"},
         "format": "json",
         "period": 30,
         "start_time": "2021-03-15",
         "end_time": "2021-04-16",
         "timeframe": "m1"
      },
      "start_time": "2021-03-15",
      "end_time": "2021-04-16",
      "max_tick": 100,
      "balance": 10000,
      "leverage": 100,
      "currency": "USD",
      "account": "default",
      "spread_point": 15
    }
  }
}
```

Testing with csv files:

    symbol: product
    tick_data: tick data data file
    start_time: start time
    end_time: end time
    max_tick: the maximum number of ticks to test, which can reduce the test time
    balance: initial capital of the test account
    leverage: leverage of the test account
    account: the name of the test account (in the test profile accounts)
    spread_point: spread

```json
"testUSDCHF": {
  "symbol": "USDCHF",
  "tick_data": "usdchf_m1_20210315-0415.csv",
  "start_time": "2021-03-15",
  "end_time": "2021-04-16",
  "max_tick": 100,
  "balance": 10000,
  "leverage": 100,
  "currency": "USD",
  "account": "default",
  "spread_point": 15
}
```

Test with tradepython data test

    source: Data account
      account@account-server
      Example:
          12345678@PixiuServer01
      or: {"type": "public", "name": "Demo1"}
      type: public or private
      name: Account name

    period: data period (days)
      Example:
          30 - the last 30 days of data

    timeframe: time frame, the following values
        s1 - 1 second
        m1 - 1 minute
        m5 - 1 minute
        m15 - 15 minutes
        m30 - 30 minutes
        h1 - 1 hour
        h4 - 1 hour
        d1 - 1 day
        w1 - 1 week
        mn1 - 1 month

```json
"testUSDCHF_TP": {
   ...
  "tick_data": {
     "channel": "tradepython.com",
     "api_token": "YOUR-API-TOKEN",
     "source": "account@account-server",
     "format": "json",
     "period": 30,
     "timeframe": "m1"
  },
  ...
}
```

Script Samples
=======
1. Buy or sell a product
   ```python
    errid, order_uid = Buy(volume=volume, price=Ask())
    errid, order_uid = Sell(volume=0.01, price=Bid())
   ```

2. Modify an order
   ```python
    errid, order_uid = ModifyOrder(order_uid, stop_loss=stop_loss, take_profit=take_profit)
   ```

3. Close an order
   ```python
    errid, order_uid = CloseOrder(order_uid, price=Ask(), volume=volume)
   ```

4. Get the current open order UIDs
   ```python
    uids = GetOpenedOrderUIDs()
    for uid in uids:
        o = GetOrder(uid)
   ```


API
=======

```python
AccountEquity(self)
   Returns the equity.

           Returns:
                   The account equity.

AccountFreeMargin(self)
   Returns the free margin.

           Returns:
                   The free margin.

Ask(self, shift=0, symbol=None) -> float
   Returns Ask price value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   Ask price.

Bid(self, shift=0, symbol=None) -> float
   Returns Bid price value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   Bid price.

Buy(self, volume: float, type=0, price=None, stop_loss=None, take_profit=None, magic_number=None, symbol=None, slippage=None, arrow_color=None, expiration=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)
   Open a long order.

           Parameters:
                   volume (float): Number of lots.
                   type (OrderType): Order type.
                   price (float): Order price. If price is None, price = Ask().
                   stop_loss (float): Stop loss price.
                   take_profit (float): Take profit price.
                   magic_number (float): Order magic number.
                   symbol (float): Symbol for trading.
                   slippage (float): Maximum price slippage for trading.
                   arrow_color (float): Color of the opening arrow on the MT4/5 chart.
                   expiration (float): Order expiration time (for pending order only)
                   tags (dict): Order tags

           Returns:
                   ErrorID: If 0 success.
                   OrderResult: The order result.


Sell(self, volume: float, type=0, price=None, stop_loss=None, take_profit=None, magic_number=None, symbol=None, slippage=None, arrow_color=None, expiration=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)
   Open a short order.

           Parameters:
                   volume (float): Number of lots.
                   type (OrderType): Order type.
                   price (float): Order price. If price is None, price = Bid().
                   stop_loss (float): Stop loss price.
                   take_profit (float): Take profit price.
                   magic_number (float): Order magic number.
                   symbol (float): Symbol for trading.
                   slippage (float): Maximum price slippage for trading.
                   arrow_color (float): Color of the opening arrow on the MT4/5 chart.
                   expiration (float): Order expiration time (for pending order only)
                   tags (dict): Order tags

           Returns:
                   ErrorID: If 0 success.
                   OrderResult: The order result.


ModifyOrder(self, uid, price=None, stop_loss=None, take_profit=None, arrow_color=None, expiration=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)
   Modify a order.

           Parameters:
                   uid : The order UID.
                   price (float): New open price. (for pending order only)
                   stop_loss (float): New stop loss price.
                   take_profit (float): New take profit price.
                   arrow_color (float): New color of the opening arrow on the MT4/5 chart.
                   expiration (float): New order expiration time (for pending order only)
                   tags (dict): Order tags
           Returns:
                   ErrorID: If 0 success.
                   OrderResult: The order result.

CloseOrder(self, uid, price, volume: float, slippage=None, arrow_color=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)
   Close a order.

           Parameters:
                   uid : The order UID.
                   price (float): Close price.
                   volume (float): Number of lots.
                   slippage (float): Maximum price slippage for trading.
                   arrow_color (float): New color of the opening arrow on the MT4/5 chart.
                   tags (dict): Order tags

           Returns:
                   ErrorID: If 0 success.
                   OrderResult: The order result.


Close(self, shift=0, symbol=None) -> float
   Returns Close price value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                    symbol (str): The symbol name.
                            If None returns current symbol.

           Returns:
                   Close price.

DefaultTimeFrame(self)
   Returns the default time frame.

GetAccount(self)
   Returns the account data.

           Returns:
                   The account data.

GetClosedOrderUIDs(self, symbol: str = None, scope: int = DataScope.EA)
   Returns the UIDs of current closed orders.

           Parameters:
                   symbol: The symbol name.
                           If None returns current symbol.
                           If '*' returns all symbols.
                   scope:
                           EA: The current ea (default).
                           ACCOUNT: The current account.
                           EA_VERSION: The current ea version.

           Returns:
                   The uid list.

GetOpenedOrderUIDs(self, symbol: str = None, scope: int = DataScope.EA)
   Returns the UIDs of current opened orders.

           Parameters:
                   symbol: The symbol name.
                           If None returns current symbol.
                           If '*' returns all symbols.
                   scope:
                           EA: The current ea (default).
                           ACCOUNT: The current account.
                           EA_VERSION: The current ea version.


           Returns:
                   The uid list.


GetPendingOrderUIDs(self, symbol: str = None, scope: int = DataScope.EA)
   Returns the UIDs of current pending orders.

           Parameters:
                   symbol: The symbol name.
                           If None returns current symbol.
                           If '*' returns all symbols.
                   scope:
                           EA: The current ea (default).
                           ACCOUNT: The current account.
                           EA_VERSION: The current ea version.

           Returns:
                   The uid list.

GetOrder(self, order_uid: <function NewType.<locals>.new_type at 0x7fe122ed0940>)
   Returns the order object.

           Parameters:
                   order_uid (): The order uid.

           Returns:
                   The order object.

GetParam(self, name, default=None)
   Returns the EA parameter value.

           Parameters:
                   name (): The EA parameter name.
                   default (int): The EA parameter default value.

           Returns:
                   The EA parameter value.

  GetSettings(self, name, default=None)
    Returns the EA Settings value.

            Parameters:
                    name (): The EA settings name.
                    default (int): The EA settings default value.

            Returns:
                    The EA settings value.

GetSymbol(self, symbol=None)
   Returns the symbol properties.

           Parameters:
                   symbol (str): The symbol name.

           Returns:
                   The symbol properties

GetSymbolData(self, symbol: str, timeframe: str, size: int)
   Get a symbol data.

           Parameters:
                   symbol (str): Symbol name.
                   timeframe (str): Timeframe. See the TimeFrame defining.
                   size (int): Maximum size.

           Returns:
                   Symbol data

High(self, shift=0, symbol=None) -> float
   Returns High price value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   High price.

Low(self, shift=0, symbol=None) -> float
   Returns Low price value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   Low price.

Open(self, shift=0, symbol=None) -> float
   Returns Open price value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   Open price.

OrderStats(self, order_uids)
   Returns the order statistics.

           Parameters:
                   order_uids : the list of order uids.

           Returns:
                   The order statistics.


StopTester(self, code: int = 0, message: str = None)
   Stop the EA tester. (For tester only.)

           Parameters:
                   code (int): Error code.
                   message (str): Error message.

           Returns:
                   None

Symbol(self) -> str
   Returns the current symbol name.

           Returns:
                   The symbol name.

SymbolInfo(self, item, symbol=None, default=None)
   Returns the symbol information.

           Parameters:
                   item (str): The symbol item name.
                   symbol (str): The symbol name.
                   default (): The default value.

           Returns:
                   The symbol information.

Time(self, shift=0, symbol=None) -> datetime.datetime
   Returns time value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   Time.

Volume(self, shift=0, symbol=None) -> float
   Returns volume value for the default symbol with default timeframe and shift.

           Parameters:
                   shift (int): Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).
                   symbol (str): The symbol name.
                           If None returns current symbol.

           Returns:
                   Volume price.

__init__(self)
   Initialize self.  See help(type(self)) for accurate signature.

iAD(self, symbol_data, shift=0)
   Chaikin A/D Line (Volume Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Chaikin A/D Line

iADX(self, symbol_data, timeperiod, shift=0)
   Average Directional Movement Index (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Average Directional Movement Index

iATR(self, symbol_data, timeperiod, shift=0)
   Average True Range (Volatility Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Average True Range

iBands(self, symbol_data, timeperiod, nbdevup, nbdevdn, matype, shift=0)
   Bollinger Bands (Overlap Studies)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   nbdevup (int): 2
                   nbdevdn (int): 2
                   ma_type: 0 (Simple Moving Average) ,For details see the TA-LIB
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Bollinger Bands

iCCI(self, symbol_data, timeperiod, shift=0)
   Commodity Channel Index (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Commodity Channel Index

iChaikin(self, symbol_data, fastperiod, slowperiod, shift=0)
   Chaikin A/D Oscillator (Volume Indicators)

          Parameters:
                  symbol_data (object): The symbol data.
                  fastperiod (int): The fast period.
                  slowperiod (int): The low period.
                  shift: Index of the value taken from the buffer
                  (shift relative to the current the given amount of periods ago).

          Returns:
                  Chaikin A/D Oscillator

iDEMA(self, symbol_data, timeperiod, shift=0)
   Double Exponential Moving Average (Overlap Studies)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Double Exponential Moving Average

iMA(self, price_data, period, ma_type, shift=0)
   Calculates the Moving Average indicator and returns its value.

           Parameters:
                   price_data (object): The price data. (Close, Open, Low, etc...)
                   period (int): Averaging period for calculation.
                   ma_type: 0 (Simple Moving Average) ,For details see the TA-LIB
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Moving average value.

iMACD(self, symbol_data, fastperiod, slowperiod, signalperiod, shift=0)
   Moving Average Convergence/Divergence (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   fastperiod (int): The fast period.
                   slowperiod (int): The slow period.
                   signalperiod (int): The signal period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Moving Average Convergence/Divergence

iMFI(self, symbol_data, timeperiod, shift=0)
   Money Flow Index (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Money Flow Index

iMomentum(self, symbol_data, timeperiod, shift=0)
   Momentum (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Momentum

iOBV(self, symbol_data, shift=0)
   On Balance Volume (Volume Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   On Balance Volume

iRSI(self, symbol_data, timeperiod, shift=0)
   Relative Strength Index (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Relative Strength Index

iSAR(self, symbol_data, acceleration, maximum, shift=0)
   Parabolic SAR (Overlap Studies)

           Parameters:
                   symbol_data (object): The symbol data.
                   acceleration (int): 0.02
                   maximum (int): 0.2
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Parabolic SAR

iStdDev(self, symbol_data, timeperiod, nbdev, shift=0)
   Standard Deviation (Statistic Functions)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   nbdev (int): 1
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Standard Deviation

iStochastic(self, symbol_data, fastk_period, slowk_period, slowk_matype, slowd_period, slowd_matype, shift=0)
   Stochastic (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   fastk_period (int): 5
                   slowk_period (int): 3
                   slowk_matype (int): 0
                   slowd_period (int): 3
                   slowd_matype (int): 0
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Stochastic

iTEMA(self, symbol_data, timeperiod, shift=0)
   Triple Exponential Moving Average (Overlap Studies)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Triple Exponential Moving Average

iWPR(self, symbol_data, timeperiod, shift=0)
   Williams' %R (Momentum Indicators)

           Parameters:
                   symbol_data (object): The symbol data.
                   timeperiod (int): The time period.
                   shift: Index of the value taken from the buffer
                   (shift relative to the current the given amount of periods ago).

           Returns:
                   Williams' %R

WaitCommand(self, uid, timeout=120)
   Waiting for a asynchronous command execution。

          Parameters:
                  uid : The command UID.
                  timeout : Timeout (seconds)
          Returns:
                  ErrorID: If 0 success.
                  CommandResult: If failed returns None.
                  

 AcquireLock(self, name, timeout=60) -> bool:
     Acquire a lock

             Parameters:
                     name : The lock name
                     timeout : Lock timeout (seconds)
             Returns:
                     If True success.
     

 ReleaseLock(self, name):
     Release a lock

             Parameters:
                     name : The lock name
     

 Plot(self, series):
     Plot
     
             Parameters:
                     series


 DeleteData(self, name, scope: int = DataScope.EA) -> ErrorID:
     Delete data

             Parameters:
                     name : The data name
                     scope : The data scope (current EA settings, EA version, EA, Account)
             Returns:
                     The errorid.

 LoadData(self, name, scope: int = DataScope.EA, format='json'):
     Load data

             Parameters:
                     name : The data name
                     scope : The data scope (current EA settings, EA version, EA, Account)
                     format: Only support JSON.
             Returns:
                     data.
 
 SaveData(self, name, data, scope: int = DataScope.EA, format='json') -> ErrorID:
     Save data

             Parameters:
                     name : The data name
                     scope : The data scope (current EA settings, EA version, EA, Account)
                     format: Only support JSON.
             Returns:
                     The errorid.
 
 Notify(self, message) -> ErrorID:
     Send a notification

             Parameters:
                     message: The content of notification
             Returns:
                     The errorid.
                  
                   
```



### [2023-12-07]
#### Version:
#####   Package:
#####    pixiu: 0.109.*.20231207
#####
#### **Descriptions:**
     1.ea_taster.py:
       1) __close_order__
         Fix profit calculation error when closing partitioned volumes  
       

### [2023-11-16]
#### Version:
#####   Package:
#####    pixiu: 0.108.*.20231116
#####
#### **Descriptions:**
     1.main.py:
       1) gen_report_row: 
          Add compare_item['value'] checking

### [2023-11-15]
#### Version:
#####   Package:
#####    pixiu: 0.107.*.20231115
#####
#### **Descriptions:**
     1.ea_tester.py:
       1) __close_order__:
          Fix new order open_price error
     2.ts_order_market.py:
       1) Add from_uid, to_uid test

### [2023-11-14]
#### Version:
#####   Package:
#####    pixiu: 0.106.*.20231114
#####
#### **Descriptions:**
     1.ea_tester.py:
       1) Fix order_to_ndarray KeyError: 'magic_number'
       2) __close_order__:
          Change order comment from 'close by #xxx' to 'from #xxx'
          Remove the tags of closed order
       3) __add_market_order__:
          Add comment checking
     2.ts_order_market.py:
       1) Add close partial order test


### [2023-06-23]
#### Version:
#####   Package:
#####    pixiu: 0.105.*.20230623
#####
#### **Descriptions:**
     1.ea_tester.py:
      1)  Add tick_test_start_index in params
      2)  Add test_period in pixiu config file

### [2023-03-13]
#### Version:
#####   Package:
#####    pixiu: 0.104.*.20230313
#####
#### **Descriptions:**
     1.pxtester.py:
      1) Add get_tick_data_from_yfinance, covert_yfinance_data_to_json 

### [2023-02-26]
#### Version:
#####   Package:
#####    pixiu: 0.103.*.20230226
#####
#### **Descriptions:**
     1.main.py:
      1) start_mp, start_sp: results add exception 

### [2023-02-28]
#### Version:
#####   Package:
#####    pixiu: 0.102.*.20230228
#####
#### **Descriptions:**
     1.ea_tester.py:
       1) Remove parse_script, get_script_init_settings
       2) execute_: Add ValidScriptSettings Error
       3) __init__: self.log_file = open(self.log_path, mode='wt')


### [2023-02-22]
#### Version:
#####   Package:
#####    pixiu: 0.101.*.20230222
#####
#### **Descriptions:**
     1.ea_tester.py:
      1) Add script_settings output

### [2023-02-12]
#### Version:
#####   Package:
#####    pixiu: 0.100.*.20230212
#####
#### **Descriptions:**
     1.ea_tester.py:
       1) Fix get_api missing error.

### [2023-01-11]
#### Version:
#####   Package:
#####    pixiu: 0.99.*.20230111
#####
#### **Descriptions:**
     1.ea_tester.py:
       1) Fix self.current_tick_index exception in execute_(self, ticket)

### [2022-12-28]
#### Version:
#####   Package:
#####    pixiu: 0.98.*.20221228
#####
#### **Descriptions:**
     1.Add global API:
      PX_InitScriptSettings, PX_ValidScriptSettings
      Call order:
       PX_InitScriptSettings -> AddChart/AddParam -> PX_ValidScriptSettings
     2.Add ts_settings.py

### [2022-12-19]
#### Version:
#####   Package:
#####    pixiu: 0.97.*.20221219
#####
#### **Descriptions:**
     1.Add global API:
      PX_InitScriptSettings, PX_ValidScriptSettings
      Call order:
       PX_InitScriptSettings -> AddChart/AddParam -> PX_ValidScriptSettings

### [2022-12-07]
#### Version:
#####   Package:
#####    pixiu: 0.96.*.20221207
#####
#### **Descriptions:**
    1.api.py:
      Add AddChart, AddParam

### [2022-12-06]
#### Version:
#####   Package:
#####    pixiu: 0.95.*.20221206
#####
#### **Descriptions:**
    1.api.py:
      Add AddChart, AddParam

### [2022-12-05]
#### Version:
#####   Package:
#####    pixiu: 0.94.*.20221205
#####
#### **Descriptions:**
   1.pxtester.py:
     1) Replace json with json5

### [2022-12-02]
#### Version:
#####   Package:
#####    pixiu: 0.93.*.20221202
#####
#### **Descriptions:**
   1.pxtester.py:
     1) Fix get_data_info tzinfo error

### [2022-11-04]
#### Version:
#####   Package:
#####    pixiu: 0.92.*.20221104
#####
#### **Descriptions:**
    1.api_base.py:
     1) Add _safe_import

### [2022-10-25]
#### Version:
#####   Package:
#####    pixiu: 0.91.*.20221025
#####
#### **Descriptions:**
    1.ea_tester.py:
     1)Add execute_script

### [2022-08-26]
#### Version:
#####   Package:
#####    pixiu: 0.90.*.20220826
#####
#### **Descriptions:**
    1.test_pixiu.py:
     1) test_ea_tester_func_base: datetime.utcfromtimestamp(new_a['t'][idx])
     2) test_ea_tester_func_indicators: datetime.utcfromtimestamp(new_a['t'][idx])
    2.ts_symbol_data.py:
     1) Change 
            assertEqual(df['time'][valid_shift], get_timeframe_value_by_time(timeframe, c_time, "time").timestamp(),
                f'@ {c_time}, {timeframe}')
        to 
            assertEqual(df['time'][valid_shift], get_timeframe_value_by_time(timeframe, c_time, "time").replace(tzinfo=timezone('UTC')).timestamp(),
                f'@ {c_time}, {timeframe}')
    3.setup.py:
     1) Add requires: dash, plotly


### [2022-08-02]
#### Version:
#####   Package:
#####    pixiu: 0.89.*.20220802
#####
#### **Descriptions:**
    1.ea_tester.py:
     1) Fix calculate_return_ratio return value error

### [2022-07-28]
#### Version:
#####   Package:
#####    pixiu: 0.88.*.20220728
#####
#### **Descriptions:**
    1.pxtester.py:
      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp
    2.account.py:
      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp
    3.order.py:
      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp
    4.symbol.py:
      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp
    5.ea_tester.py:
      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp
    6.test_pixiu.py:
      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp

### [2022-07-18]
#### Version:
#####   Package:
#####    pixiu: 0.87.*.20220718
#####
#### **Descriptions:**
    1. Fix gen_report_row total_value bug

### [2022-06-20]
#### Version:
#####   Package:
#####    pixiu: 0.86.*.20220620
#####
#### **Descriptions:**
    1.Add ea_tester_graph
       support dash + plotly
        

### [2022-05-18]
#### Version:
#####   Package:
#####    pixiu: 0.85.*.20220518
#####
#### **Descriptions:**
    1.ea_tester.py:
        1) Fix calculate_returns calculation error


### [2022-04-26]
#### Version:
#####   Package:
#####    pixiu: 0.84.*.20220426
#####
#### **Descriptions:**
    1.tester_api_v1.py:
        1) Fix __get_indicator__ cache_name error

### [2022-04-24]
#### Version:
#####   Package:
#####    pixiu: 0.83.*.20220424
#####
#### **Descriptions:**
    1.symbol.py:
      1) SymbolIndicator, SymbolPrice, SymbolTime, SymbolData add getitem_index
      2) SymbolPrice add:
            <	__lt__(self, other)
            >	__gt__(self, other)
            <=	__le__(self, other)
            >=	__ge__(self, other)
            ==	__eq__(self, other)
            !=	__ne__(self, other)
            +	__add__(self, other)
            –	__sub__(self, other)
            * __mul__(self, other)
            /	__truediv__(self, other)
            //	__floordiv__(self, other)
            %	__mod__(self, other)
            **	__pow__(self, other)

### [2022-04-23]
#### Version:
#####   Package:
#####    pixiu: 0.82.*.20220423
#####
#### **Descriptions:**
    1.symbol.py:
      1) Add to_dataframe
    2.api_base.py:
      1) env_dict add _iter_unpack_sequence_ # [abs(value - level) < ave for _, level in levels]
    3.ea_node_transformer.py:
      1) Add EARestrictingNodeTransformer

### [2022-04-22]
#### Version:
#####   Package:
#####    pixiu: 0.81.*.20220422
#####
#### **Descriptions:**
    1.ea_tester.py:
      1) Change min_volume initial value to None
    2.pxtester.py:
      1)  Fix on_end_execute item['value'] None error
    3.main.py:
      1)  Fix gen_report_row item['value'] None error

### [2022-04-21]
#### Version:
#####   Package:
#####    pixiu: 0.80.*.20220421
#####
#### **Descriptions:**
    1.ea_tester.py:
      1) report add max_volume

### [2022-04-20]
#### Version:
#####   Package:
#####    pixiu: 0.79.*.20220420
#####
#### **Descriptions:**
    1.ea_tester.py:
      1) Fix __valid_order__ pending order error

### [2022-04-18]
#### Version:
#####   Package:
#####    pixiu: 0.78.*.20220418
#####
#### **Descriptions:**
    1.api_base.py:
      1) env_dictAdd property

### [2022-04-07]
#### Version:
#####   Package:
#####    pixiu: 0.77.*.20220407
#####
#### **Descriptions:**
    1.ea_tester.py:
        1) Fix calculate_return_ratio error
        2) Add sortino_ratio

### [2022-04-06]
#### Version:
#####   Package:
#####    pixiu: 0.76.*.20220406
#####
#### **Descriptions:**
    1.ea_tester.py:
        1) Add percent_str_to_float
        2) Add calculate_sharpe_ratio

### [2022-04-03]
#### Version:
#####   Package:
#####    pixiu: 0.75.*.20220403
#####
#### **Descriptions:**
    1.ea_tester.py:
        1) Add margin_so_so, margin_so_call checking

### [2022-04-02]
#### Version:
#####   Package:
#####    pixiu: 0.74.*.20220402
#####
#### **Descriptions:**
    1.ea_tester.py:
       Fix modify_order order_log error

### [2022-03-30]
#### Version:
#####   Package:
#####    pixiu: 0.73.*.20220330
#####
#### **Descriptions:**
    1.ea_tester.py:
        __remove_pending_order__ pop add None
    2.Add set:
      env_dict["set"]


### [2022-03-10]
#### Version:
#####   Package:
#####    pixiu: 0.72.*.20220310
#####
#### **Descriptions:**
    1.ts_order_buylimit.py,ts_order_buystop.py,ts_order_selllimit.py,ts_order_sellstop.py:
      Add check order.status
    2.api.py:
      Add GetSettings

### [2022-03-09]
#### Version:
#####   Package:
#####    pixiu: 0.71.*.20220309
#####
#### **Descriptions:**
    1.defines.py:
      Add OrderStatus
    2.order.py:
      Add status

### [2022-03-05]
#### Version:
#####   Package:
#####    pixiu: 0.70.*.20220305
#####
#### **Descriptions:**
    1.ea_tester.py:
      1) __process_order__: Add parameters: ask, last_ask, bid, last_bid
      2) __calculate_profit__: Update calculation m
      3) __valid_order__: Add parameters: ask, bid

### [2022-03-04]
#### Version:
#####   Package:
#####    pixiu: 0.69.*.20220304
#####
#### **Descriptions:**
    1.Add PositionType
    2.Fix __valid_order__ pending order error
    3.Fix __close_order__ close_time error

### [2022-03-02]
#### Version:
#####   Package:
#####    pixiu: 0.68.*.20220301
#####
#### **Descriptions:**
    1.ea_tester.py: Add volume_precision

### [2022-03-01]
#### Version:
#####   Package:
#####    pixiu: 0.67.*.20220301
#####
#### **Descriptions:**
    1.fix __remove_order__ pop bug

### [2022-02-26]
#### Version:
#####   Package:
#####    pixiu: 0.66.*.20220226
#####
#### **Descriptions:**
    1.Add is_dirty method to order
    2.API: add RunMode, CloseMultiOrders
    3.Defines: add RunModeValue

### [2022-02-24]
#### Version:
#####   Package:
#####    pixiu: 0.65.*.20220224
#####
#### **Descriptions:**
    1.Change error name: EID_EAT_MARGIN_CALL -> EID_EAT_NOT_ENOUGH_MONEY

### [2022-02-22]
#### Version:
#####   Package:
#####    pixiu: 0.64.*.20220222
#####
#### **Descriptions:**
    1.Add tags in order data 

### [2022-02-11]
#### Version:
#####   Package:
#####    pixiu: 0.63.*.20220211
#####
#### **Descriptions:**
    1.Add new testing 'test_ea_tester_func_load_lib'

### [2022-02-10]
#### Version:
#####   Package:
#####    pixiu: 0.62.*.20220210
#####
#### **Descriptions:**
    1.Add library function 
        ###[lib|library]=["PriceAction==0.1.0"]
    2.ea_base.py:
      1)Add method parse_script
    


### [2022-02-09]
#### Version:
#####   Package:
#####    pixiu: 0.61.*.20220209
#####
#### **Descriptions:**
    1.Remove OrderScope, using DataScope

### [2021-12-14]
#### Version:
#####   Package:
#####    pixiu: 0.60.*.20211114
#####
#### **Descriptions:**
    1.EA script support timezone
    2.ts_base: Add test_timezone

### [2021-12-11]
#### Version:
#####   Package:
#####    pixiu: 0.59.*.20211111
#####
#### **Descriptions:**
    1.Support auto loading script from tag
        pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 -s ../Test/Test_V2.11.18-3x.py -p report -t 2.11.18-3x -l ea2_7_211209.json
        or
        pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 -s ../Test -p report -t 2.11.18-3x -l ea2_7_211209.json


### [2021-11-26]
#### Version:K
#####   Package:
#####    pixiu: 0.58.*.20211126
#####
#### **Descriptions:**
    1.Update README.md/README.zh.md
    2.ea_tester.py:
      Modify notify output format

### [2021-11-25]
#### Version:
#####   Package:
#####    pixiu: 0.57.*.20211125
#####
#### **Descriptions:**
    1.Update README.md/README.zh.md
    2.ea_tester.py:
      Modify notify output format


### [2021-11-24]
#### Version:
#####   Package:
#####    pixiu: 0.56.*.20211124
#####
#### **Descriptions:**
    1.api.py, tester_api_v1.py:
      Add Notify


### [2021-11-16]
#### Version:
#####   Package:
#####    pixiu: 0.55.*.20211116
#####
#### **Descriptions:**
    1.Fix setup.py requires. 

### [2021-11-15]
#### Version:
#####   Package:
#####    pixiu: 0.54.0.20211115
#####
#### **Descriptions:**
    1.api.py, tester_api_v1.py:
      Add DeleteData, LoadData, SaveData
      Buy/Sell/ModifyOrder/CloseOrder add argument tags 
    2.tests:
      ts_base.py add data test
      ts_order_market.py add tags 
    3.api_base.py:
      Add uuid, hashlib 

### [2021-11-14]
#### Version:
#####   Package:
#####    pixiu: 0.53.0.20211114
#####
#### **Descriptions:**
    1.api.py, tester_api_v1.py:
      Ask, Bid, Time, Volume, Open, Close, Low, High add symbol
    2.order.py:
      Add from_uid, to_uid, group_uid, tags

### [2021-11-13]
#### Version:
#####   Package:
#####    pixiu: 0.52.0.20211113
#####
#### **Descriptions:**
    1.Add arguments : 
        --compare-wit-tag/-r, --tag/-t, --datafile/-l
      sample:
            1)  
               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.0.py -p report -t 2.10.0 -l ea2_7.json
               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.1.py -p report -t 2.10.1 -l ea2_7.json
               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.2.py -p report -t 2.10.2 -l ea2_7.json
               
               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json
                +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+
                |    |                                      | testAUDUSD_TP_Demo1 | testGBPUSD_TP_Demo1 | testNZDUSD_TP_Demo1 | testEURUSD_TP_Demo1 | testUSDCHF_TP_Demo1 | testUSDJPY_TP_Demo1 | testUSDCAD_TP_Demo1 | Total/Avg          |
                +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+
                | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |
                | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |
                | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |
                ...
                | 7  | Balance(2.10.0)                      | 4988.31             | 5064.61             | 5041.77             | 5071.6              | 4994.96             | 4996.97             | 4996.94             | 35155.16 / 5022.17 |
                | 7  | Balance(2.10.1)                      | 5003.42 ↑           | 5061.26 ↓           | 5000.58 ↓           | 4965.65 ↓           | 5009.12 ↑           | 5033.44 ↑           | 4931.17 ↓           | 35004.64 / 5000.66 |
                | 7  | Balance(2.10.2)                      | 4981.59 ↓           | 5076.74 ↑           | 5000.58 ↓           | 4985.02 ↓           | 5023.02 ↑           | 5029.35 ↑           | 4965.34 ↓           | 35061.64 / 5008.81 |
                | 8  | Total Net Profit(2.10.0)             | -11.69              | 64.61               | 41.77               | 71.6                | -5.05               | -3.02               | -3.05               | 155.17 / 22.17     |
                | 8  | Total Net Profit(2.10.1)             | 3.42 ↑              | 61.26 ↓             | 0.58 ↓              | -34.35 ↓            | 9.14 ↑              | 33.44 ↑             | -68.84 ↓            | 4.65 / 0.66        |
                | 8  | Total Net Profit(2.10.2)             | -18.41 ↓            | 76.74 ↑             | 0.58 ↓              | -14.98 ↓            | 23.04 ↑             | 29.35 ↑             | -34.68 ↓            | 61.64 / 8.81       |
                | 9  | Total Net Profit Rate(2.10.0)        | -0.23 %             | 1.29 %              | 0.84 %              | 1.43 %              | -0.1 %              | -0.06 %             | -0.06 %             | 3.11 % / 0.44 %    |
                | 9  | Total Net Profit Rate(2.10.1)        | 0.07 % ↑            | 1.23 % ↓            | 0.01 % ↓            | -0.69 % ↓           | 0.18 % ↑            | 0.67 % ↑            | -1.38 % ↓           | 0.09 % / 0.01 %    |
                | 9  | Total Net Profit Rate(2.10.2)        | -0.37 % ↓           | 1.53 % ↑            | 0.01 % ↓            | -0.3 % ↓            | 0.46 % ↑            | 0.59 % ↑            | -0.69 % ↓           | 1.23 % / 0.18 %    |
                ...

               pixiu -c pixiu.json -n testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json
                +----+--------------------------------------+---------------------+-------------------+
                |    |                                      | testUSDCAD_TP_Demo1 | Total/Avg         |
                +----+--------------------------------------+---------------------+-------------------+
                | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0 / 5000.0   |
                | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0 / 5000.0   |
                | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0 / 5000.0   |
                ...
                | 7  | Balance(2.10.0)                      | 4996.94             | 4996.94 / 4996.94 |
                | 7  | Balance(2.10.1)                      | 4931.17 ↓           | 4931.17 / 4931.17 |
                | 7  | Balance(2.10.2)                      | 4965.34 ↓           | 4965.34 / 4965.34 |
                | 8  | Total Net Profit(2.10.0)             | -3.05               | -3.05 / -3.05     |
                | 8  | Total Net Profit(2.10.1)             | -68.84 ↓            | -68.84 / -68.84   |
                | 8  | Total Net Profit(2.10.2)             | -34.68 ↓            | -34.68 / -34.68   |
                | 9  | Total Net Profit Rate(2.10.0)        | -0.06 %             | -0.06 % / -0.06 % |
                | 9  | Total Net Profit Rate(2.10.1)        | -1.38 % ↓           | -1.38 % / -1.38 % |
                | 9  | Total Net Profit Rate(2.10.2)        | -0.69 % ↓           | -0.69 % / -0.69 % |
                ...





### [2021-11-11]
#### Version:
#####   Package:
#####    pixiu: 0.51.0.20211111
#####
#### **Descriptions:**
    1.api_base:
      Add build-in function: max, min, all, any, ascii, bin, chr, divmod, enumerate, filter, format, hex, next, oct, ord, pow, reversed, sorted, sum
    2.main.py:
      Add argument: multiprocessing

### [2021-10-26]
#### Version:
#####   Package:
#####    pixiu: 0.50.0.20211026
#####
#### **Descriptions:**
    1.ea_tester.py:
        1) Fix report currency bug

### [2021-10-24]
#### Version:
#####   Package:
#####    pixiu: 0.49.0.20211024
#####
#### **Descriptions:**
    1.Using process pool

### [2021-10-23]
#### Version:
#####   Package:
#####    pixiu: 0.48.0.20211023
#####
#### **Descriptions:**
    1.Add support multiple test names:
     pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 ...


### [2021-10-19]
#### Version:
#####   Package:
#####    pixiu: 0.47.0.20211019
#####
#### **Descriptions:**
    1.ea_tester.py:
     1) Fix report total_net_profit_rate error.
    2.pxtester.py:
     1) parse_test_config: Add custom account

### [2021-10-18]
#### Version:
#####   Package:
#####    pixiu: 0.46.0.20211018
#####
#### **Descriptions:**
    1.ea_tester.py:
     1) Fix modify_order bug, if take_profit or stop_loss is None

### [2021-10-16]
#### Version:
#####   Package:
#####    pixiu: 0.45.0.20211016
#####
#### **Descriptions:**
    1.pxtester.py:
      1) Report add win rate

### [2021-10-15]
#### Version:
#####   Package:
#####    pixiu: 0.44.0.20211015
#####
#### **Descriptions:**
    1.pxtester.py:
      1) Add argument: print_log_type = account|order|ea|report

### [2021-10-14]
#### Version:
#####   Package:
#####    pixiu: 0.43.0.20211014
#####
#### **Descriptions:**
    1.ea_tester.py:
      1) Fix bugs: __process_order__, close_all_orders call close_order error
      2) Fix bugs: max_drawdown calculation
    2.pxtester.py:
      1) on_end_execute: report output format

### [2021-08-25]
#### Version:
#####   Package:
#####    pixiu: 0.42.0.20210825
#####
#### **Descriptions:**
    1.ea_tester.py:
      1) __add_market_order__:
        new_order['comment'] = f"cuid#{new_order['uid']}|" 
        to
        new_order['comment'] = f"uid#{new_order['uid']}|"

### [2021-08-06]
#### Version:
#####   Package:
#####    pixiu: 0.41.0.20210806
#####
#### **Descriptions:**
    1.API 1 
      1) Add Plot 

### [2021-08-04]
#### Version:
#####   Package:
#####    pixiu: 0.40.0.20210804
#####
#### **Descriptions:**
    1.ea_tester.py:
        1).Change plot parameters to plot(chart_name, {series_name1: data, series_name2: data, ...})

### [2021-07-20]
#### Version:
#####   Package:
#####    pixiu: 0.39.0.20210720
#####
#### **Descriptions:**
    1.ea_tester.py:
        1).Add plot 

### [2021-07-16]
#### Version:
#####   Package:
#####    pixiu: 0.38.0.20210716
#####
#### **Descriptions:**
    1.Update API:
     1) GetOpenedOrderUIDs, GetPendingOrderUIDs, GetClosedOrderUIDs
       Add parameter: scope

### [2021-07-08]
#### Version:
#####   Package:
#####    pixiu: 0.37.0.20210708
#####
#### **Descriptions:**
    1.fix write_log bugs: parameters count


### [2021-06-07]
#### Version:
#####   Package:
#####    pixiu: 0.36.2.20210607
#####
#### **Descriptions:**
    1.fix dependencies bugs
       remove oeoeweb library
       add pymongo library
    2.fix sample.py, sample2.py errors.
    3.API add AcquireLock, ReleaseLock 

    
### [2021-06-04]
#### Version:
#####   Package:
#####    pixiu: 0.35.0.20210604
#####
#### **Descriptions:**
    1.Modify API:
     1) 
       def CloseOrder(self, uid, price, volume: float, slippage=None, arrow_color=None) -> (ErrorID, OrderResult)
       ->
       def CloseOrder(self, uid, volume=None, price=None, slippage=None, arrow_color=None) -> (ErrorID, OrderResult)
    2.fix:
      __valid_order__: EID_EAT_INVALID_ORDER_CLOSE_PRICE 
    3.Add:
      __order_close_price__


### [2021-06-03]
#### Version:
#####   Package:
#####    pixiu: 0.34.0.20210603
#####
#### **Descriptions:**
    1.fix bugs GetSymbolData('*') 
    2. 
      self.orders['ds'] -> order['__ds__']
      self.account_info['ds'] -> self.account_info['__ds__']
    3.Add build-in :
      datetime, timedelta, random

### [2021-06-01]
#### Version:
#####   Package:
#####    pixiu: 0.33.0.20210601
#####
#### **Descriptions:**
    1.add APIs:
      WaitCommand
    2.modify APIs:
      Buy, Sell, CloseOrder, ModifyOrder return order_uid -> OrderResult

### [2021-05-31]
#### Version:
#####   Package:
#####    pixiu: 0.32.0.20210531
#####
#### **Descriptions:**
    1.fix EATesterPrintCollector._call_print write_log bug

### [2021-05-30]
#### Version:
#####   Package:
#####    pixiu: 0.31.0.20210530
#####
#### **Descriptions:**
    1. get_url_data add headers

### [2021-05-29]
#### Version:
#####   Package:
#####    pixiu: 0.30.0.20210529
#####
#### **Descriptions:**
    1.Add output


### [2021-05-28]
#### Version:
#####   Package:
#####    pixiu: 0.29.0.20210528
#####
#### **Descriptions:**
    1.Struct project directories
    2.Complete README.txt


### [2021-05-27]
#### Version:
#####   Package:
#####    pixiu: 0.28.0.20210527
#####
#### **Descriptions:**
    1.Add load channel


### [2021-05-26]
#### Version:
#####   Package:
#####    pixiu: 0.27.0.20210526
#####
#### **Descriptions:**
    1.Add PXTester, main


### [2021-05-24]
#### Version:
#####   Package:
#####    pixiu: 0.26.0.20210524
#####
#### **Descriptions:**
    1. api add help doc string


### [2021-05-22]
#### Version:
#####   Package:
#####    pixiu: 0.25.0.20210522
#####
#### **Descriptions:**
    1.add language
    2.fix sl/tp error:
      ds[((ds['sl'] > 0) & (ds['sl_p'] <= 0)) | ((ds['tp'] > 0) & (ds['tp_p'] >= 0))]
    3.api:
        Dict - > UIDs
        def GetOpenedOrderUIDs(self, symbol: str = None)
        def GetPendingOrderUIDs(self, symbol: str = None)
        def GetClosedOrderUIDs(self, symbol: str = None)


### [2021-05-19]
#### Version:
#####   Package:
#####    pixiu: 0.24.0.20210519
#####
#### **Descriptions:**
    1.add test_pixiu set_test_result

### [2021-05-18]
#### Version:
#####   Package:
#####    pixiu: 0.23.0.20210518
#####
#### **Descriptions:**

### [2021-05-17]
#### Version:
#####   Package:
#####    pixiu: 0.22.0.20210517
#####
#### **Descriptions:**
    1.SymbolIndicator, SymbolPrice, SymbolTime, SymbolData arguments.


### [2021-05-15]
#### Version:
#####   Package:
#####    pixiu: 0.21.0.20210515
#####
#### **Descriptions:**


### [2021-05-13]
#### Version:
#####   Package:
#####    pixiu: 0.20.0.20210513
#####
#### **Descriptions:**



### [2021-05-11]
#### Version:
#####   Package:
#####    pixiu: 0.19.0.20210511
#####
#### **Descriptions:**
    1.fix ea_tester some bugs


### [2021-05-10]
#### Version:
#####   Package:
#####    pixiu: 0.18.0.20210510
#####
#### **Descriptions:**

### [2021-05-09]
#### Version:
#####   Package:
#####    pixiu: 0.17.0.20210509
#####
#### **Descriptions:**
    1. Buy, Sell, ModifyOrder remove arguments comment


### [2021-05-08]
#### Version:
#####   Package:
#####    pixiu: 0.16.0.20210508
#####
#### **Descriptions:**
    1.

### [2021-05-07]
#### Version:
#####   Package:
#####    pixiu: 0.15.0.20210507
#####
#### **Descriptions:**
    1. def GetSymbolData(self, symbol: str, timeframe: str, count: int)


### [2021-05-06]
#### Version:
#####   Package:
#####    pixiu: 0.14.0.20210506
#####
#### **Descriptions:**
    1. some fixs


### [2021-05-01]
#### Version:
#####   Package:
#####    pixiu: 0.13.0.20210501
#####
#### **Descriptions:**
    1.Add test open, modify, close in the EAT testing.

### [2021-04-30]
#### Version:
#####   Package:
#####    pixiu: 0.12.0.20210430
#####
#### **Descriptions:**
    1.Finish EAT's 7 tests.

### [2021-04-29]
#### Version:
#####   Package:
#####    pixiu: 0.11.0.20210429
#####
#### **Descriptions:**
    1.Add Account, Symbol Classes
    2.Add ts_order, ts_base


### [2021-04-28]
#### Version:
#####   Package:
#####    pixiu: 0.10.0.20210428
#####
#### **Descriptions:**
    1.Add some methods


### [2021-04-27]
#### Version:
#####   Package:
#####    pixiu: 0.9.0.20210427
#####
#### **Descriptions:**

### [2021-04-26]
#### Version:
#####   Package:
#####    pixiu: 0.8.0.20210426
#####
#### **Descriptions:**
    1. Add test_ea_tester_func_indicators


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/tradepython/pixiu",
    "name": "pixiu",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "Trading Backtest Forex Stocks MT4 MT5 MetaTrade",
    "author": "tradepython",
    "author_email": "tradepython@icloud.com",
    "download_url": "https://files.pythonhosted.org/packages/a3/11/ad1696d3d07f378145fead1df11be5c9c631e535688666d29b277e7e8fa8/pixiu-0.109.0.tar.gz",
    "platform": null,
    "description": "[comment]: <> (![alt pixiu-icon]&#40;pixiu-128x128-8bit.png&#41;)\n\n<p align=\"center\">\n<img width=\"128\" height=\"128\" src=\"https://raw.githubusercontent.com/tradepython/pixiu/main/pixiu-128x128-8bit.png\">\n</p>\n<p align=\"center\" style=\"font-size:xx-small;\">PiXiu - A Chinese mythological creature that brings fortune to people.</p>\n\n\nPiXiu\n======\nA trading backtesting tool similar to MT4/MT5.\n\nIt has a standard set of API definitions, and backtesting code written using these APIs can be run on www.TradePython.com without changes.\n\nInstall\n=======\n```\npip install pixiu\n```\nIf you have problems installing TA-Lib, please refer to https://github.com/mrjbq7/ta-lib\n\n\n\nHow to use\n=======\nParameters :\n\n    -c/--testconfig         test config\n    -n/--testname           test name (in the test configuration file)\n    -s/--scriptpath         script file\n    -o/--logpath            log file\n    -p/--printlogtype       print log type\n    -m/--multiprocessing    multiprocessing mode\n    -r/--compare            compare with the tags list\n    -t/--tag                tag\n    -l/--datafile           data file name\n\n    Basic\n\n    pixiu -c pixiu_sample.json -n testUSDCHF_TP -s pixiu_sample.py\n    pixiu -c pixiu_sample.json -n testUSDCHF_TP -s pixiu_sample.py\n    pixiu -c pixiu_sample.json -n testUSDCHF -s pixiu_sample2.py -o log.txt\n\n    Compare multiple strategies\n\n    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.0.py -p report -t 2.10.0 -l ea2_7.json\n    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.1.py -p report -t 2.10.1 -l ea2_7.json\n    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.2.py -p report -t 2.10.2 -l ea2_7.json\n\n    pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json\n\n    Output:\n    +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+\n    |    |                                      | testAUDUSD_TP_Demo1 | testGBPUSD_TP_Demo1 | testNZDUSD_TP_Demo1 | testEURUSD_TP_Demo1 | testUSDCHF_TP_Demo1 | testUSDJPY_TP_Demo1 | testUSDCAD_TP_Demo1 | Total/Avg          |\n    +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+\n    | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |\n    | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |\n    | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |\n    ...\n    | 7  | Balance(2.10.0)                      | 4988.31             | 5064.61             | 5041.77             | 5071.6              | 4994.96             | 4996.97             | 4996.94             | 35155.16 / 5022.17 |\n    | 7  | Balance(2.10.1)                      | 5003.42 \u2191           | 5061.26 \u2193           | 5000.58 \u2193           | 4965.65 \u2193           | 5009.12 \u2191           | 5033.44 \u2191           | 4931.17 \u2193           | 35004.64 / 5000.66 |\n    | 7  | Balance(2.10.2)                      | 4981.59 \u2193           | 5076.74 \u2191           | 5000.58 \u2193           | 4985.02 \u2193           | 5023.02 \u2191           | 5029.35 \u2191           | 4965.34 \u2193           | 35061.64 / 5008.81 |\n    | 8  | Total Net Profit(2.10.0)             | -11.69              | 64.61               | 41.77               | 71.6                | -5.05               | -3.02               | -3.05               | 155.17 / 22.17     |\n    | 8  | Total Net Profit(2.10.1)             | 3.42 \u2191              | 61.26 \u2193             | 0.58 \u2193              | -34.35 \u2193            | 9.14 \u2191              | 33.44 \u2191             | -68.84 \u2193            | 4.65 / 0.66        |\n    | 8  | Total Net Profit(2.10.2)             | -18.41 \u2193            | 76.74 \u2191             | 0.58 \u2193              | -14.98 \u2193            | 23.04 \u2191             | 29.35 \u2191             | -34.68 \u2193            | 61.64 / 8.81       |\n    | 9  | Total Net Profit Rate(2.10.0)        | -0.23 %             | 1.29 %              | 0.84 %              | 1.43 %              | -0.1 %              | -0.06 %             | -0.06 %             | 3.11 % / 0.44 %    |\n    | 9  | Total Net Profit Rate(2.10.1)        | 0.07 % \u2191            | 1.23 % \u2193            | 0.01 % \u2193            | -0.69 % \u2193           | 0.18 % \u2191            | 0.67 % \u2191            | -1.38 % \u2193           | 0.09 % / 0.01 %    |\n    | 9  | Total Net Profit Rate(2.10.2)        | -0.37 % \u2193           | 1.53 % \u2191            | 0.01 % \u2193            | -0.3 % \u2193            | 0.46 % \u2191            | 0.59 % \u2191            | -0.69 % \u2193           | 1.23 % / 0.18 %    |\n    ...\n\n    pixiu -c pixiu.json -n testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json\n    Output:\n    +----+--------------------------------------+---------------------+-------------------+\n    |    |                                      | testUSDCAD_TP_Demo1 | Total/Avg         |\n    +----+--------------------------------------+---------------------+-------------------+\n    | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0 / 5000.0   |\n    | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0 / 5000.0   |\n    | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0 / 5000.0   |\n    ...\n    | 7  | Balance(2.10.0)                      | 4996.94             | 4996.94 / 4996.94 |\n    | 7  | Balance(2.10.1)                      | 4931.17 \u2193           | 4931.17 / 4931.17 |\n    | 7  | Balance(2.10.2)                      | 4965.34 \u2193           | 4965.34 / 4965.34 |\n    | 8  | Total Net Profit(2.10.0)             | -3.05               | -3.05 / -3.05     |\n    | 8  | Total Net Profit(2.10.1)             | -68.84 \u2193            | -68.84 / -68.84   |\n    | 8  | Total Net Profit(2.10.2)             | -34.68 \u2193            | -34.68 / -34.68   |\n    | 9  | Total Net Profit Rate(2.10.0)        | -0.06 %             | -0.06 % / -0.06 % |\n    | 9  | Total Net Profit Rate(2.10.1)        | -1.38 % \u2193           | -1.38 % / -1.38 % |\n    | 9  | Total Net Profit Rate(2.10.2)        | -0.69 % \u2193           | -0.69 % / -0.69 % |\n    ...\n\n\nTest configuration file format\n=======\nJSON format:\n\n```json\n{\n \"accounts\": {\n    \"default\": {\n      \"balance\": 10000.0,\n      \"equity\": 10000.0,\n      \"margin\": 0,\n      \"free_margin\": 10000.0,\n      \"credit\": 0.0,\n      \"profit\": 0.0,\n      \"margin_level\": 0,\n      \"leverage\": 100,\n      \"currency\": \"USD\",\n      \"free_margin_mode\": 0,\n      \"stop_out_level\": 0,\n      \"stop_out_mode\": 0,\n      \"company\": \"TradePython.com\",\n      \"name\": \"PXTester\",\n      \"number\": \"000\",\n      \"server\": \"PXTester\",\n      \"trade_mode\": 0,\n      \"limit_orders\": 500,\n      \"margin_so_mode\": 0,\n      \"trade_allowed\": true,\n      \"trade_expert\": 1,\n      \"margin_so_call\": 0.0,\n      \"margin_so_so\": 0.0,\n      \"commission\": 0.0\n    }\n  },\n  \"symbols\": {\n    \"USDCHF\": {\n      \"symbol\": \"USDCHF\",\n      \"spread\": 2,\n      \"digits\": 5,\n      \"stop_level\": 0,\n      \"volume_min\": 0.01,\n      \"trade_contract_size\": 100000,\n      \"point\": 0.00001,\n      \"currency_profit\": \"CHF\",\n      \"currency_base\": \"USD\",\n      \"currency_margin\": \"USD\"\n    }\n  },\n  \"tests\": {\n    \"testUSDCHF\": {\n      \"symbol\": \"USDCHF\",\n      \"tick_data\": \"usdchf_m1_20210315-0415.csv\",\n      \"start_time\": \"2021-03-15\",\n      \"end_time\": \"2021-04-16\",\n      \"max_tick\": 100,\n      \"balance\": 10000,\n      \"leverage\": 100,\n      \"currency\": \"USD\",\n      \"account\": \"default\",\n      \"spread_point\": 15\n    },\n    \"testUSDCHF_TP\": {\n      \"symbol\": \"USDCHF\",\n      \"tick_data\": {\n         \"channel\": \"tradepython.com\",\n         \"api_token\": \"YOUR-API-TOKEN\",\n         \"source\": \"12345678@PixiuServer01\",\n         \"format\": \"json\",\n         \"period\": 30,\n         \"timeframe\": \"m1\"\n      },\n      \"max_tick\": 100,\n      \"balance\": 10000,\n      \"leverage\": 100,\n      \"currency\": \"USD\",\n      \"account\": \"default\",\n      \"spread_point\": 15\n    },\n    \"testUSDCHF_TP2\": {\n      \"symbol\": \"USDCHF\",\n      \"tick_data\": {\n         \"channel\": \"tradepython.com\",\n         \"api_token\": \"YOUR-API-TOKEN\",\n         \"source\": {\"type\": \"public\", \"name\": \"Demo1\"},\n         \"format\": \"json\",\n         \"period\": 30,\n         \"start_time\": \"2021-03-15\",\n         \"end_time\": \"2021-04-16\",\n         \"timeframe\": \"m1\"\n      },\n      \"start_time\": \"2021-03-15\",\n      \"end_time\": \"2021-04-16\",\n      \"max_tick\": 100,\n      \"balance\": 10000,\n      \"leverage\": 100,\n      \"currency\": \"USD\",\n      \"account\": \"default\",\n      \"spread_point\": 15\n    }\n  }\n}\n```\n\nTesting with csv files:\n\n    symbol: product\n    tick_data: tick data data file\n    start_time: start time\n    end_time: end time\n    max_tick: the maximum number of ticks to test, which can reduce the test time\n    balance: initial capital of the test account\n    leverage: leverage of the test account\n    account: the name of the test account (in the test profile accounts)\n    spread_point: spread\n\n```json\n\"testUSDCHF\": {\n  \"symbol\": \"USDCHF\",\n  \"tick_data\": \"usdchf_m1_20210315-0415.csv\",\n  \"start_time\": \"2021-03-15\",\n  \"end_time\": \"2021-04-16\",\n  \"max_tick\": 100,\n  \"balance\": 10000,\n  \"leverage\": 100,\n  \"currency\": \"USD\",\n  \"account\": \"default\",\n  \"spread_point\": 15\n}\n```\n\nTest with tradepython data test\n\n    source: Data account\n      account@account-server\n      Example:\n          12345678@PixiuServer01\n      or: {\"type\": \"public\", \"name\": \"Demo1\"}\n      type: public or private\n      name: Account name\n\n    period: data period (days)\n      Example:\n          30 - the last 30 days of data\n\n    timeframe: time frame, the following values\n        s1 - 1 second\n        m1 - 1 minute\n        m5 - 1 minute\n        m15 - 15 minutes\n        m30 - 30 minutes\n        h1 - 1 hour\n        h4 - 1 hour\n        d1 - 1 day\n        w1 - 1 week\n        mn1 - 1 month\n\n```json\n\"testUSDCHF_TP\": {\n   ...\n  \"tick_data\": {\n     \"channel\": \"tradepython.com\",\n     \"api_token\": \"YOUR-API-TOKEN\",\n     \"source\": \"account@account-server\",\n     \"format\": \"json\",\n     \"period\": 30,\n     \"timeframe\": \"m1\"\n  },\n  ...\n}\n```\n\nScript Samples\n=======\n1. Buy or sell a product\n   ```python\n    errid, order_uid = Buy(volume=volume, price=Ask())\n    errid, order_uid = Sell(volume=0.01, price=Bid())\n   ```\n\n2. Modify an order\n   ```python\n    errid, order_uid = ModifyOrder(order_uid, stop_loss=stop_loss, take_profit=take_profit)\n   ```\n\n3. Close an order\n   ```python\n    errid, order_uid = CloseOrder(order_uid, price=Ask(), volume=volume)\n   ```\n\n4. Get the current open order UIDs\n   ```python\n    uids = GetOpenedOrderUIDs()\n    for uid in uids:\n        o = GetOrder(uid)\n   ```\n\n\nAPI\n=======\n\n```python\nAccountEquity(self)\n   Returns the equity.\n\n           Returns:\n                   The account equity.\n\nAccountFreeMargin(self)\n   Returns the free margin.\n\n           Returns:\n                   The free margin.\n\nAsk(self, shift=0, symbol=None) -> float\n   Returns Ask price value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   Ask price.\n\nBid(self, shift=0, symbol=None) -> float\n   Returns Bid price value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   Bid price.\n\nBuy(self, volume: float, type=0, price=None, stop_loss=None, take_profit=None, magic_number=None, symbol=None, slippage=None, arrow_color=None, expiration=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)\n   Open a long order.\n\n           Parameters:\n                   volume (float): Number of lots.\n                   type (OrderType): Order type.\n                   price (float): Order price. If price is None, price = Ask().\n                   stop_loss (float): Stop loss price.\n                   take_profit (float): Take profit price.\n                   magic_number (float): Order magic number.\n                   symbol (float): Symbol for trading.\n                   slippage (float): Maximum price slippage for trading.\n                   arrow_color (float): Color of the opening arrow on the MT4/5 chart.\n                   expiration (float): Order expiration time (for pending order only)\n                   tags (dict): Order tags\n\n           Returns:\n                   ErrorID: If 0 success.\n                   OrderResult: The order result.\n\n\nSell(self, volume: float, type=0, price=None, stop_loss=None, take_profit=None, magic_number=None, symbol=None, slippage=None, arrow_color=None, expiration=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)\n   Open a short order.\n\n           Parameters:\n                   volume (float): Number of lots.\n                   type (OrderType): Order type.\n                   price (float): Order price. If price is None, price = Bid().\n                   stop_loss (float): Stop loss price.\n                   take_profit (float): Take profit price.\n                   magic_number (float): Order magic number.\n                   symbol (float): Symbol for trading.\n                   slippage (float): Maximum price slippage for trading.\n                   arrow_color (float): Color of the opening arrow on the MT4/5 chart.\n                   expiration (float): Order expiration time (for pending order only)\n                   tags (dict): Order tags\n\n           Returns:\n                   ErrorID: If 0 success.\n                   OrderResult: The order result.\n\n\nModifyOrder(self, uid, price=None, stop_loss=None, take_profit=None, arrow_color=None, expiration=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)\n   Modify a order.\n\n           Parameters:\n                   uid : The order UID.\n                   price (float): New open price. (for pending order only)\n                   stop_loss (float): New stop loss price.\n                   take_profit (float): New take profit price.\n                   arrow_color (float): New color of the opening arrow on the MT4/5 chart.\n                   expiration (float): New order expiration time (for pending order only)\n                   tags (dict): Order tags\n           Returns:\n                   ErrorID: If 0 success.\n                   OrderResult: The order result.\n\nCloseOrder(self, uid, price, volume: float, slippage=None, arrow_color=None, tags=None) -> (<function NewType.<locals>.new_type at 0x7fe120629dc0>, <function NewType.<locals>.new_type at 0x7fe122ed0940>)\n   Close a order.\n\n           Parameters:\n                   uid : The order UID.\n                   price (float): Close price.\n                   volume (float): Number of lots.\n                   slippage (float): Maximum price slippage for trading.\n                   arrow_color (float): New color of the opening arrow on the MT4/5 chart.\n                   tags (dict): Order tags\n\n           Returns:\n                   ErrorID: If 0 success.\n                   OrderResult: The order result.\n\n\nClose(self, shift=0, symbol=None) -> float\n   Returns Close price value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                    symbol (str): The symbol name.\n                            If None returns current symbol.\n\n           Returns:\n                   Close price.\n\nDefaultTimeFrame(self)\n   Returns the default time frame.\n\nGetAccount(self)\n   Returns the account data.\n\n           Returns:\n                   The account data.\n\nGetClosedOrderUIDs(self, symbol: str = None, scope: int = DataScope.EA)\n   Returns the UIDs of current closed orders.\n\n           Parameters:\n                   symbol: The symbol name.\n                           If None returns current symbol.\n                           If '*' returns all symbols.\n                   scope:\n                           EA: The current ea (default).\n                           ACCOUNT: The current account.\n                           EA_VERSION: The current ea version.\n\n           Returns:\n                   The uid list.\n\nGetOpenedOrderUIDs(self, symbol: str = None, scope: int = DataScope.EA)\n   Returns the UIDs of current opened orders.\n\n           Parameters:\n                   symbol: The symbol name.\n                           If None returns current symbol.\n                           If '*' returns all symbols.\n                   scope:\n                           EA: The current ea (default).\n                           ACCOUNT: The current account.\n                           EA_VERSION: The current ea version.\n\n\n           Returns:\n                   The uid list.\n\n\nGetPendingOrderUIDs(self, symbol: str = None, scope: int = DataScope.EA)\n   Returns the UIDs of current pending orders.\n\n           Parameters:\n                   symbol: The symbol name.\n                           If None returns current symbol.\n                           If '*' returns all symbols.\n                   scope:\n                           EA: The current ea (default).\n                           ACCOUNT: The current account.\n                           EA_VERSION: The current ea version.\n\n           Returns:\n                   The uid list.\n\nGetOrder(self, order_uid: <function NewType.<locals>.new_type at 0x7fe122ed0940>)\n   Returns the order object.\n\n           Parameters:\n                   order_uid (): The order uid.\n\n           Returns:\n                   The order object.\n\nGetParam(self, name, default=None)\n   Returns the EA parameter value.\n\n           Parameters:\n                   name (): The EA parameter name.\n                   default (int): The EA parameter default value.\n\n           Returns:\n                   The EA parameter value.\n\n  GetSettings(self, name, default=None)\n    Returns the EA Settings value.\n\n            Parameters:\n                    name (): The EA settings name.\n                    default (int): The EA settings default value.\n\n            Returns:\n                    The EA settings value.\n\nGetSymbol(self, symbol=None)\n   Returns the symbol properties.\n\n           Parameters:\n                   symbol (str): The symbol name.\n\n           Returns:\n                   The symbol properties\n\nGetSymbolData(self, symbol: str, timeframe: str, size: int)\n   Get a symbol data.\n\n           Parameters:\n                   symbol (str): Symbol name.\n                   timeframe (str): Timeframe. See the TimeFrame defining.\n                   size (int): Maximum size.\n\n           Returns:\n                   Symbol data\n\nHigh(self, shift=0, symbol=None) -> float\n   Returns High price value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   High price.\n\nLow(self, shift=0, symbol=None) -> float\n   Returns Low price value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   Low price.\n\nOpen(self, shift=0, symbol=None) -> float\n   Returns Open price value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   Open price.\n\nOrderStats(self, order_uids)\n   Returns the order statistics.\n\n           Parameters:\n                   order_uids : the list of order uids.\n\n           Returns:\n                   The order statistics.\n\n\nStopTester(self, code: int = 0, message: str = None)\n   Stop the EA tester. (For tester only.)\n\n           Parameters:\n                   code (int): Error code.\n                   message (str): Error message.\n\n           Returns:\n                   None\n\nSymbol(self) -> str\n   Returns the current symbol name.\n\n           Returns:\n                   The symbol name.\n\nSymbolInfo(self, item, symbol=None, default=None)\n   Returns the symbol information.\n\n           Parameters:\n                   item (str): The symbol item name.\n                   symbol (str): The symbol name.\n                   default (): The default value.\n\n           Returns:\n                   The symbol information.\n\nTime(self, shift=0, symbol=None) -> datetime.datetime\n   Returns time value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   Time.\n\nVolume(self, shift=0, symbol=None) -> float\n   Returns volume value for the default symbol with default timeframe and shift.\n\n           Parameters:\n                   shift (int): Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n                   symbol (str): The symbol name.\n                           If None returns current symbol.\n\n           Returns:\n                   Volume price.\n\n__init__(self)\n   Initialize self.  See help(type(self)) for accurate signature.\n\niAD(self, symbol_data, shift=0)\n   Chaikin A/D Line (Volume Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Chaikin A/D Line\n\niADX(self, symbol_data, timeperiod, shift=0)\n   Average Directional Movement Index (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Average Directional Movement Index\n\niATR(self, symbol_data, timeperiod, shift=0)\n   Average True Range (Volatility Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Average True Range\n\niBands(self, symbol_data, timeperiod, nbdevup, nbdevdn, matype, shift=0)\n   Bollinger Bands (Overlap Studies)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   nbdevup (int): 2\n                   nbdevdn (int): 2\n                   ma_type: 0 (Simple Moving Average) ,For details see the TA-LIB\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Bollinger Bands\n\niCCI(self, symbol_data, timeperiod, shift=0)\n   Commodity Channel Index (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Commodity Channel Index\n\niChaikin(self, symbol_data, fastperiod, slowperiod, shift=0)\n   Chaikin A/D Oscillator (Volume Indicators)\n\n          Parameters:\n                  symbol_data (object): The symbol data.\n                  fastperiod (int): The fast period.\n                  slowperiod (int): The low period.\n                  shift: Index of the value taken from the buffer\n                  (shift relative to the current the given amount of periods ago).\n\n          Returns:\n                  Chaikin A/D Oscillator\n\niDEMA(self, symbol_data, timeperiod, shift=0)\n   Double Exponential Moving Average (Overlap Studies)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Double Exponential Moving Average\n\niMA(self, price_data, period, ma_type, shift=0)\n   Calculates the Moving Average indicator and returns its value.\n\n           Parameters:\n                   price_data (object): The price data. (Close, Open, Low, etc...)\n                   period (int): Averaging period for calculation.\n                   ma_type: 0 (Simple Moving Average) ,For details see the TA-LIB\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Moving average value.\n\niMACD(self, symbol_data, fastperiod, slowperiod, signalperiod, shift=0)\n   Moving Average Convergence/Divergence (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   fastperiod (int): The fast period.\n                   slowperiod (int): The slow period.\n                   signalperiod (int): The signal period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Moving Average Convergence/Divergence\n\niMFI(self, symbol_data, timeperiod, shift=0)\n   Money Flow Index (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Money Flow Index\n\niMomentum(self, symbol_data, timeperiod, shift=0)\n   Momentum (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Momentum\n\niOBV(self, symbol_data, shift=0)\n   On Balance Volume (Volume Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   On Balance Volume\n\niRSI(self, symbol_data, timeperiod, shift=0)\n   Relative Strength Index (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Relative Strength Index\n\niSAR(self, symbol_data, acceleration, maximum, shift=0)\n   Parabolic SAR (Overlap Studies)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   acceleration (int): 0.02\n                   maximum (int): 0.2\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Parabolic SAR\n\niStdDev(self, symbol_data, timeperiod, nbdev, shift=0)\n   Standard Deviation (Statistic Functions)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   nbdev (int): 1\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Standard Deviation\n\niStochastic(self, symbol_data, fastk_period, slowk_period, slowk_matype, slowd_period, slowd_matype, shift=0)\n   Stochastic (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   fastk_period (int): 5\n                   slowk_period (int): 3\n                   slowk_matype (int): 0\n                   slowd_period (int): 3\n                   slowd_matype (int): 0\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Stochastic\n\niTEMA(self, symbol_data, timeperiod, shift=0)\n   Triple Exponential Moving Average (Overlap Studies)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Triple Exponential Moving Average\n\niWPR(self, symbol_data, timeperiod, shift=0)\n   Williams' %R (Momentum Indicators)\n\n           Parameters:\n                   symbol_data (object): The symbol data.\n                   timeperiod (int): The time period.\n                   shift: Index of the value taken from the buffer\n                   (shift relative to the current the given amount of periods ago).\n\n           Returns:\n                   Williams' %R\n\nWaitCommand(self, uid, timeout=120)\n   Waiting for a asynchronous command execution\u3002\n\n          Parameters:\n                  uid : The command UID.\n                  timeout : Timeout \uff08seconds\uff09\n          Returns:\n                  ErrorID: If 0 success.\n                  CommandResult: If failed returns None.\n                  \n\n AcquireLock(self, name, timeout=60) -> bool:\n     Acquire a lock\n\n             Parameters:\n                     name : The lock name\n                     timeout : Lock timeout \uff08seconds\uff09\n             Returns:\n                     If True success.\n     \n\n ReleaseLock(self, name):\n     Release a lock\n\n             Parameters:\n                     name : The lock name\n     \n\n Plot(self, series):\n     Plot\n     \n             Parameters:\n                     series\n\n\n DeleteData(self, name, scope: int = DataScope.EA) -> ErrorID:\n     Delete data\n\n             Parameters:\n                     name : The data name\n                     scope : The data scope (current EA settings, EA version, EA, Account)\n             Returns:\n                     The errorid.\n\n LoadData(self, name, scope: int = DataScope.EA, format='json'):\n     Load data\n\n             Parameters:\n                     name : The data name\n                     scope : The data scope (current EA settings, EA version, EA, Account)\n                     format: Only support JSON.\n             Returns:\n                     data.\n \n SaveData(self, name, data, scope: int = DataScope.EA, format='json') -> ErrorID:\n     Save data\n\n             Parameters:\n                     name : The data name\n                     scope : The data scope (current EA settings, EA version, EA, Account)\n                     format: Only support JSON.\n             Returns:\n                     The errorid.\n \n Notify(self, message) -> ErrorID:\n     Send a notification\n\n             Parameters:\n                     message: The content of notification\n             Returns:\n                     The errorid.\n                  \n                   \n```\n\n\n\n### [2023-12-07]\n#### Version:\n#####   Package:\n#####    pixiu: 0.109.*.20231207\n#####\n#### **Descriptions\uff1a**\n     1.ea_taster.py:\n       1) __close_order__\n         Fix profit calculation error when closing partitioned volumes  \n       \n\n### [2023-11-16]\n#### Version:\n#####   Package:\n#####    pixiu: 0.108.*.20231116\n#####\n#### **Descriptions\uff1a**\n     1.main.py:\n       1) gen_report_row: \n          Add compare_item['value'] checking\n\n### [2023-11-15]\n#### Version:\n#####   Package:\n#####    pixiu: 0.107.*.20231115\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n       1) __close_order__:\n          Fix new order open_price error\n     2.ts_order_market.py:\n       1) Add from_uid, to_uid test\n\n### [2023-11-14]\n#### Version:\n#####   Package:\n#####    pixiu: 0.106.*.20231114\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n       1) Fix order_to_ndarray KeyError: 'magic_number'\n       2) __close_order__:\n          Change order comment from 'close by #xxx' to 'from #xxx'\n          Remove the tags of closed order\n       3) __add_market_order__:\n          Add comment checking\n     2.ts_order_market.py:\n       1) Add close partial order test\n\n\n### [2023-06-23]\n#### Version:\n#####   Package:\n#####    pixiu: 0.105.*.20230623\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n      1)  Add tick_test_start_index in params\n      2)  Add test_period in pixiu config file\n\n### [2023-03-13]\n#### Version:\n#####   Package:\n#####    pixiu: 0.104.*.20230313\n#####\n#### **Descriptions\uff1a**\n     1.pxtester.py:\n      1) Add get_tick_data_from_yfinance, covert_yfinance_data_to_json \n\n### [2023-02-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.103.*.20230226\n#####\n#### **Descriptions\uff1a**\n     1.main.py:\n      1) start_mp, start_sp: results add exception \n\n### [2023-02-28]\n#### Version:\n#####   Package:\n#####    pixiu: 0.102.*.20230228\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n       1) Remove parse_script, get_script_init_settings\n       2) execute_: Add ValidScriptSettings Error\n       3) __init__: self.log_file = open(self.log_path, mode='wt')\n\n\n### [2023-02-22]\n#### Version:\n#####   Package:\n#####    pixiu: 0.101.*.20230222\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n      1) Add script_settings output\n\n### [2023-02-12]\n#### Version:\n#####   Package:\n#####    pixiu: 0.100.*.20230212\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n       1) Fix get_api missing error.\n\n### [2023-01-11]\n#### Version:\n#####   Package:\n#####    pixiu: 0.99.*.20230111\n#####\n#### **Descriptions\uff1a**\n     1.ea_tester.py:\n       1) Fix self.current_tick_index exception in execute_(self, ticket)\n\n### [2022-12-28]\n#### Version:\n#####   Package:\n#####    pixiu: 0.98.*.20221228\n#####\n#### **Descriptions\uff1a**\n     1.Add global API:\n      PX_InitScriptSettings, PX_ValidScriptSettings\n      Call order:\n       PX_InitScriptSettings -> AddChart/AddParam -> PX_ValidScriptSettings\n     2.Add ts_settings.py\n\n### [2022-12-19]\n#### Version:\n#####   Package:\n#####    pixiu: 0.97.*.20221219\n#####\n#### **Descriptions\uff1a**\n     1.Add global API:\n      PX_InitScriptSettings, PX_ValidScriptSettings\n      Call order:\n       PX_InitScriptSettings -> AddChart/AddParam -> PX_ValidScriptSettings\n\n### [2022-12-07]\n#### Version:\n#####   Package:\n#####    pixiu: 0.96.*.20221207\n#####\n#### **Descriptions\uff1a**\n    1.api.py:\n      Add AddChart, AddParam\n\n### [2022-12-06]\n#### Version:\n#####   Package:\n#####    pixiu: 0.95.*.20221206\n#####\n#### **Descriptions\uff1a**\n    1.api.py:\n      Add AddChart, AddParam\n\n### [2022-12-05]\n#### Version:\n#####   Package:\n#####    pixiu: 0.94.*.20221205\n#####\n#### **Descriptions\uff1a**\n   1.pxtester.py:\n     1) Replace json with json5\n\n### [2022-12-02]\n#### Version:\n#####   Package:\n#####    pixiu: 0.93.*.20221202\n#####\n#### **Descriptions\uff1a**\n   1.pxtester.py:\n     1) Fix get_data_info tzinfo error\n\n### [2022-11-04]\n#### Version:\n#####   Package:\n#####    pixiu: 0.92.*.20221104\n#####\n#### **Descriptions\uff1a**\n    1.api_base.py:\n     1) Add _safe_import\n\n### [2022-10-25]\n#### Version:\n#####   Package:\n#####    pixiu: 0.91.*.20221025\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n     1)Add execute_script\n\n### [2022-08-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.90.*.20220826\n#####\n#### **Descriptions\uff1a**\n    1.test_pixiu.py:\n     1) test_ea_tester_func_base: datetime.utcfromtimestamp(new_a['t'][idx])\n     2) test_ea_tester_func_indicators: datetime.utcfromtimestamp(new_a['t'][idx])\n    2.ts_symbol_data.py:\n     1) Change \n            assertEqual(df['time'][valid_shift], get_timeframe_value_by_time(timeframe, c_time, \"time\").timestamp(),\n                f'@ {c_time}, {timeframe}')\n        to \n            assertEqual(df['time'][valid_shift], get_timeframe_value_by_time(timeframe, c_time, \"time\").replace(tzinfo=timezone('UTC')).timestamp(),\n                f'@ {c_time}, {timeframe}')\n    3.setup.py:\n     1) Add requires: dash, plotly\n\n\n### [2022-08-02]\n#### Version:\n#####   Package:\n#####    pixiu: 0.89.*.20220802\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n     1) Fix calculate_return_ratio return value error\n\n### [2022-07-28]\n#### Version:\n#####   Package:\n#####    pixiu: 0.88.*.20220728\n#####\n#### **Descriptions\uff1a**\n    1.pxtester.py:\n      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp\n    2.account.py:\n      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp\n    3.order.py:\n      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp\n    4.symbol.py:\n      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp\n    5.ea_tester.py:\n      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp\n    6.test_pixiu.py:\n      1) Change datetime.fromtimestamp to datetime.utcfromtimestamp\n\n### [2022-07-18]\n#### Version:\n#####   Package:\n#####    pixiu: 0.87.*.20220718\n#####\n#### **Descriptions\uff1a**\n    1. Fix gen_report_row total_value bug\n\n### [2022-06-20]\n#### Version:\n#####   Package:\n#####    pixiu: 0.86.*.20220620\n#####\n#### **Descriptions\uff1a**\n    1.Add ea_tester_graph\n       support dash + plotly\n        \n\n### [2022-05-18]\n#### Version:\n#####   Package:\n#####    pixiu: 0.85.*.20220518\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1) Fix calculate_returns calculation error\n\n\n### [2022-04-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.84.*.20220426\n#####\n#### **Descriptions\uff1a**\n    1.tester_api_v1.py:\n        1) Fix __get_indicator__ cache_name error\n\n### [2022-04-24]\n#### Version:\n#####   Package:\n#####    pixiu: 0.83.*.20220424\n#####\n#### **Descriptions\uff1a**\n    1.symbol.py:\n      1) SymbolIndicator, SymbolPrice, SymbolTime, SymbolData add getitem_index\n      2) SymbolPrice add:\n            <\t__lt__(self, other)\n            >\t__gt__(self, other)\n            <=\t__le__(self, other)\n            >=\t__ge__(self, other)\n            ==\t__eq__(self, other)\n            !=\t__ne__(self, other)\n            +\t__add__(self, other)\n            \u2013\t__sub__(self, other)\n            * __mul__(self, other)\n            /\t__truediv__(self, other)\n            //\t__floordiv__(self, other)\n            %\t__mod__(self, other)\n            **\t__pow__(self, other)\n\n### [2022-04-23]\n#### Version:\n#####   Package:\n#####    pixiu: 0.82.*.20220423\n#####\n#### **Descriptions\uff1a**\n    1.symbol.py:\n      1) Add to_dataframe\n    2.api_base.py:\n      1) env_dict add _iter_unpack_sequence_ # [abs(value - level) < ave for _, level in levels]\n    3.ea_node_transformer.py:\n      1) Add EARestrictingNodeTransformer\n\n### [2022-04-22]\n#### Version:\n#####   Package:\n#####    pixiu: 0.81.*.20220422\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n      1) Change min_volume initial value to None\n    2.pxtester.py:\n      1)  Fix on_end_execute item['value'] None error\n    3.main.py:\n      1)  Fix gen_report_row item['value'] None error\n\n### [2022-04-21]\n#### Version:\n#####   Package:\n#####    pixiu: 0.80.*.20220421\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n      1) report add max_volume\n\n### [2022-04-20]\n#### Version:\n#####   Package:\n#####    pixiu: 0.79.*.20220420\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n      1) Fix __valid_order__ pending order error\n\n### [2022-04-18]\n#### Version:\n#####   Package:\n#####    pixiu: 0.78.*.20220418\n#####\n#### **Descriptions\uff1a**\n    1.api_base.py:\n      1) env_dictAdd property\n\n### [2022-04-07]\n#### Version:\n#####   Package:\n#####    pixiu: 0.77.*.20220407\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1) Fix calculate_return_ratio error\n        2) Add sortino_ratio\n\n### [2022-04-06]\n#### Version:\n#####   Package:\n#####    pixiu: 0.76.*.20220406\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1) Add percent_str_to_float\n        2) Add calculate_sharpe_ratio\n\n### [2022-04-03]\n#### Version:\n#####   Package:\n#####    pixiu: 0.75.*.20220403\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1) Add margin_so_so, margin_so_call checking\n\n### [2022-04-02]\n#### Version:\n#####   Package:\n#####    pixiu: 0.74.*.20220402\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n       Fix modify_order order_log error\n\n### [2022-03-30]\n#### Version:\n#####   Package:\n#####    pixiu: 0.73.*.20220330\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        __remove_pending_order__ pop add None\n    2.Add set:\n      env_dict[\"set\"]\n\n\n### [2022-03-10]\n#### Version:\n#####   Package:\n#####    pixiu: 0.72.*.20220310\n#####\n#### **Descriptions\uff1a**\n    1.ts_order_buylimit.py,ts_order_buystop.py,ts_order_selllimit.py,ts_order_sellstop.py:\n      Add check order.status\n    2.api.py:\n      Add GetSettings\n\n### [2022-03-09]\n#### Version:\n#####   Package:\n#####    pixiu: 0.71.*.20220309\n#####\n#### **Descriptions\uff1a**\n    1.defines.py:\n      Add OrderStatus\n    2.order.py:\n      Add status\n\n### [2022-03-05]\n#### Version:\n#####   Package:\n#####    pixiu: 0.70.*.20220305\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n      1) __process_order__: Add parameters: ask, last_ask, bid, last_bid\n      2) __calculate_profit__: Update calculation m\n      3) __valid_order__: Add parameters: ask, bid\n\n### [2022-03-04]\n#### Version:\n#####   Package:\n#####    pixiu: 0.69.*.20220304\n#####\n#### **Descriptions\uff1a**\n    1.Add PositionType\n    2.Fix __valid_order__ pending order error\n    3.Fix __close_order__ close_time error\n\n### [2022-03-02]\n#### Version:\n#####   Package:\n#####    pixiu: 0.68.*.20220301\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py: Add volume_precision\n\n### [2022-03-01]\n#### Version:\n#####   Package:\n#####    pixiu: 0.67.*.20220301\n#####\n#### **Descriptions\uff1a**\n    1.fix __remove_order__ pop bug\n\n### [2022-02-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.66.*.20220226\n#####\n#### **Descriptions\uff1a**\n    1.Add is_dirty method to order\n    2.API: add RunMode, CloseMultiOrders\n    3.Defines: add RunModeValue\n\n### [2022-02-24]\n#### Version:\n#####   Package:\n#####    pixiu: 0.65.*.20220224\n#####\n#### **Descriptions\uff1a**\n    1.Change error name: EID_EAT_MARGIN_CALL -> EID_EAT_NOT_ENOUGH_MONEY\n\n### [2022-02-22]\n#### Version:\n#####   Package:\n#####    pixiu: 0.64.*.20220222\n#####\n#### **Descriptions\uff1a**\n    1.Add tags in order data \n\n### [2022-02-11]\n#### Version:\n#####   Package:\n#####    pixiu: 0.63.*.20220211\n#####\n#### **Descriptions\uff1a**\n    1.Add new testing 'test_ea_tester_func_load_lib'\n\n### [2022-02-10]\n#### Version:\n#####   Package:\n#####    pixiu: 0.62.*.20220210\n#####\n#### **Descriptions\uff1a**\n    1.Add library function \n        ###[lib|library]=[\"PriceAction==0.1.0\"]\n    2.ea_base.py:\n      1)Add method parse_script\n    \n\n\n### [2022-02-09]\n#### Version:\n#####   Package:\n#####    pixiu: 0.61.*.20220209\n#####\n#### **Descriptions\uff1a**\n    1.Remove OrderScope, using DataScope\n\n### [2021-12-14]\n#### Version:\n#####   Package:\n#####    pixiu: 0.60.*.20211114\n#####\n#### **Descriptions\uff1a**\n    1.EA script support timezone\n    2.ts_base: Add test_timezone\n\n### [2021-12-11]\n#### Version:\n#####   Package:\n#####    pixiu: 0.59.*.20211111\n#####\n#### **Descriptions\uff1a**\n    1.Support auto loading script from tag\n        pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 -s ../Test/Test_V2.11.18-3x.py -p report -t 2.11.18-3x -l ea2_7_211209.json\n        or\n        pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 -s ../Test -p report -t 2.11.18-3x -l ea2_7_211209.json\n\n\n### [2021-11-26]\n#### Version:K\n#####   Package:\n#####    pixiu: 0.58.*.20211126\n#####\n#### **Descriptions\uff1a**\n    1.Update README.md/README.zh.md\n    2.ea_tester.py:\n      Modify notify output format\n\n### [2021-11-25]\n#### Version:\n#####   Package:\n#####    pixiu: 0.57.*.20211125\n#####\n#### **Descriptions\uff1a**\n    1.Update README.md/README.zh.md\n    2.ea_tester.py:\n      Modify notify output format\n\n\n### [2021-11-24]\n#### Version:\n#####   Package:\n#####    pixiu: 0.56.*.20211124\n#####\n#### **Descriptions\uff1a**\n    1.api.py, tester_api_v1.py:\n      Add Notify\n\n\n### [2021-11-16]\n#### Version:\n#####   Package:\n#####    pixiu: 0.55.*.20211116\n#####\n#### **Descriptions\uff1a**\n    1.Fix setup.py requires. \n\n### [2021-11-15]\n#### Version:\n#####   Package:\n#####    pixiu: 0.54.0.20211115\n#####\n#### **Descriptions\uff1a**\n    1.api.py, tester_api_v1.py:\n      Add DeleteData, LoadData, SaveData\n      Buy/Sell/ModifyOrder/CloseOrder add argument tags \n    2.tests:\n      ts_base.py add data test\n      ts_order_market.py add tags \n    3.api_base.py:\n      Add uuid, hashlib \n\n### [2021-11-14]\n#### Version:\n#####   Package:\n#####    pixiu: 0.53.0.20211114\n#####\n#### **Descriptions\uff1a**\n    1.api.py, tester_api_v1.py:\n      Ask, Bid, Time, Volume, Open, Close, Low, High add symbol\n    2.order.py:\n      Add from_uid, to_uid\uff0c group_uid, tags\n\n### [2021-11-13]\n#### Version:\n#####   Package:\n#####    pixiu: 0.52.0.20211113\n#####\n#### **Descriptions\uff1a**\n    1.Add arguments : \n        --compare-wit-tag/-r, --tag/-t, --datafile/-l\n      sample:\n            1)  \n               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.0.py -p report -t 2.10.0 -l ea2_7.json\n               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.1.py -p report -t 2.10.1 -l ea2_7.json\n               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -s ../EA/EA_V2.10.2.py -p report -t 2.10.2 -l ea2_7.json\n               \n               pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json\n                +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+\n                |    |                                      | testAUDUSD_TP_Demo1 | testGBPUSD_TP_Demo1 | testNZDUSD_TP_Demo1 | testEURUSD_TP_Demo1 | testUSDCHF_TP_Demo1 | testUSDJPY_TP_Demo1 | testUSDCAD_TP_Demo1 | Total/Avg          |\n                +----+--------------------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+--------------------+\n                | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |\n                | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |\n                | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 5000.0              | 35000.0 / 5000.0   |\n                ...\n                | 7  | Balance(2.10.0)                      | 4988.31             | 5064.61             | 5041.77             | 5071.6              | 4994.96             | 4996.97             | 4996.94             | 35155.16 / 5022.17 |\n                | 7  | Balance(2.10.1)                      | 5003.42 \u2191           | 5061.26 \u2193           | 5000.58 \u2193           | 4965.65 \u2193           | 5009.12 \u2191           | 5033.44 \u2191           | 4931.17 \u2193           | 35004.64 / 5000.66 |\n                | 7  | Balance(2.10.2)                      | 4981.59 \u2193           | 5076.74 \u2191           | 5000.58 \u2193           | 4985.02 \u2193           | 5023.02 \u2191           | 5029.35 \u2191           | 4965.34 \u2193           | 35061.64 / 5008.81 |\n                | 8  | Total Net Profit(2.10.0)             | -11.69              | 64.61               | 41.77               | 71.6                | -5.05               | -3.02               | -3.05               | 155.17 / 22.17     |\n                | 8  | Total Net Profit(2.10.1)             | 3.42 \u2191              | 61.26 \u2193             | 0.58 \u2193              | -34.35 \u2193            | 9.14 \u2191              | 33.44 \u2191             | -68.84 \u2193            | 4.65 / 0.66        |\n                | 8  | Total Net Profit(2.10.2)             | -18.41 \u2193            | 76.74 \u2191             | 0.58 \u2193              | -14.98 \u2193            | 23.04 \u2191             | 29.35 \u2191             | -34.68 \u2193            | 61.64 / 8.81       |\n                | 9  | Total Net Profit Rate(2.10.0)        | -0.23 %             | 1.29 %              | 0.84 %              | 1.43 %              | -0.1 %              | -0.06 %             | -0.06 %             | 3.11 % / 0.44 %    |\n                | 9  | Total Net Profit Rate(2.10.1)        | 0.07 % \u2191            | 1.23 % \u2193            | 0.01 % \u2193            | -0.69 % \u2193           | 0.18 % \u2191            | 0.67 % \u2191            | -1.38 % \u2193           | 0.09 % / 0.01 %    |\n                | 9  | Total Net Profit Rate(2.10.2)        | -0.37 % \u2193           | 1.53 % \u2191            | 0.01 % \u2193            | -0.3 % \u2193            | 0.46 % \u2191            | 0.59 % \u2191            | -0.69 % \u2193           | 1.23 % / 0.18 %    |\n                ...\n\n               pixiu -c pixiu.json -n testUSDCAD_TP_Demo1 -t 2.10.0 -r 2.10.1 2.10.2 -l ea2_7.json\n                +----+--------------------------------------+---------------------+-------------------+\n                |    |                                      | testUSDCAD_TP_Demo1 | Total/Avg         |\n                +----+--------------------------------------+---------------------+-------------------+\n                | 1  | Init Balance(2.10.0)                 | 5000.0              | 5000.0 / 5000.0   |\n                | 1  | Init Balance(2.10.1)                 | 5000.0              | 5000.0 / 5000.0   |\n                | 1  | Init Balance(2.10.2)                 | 5000.0              | 5000.0 / 5000.0   |\n                ...\n                | 7  | Balance(2.10.0)                      | 4996.94             | 4996.94 / 4996.94 |\n                | 7  | Balance(2.10.1)                      | 4931.17 \u2193           | 4931.17 / 4931.17 |\n                | 7  | Balance(2.10.2)                      | 4965.34 \u2193           | 4965.34 / 4965.34 |\n                | 8  | Total Net Profit(2.10.0)             | -3.05               | -3.05 / -3.05     |\n                | 8  | Total Net Profit(2.10.1)             | -68.84 \u2193            | -68.84 / -68.84   |\n                | 8  | Total Net Profit(2.10.2)             | -34.68 \u2193            | -34.68 / -34.68   |\n                | 9  | Total Net Profit Rate(2.10.0)        | -0.06 %             | -0.06 % / -0.06 % |\n                | 9  | Total Net Profit Rate(2.10.1)        | -1.38 % \u2193           | -1.38 % / -1.38 % |\n                | 9  | Total Net Profit Rate(2.10.2)        | -0.69 % \u2193           | -0.69 % / -0.69 % |\n                ...\n\n\n\n\n\n### [2021-11-11]\n#### Version:\n#####   Package:\n#####    pixiu: 0.51.0.20211111\n#####\n#### **Descriptions\uff1a**\n    1.api_base:\n      Add build-in function: max, min, all, any, ascii, bin, chr, divmod, enumerate, filter, format, hex, next, oct, ord, pow, reversed, sorted, sum\n    2.main.py:\n      Add argument: multiprocessing\n\n### [2021-10-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.50.0.20211026\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1) Fix report currency bug\n\n### [2021-10-24]\n#### Version:\n#####   Package:\n#####    pixiu: 0.49.0.20211024\n#####\n#### **Descriptions\uff1a**\n    1.Using process pool\n\n### [2021-10-23]\n#### Version:\n#####   Package:\n#####    pixiu: 0.48.0.20211023\n#####\n#### **Descriptions\uff1a**\n    1.Add support multiple test names:\n     pixiu -c pixiu.json -n testAUDUSD_TP_Demo1 testGBPUSD_TP_Demo1 testNZDUSD_TP_Demo1 testEURUSD_TP_Demo1 testUSDCHF_TP_Demo1 testUSDJPY_TP_Demo1 testUSDCAD_TP_Demo1 ...\n\n\n### [2021-10-19]\n#### Version:\n#####   Package:\n#####    pixiu: 0.47.0.20211019\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n     1) Fix report total_net_profit_rate error.\n    2.pxtester.py:\n     1) parse_test_config: Add custom account\n\n### [2021-10-18]\n#### Version:\n#####   Package:\n#####    pixiu: 0.46.0.20211018\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n     1) Fix modify_order bug, if take_profit or stop_loss is None\n\n### [2021-10-16]\n#### Version:\n#####   Package:\n#####    pixiu: 0.45.0.20211016\n#####\n#### **Descriptions\uff1a**\n    1.pxtester.py:\n      1) Report add win rate\n\n### [2021-10-15]\n#### Version:\n#####   Package:\n#####    pixiu: 0.44.0.20211015\n#####\n#### **Descriptions\uff1a**\n    1.pxtester.py:\n      1) Add argument: print_log_type = account|order|ea|report\n\n### [2021-10-14]\n#### Version:\n#####   Package:\n#####    pixiu: 0.43.0.20211014\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n      1) Fix bugs: __process_order__, close_all_orders call close_order error\n      2) Fix bugs: max_drawdown calculation\n    2.pxtester.py:\n      1) on_end_execute: report output format\n\n### [2021-08-25]\n#### Version:\n#####   Package:\n#####    pixiu: 0.42.0.20210825\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n      1) __add_market_order__:\n        new_order['comment'] = f\"cuid#{new_order['uid']}|\" \n        to\n        new_order['comment'] = f\"uid#{new_order['uid']}|\"\n\n### [2021-08-06]\n#### Version:\n#####   Package:\n#####    pixiu: 0.41.0.20210806\n#####\n#### **Descriptions\uff1a**\n    1.API 1 \n      1) Add Plot \n\n### [2021-08-04]\n#### Version:\n#####   Package:\n#####    pixiu: 0.40.0.20210804\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1).Change plot parameters to plot(chart_name, {series_name1: data, series_name2: data, ...})\n\n### [2021-07-20]\n#### Version:\n#####   Package:\n#####    pixiu: 0.39.0.20210720\n#####\n#### **Descriptions\uff1a**\n    1.ea_tester.py:\n        1).Add plot \n\n### [2021-07-16]\n#### Version:\n#####   Package:\n#####    pixiu: 0.38.0.20210716\n#####\n#### **Descriptions\uff1a**\n    1.Update API:\n     1) GetOpenedOrderUIDs, GetPendingOrderUIDs, GetClosedOrderUIDs\n       Add parameter: scope\n\n### [2021-07-08]\n#### Version:\n#####   Package:\n#####    pixiu: 0.37.0.20210708\n#####\n#### **Descriptions\uff1a**\n    1.fix write_log bugs: parameters count\n\n\n### [2021-06-07]\n#### Version:\n#####   Package:\n#####    pixiu: 0.36.2.20210607\n#####\n#### **Descriptions\uff1a**\n    1.fix dependencies bugs\n       remove oeoeweb library\n       add pymongo library\n    2.fix sample.py, sample2.py errors.\n    3.API add AcquireLock, ReleaseLock \n\n    \n### [2021-06-04]\n#### Version:\n#####   Package:\n#####    pixiu: 0.35.0.20210604\n#####\n#### **Descriptions\uff1a**\n    1.Modify API:\n     1) \n       def CloseOrder(self, uid, price, volume: float, slippage=None, arrow_color=None) -> (ErrorID, OrderResult)\n       ->\n       def CloseOrder(self, uid, volume=None, price=None, slippage=None, arrow_color=None) -> (ErrorID, OrderResult)\n    2.fix:\n      __valid_order__: EID_EAT_INVALID_ORDER_CLOSE_PRICE \n    3.Add:\n      __order_close_price__\n\n\n### [2021-06-03]\n#### Version:\n#####   Package:\n#####    pixiu: 0.34.0.20210603\n#####\n#### **Descriptions\uff1a**\n    1.fix bugs GetSymbolData('*') \n    2. \n      self.orders['ds'] -> order['__ds__']\n      self.account_info['ds'] -> self.account_info['__ds__']\n    3.Add build-in :\n      datetime, timedelta, random\n\n### [2021-06-01]\n#### Version:\n#####   Package:\n#####    pixiu: 0.33.0.20210601\n#####\n#### **Descriptions\uff1a**\n    1.add APIs:\n      WaitCommand\n    2.modify APIs:\n      Buy, Sell, CloseOrder, ModifyOrder return order_uid -> OrderResult\n\n### [2021-05-31]\n#### Version:\n#####   Package:\n#####    pixiu: 0.32.0.20210531\n#####\n#### **Descriptions\uff1a**\n    1.fix EATesterPrintCollector._call_print write_log bug\n\n### [2021-05-30]\n#### Version:\n#####   Package:\n#####    pixiu: 0.31.0.20210530\n#####\n#### **Descriptions\uff1a**\n    1. get_url_data add headers\n\n### [2021-05-29]\n#### Version:\n#####   Package:\n#####    pixiu: 0.30.0.20210529\n#####\n#### **Descriptions\uff1a**\n    1.Add output\n\n\n### [2021-05-28]\n#### Version:\n#####   Package:\n#####    pixiu: 0.29.0.20210528\n#####\n#### **Descriptions\uff1a**\n    1.Struct project directories\n    2.Complete README.txt\n\n\n### [2021-05-27]\n#### Version:\n#####   Package:\n#####    pixiu: 0.28.0.20210527\n#####\n#### **Descriptions\uff1a**\n    1.Add load channel\n\n\n### [2021-05-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.27.0.20210526\n#####\n#### **Descriptions\uff1a**\n    1.Add PXTester, main\n\n\n### [2021-05-24]\n#### Version:\n#####   Package:\n#####    pixiu: 0.26.0.20210524\n#####\n#### **Descriptions\uff1a**\n    1. api add help doc string\n\n\n### [2021-05-22]\n#### Version:\n#####   Package:\n#####    pixiu: 0.25.0.20210522\n#####\n#### **Descriptions\uff1a**\n    1.add language\n    2.fix sl/tp error:\n      ds[((ds['sl'] > 0) & (ds['sl_p'] <= 0)) | ((ds['tp'] > 0) & (ds['tp_p'] >= 0))]\n    3.api:\n        Dict - > UIDs\n        def GetOpenedOrderUIDs(self, symbol: str = None)\n        def GetPendingOrderUIDs(self, symbol: str = None)\n        def GetClosedOrderUIDs(self, symbol: str = None)\n\n\n### [2021-05-19]\n#### Version:\n#####   Package:\n#####    pixiu: 0.24.0.20210519\n#####\n#### **Descriptions\uff1a**\n    1.add test_pixiu set_test_result\n\n### [2021-05-18]\n#### Version:\n#####   Package:\n#####    pixiu: 0.23.0.20210518\n#####\n#### **Descriptions\uff1a**\n\n### [2021-05-17]\n#### Version:\n#####   Package:\n#####    pixiu: 0.22.0.20210517\n#####\n#### **Descriptions\uff1a**\n    1.SymbolIndicator, SymbolPrice, SymbolTime, SymbolData arguments.\n\n\n### [2021-05-15]\n#### Version:\n#####   Package:\n#####    pixiu: 0.21.0.20210515\n#####\n#### **Descriptions\uff1a**\n\n\n### [2021-05-13]\n#### Version:\n#####   Package:\n#####    pixiu: 0.20.0.20210513\n#####\n#### **Descriptions\uff1a**\n\n\n\n### [2021-05-11]\n#### Version:\n#####   Package:\n#####    pixiu: 0.19.0.20210511\n#####\n#### **Descriptions\uff1a**\n    1.fix ea_tester some bugs\n\n\n### [2021-05-10]\n#### Version:\n#####   Package:\n#####    pixiu: 0.18.0.20210510\n#####\n#### **Descriptions\uff1a**\n\n### [2021-05-09]\n#### Version:\n#####   Package:\n#####    pixiu: 0.17.0.20210509\n#####\n#### **Descriptions\uff1a**\n    1. Buy, Sell, ModifyOrder remove arguments comment\n\n\n### [2021-05-08]\n#### Version:\n#####   Package:\n#####    pixiu: 0.16.0.20210508\n#####\n#### **Descriptions\uff1a**\n    1.\n\n### [2021-05-07]\n#### Version:\n#####   Package:\n#####    pixiu: 0.15.0.20210507\n#####\n#### **Descriptions\uff1a**\n    1. def GetSymbolData(self, symbol: str, timeframe: str, count: int)\n\n\n### [2021-05-06]\n#### Version:\n#####   Package:\n#####    pixiu: 0.14.0.20210506\n#####\n#### **Descriptions\uff1a**\n    1. some fixs\n\n\n### [2021-05-01]\n#### Version:\n#####   Package:\n#####    pixiu: 0.13.0.20210501\n#####\n#### **Descriptions\uff1a**\n    1.Add test open, modify, close in the EAT testing.\n\n### [2021-04-30]\n#### Version:\n#####   Package:\n#####    pixiu: 0.12.0.20210430\n#####\n#### **Descriptions\uff1a**\n    1.Finish EAT's 7 tests.\n\n### [2021-04-29]\n#### Version:\n#####   Package:\n#####    pixiu: 0.11.0.20210429\n#####\n#### **Descriptions\uff1a**\n    1.Add Account, Symbol Classes\n    2.Add ts_order, ts_base\n\n\n### [2021-04-28]\n#### Version:\n#####   Package:\n#####    pixiu: 0.10.0.20210428\n#####\n#### **Descriptions\uff1a**\n    1.Add some methods\n\n\n### [2021-04-27]\n#### Version:\n#####   Package:\n#####    pixiu: 0.9.0.20210427\n#####\n#### **Descriptions\uff1a**\n\n### [2021-04-26]\n#### Version:\n#####   Package:\n#####    pixiu: 0.8.0.20210426\n#####\n#### **Descriptions\uff1a**\n    1. Add test_ea_tester_func_indicators\n\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "PiXiu - A trading backtesting tool similar to MT4/MT5",
    "version": "0.109.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/tradepython/pixiu/issues",
        "Homepage": "https://github.com/tradepython/pixiu"
    },
    "split_keywords": [
        "trading",
        "backtest",
        "forex",
        "stocks",
        "mt4",
        "mt5",
        "metatrade"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9ebc1f61b3b0aeb088fc4e6b0cc828348cb41362fda129433e8912cbcf3c716a",
                "md5": "78007b8e7b01e2e9b65861e67c504670",
                "sha256": "510f1fea2e2d43d01adc337fe0c17636f134f681c53c320312052d73b35f8cc4"
            },
            "downloads": -1,
            "filename": "pixiu-0.109.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "78007b8e7b01e2e9b65861e67c504670",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 68724,
            "upload_time": "2023-12-07T08:41:56",
            "upload_time_iso_8601": "2023-12-07T08:41:56.087537Z",
            "url": "https://files.pythonhosted.org/packages/9e/bc/1f61b3b0aeb088fc4e6b0cc828348cb41362fda129433e8912cbcf3c716a/pixiu-0.109.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a311ad1696d3d07f378145fead1df11be5c9c631e535688666d29b277e7e8fa8",
                "md5": "c11ceddf711a0ddaec273145e28cdf09",
                "sha256": "9dff9ad9b7a9c6126b2f7e136358c3d3120836b67dfac240ac22b3b492f7544c"
            },
            "downloads": -1,
            "filename": "pixiu-0.109.0.tar.gz",
            "has_sig": false,
            "md5_digest": "c11ceddf711a0ddaec273145e28cdf09",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 715262,
            "upload_time": "2023-12-07T08:42:06",
            "upload_time_iso_8601": "2023-12-07T08:42:06.020988Z",
            "url": "https://files.pythonhosted.org/packages/a3/11/ad1696d3d07f378145fead1df11be5c9c631e535688666d29b277e7e8fa8/pixiu-0.109.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-07 08:42:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "tradepython",
    "github_project": "pixiu",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "pixiu"
}
        
Elapsed time: 0.14914s