FX自動売買といえばこのチャンネル!と言われるように頑張ります

ChatGPTを活用したFX自動売買の作り方

ChatGPTを活用したFX自動売買の作り方


こんにちは!はかせです。

Googleに変わると

言われているChatGPTですが、

このAIは驚異の言語能力を持っています。

このAIを活用してFX自動売買を

開発する方法を解説していきます。



この記事はこんな方にオススメ

ChatGPTを使ってプログラミングを勉強したい

簡単なEAを作ってみたい

AIを上手いこなしたい

AIと自動売買の可能性を感じている


ChatGPTとは?

ChatGPTとはOpenAI社が

開発したAIメッセージ応答サービスです。

このChatGPTはプログラミングも出来ます


但し、現段階ではまるっきり

頼る事は出来ません。

今回の記事では、

このChatGPTを使った

プログラミングの活用例と共に

修正した点をまとめていきます。


AIを利用したプログラミングを学ぶことで

資産形成のポートフォリオの

一部にすることが可能になると思います。


是非最後までご覧ください。


ChatGPTの活用例

まず最初に活用例をお見せします。

こちらのyoutubeにChatGPTを

使った自動売買開発の活用例を

載せているので、ご覧ください。






ChatGPTの課題


動画をご覧いただくと

分かるかと思いますが、

ChatGPTがかいた 

プログラミングコードは

手直しする必要があります。


それはプログラミング精度が

完璧ではない。という事です。


数値の設定が悪かったり

エントリーを何度も繰り返してしまう

という事が多々あります。


試しにどのような点を

直したか一つずつ見ていきましょう。



ChatGPTのソースコード


ChatGPTがプログラミングした

コードは下記の通りです。


// MAクロスに基づくシンプルなトレードシステム
// エントリー条件: ゴールデンクロスが起きたら買い、デッドクロスが起きたら売り
// 決済条件: 50pipsで利確、20pipsで損切り

// 外部変数の設定
extern int FastMA = 50;  // 短期MAの期間
extern int SlowMA = 200; // 長期MAの期間
extern double Lots = 0.1; // 取引量
extern int TakeProfit = 50; // 利確設定
extern int StopLoss = 20; // 損切り設定

// グローバル変数の設定
int ticket = 0; // 取引注文番号を保持する変数

// 初期化関数
int init()
{
    return(0);
}

// スタート関数
int start()
{
    // MAの計算
    double FastMAValue = iMA(NULL, 0, FastMA, 0, MODE_EMA, PRICE_CLOSE, 0);
    double SlowMAValue = iMA(NULL, 0, SlowMA, 0, MODE_EMA, PRICE_CLOSE, 0);
    
    // ゴールデンクロス/デッドクロスの判定
    if(FastMAValue > SlowMAValue && ticket == 0) // ゴールデンクロスの場合、買い注文を出す
    {
        ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-StopLoss*Point, Bid+TakeProfit*Point, "Buy", 0, 0, Green);
        if(ticket > 0) // 注文が成功した場合、ログに出力
        {
            Print("Buy order placed, ticket ", ticket);
        }
        else // 注文が失敗した場合、エラーメッセージをログに出力
        {
            Print("Error placing buy order, error ", GetLastError());
        }
    }
    else if(FastMAValue < SlowMAValue && ticket == 0) // デッドクロスの場合、売り注文を出す
    {
        ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+StopLoss*Point, Ask-TakeProfit*Point, "Sell", 0, 0, Red);
        if(ticket > 0) // 注文が成功した場合、ログに出力
        {
            Print("Sell order placed, ticket ", ticket);
        }
        else // 注文が失敗した場合、エラーメッセージをログに出力
        {
            Print("Error placing sell order, error ", GetLastError());
        }
    }
    
    // 注文の決済処理
    if(ticket > 0) // 注文が存在する場合
    {
        // 注文情
    OrderSelect(ticket, SELECT_BY_TICKET); // 注文を選択する
    
    if(OrderType() == OP_BUY) // 買い注文の場合
    {
        if(Bid - OrderOpenPrice() >= TakeProfit*Point) // 利確条件を満たした場合、決済注文を出す
        {
            bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Green);
            if(closeOrder) // 決済注文が成功した場合、ログに出力
            {
                Print("Buy order closed with profit, ticket ", ticket);
            }
            else // 決済注文が失敗した場合、エラーメッセージをログに出力
            {
                Print("Error closing buy order with profit, error ", GetLastError());
            }
            ticket = 0; // 注文番号を初期化する
        }
        else if(OrderOpenPrice() - Bid >= StopLoss*Point) // 損切り条件を満たした場合、決済注文を出す
        {
            bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Red);
            if(closeOrder) // 決済注文が成功した場合、ログに出力
            {
                Print("Buy order closed with loss, ticket ", ticket);
            }
            else // 決済注文が失敗した場合、エラーメッセージをログに出力
            {
                Print("Error closing buy order with loss, error ", GetLastError());
            }
            ticket = 0; // 注文番号を初期化する
        }
    }
    else if(OrderType() == OP_SELL) // 売り注文の場合
    {
        if(OrderOpenPrice() - Ask >= TakeProfit*Point) // 利確条件を満たした場合、決済注文を出す
        {
            bool closeOrder = OrderClose(ticket, Lots, Ask, 3, Red);
            if(closeOrder) // 決済注文が成功した場合、ログに出力
            {
                Print("Sell order closed with profit, ticket ", ticket);
            }
            else // 決済注文が失敗した場合、エラーメッセージをログに出力
            {
                Print("Error closing sell order with profit, error ", GetLastError());
            }
            ticket = 0; // 注文番号を初期化する
        }
        else if(Ask - OrderOpenPrice() >= StopLoss*Point) // 損切り条件を満たした場合、決済注文を出す
        {
            bool closeOrder = OrderClose(ticket, Lots, Ask, 3, Green);
            if(closeOrder) // 決済注文が成功した場合、ログに出力
            {
                Print("Sell order closed with loss, ticket ", ticket);
            }
            else // 決済注文が失敗した場合、エラーメッセージをログに出力
            {
                Print("Error closing sell order with loss, error ", GetLastError());
            }
            ticket = 0; // 注文番号を初期化する
        }
    }
}

return(0);
}



こちらをMT4に入れてコンパイルしてみましょう。


ChatGPTソースコード修正


closeOrder-variable already defined

というエラーになりましたね。

直していきます。


ChatGPTのソースコードを修正した
//closeOrderがboolで何度も定義されている
bool closeOrder = OrderClose(ticket, Lots, Bid, 3, Green);


closeOrderが何度も定義されている為、

このようなエラーが出ます。


bool closeOrderの定義を一つだけにします。


次にコンパイル時にはワーニングが出てしまいました。


ChatGPTのソースコードのエラーを修正


こちらの箇所が悪さをしています。


OrderSelect関数を使う場合には、必ず戻り値を格納する変数を用意しましょう。


OrderSelect(ticket, SELECT_BY_TICKET); // 注文を選択する


ChatGPTのソースコードを手直し


再度コンパイルすると

エラーがなくなりました。


ではバックテストをして、

想定通りのエントリーに

なっているか確認してみましょう。


ChatGPTのソースコードがバグを生む

ビジュアルモードで

バックテストをしたところ、

このように何度も

エントリーしてしまいましたね。


ここがChatGPT最大の

ミスと言ってもよいでしょう。


何が悪いのか見ていきます。


エントリー価格:109.615

S/L:109.554 (約5pips)

T/P:109.624 (約1pips)


となっており、想定の利確、

損切りではない事が分かります。


ChatGPTのソースコードは無限エントリーしてしまう


extern int TakeProfit = 500; // 利確設定を変更
extern int StopLoss = 200; // 損切り設定を変更
ChatGPTのソースコードを直すと正常にエントリーする


ポジションによって、エントリー~利確、

エントリー~損切りまでの

価格差に若干の誤差がありますが、


大体は利確50pips,損切り20pipsに

設定できました。


この誤差の原因は、スプレッドです。

このスプレッドの計算方法を

加味されていないので、

このように誤差が出てきます。


修正方法の参考動画

修正した動画は以下の通り

youtubeにアップしましたので、

併せてご覧ください。


(現在準備中)


最後に

まだまだ課題の多いChatGPTですが、

可能性は無限大に秘めていますね。

引き続きChatGPTの

動向もウォッチしつつ記事にしていきます

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です