With the launch of Signal Bot, TradingView users and signal providers can now publish and set up Signal Bots using their TradingView signals. Follow the step-by-step instructions to start trading with signals on OKX.
Please use the following link to access a comprehensive guide detailing the alert message specifications: Alert message specifications .
If you encounter any difficulties, please refer to the guide which contains a list of frequently asked questions in the FAQ . This resource is designed to assist you in resolving any issues you may encounter while using the product.
Table of contents
- Step 1: Access Signal Bot
- Step 2: Create your signals
- Step 3: Configure TradingView alerts
- Step 3.1: TradingView strategy script instructions
- Step 3.2: TradingView Indicator/Research Guide
- Step 3.3: Instructions for chart analysis
- Step 3.4: Instructions for third-party programs
- Step 4: Set up your Signals Bot
- Step 5: Monitor & Manage Signal Bot
- Appendix A: MACD script with alert condition( ) + Set up alerts manually
- Appendix B: Python Webhook request example
- Warning message specifications
- FAQ
Step 1: Access Signal Bot
Log in to your OKX account, go to Trading -> Trading Bot -> Markets.

Next, select the Signal Bot sub-tab and select 'Create'.

Step 2: Create your signals
You will find a button that helps create custom signals. Select 'Add custom signal' to get started.

We've simplified the experience to help users quickly set up TradingView signals. In the first step, you can name the signal and insert an optional description of the signal (up to 500 characters long). Once done, select 'Generate Signal' to move to the next step.

After selecting 'Create', you will see the next page prompting you to add a Webhook URL and AlertMsg Parameters automatically generated by OKX. From here, you will set up signal push notifications on TradingView. Let's look at two separate methods for configuring alerts:
- "TradingView": Aimed at users who use the TradingView strategy script, especially those who use the strategy.*() function to transmit signals.
- "Custom": Designed to serve a wider range of users, including users of TradingView indicators, chart alerts, and providers using third-party programs.

Pine Script Quick Overview: “Strategy” vs “Indicator”
Pine Script type | Describe | |
---|---|---|
![]() 1. TradingView Strategy | Pine Script strategies serve the purpose of conducting historical data backtesting as well as live market backtesting. Besides performing indicator calculations, the strategy also includes a call to the strategy.*() function to pass trade orders to the Pine Script broker simulator. This simulator can then simulate the execution of these commands. The test results are displayed in the "Strategy Tester" tab located at the bottom of the chart, right next to the "Pine Script Editor" tab. | If you are using the Trading View strategy script with the strategy.*()** functions, go straight to Step 3.1: Start with the strategy.*()TradingView function. |
![]() 2. TradingView Indicator | On the other hand, Pine Script's indicator also involves calculations but is not intended for use in testing situations. Due to their independence from the broker simulator, indicators consume less resources and execute faster. Also, this is called a research script and not an indicator in PineScript v4. | For users using research indicators/scripts and third-party programs, proceed to Step 3.2, Step 3.3 and Step 3.4 based on your specific situation. This section is tailored to more general situations, including users who rely on the TradingView indicator, alerts via charts, and traders who use third-party programs. |
Step 3: Configure TradingView alerts
Please use the following link to access a comprehensive guide detailing the alert message specifications: Alert message specifications.
To get started, open TradingView and select the trading pair you want. (Make sure you are selecting the appropriate perpetual swap.)
You can access the full list of supported perpetual swaps on OKX via the pair selector list available on the Exchanges page.


Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions
Step 1: Configure the strategy script in Pine Editor and click "Save" and "Add to chart". Additionally, if you have a strategy script available, add it to the chart.
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/64319eb684f61624ef7f24a584372a1b.jpg)
Step 2: Select the gear icon associated with the strategy you added to the chart. Adjust strategy attributes such as order size to your wishes. Once completed, click "OK" to complete the installation.
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/009f970ed959a10f2e95e79c0477920d.jpg)
How to align TradingView strategy order settings using OKX?
In the TradingView strategy, you have three options for configuring order parameters: You can define "order size" by USDT, number of contracts, or by equity percentage based on your Initial Capital Friend. While all of these approaches can ultimately be adapted for use on OKX, it is essential to understand how each works on TradingView and how it translates to the OKX platform. Below is a brief overview of different scenarios to guide you through the process.
1. Order size: USDT
This approach is simple and user-friendly. You directly enter the order size in absolute value in USDT valuation currency. When testing TradingView, this value will serve as the basis for all your order operations.
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/4d174503ab7694d36f2335ca10bf641f.jpg)
To ensure seamless compatibility with OKX, remember to set "investmentType" to "base" and configure "amount" to "{{strategy.order.contracts}}". By following these specifications, your orders on OKX will be accurately aligned with your intended TradingView strategy.
{
"id": "{{strategy.order.id}}",
"action": "{{strategy.order.action}}",
"marketPosition": "{{strategy.market_position}}",
"prevMarketPosition": "{{strategy.prev_market_position}}",
"instrument": "{{ticker}}",
"signalToken": "********", //enter the signalToken for your signal
"timestamp": "{{timenow}}",
"maxLag": "60",
"investmentType": "base",
"amount": "{{strategy.order.contracts}}"
}
2. Order size: Contract
The important difference to realize is that the concept of "contract" is defined differently on TradingView and OKX. On TradingView, a contract represents one perpetual swap unit at the current price (equivalent to one base currency unit, i.e. one BTCUSDT perpetual contract is equivalent to buying 1 BTC). In contrast, on OKX, the "contract size" is unique for each perpetual swap (e.g. One BTCUSDT perpetual contract is equivalent to buying 0.01 BTC). Full information on OKX contract sizes is available here: https://www.okx.com/trade-market/info/swap .
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/0198cc56bb7eea53c781e6718326fa42.jpg)
To ensure seamless alignment with OKX, it is important to configure "investmentType" to "base" and set "amount" to "{{strategy.order.contracts}}". Notably, on TradingView, the "{{strategy.order.contracts}}" placeholder effectively corresponds to the amount in the base currency. This choice of "investmentType" as a "base" facilitates direct compatibility. Adherence to these specifications ensures that your orders on OKX perfectly reflect the TradingView strategy you intend to implement.
{
"id": "{{strategy.order.id}}",
"action": "{{strategy.order.action}}",
"marketPosition": "{{strategy.market_position}}",
"prevMarketPosition": "{{strategy.prev_market_position}}",
"instrument": "{{ticker}}",
"signalToken": "********", //enter the signalToken for your signal
"timestamp": "{{timenow}}",
"maxLag": "60",
"investmentType": "base",
"amount": "{{strategy.order.contracts}}"
}
3. Order size: % equity
When using "equity %", it is important to understand that equity starts with the value you specify as Initial Capital. Equity is then determined and evaluated through the TradingView backtesting process.
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/50d0f0199653b7f0200a81d00e3fbfa7.jpg)
While it is possible to simulate this by configuring "investmentType" to "base" "amount" to "{{strategy.order.contracts}}" (as described below), it is necessary to Remember that the values obtained from this method are heavily influenced by experimental calculations. In real-life situations, discrepancies between backtesting and live trading can occur, as backtesting is designed to approximate rather than exact order execution. Therefore, you should set your order size definition in USDT or contract terms on TradingView.
{
"id": "{{strategy.order.id}}",
"action": "{{strategy.order.action}}",
"marketPosition": "{{strategy.market_position}}",
"prevMarketPosition": "{{strategy.prev_market_position}}",
"instrument": "{{ticker}}",
"signalToken": "********", //enter the signalToken for your signal
"timestamp": "{{timenow}}",
"maxLag": "60",
"investmentType": "base",
"amount": "{{strategy.order.contracts}}"
}
Step 3: Click "Alerts" on the top toolbar and change "Conditions" to the script just added to the chart with "Execution Only". Expiration can also be selected as an "open-ended warning" for convenience.
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/1px.png)
Step 4 : Retrieve the alert message template from the TradingView tab in OKX Alert Message Parameters on your OKX Signals. Then, paste this template into the "Messages" section of your TradingView alerts, along with the corresponding Alert Name of your choice.
If you wish to make any modifications to the recommended template for alert messages, you may do so and ensure that such changes comply with the provided Alert Message Specifications.here .
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/de398cf0a268b98b275f946d0ff1a21f.jpg)
![Step 3.1 [TradingView Strategy Script Instructions]: For Pinescript strategy creators using the strategy.*() functions Bước 3.1 [Hướng dẫn về tập lệnh chiến lược TradingView]: Dành cho những người tạo chiến lược Pinescript sử dụng các hàm strategy.*()](https://static.fwimg.io/img/feed/059d1b1d0d1e5f065e233c5fea067fb6.jpg)
Step 5: Select Webhook URL* in "Notifications". Paste the webhook URL copied from OKX into TradingView then click "Create".
*Please note, you will need a paid TradingView subscription to access this feature


Step 3.2 [TradingView Indicator/Research Guide] for Pinescript Indicator/Research Script Creators
Step 1: Configure the script in Pine Editor then click "Save" and "Add to chart"
![Step 3.2 [TradingView Indicator/Research Guide] for Pinescript Indicator/Research Script Creators Bước 3.2 [Chỉ báo TradingView/Hướng dẫn nghiên cứu] dành cho người tạo chỉ báo/tập lệnh nghiên cứu Pinescript](https://static.fwimg.io/img/feed/e91d0d65deaacc87e70c1f47d37849d8.jpg)
Step 2 : Click "Alerts" on the top toolbar and change "Conditions" to the script just added to the chart with the corresponding Alert Condition. In this case, MACD Golden Cross is used along with Message Pattern IN_LONG. Expiration can also be selected as an "open-ended alert" for convenience.
Finally, retrieve the alert message template from the Customize tab in OKX Alert Message Parameters on your OKX Signal. Then, paste this template into the "Messages" section of your TradingView alerts, along with the corresponding Alert Name of your choice.
If you wish to make any modifications to the recommended template for alert messages, you may do so and ensure that such changes comply with the provided Alert Message Specifications.here .
"IMPORTANT: OKX has provided 4 different message contents with different operations (i.e. ENTER_LONG, EXIT_LONG, ENTER_SHORT, EXIT_SHORT). When setting up alerts, please select the appropriate alert depending on the logic your transaction.
![Step 3.2 [TradingView Indicator/Research Guide] for Pinescript Indicator/Research Script Creators Bước 3.2 [Chỉ báo TradingView/Hướng dẫn nghiên cứu] dành cho người tạo chỉ báo/tập lệnh nghiên cứu Pinescript](https://static.fwimg.io/img/feed/f18f071013f1f6047447753d8b4e7ab4.jpg)
![Step 3.2 [TradingView Indicator/Research Guide] for Pinescript Indicator/Research Script Creators Bước 3.2 [Chỉ báo TradingView/Hướng dẫn nghiên cứu] dành cho người tạo chỉ báo/tập lệnh nghiên cứu Pinescript](https://static.fwimg.io/img/1px.png)
Step 3: Select the Webhook URL in "Notifications". Paste the webhook URL copied from OKX into TradingView then click "Create".
![Step 3.2 [TradingView Indicator/Research Guide] for Pinescript Indicator/Research Script Creators Bước 3.2 [Chỉ báo TradingView/Hướng dẫn nghiên cứu] dành cho người tạo chỉ báo/tập lệnh nghiên cứu Pinescript](https://static.fwimg.io/img/feed/896857071f2ca6475b42f7a5fe7e02d6.jpg)
![Step 3.2 [TradingView Indicator/Research Guide] for Pinescript Indicator/Research Script Creators Bước 3.2 [Chỉ báo TradingView/Hướng dẫn nghiên cứu] dành cho người tạo chỉ báo/tập lệnh nghiên cứu Pinescript](https://static.fwimg.io/img/feed/53797a10188baffee9de042c0226fa4b.jpg)
Step 3.3 [Chart Analysis Instructions] for users using chart analysis and/or basic indicators
Step 1: Click the "Alerts" button on the toolbar at the top and set your conditions based on what you normally trade (e.g. RSI-14 crosses above 30)
![Step 3.3 [Chart Analysis Instructions] for users using chart analysis and/or basic indicators Bước 3.3 [Hướng dẫn phân tích biểu đồ] dành cho người dùng sử dụng phân tích biểu đồ và/hoặc các đường chỉ báo cơ bản](https://static.fwimg.io/img/feed/4304a2e484c19161c66e184ee15e0826.jpg)
Next, paste the OKX AlertMsg Specification in the "Messages" section. Learn more about AlertMsg OKX Specificationshere .
**IMPORTANT: We support 4 different message types with different operations (i.e. ENTER_LONG, EXIT_LONG, ENTER_SHORT, EXIT_SHORT). When setting up alerts, please choose the appropriate alert depending on your trading logic. **
Step 2: Select the Webhook URL in "Notifications". Paste the webhook URL copied from OKX into TradingView then click "Create".

Step 3: To view the generated alerts, click the "Alerts" tab and select the corresponding Alert.
![Step 3.3 [Chart Analysis Instructions] for users using chart analysis and/or basic indicators Bước 3.3 [Hướng dẫn phân tích biểu đồ] dành cho người dùng sử dụng phân tích biểu đồ và/hoặc các đường chỉ báo cơ bản](https://static.fwimg.io/img/feed/3dcb9edd3a5aad5d4462dcfcb6e2260b.jpg)
Step 3.4 [Third Party Program Instructions] for signal providers transmitting messages from native programs
For a configuration using Python as an example request, please refer to Appendix B: Python Webhook Request Example .
Please note, if you intend to send a request from a third party's fixed IP address to OKX, please contact our customer service team or write an email to tradingbot@okx.com with related reasons. This will ensure that your request is managed appropriately by a dedicated processing team. If not following this channel, all external signals will be considered invalid by default.
Step 4: Set up your Signals Bot
Now that you have successfully published signals on OKX, it's time to connect to the Signals Bot! To get started, tap 'Create Bot', this will take you to the Signals Bot creation page.

To get started, you need to provide the minimum required settings for the bot, including applicable trading pairs, leverage, and the amount (margin) you want to invest.
Choosing the right trading pairs is essential for your bot to identify the right opportunities: simply specify the trading pair that fits your trading strategy. Next, determine the leverage ratio you want to apply to the trade. Note that using leverage can increase potential profits but also comes with more risk. Make sure to choose a ratio that suits your risk tolerance and trading goals. Once you have determined the trading pair and leverage ratio, it is time to decide how much you are willing to invest in the bot.

In addition to basic settings, the bot offers advanced customization options to further fine-tune your trading preferences.
For example, you can choose between different order types, such as Market or Limit orders. Market orders are executed immediately at the current market price, while Limit orders allow setting a specific price at which the order will be executed.
Not only that, the order entry settings allow you to determine the investment amount for each order, determining the amount of money allocated to each transaction. The portion of funds allocated to each trade is quite customizable and can be chosen in absolute terms (e.g. 1000 USDT) or in percentage (e.g. 10% of available balance), giving you flexibility. active in determining position size. Adjusting this setting allows you to manage risk and control position size according to your trading strategy.
Additionally, you can set Take Profit (TP) and Stop Loss (SL) levels as part of the exit settings. Take Profit sets the price at which the bot will automatically close the trade to ensure a profit, while Stop Loss determines the price at which the bot will exit the trade to limit possible losses.
For each of these advanced settings (except TP and SL), you have the flexibility to define them directly at the bot level or rely on TradingView's alert messages to receive these parameters. This adaptability allows you to choose the method that best suits your trading style and workflow.

After filling in the desired bot parameters, select 'Confirm' to complete the Signal Bot creation.

Step 5: Monitor and manage your newly created Signals Bot
Congratulations! You have successfully created a Signal Bot. Now this powerful tool will listen to signals from your chosen signal source and execute trades instantly in real time, taking your trading to the next level.
You have full control and ability to view Bot signals. At any time you can monitor your bot's performance and access detailed information using the 'Details' view by clicking on the icon as shown below.

This comprehensive view allows you to track your performance history, review your active position listings, monitor your pending orders, and explore your positions and signal history, etc.

Review performance data

Monitor and manage positions waiting to be matched

Track historical positions
You can also review the signal history log and corresponding processing operations. This valuable resource helps you analyze successes and failures, refine your approach and make informed decisions for future trades.

Track signal history
In addition, you have the flexibility to intervene manually whenever necessary. For example, you can adjust the margin allocated to the bot, manually place orders for specific reasons, control ongoing positions, and manually close or reduce pending positions . This level of control allows you to fine-tune your trading strategy based on real-time market conditions and your own analysis.
1. Adjust (Add/Delete) bot margin
In the Bot Details section, you can easily Add or Remove Margin from the bot if needed. This allows you to pump more money into the bot when you want or set aside a portion of the money after achieving a significant return on investment (ROI).

Find the "Adjust Margin" button

Add/Reduce Margin
2. Place orders manually
Second, you have the freedom to place manual orders in the bot, no matter what the incoming signal is. This feature allows you to manually add orders for any trading pair according to your specific requirements. Intuitive pop-ups allow you to define order settings, including order type, quantity, and direction. You can use this function to initiate a new position, increase an existing position, or even reduce or completely close a position pending execution. This gives you broad control over active position management, allowing you to make adjustments whenever necessary.

*Look for the "Manual Commands" button

Place orders manually in either direction
3. Immediately close positions waiting to be matched
Additionally, you enjoy the convenience of not only being able to view your pending positions, but also directly closing any existing pending positions for a specific trading pair with a simple click. That way, you can completely close positions for that pair at the prevailing market price. When you click the close button, a confirmation prompt will appear, ensuring accuracy before completing the operation. It's easy – click to confirm and you're ready to go.

For every position record, there is a "Close All" button

Confirm you want to close
4. Stop Signal Bot
When stopping this bot, the system will close all positions waiting to be matched and cancel all pending orders of this bot. Any remaining assets from these orders will be returned to your trading account. There are two methods you can choose when stopping the Signal Bot.
- Go to Bot Details
Go to the Bot details page and select 'Stop' in the top right corner.

- Access the Bot commands tab
Access the Bot orders tab from the Trading page located at the bottom of the page.

Congratulations on successfully setting up the Signal Bot with TradingView signals! This achievement marks an important milestone in optimizing your trading strategy and has the potential to enhance your profits. Seize this opportunity to confidently navigate the cryptocurrency market and unlock your full trading potential. We wish you great success on your trading journey ahead. Want to learn about Signal Trading? Click here to learn more.
Appendix
A. Sample case 1: MACD script with alert condition( ) + Setting up alerts manually
To create an alert, you need to define the condition that will trigger the alert. This condition can be based on many different factors such as price, indicators or custom logic. The following PineScript uses the MACD technical indicator as an example.
//@version=5
indicator('MACD Sample Script 1', overlay=true)
// Calculate MACD
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
// Determine the golden cross condition
goldenCross = ta.crossover(macdLine, signalLine)
// Determine the death cross condition
deathCross = ta.crossunder(macdLine, signalLine)
// Use the alertcondition function to create an alert
alertcondition(condition=goldenCross, title="MACD Golden Cross", message="")
alertcondition(condition=deathCross, title="MACD Death Cross", message="")
In this example, we first calculate the MACD using the macd
function, which takes the input string (in this case the closing price) and the parameters for MACD (12, 26, 9). We then define the conditions for the golden cross and death cross using the crossover
and crossunder
functions, respectively. The golden cross appears when the MACD line crosses above the signal line, while the death cross appears when the MACD line crosses below the signal line.
Regarding setting up alerts manually, this procedure is covered in more detail in section 3 (Method B). However, for a quick overview, you will start the setup by pressing the "Alerts" button on TradingView. From there, you will select the indicator along with the associated condition. The next step involves copying and pasting the appropriate alert message and webhook URL from your signal on OKX.


B. Sample case 2: Python Webhook request example
import datetime
import time
import requests
import datetime
import json
import log
symbol = 'BTC-USDT-SWAP'
#enter long demo, using 100% available balance
signaldata_enterlong = {
"action":"ENTER_LONG",
"instrument":symbol,
"signalToken":"your signaltoken",
"timestamp":datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
"maxLag":"2000",
"orderType":"market",
"orderPriceOffset":"0.1",
"investmentType":"percentage_balance",
"amount":"100"
}
#enter short demo, using 100% available balance
signaldata_entershort = {
"action":"ENTER_SHORT",
"instrument":symbol,
"signalToken":"your signaltoken",
"timestamp":datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
"maxLag":"2000",
"orderType":"market",
"orderPriceOffset":"0.1",
"investmentType":"percentage_balance",
"amount":"100"
}
# exit short demo, closing 100% open position
signaldata_exitshort = {
"action":"EXIT_SHORT",
"instrument":symbol,
"signalToken":"your signaltoken",
"timestamp":datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
"maxLag":"2000",
"orderType":"market",
"orderPriceOffset":"0.1",
"investmentType":"percentage_position",
"amount":"100"
}
# exit long demo, closing 100% open postion
signaldata_exitlong = {
"action":"EXIT_LONG",
"instrument":symbol,
"signalToken":"your signaltoken",
"timestamp":datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
"maxLag":"2000",
"orderType":"market",
"orderPriceOffset":"0.1",
"investmentType":"percentage_position",
"amount":"100"
}
demo_trading_url = 'https://www.okx.com/pap/algo/signal/trigger'
live_trading_url = 'https://www.okx.com/algo/signal/trigger'
# Make a POST request signak enter
response = requests.post(live_trading_url, data=json.dumps(signaldata_enterlong))
# Check the response status code
if response.status_code == 200:
log.info('trigger signal successful')
else:
log.info('trigger sitgnal failed')
C. OKX TradingView sample script
- [Beginner-friendly TradingView strategy script] RSI Strategy: https://www.tradingview.com/script/3Is1tjRU-OKX-Signal-Bot-Beginner-s-Guide-RSI-Strategy/
- [Advanced TradingView indicator script] Turtle Trading Rules: https://www.tradingview.com/script/UUKKgHCB-OKX-Signal-Bot-Turtle-Trading-Rules/
Warning message specifications
For more information about OKX Alert Message Specifications, seethis article .
Frequently asked questions
If you have any questions about signal strategies, check out the most frequently asked questions users have asked in this article .
The post How to Set Up OKX Signal Trading Bot With TradingView appeared first on HakResearch .