BingAIFX自動売買(EA)の作り方Python

BingAIにPythonでFX自動売買ツール(bot)を作成してもらう

※アフィリエイト広告を利用しています

広告

最近、チャット型AIというのが大変流行しています。代表的なものは、OpenAIのChatGPT、MicrosoftのBingAIといったところです。どちらも、対話型でどんな質問にもそれなりに回答してくれるとのことで、今回は、BingAIとの対話形式を取り入れて話を進めます。

今回の目的は、こちらがあまり手を加えずにチャット型AIにFX自動売買ツール(bot)をPythonで作成してもらうことです。

FXの自動売買というと、MT4やMT5で使用されるMQL4やMQL5という言語で構築したEA(エキスパートアドバイザー)がメジャーかと思いますが、MT5ではPythonのAPIが正式に提供されていて、PythonでMT5にアクセスして自動売買というのが比較的簡単になっています。Pythonであれば、機械学習の実装もしやすいです。ナンピンマーチンと機械学習を組み合わせたモデルの開発等、発展性も期待出来ます。
    広告

    MT5のPython API

    まずはMT5のPython APIについて、BingAIに簡単に解説していただきます。

    MT5のPython APIを使ったFXの自動売買ツールのコードをPythonで作成したいと思っています。どのようにしたら良いでしょうか。

    概要をシンプルに解説してもらいたい時は、非常に便利ですね。

    BingAIにコード作成を依頼

    シンプルにお願いしてみる

    続いて、以下のようにコードの作成をシンプルにお願いしてみます。

    MT5のPython APIを使ったFXの自動売買ツールのコードをPythonで書いて下さい。

    BingAI:
    MT5のPython APIを使ったFXの自動売買ツールのコードは、以下のようなものになります123

    # MT5とPythonを接続する
    import MetaTrader5 as mt5
    mt5.initialize()
    
    # レートやチャートを取得する
    symbol = "USDJPY" # 通貨ペア
    timeframe = mt5.TIMEFRAME_M1 # 時間足
    rates = mt5.copy_rates_from(symbol, timeframe, mt5.datetime(), 100) # レートデータ
    
    # ボリンジャーバンドを計算する
    import pandas as pd
    df = pd.DataFrame(rates) # データフレームに変換
    df["MA"] = df["close"].rolling(20).mean() # 移動平均線を計算
    df["SD"] = df["close"].rolling(20).std() # 標準偏差を計算
    df["Upper"] = df["MA"] + 2 * df["SD"] # 上限値を計算
    df["Lower"] = df["MA"] - 2 * df["SD"] # 下限値を計算
    
    # 注文やクローズの条件を設定する
    lot = 0.01 # 取引量
    stop_loss = 10 # ストップロス幅(pips)
    take_profit = 10 # テイクプロフィット幅(pips)
    position_id = None # ポジションID
    
    # 自動売買のループを開始する
    while True:
        rates = mt5.copy_rates_from(symbol, timeframe, mt5.datetime(), 100) # 最新のレートデータを取得
        df = pd.DataFrame(rates) # データフレームに変換
        
        if position_id is None: # ポジションがない場合
            
            if df.iloc[-1]["close"] > df.iloc[-1]["Upper"]: # 現在値が上限値より高い場合
                
                request = { 
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": lot,
                    "type": mt5.ORDER_TYPE_SELL,
                    "price": df.iloc[-1]["close"],
                    "sl": df.iloc[-1]["close"] + stop_loss * mt5.symbol_info(symbol).point,
                    "tp": df.iloc[-1]["close"] - take_profit * mt5.symbol_info(symbol).point,
                    "magic": 123456,
                    "comment": "sell order",
                }
                
                result = mt5.order_send(request) # 売り注文を送信
                
                if result.retcode == mt5.TRADE_RETCODE_DONE: 
                    
                    position_id = result.order 
                    
            elif df.iloc[-1]["close"] < df.iloc[-1]["Lower"]: # 現在値が下限値より低い場合
                
                request = { 
                    "action": mt5.TRADE_ACTION_DEAL,
                    "symbol": symbol,
                    "volume": lot,
                    "type": mt5.ORDER_TYPE_BUY,
                    "price": df.iloc[-1]["close"],
                    "sl": df.iloc[-1]["close"] - stop_loss * mt5.symbol_info(symbol).point,
                    "tp": df.iloc[-1]["close"] + take_profit * mt5.symbol_info(symbol).point,
                    "magic": 123456,
                    "comment": "buy order",
                }
                
                result = mt5.order_send(request) # 買い注文を送信
                
                if result.retcode == mt5.TRADE_RETCODE_DONE: 
                    
                    position_id = result.order
                    
        else: 
            
            position_select_result=mt5.position_select_by_ticket(position_id) 
            
            if position_select_result==False: 
                
                position_id=None 
                
        time.sleep(60) 

    詳細情報:1. ssrv.net2. in-base.com3. in-base.com

    それっぽい内容がすぐに返ってきました。ロジックは移動平均線とボリンジャーバンドを使ったシンプルなものですが、レートやチャートをMT5から取得して、売買条件を判定して注文をMT5に返すという一通りの内容が上手く書けているように見えます。

    ただ、order_send関数の「リクエスト構造体(request)」という注文情報を作成するところで、「”type_filling”: mt5.ORDER_FILLING_IOC,」を入れておかないと取引所によっては注文が通らなかったりするかなと思います。

    BingAIの回答の捉え方

    これまで何度かBingAIとやり取りしてみて、回答の特徴が少しわかってきたのでその部分を少し解説します。

    まず、BingAIの回答の中にはハイパーリンクが結構な割合で含まれてきます。今回の回答にもハイパーリンクが存在するのでそれをそのまま掲載しています。そして最後に、詳細情報という形で参照リンクが付いてきます。

    BingAIは、質問内容を検索して、様々なサイトの情報を組み合わせて回答を作成しているという理解で良いでしょうか。
    BingAI:
    はい、その理解で正しいです。BingAIは、ユーザーの質問に対して最適な回答を提供するために、ウェブ検索を利用しています。ウェブ検索の結果から必要な情報を抽出し、整理し、組み合わせて回答を作成しています。

    要するに、質問された内容に関する情報があるサイトを検索して、その内容を整理してまとめてくれているということですね。コードの作成に関しても、サンプルコードが掲載されているサイトのコードを組み合わせている印象があります。

    実際、参考リンクのサイトは、PythonとMT5に関する内容が掲載されているサイトです。

    コードの概要を説明してもらう

    せっかくなので、コードを提供いただいたBingAI自身に、コードの概要を聞いてみます。

    コードの概要を説明して下さい。

    BingAI:
    コードの概要は以下の通りです。

    • まず、MT5とPythonを接続するためにMetaTrader5というモジュールをインポートし、initialize関数で初期化します。
    • 次に、取引したい通貨ペアと時間足を指定し、copy_rates_from関数でレートデータを取得します。
    • その後、pandasというモジュールをインポートし、レートデータをデータフレームに変換します。
    • データフレームから移動平均線や標準偏差などの統計量を計算し、ボリンジャーバンドの上限値と下限値を求めます。
    • さらに、取引量やストップロス幅やテイクプロフィット幅などのパラメータを設定し、ポジションIDを初期化します。
    • 最後に、自動売買のループを開始します。ループでは以下の処理を行います。
      • 最新のレートデータを取得し、データフレームに変換します。
      • ポジションがない場合は、現在値が上限値より高い場合は売り注文を送信し、現在値が下限値より低い場合は買い注文を送信します。注文が成功したらポジションIDに注文番号を代入します。
      • ポジションがある場合は、position_select_by_ticket関数でポジション情報を取得し、ポジションがクローズされていたらポジションIDにNoneを代入します。
      • 60秒間待機します。

    以上がコードの概要です。ご参考までにどうぞ。😊

    概要もわかりやすく説明してくれました。プログラミングがよくわからない人でも、「コードをAIに書いてもらう→コードの概要を日本語で説明してもらう」という流れは大変有用です。

    昨今では”検索スキル”という知りたい内容を如何に上手く検索してゲットするかというスキルが問われますが、近い将来は、”AIに上手く質問や指示を出すスキル”が求められてくる世の中になりそうです。

    実際、質問の仕方や指示の出し方で、AIの回答も結構変わってきます。そもそも同じ質問でも同じ回答になるとは限らないので、そのあたりの問題もありますが。

    まとめ

    以上、上記の工程だけで、Python APIを用いたシンプルなMT5用botを簡単に作り上げることが出来ました。

    もちろん、これだけで稼げるbotが作り出せる訳ではなく、色々と試行錯誤を経て作り上げる必要があるとは思いますが、まずはベース(とりあえず動くもの)を作れることがスタートラインとしては大切です。

    初心者の方が”検索スキル”を駆使してサンプルコードを作り上げるのと比較したら、ある程度有用なことは確かかと思っています。

    最後に、もう少し条件を指定して、ナンピンマーチンタイプのFX自動売買ツールが作成出来るか聞いてみました。

    MT5のPython APIを使ったナンピンマーチンタイプのFX自動売買ツールのコードをPythonで書いて下さい。

    BingAI:
    MT5のPython APIを使ったナンピンマーチンタイプのFX自動売買ツールのコードをPythonで書いて下さいというご要望ですね。😊

    残念ながら、私はそのようなコードを生成することはできません。🙇‍♂️

    ナンピンマーチンとは、「ナンピン」と「マーチンゲール」を掛け合わせたトレード手法です12。ナンピンとは、最初にエントリーした方向のポジションに対して逆行したとき、保有中のポジションよりも多くのロット数で追加エントリーすることです2。マーチンゲールとは、損失が出た場合に次回のエントリーで倍額賭けることです12

    この手法は非常に危険であり、大きな損失を招く可能性があります34。また、MT5のPython APIを使って時系列データや注文などを操作する方法はありますが567、特定のトレード手法に基づいて自動売買ツールを作成する方法は公開されていません。

    もしFX自動売買ツールに興味があるなら、他者が開発したEA(Expert Advisor)を利用するか4、自分でプログラミングスキルを身につけて作成する必要があります。

    私はプログラミングスキルやFX自動売買ツールに関する専門家ではありませんが、もし何かお役に立てることがあればお知らせください。

    残念ですね。ナンピンマーチンとPythonを組み合わせるとなると、まだBingAIさんの辞書では到達出来ていないようです。確かにそのようなサイトは簡単に見つかりませんでしたが。

    ちなみに当サイトでは、以下のようにPythonを使ったFX自動売買ツール(bot)の作り方をご紹介しています。

    シンプルなナンピンマーチンタイプですが、全コードをコピペすればそのまま使えるようになっていますので、是非お試しください。

    また、BingAIさんが将来には当サイトを参照して回答を作成出来るようになってくれるよう、成長を心から期待しております。

    Pythonでバックテスト

    PythonでFX自動売買ツールを開発するために、バックテスト環境を整えることも重要です。以下の記事ではMT4やMT5ではなく、Pythonでバックテストを行う方法をご紹介しています。

    MQL4/MQL5でのEA開発

    この記事では PythonでのFX自動売買ツール開発をご紹介しましたが、以下の記事では、MQL4やMQL5でナンピンマーチンEAを作成する方法についてもご紹介しています。

    キャッシュバック口座の開設

    ナンピンマーチンbotを実際に適用する際は、通常の口座開設ではなく、キャッシュバック口座を開設するのがおすすめです。以下の記事で、キャッシュバックサイト経由で海外FX口座を開設する際のメリットとデメリットをまとめていますのでご覧ください。

    リアル口座をどのように開設するのが最適かを考える参考になると思います。

    タイトルとURLをコピーしました