English Русский 中文 Español Deutsch 日本語 Português Français Italiano
preview
파이썬으로 트레이딩 로봇 개발하기(3부): 모델 기반 트레이딩 알고리즘 구현하기

파이썬으로 트레이딩 로봇 개발하기(3부): 모델 기반 트레이딩 알고리즘 구현하기

MetaTrader 5트레이딩 시스템 |
22 0
Yevgeniy Koshtenko
Yevgeniy Koshtenko

시리즈의 첫 번째 글에서는 우리는 데이터 집합을 로드하고 레이블을 배치하고 데이터 집합을 보강하고 데이터 집합 레이블링도 수행했습니다. 두 번째 기사는 모델의 생성 및 훈련과 교차 검증 및 배깅 구현에 대해 다뤘습니다. 

이제 모델 학습과 테스트가 완료되었으므로 이제 Python용 MetaTrader 5 라이브러리를 사용하여 실제로 거래를 시작할 차례입니다. 이 강력한 라이브러리를 통해 우리는 MetaTrader 5 플랫폼에서 제공하는 함수와 클래스를 사용하여 파이썬을 통해 트레이딩을 자동화할 수 있습니다.


모델 기반의 트레이딩 알고리즘 구현

모델을 기반으로 트레이딩 알고리즘을 구현하기 위해 우리는 다음과 같은 접근 방식을 사용할 것입니다. 기본 알고리즘은 미리 설정된 손절매로 거래를 시작하고 모델에서 생성한 레이블과 일치하는 수익을 취하는 것입니다. 모델이 자산 가격의 상승을 예측하면 손절매와 이익 실현 수준을 설정한 롱 포지션에 진입합니다. 모델이 자산 가격의 하락을 예측하면 유사한 손절매와 이익 실현 파라미터로 숏 포지션에 진입합니다.

파이썬용 MetaTrader 5 라이브러리는 거래의 진입 및 청산을 관리하고 손절 및 익절 수준을 설정하는 데 필요한 도구를 제공합니다. 이를 통해 우리는 모델 예측을 기반으로 트레이딩을 완전히 자동화할 수 있습니다.

이전에 행한 분석 및 훈련 단계에서 얻은 데이터를 사용하면 MetaTrader 5 플랫폼에서 실시간으로 포지션에 진입하고 청산하는 신호를 전송할 수 있으므로 거래 알고리즘의 연속성과 정확성을 보장할 수 있습니다.

따라서 훈련된 모델을 Python용 MetaTrader 5 라이브러리와 통합하면 모델 예측에 따라 거래하고 사전에 설정된 손절매로 위험을 관리하고 이익실현으로 수익을 보호하는 효율적이고 자동화된 트레이딩 알고리즘을 만들 수 있습니다.


트레이딩 터미널과 환경을 설정하고 알고리즘 실행하기

먼저 환경과 MetaTrader 5 트레이딩 터미널을 설정해야 합니다. 다음 단계를 따르세요:

pip 명령을 사용하여 Python 라이브러리를 설치합니다:

pip install numpy pandas MetaTrader5 scikit-learn xgboost

터미널 링크에 터미널 실행 파일로의 경로를 표시합니다:

terminal_path = "C:/Program Files/RoboForex - MetaTrader 5/Arima/terminal64.exe"


온라인 거래 구현

온라인 트레이딩을 구현하기 위해 모델 예측에 따라 거래를 하는 online_trading 함수를 추가합니다.

online_trading 함수는 다음 인수를 받습니다:

  • symbol - 거래되는 심볼
  • features - 예측을 만드는 데 사용할 피처 목록
  • model - 예측에 사용할 훈련된 모델

online_trading 함수 내에서 먼저 terminal_path에 지정된 경로를 사용하여 MetaTrader 5 터미널에 연결합니다. 그런 다음 mt5.symbol_info_tick(symbol) 함수를 사용하여 현재 심볼 가격을 가져옵니다.

다음으로, 전달된 피처들을 기반으로 모델을 사용하여 신호를 예측합니다. 예측이 양수(0.5 이상)이면 매수 포지션에 진입하고 음수(0.5 미만)이면 매도 포지션에 진입합니다.

또한 각 거래에 대해 손절매와 이익 실현을 설정하여 위험을 최소화합니다.

이미 최대 미체결 거래 수에 도달한 경우(MAX_OPEN_TRADES 상수에서 설정됨), 새로운 거래에 진입하지 않고 미체결 거래 중 하나가 청산될 때까지 기다립니다.

예측에서 새로운 거래를 개시할 수 없는 경우 새로운 신호가 나타날 때까지 기다립니다.

함수의 끝에서 거래가 성공적으로 체결된 경우 거래 체결 결과를 반환하고 거래가 체결되지 않은 경우 없음(None)을 반환하도록 합니다.

def online_trading(symbol, features, model):
    terminal_path = "C:/Program Files/RoboForex - MetaTrader 5/Arima/terminal64.exe"

    if not mt5.initialize(path=terminal_path):
        print("Error: Failed to connect to MetaTrader 5 terminal")
        return

    open_trades = 0
    e = None
    attempts = 30000

    while True:
        symbol_info = mt5.symbol_info(symbol)
        if symbol_info is not None:
            break
        else:
            print("Error: Instrument not found. Attempt {} of {}".format(_ + 1, attempts))
            time.sleep(5)

    while True:
        price_bid = mt5.symbol_info_tick(symbol).bid
        price_ask = mt5.symbol_info_tick(symbol).ask

        signal = model.predict(features)

        positions_total = mt5.positions_total()

        for _ in range(attempts):
            if positions_total < MAX_OPEN_TRADES and signal[-1] > 0.5:
                request = {
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": 0.3,
                    "type": mt5.ORDER_TYPE_BUY,
                    "price": price_ask,
                    "sl": price_ask - 150 * symbol_info.point,
                    "tp": price_ask + 800 * symbol_info.point,
                    "deviation": 20,
                    "magic": 123456,
                    "comment": "Test deal",
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_FOK,
                }
            elif positions_total < MAX_OPEN_TRADES and signal[-1] < 0.5:
                request = {
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": 0.3,
                    "type": mt5.ORDER_TYPE_SELL,
                    "price": price_bid,
                    "sl": price_bid + 150 * symbol_info.point,
                    "tp": price_bid - 800 * symbol_info.point,
                    "deviation": 20,
                    "magic": 123456,
                    "comment": "Test deal",
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_FOK,
                }
            else:
                print("No signal to open a position")
                return None

            result = mt5.order_send(request)

            if result.retcode == mt5.TRADE_RETCODE_DONE:
                if signal[-1] < 0.5:
                    print("Buy position opened")
                    open_trades += 1
                elif signal[-1] > 0.5:
                    print("Sell position opened")
                    open_trades += 1
                return result.order
            else:
                print("Error: Trade request not executed, retcode={}. Attempt {}/{}".format(result.retcode, _ + 1, attempts))
                time.sleep(3)

        time.sleep(4000)

def process_symbol(symbol):
    try:
        # Retrieve data for the specified symbol
        raw_data = retrieve_data(symbol)
        if raw_data is None:
            print("No data found for symbol {}".format(symbol))
            return None

        # Augment data
        augmented_data = augment_data(raw_data)

        # Markup data
        marked_data = markup_data(augmented_data.copy(), 'close', 'label')

        # Label data
        labeled_data = label_data(marked_data, symbol)

        # Generate new features
        labeled_data_generate = generate_new_features(labeled_data, num_features=100, random_seed=1)

        # Cluster features by GMM
        labeled_data_clustered = cluster_features_by_gmm(labeled_data_generate, n_components=4)

        # Feature engineering
        labeled_data_engineered = feature_engineering(labeled_data_clustered, n_features_to_select=10)

        # Train XGBoost classifier
        train_data = labeled_data_engineered[labeled_data_engineered.index <= FORWARD]


온라인 트레이딩 알고리즘 론칭

온라인 트레이딩 알고리즘을 시작하려면 거래되는 심볼을 전달하는 동안 process_symbol 함수를 호출합니다.

process_symbol 함수 내에서 online_trading 함수를 호출하여 필요한 인수를 전달하고 중단될 때까지 실행되는 루프를 시작합니다.

루프가 끝나면 MetaTrader 5 터미널에 과부하가 걸리지 않도록 6초간 일시정지 합니다.

알고리즘 실행 중 오류가 발생하면 오류 메시지를 출력하고 실행을 중단합니다.


지능형 리스크 및 드로다운 관리 시스템

리스크 관리는 성공적인 트레이딩 전략의 초석입니다. 트레이더가 직면하게 되는 주요 위험 중 하나는 자산 가격이 미리 정해진 수준 이하로 하락할 때 발생하는 손실이란 위험입니다. 이러한 위험을 최소화하기 위해서는 변화하는 시장 상황에 적응할 수 있는 효과적인 리스크 관리 시스템이 필요합니다.

이제 우리는 파이썬용 MetaTrader 5 라이브러리 도구를 사용하여 계좌 잔고가 부족할 때 자동으로 거래량을 줄이는 시스템을 개발할 예정입니다.

시스템의 기본 규칙:

  1. 매일 경상수지 잔고 검색 - 매일 시스템에서 경상수지 잔고를 검색하여 변경 사항을 분석합니다.

  2. 손실 시 거래량 감소 - 잔고가 하루에 2% 이상 감소하면 시스템이 자동으로 미체결 거래량을 10% 줄입니다. 이는 점진적으로 위험을 줄이기 위해 0.01랏 부터 진행됩니다.

  3. 잔고가 계속 감소하면 거래량 추가 감소 - 잔액이 계속 감소하면 매일 거래량이 추가로 10%, 0.01랏씩 감소하여 자본을 더 보호할 수 있습니다.

  4. 잔고 복원 후 원래 거래량으로 되돌리기 - 계좌 잔고가 이전 최고치를 초과하면 시스템이 자동으로 거래량을 원래 값으로 되돌립니다. 이는 거래량 감소를 통해 일시적으로 볼륨이 줄어든 후 전체 거래 활동을 복원하는 데 도움이 됩니다.

online_trading 함수에 새로운 변수가 추가되었습니다: 현재 잔고 저장용 account_balance, 이전 최고 잔고 수준 저장용 peak_balance, 일일 하락폭 추적용 daily_drop입니다. 이러한 변수는 위험 관리 로직을 구현하는 데 사용됩니다.

샘플 코드:

def online_trading(symbol, features, model):
    terminal_path = "C:/Program Files/RoboForex - MetaTrader 5/Arima/terminal64.exe"

    if not mt5.initialize(path=terminal_path):
        print("Error: Failed to connect to MetaTrader 5 terminal")
        return

    open_trades = 0
    e = None
    attempts = 30000

    # Get the current account balance
    account_info = mt5.account_info()
    account_balance = account_info.balance

    # Set the initial volume for opening trades
    volume = 0.3

    # Set the initial peak balance
    peak_balance = account_balance

    while True:
        symbol_info = mt5.symbol_info(symbol)
        if symbol_info is not None:
            break
        else:
            print("Error: Instrument not found. Attempt {} of {}".format(_ + 1, attempts))
            time.sleep(5)

    while True:
        price_bid = mt5.symbol_info_tick(symbol).bid
        price_ask = mt5.symbol_info_tick(symbol).ask

        signal = model.predict(features)

        positions_total = mt5.positions_total()

        # Calculate the daily drop in account balance
        account_info = mt5.account_info()
        current_balance = account_info.balance
        daily_drop = (account_balance - current_balance) / account_balance

        # Reduce the volume for opening trades by 10% with a step of 0.01 lot for each day of daily drop
        if daily_drop > 0.02:
            volume -= 0.01
            volume = max(volume, 0.01)
        elif current_balance > peak_balance:
            volume = 0.3
            peak_balance = current_balance

        for _ in range(attempts):
            if positions_total < MAX_OPEN_TRADES and signal[-1] > 0.5:
                request = {
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": volume,
                    "type": mt5.ORDER_TYPE_BUY,
                    "price": price_ask,
                    "sl": price_ask - 150 * symbol_info.point,
                    "tp": price_ask + 800 * symbol_info.point,
                    "deviation": 20,
                    "magic": 123456,
                    "comment": "Test deal",
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_FOK,
                }
            elif positions_total < MAX_OPEN_TRADES and signal[-1] < 0.5:
                request = {
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": volume,
                    "type": mt5.ORDER_TYPE_SELL,
                    "price": price_bid,
                    "sl": price_bid + 150 * symbol_info.point,
                    "tp": price_bid - 800 * symbol_info.point,
                    "deviation": 20,
                    "magic": 123456,
                    "comment": "Test deal",
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_FOK,
                }
            else:
                print("No signal to open a position")
                return None

            result = mt5.order_send(request)

            if result.retcode == mt5.TRADE_RETCODE_DONE:
                if signal[-1] < 0.5:
                    print("Buy position opened")
                    open_trades += 1
                elif signal[-1] > 0.5:
                    print("Sell position opened")
                    open_trades += 1
                return result.order
            else:
                print("Error: Trade request not executed, retcode={}. Attempt {}/{}".format(result.retcode, _ + 1, attempts))
                time.sleep(3)

        time.sleep(4000)


켈리 기준에 따른 랏 관리 구현

랏 크기 관리는 트레이딩에서 리스크 관리의 또 다른 중요한 측면입니다. 랏 크기의 제어에 널리 사용되는 방법 중 하나는 켈리 기준입니다. 켈리 기준은 승리 확률과 승패 비율에 따라 최적의 베팅 규모를 결정하는 데 도움이 되는 수학 방정식입니다.

여기서는 켈리 랏 크기 관리라는 것을 위험 관리 시스템에 구현하는 방법을 살펴보겠습니다. 모델의 예측과 0.5 사이의 거리를 당첨 확률로 사용합니다. 모델의 예측이 0.5에 가까울수록 당첨 확률이 낮아지며 베팅 규모는 더 작아야 합니다.

다음은 수정된 online_trading 함수의 모습입니다:

def online_trading(symbol, features, model):
    terminal_path = "C:/Program Files/RoboForex - MetaTrader 5/Arima/terminal64.exe"

    if not mt5.initialize(path=terminal_path):
        print("Error: Failed to connect to MetaTrader 5 terminal")
        return

    open_trades = 0
    e = None
    attempts = 30000

    # Get the current account balance
    account_info = mt5.account_info()
    account_balance = account_info.balance

    # Set the initial volume for opening trades
    volume = 0.1

    # Set the initial peak balance
    peak_balance = account_balance

    while True:
        symbol_info = mt5.symbol_info(symbol)
        if symbol_info is not None:
            break
        else:
            print("Error: Instrument not found. Attempt {} of {}".format(_ + 1, attempts))
            time.sleep(5)

    while True:
        price_bid = mt5.symbol_info_tick(symbol).bid
        price_ask = mt5.symbol_info_tick(symbol).ask

        signal = model.predict(features)

        positions_total = mt5.positions_total()

        # Calculate the daily drop in account balance
        account_info = mt5.account_info()
        current_balance = account_info.balance
        daily_drop = (account_balance - current_balance) / account_balance

        # Calculate the probability of winning based on the distance between the model's prediction and 0.5
        probability_of_winning = abs(signal[-1] - 0.5) * 2

        # Calculate the optimal volume for opening trades using the Kelly criterion
        optimal_volume = (probability_of_winning - (1 - probability_of_winning) / risk_reward_ratio) / risk_reward_ratio * account_balance / price_ask

        # Reduce the volume for opening trades by 10% with a step of 0.01 lot for each day of daily drop
        if daily_drop > 0.02:
            optimal_volume -= 0.01
            optimal_volume = max(optimal_volume, 0.01)
        elif current_balance > peak_balance:
            optimal_volume = (probability_of_winning - (1 - probability_of_winning) / risk_reward_ratio) / risk_reward_ratio * account_balance / price_ask
            peak_balance = current_balance

        # Set the volume for opening trades
        volume = optimal_volume

        for _ in range(attempts):
            if positions_total < MAX_OPEN_TRADES and signal[-1] > 0.5:
                request = {
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": volume,
                    "type": mt5.ORDER_TYPE_BUY,
                    "price": price_ask,
                    "sl": price_ask - 150 * symbol_info.point,
                    "tp": price_ask + 800 * symbol_info.point,
                    "deviation": 20,
                    "magic": 123456,
                    "comment": "Test deal",
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_FOK,
                }
            elif positions_total < MAX_OPEN_TRADES and signal[-1] < 0.5:
                request = {
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": volume,
                    "type": mt5.ORDER_TYPE_SELL,
                    "price": price_bid,
                    "sl": price_bid + 150 * symbol_info.point,
                    "tp": price_bid - 800 * symbol_info.point,
                    "deviation": 20,
                    "magic": 123456,
                    "comment": "Test deal",
                    "type_time": mt5.ORDER_TIME_GTC,
                    "type_filling": mt5.ORDER_FILLING_FOK,
                }
            else:
                print("No signal to open a position")
                return None

            result = mt5.order_send(request)

            if result.retcode == mt5.TRADE_RETCODE_DONE:
                if signal[-1] < 0.5:
                    print("Buy position opened")
                    open_trades += 1
                elif signal[-1] > 0.5:
                    print("Sell position opened")
                    open_trades += 1
                return result.order
            else:
                print("Error: Trade request not executed, retcode={}. Attempt {}/{}".format(result.retcode, _ + 1, attempts))
                time.sleep(3)

        time.sleep(4000)

이 함수에서는 probability_of_winning과 optimal_volume 변수를 추가했습니다. probability_of_winning은 모델 예측과 0.5 사이의 거리에 2를 곱한 값으로 계산된 당첨 확률을 저장합니다. optimal_volume에는 켈리 기준을 사용하여 계산한 최적의 베팅 규모가 포함됩니다.

'if daily_drop > 0.05:' 블록에서는 0.01랏 단위로 optimal_volume을 10%씩 줄입니다. 또한 계좌 잔고가 이전 최고 수준을 초과했는지 확인하는 'elif current_balance > peak_balance:' 조건도 추가했습니다. 그렇다면 현재 잔고와 승/패 비율에 대한 optimal_volume을 다시 계산하고 peak_balance를 업데이트합니다.

이 Kelly 랏 크기 관리 시스템을 사용하면 당첨 확률과 승패 비율에 따라 베팅 크기를 자동으로 최적화할 수 있습니다. 이렇게 하면 수익을 극대화하고 손실 위험을 최소화할 수 있습니다.


다중 통화 운영 및 병렬 컴퓨팅 구현

다중 통화 운영을 통해 알고리즘은 한 번에 여러 통화 쌍을 거래하여 위험을 분산할 수 있습니다. 이는 쌍이 있는 'symbols' 목록을 통해 구현됩니다.

병렬 컴퓨팅은 작업을 동시에 수행하여 작업 속도를 높입니다. 우리는 'threading' 라이브러리를 사용하는데 process_symbol 함수를 사용하여 각 쌍에 대해 별도의 스레드를 생성합니다.

process_symbol은 페어 데이터를 다운로드하고 변환하고 XGBoost 모델을 트레이닝하고 테스트한 다음 온라인으로 거래하여 주기적으로 데이터를 업데이트합니다.

스레드는 'symbols'의 모든 쌍에 대해 생성됩니다. 모든 스레드가 완료되면 프로그램은 thread.join()을 사용하여 스레드를 기다립니다.

이렇게 XGBoost를 기반으로 하는 고성능 멀티 스레드 멀티 통화 거래 시스템이 구현됩니다.

import threading

def process_symbol(symbol):
    try:
        # Retrieve data for the specified symbol
        raw_data = retrieve_data(symbol)
        if raw_data is None:
            print("No data found for symbol {}".format(symbol))
            return None

        # Augment data
        augmented_data = augment_data(raw_data)

        # Markup data
        marked_data = markup_data(augmented_data.copy(), 'close', 'label')

        # Label data
        labeled_data = label_data(marked_data, symbol)

        # Generate new features
        labeled_data_generate = generate_new_features(labeled_data, num_features=100, random_seed=1)

        # Cluster features by GMM
        labeled_data_clustered = cluster_features_by_gmm(labeled_data_generate, n_components=4)

        # Feature engineering
        labeled_data_engineered = feature_engineering(labeled_data_clustered, n_features_to_select=10)

        # Train XGBoost classifier
        train_data = labeled_data_engineered[labeled_data_engineered.index <= FORWARD]
        test_data = labeled_data_engineered[labeled_data_engineered.index > FORWARD]
        xgb_clf = train_xgboost_classifier(train_data, num_boost_rounds=1000)

        # Test XGBoost classifier
        test_features = test_data.drop(['label', 'labels'], axis=1)
        test_labels = test_data['labels']
        initial_balance = 10000.0
        markup = 0.00001
        test_model(xgb_clf, test_features, test_labels, markup, initial_balance)

        # Online trading
        position_id = None
        while True:
            # Get the last 2000 data points for online trading
            features = raw_data[-6000:].drop(['label', 'labels'], axis=1).values.tolist()

            # Update features every 6 seconds
            time.sleep(6)
            new_data = retrieve_data(symbol)
            if new_data is not None:
                raw_data = pd.concat([raw_data, new_data])
                raw_data = raw_data.dropna()

            # Online trading
            position_id = online_trading(symbol, features, xgb_clf, position_id)

    except Exception as e:
        print("Error processing {} symbol: {}".format(symbol, e))
        return None

symbols = ["EURUSD", "GBPUSD", "USDJPY", "AUDUSD", "USDCAD"]

# Create a list of threads for each symbol
threads = []
for symbol in symbols:
    thread = threading.Thread(target=process_symbol, args=(symbol,))
    thread.start()
    threads.append(thread)

# Wait for all threads to complete
for thread in threads:
    thread.join()

코드를 실행한 후 다른 스레드에서 화면 출력(prints)이 겹치는 문제가 발생했습니다. 이렇게 하면 화면의 출력을 읽을 수 없게 되고 알고리즘의 작동을 디버깅하고 모니터링하기가 어려워집니다. 이 문제를 해결하기 위한 수많은 시도에도 불구하고 출력 중복을 피하는 것은 아직 불가능했습니다.

Instruments in terminal: 31Instruments in terminal: 31Instruments in terminal: 31Instruments in terminal: 31Instruments in terminal: 31




No data for symbol USDCAD yet (attempt 1)No data for symbol NZDUSD yet (attempt 1)No data for symbol AUDUSD yet (attempt 1)
No data for symbol GBPUSD yet (attempt 1)


Instruments in terminal: 31Instruments in terminal: 31Instruments in terminal: 31Instruments in terminal: 31



No data for symbol USDCAD yet (attempt 2)No data for symbol AUDUSD yet (attempt 2)No data for symbol GBPUSD yet (attempt 2)


Instruments in terminal: 31Instruments in terminal: 31

Instruments in terminal: 31
No data for symbol GBPUSD yet (attempt 3)
Instruments in terminal: 31

이 문제에도 불구하고 알고리즘 자체는 올바르게 작동하고 기능을 수행합니다. 데이터를 성공적으로 처리하고 모델을 훈련시켜 'symbols' 목록에서 각 통화쌍에 대한 거래를 수행합니다. 병렬 컴퓨팅을 사용하면 알고리즘의 속도를 크게 높이고 효율성을 향상시킬 수 있습니다.

이렇게 우리는 알고리즘이 올바르게 거래를 개시하는 것을 확인할 수 있습니다:



추가적인 시스템 개선 가능성

양자 머신 러닝

현재는 고전적인 모델 훈련을 사용하고 있지만 향후에는 큐비트를 사용하는 양자 머신 러닝으로 전환하여 정확도와 속도를 개선할 계획입니다. 현재 양자 컴퓨터의 어려움에도 불구하고 특수한 소프트웨어와 알고리즘이 이미 개발되고 있습니다. 저는 양자 학습을 연구하고 우리 시스템에 구현할 계획이며 이는 중요한 사건이 될 수 있습니다.

시장 피드백: 강화 학습

트레이딩 시스템을 개선하기 위해 우리는 강화 학습을 구현할 수 있습니다. 이 시스템은 시장과 상호작용하는 에이전트 역할을 하며 수익성 있는 거래에 대해서는 보상을 받고 수익성 없는 거래에 대해서는 페널티를 받습니다. 시스템은 DQN과 같은 알고리즘을 사용하여 학습하고 적응하여 예측을 개선합니다.

스톱 및 테이크 선택을 위한 스웜 인텔리전스

시스템의 효율성을 높이기 위해 파티클 스웜 최적화(PSO) 알고리즘을 사용하여 스웜 인텔리전스를 적용할 수 있습니다. 시스템은 다양한 손절매 및 이익실현 매개변수를 생성하여 과거 데이터에서 효율성을 평가합니다. PSO는 최적의 매개변수를 선택하여 적응력을 향상하고 위험을 줄이는 데 도움이 됩니다.


결론

우리의 트레이딩 머신 러닝 모델은 데이터 전처리, 데이터 분석 및 XGBoost 유형 알고리즘을 사용하며 노이즈 추가, 시간 이동, 피처 계산, 클래스 밸런싱 및 교차 검증을 적용합니다. 테스트 데이터의 정확도는 약 60%입니다.

양자 컴퓨팅, 강화 학습, 손절매 및 이익 실현을 위한 군집 인텔리젼스는 추후 구현될 예정입니다. 이를 통해 훈련 품질, 실제 데이터에 대한 효율성 및 위험 관리가 개선됩니다.

하지만 한 가지 문제가 있습니다. 이러한 기술들은 시장에서 알고리즘 간의 치열한 경쟁을 불러일으킬 것입니다. 이전에는 트레이더가 서로 경쟁했지만 이제는 누구의 알고리즘이 더 나은지에 대한 경쟁이 더 치열 해졌습니다.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/15127

새로운 기능: MQL5의 커스텀 인디케이터 새로운 기능: MQL5의 커스텀 인디케이터
MetaTrader5와 MQL5의 새로운 기능 전체를 나열하지는 않겠습니다. 종류도 많은 데다가, 별도의 설명이 필요한 기능들도 있거든요. 객체 지향 프로그래밍을 이용한 코드 작성법 또한 다음에 알아보도록 하겠습니다. 다른 기능들과 함께 설명하기에는 조금 어려운 이야기일 수 있으니까요. 이 글에서는 인디케이터와 인디케이터의 구조, 드로잉 타입과 프로그래밍 디테일을 MQL4와 비교해 볼게요. 초보자 분들께 많은 도움이 되면 좋겠고 기존에 사용하시던 개발자 분들도 뭔가 새로운 걸 얻어 가실 수 있길 바랍니다.
Python과 MQL5로 로봇 개발하기(2부): 모델 선택, 생성 및 훈련, Python 사용자 지정 테스터 Python과 MQL5로 로봇 개발하기(2부): 모델 선택, 생성 및 훈련, Python 사용자 지정 테스터
파이썬과 MQL5로 트레이딩 로봇을 개발하는 방법에 대한 시리즈 기사를 계속 이어갑니다. 오늘 우리는 모델 선택 및 훈련, 테스트, 교차 검증, 그리드 검색 구현, 모델 앙상블 문제를 해결해 보겠습니다.
새 MetaTrader 와 MQL5를 소개해드립니다 새 MetaTrader 와 MQL5를 소개해드립니다
본 문서는 MetaTrader5의 간략 리뷰입니다. 짧은 시간 내에 시스템의 모든 세부 사항을 안내해드리기는 어렵습니다 - 테스트는 2009.09.09에 시작되었습니다. 이는 상징적인 일자로, 전 이것이 행운의 숫자가 될거라 믿어 의심치않습니다. 제가 새 MetaTrader 5 터미널과 MQL5 베타버전을 받은지 며칠이 지났습니다. 아직 모든 기능을 사용해본 것은 아니지만, 벌써부터 감명깊네요.
Python과 MQL5로 로봇 개발하기(1부): 데이터 전처리 Python과 MQL5로 로봇 개발하기(1부): 데이터 전처리
머신 러닝을 기반으로 트레이딩 로봇을 개발하기: 자세한 가이드. 이 시리즈의 첫 번째 글에서는 데이터와 기능을 수집하고 준비하는 방법을 다룹니다. 이 프로젝트는 파이썬 프로그래밍 언어와 라이브러리, MetaTrader 5 플랫폼을 사용하여 구현됩니다.