巷で話題のChatGPTは、OpenAIによって開発されたチャット型AIです。
一方のBingAIは、Microsoftによって開発されたチャット型AIです。
どちらも、どんな質問にもそれなりに回答してくれるとのことで、今回は、BingAIとの対話形式を取り入れて話を進めます。
BingAI:ChatGPTとBingAIの違いを教えて差し上げます。😊
ChatGPTとBingAIは、どちらも自然言語処理のための言語モデルですが、開発元や利用可能性、トレーニングデータ、パラメータ数、応答時間、精度に違いがあります1。
- 開発元:ChatGPTはOpenAIによって開発されました。BingAIはMicrosoftによって開発されました。
- 利用可能性:ChatGPTは一般公開されていますが、BingAIはMicrosoft Bing Search Engineの一部としてしか利用できません。
- トレーニングデータ:ChatGPTはインターネット上のテキストデータを使って事前学習されました。BingAIは事前学習データに加えて、対話ごとに関連する検索結果を都度読み込んで学習します2。
- パラメータ数:ChatGPTは約17億個のパラメータを持ちます。BingAIは約25億個のパラメータを持ちます3。
- 応答時間:ChatGPTは応答時間が短く、即時的な会話ができます。BingAIは応答時間が長く、検索結果を読み込む必要があります。
- 精度:ChatGPTは過去の学習範囲内で回答しますが、新しい情報や知識に対応できません。BingAIは検索結果を読み込むことで、非常に精度の高く正確な解答をすることが可能です2。
以上がChatGPTとBingAIの違いです。どちらも自然言語処理の分野では優れた技術ですね!
こちらはBingAIの回答をそのままコピペしたものですが、ChatGPTとは違ってハイパーリンクが貼られていますね。それぞれの回答の根拠を示してくれているようです。BingAIは検索エンジンがベースということが少しわかってきた気がします。
MQL5のコードを書けるか聞いてみる
そこで、BingAIにもコードが書けるのかどうか聞いてみます。
BingAI:
MQL5とは、MetaTrader 5という取引プラットフォームにビルトインされた取引ストラテジーの言語です1。自動売買ロボットやテクニカル指標などを作ることができます1。私はMQL5のコードを書くことができますが、実際に取引を行うことはできません。私はあくまで検索エンジンとしての役割を果たすだけです。ご了承ください🙏
ナンピンマーチンEAの作成を依頼
ナンピンマーチンEAのコードを書いてもらう
BingAI:申し訳ありませんが、コードを提供することはできません。コードは自分で書くか、インターネット上のサンプルを参考にする必要があります。ナンピンタイプのEAのコードの例は以下のようなものです。//+------------------------------------------------------------------+ //| ナンピンタイプのEA | //+------------------------------------------------------------------+ #property strict #property version "1.00" #property source_url "https://tedukapm.tech/mql5/averagedown1/" input int MagicNumber=12345; // マジックナンバー input double Lots=0.01; // 初回ロット数 input double LotStep=0.01; // ロット増加量 input int MaxTrades=10; // 最大ポジション数 input int Distance=100; // ナンピン間隔(pips) input int TakeProfit=50; // 利益確定(pips) input int StopLoss=500; // 損切り(pips) void OnTick() { if(!IsTradeAllowed()) return; double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); int total = PositionsTotal(); if(total < MaxTrades) // 最大ポジション数に達していない場合 { if(total == 0) // ポジションがない場合 { Buy(Lots); // 買いポジションをオープンする } else // ポジションがある場合 { for(int i = total-1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(PositionSelectByTicket(ticket)) { if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { double open_price = PositionGetDouble(POSITION_PRICE_OPEN); if(Bid <= open_price - Distance*_Point) // 価格がナンピン間隔分下落したら { Buy(Lots + LotStep*total); // 買いポジションを追加でオープンする(ロット数を増やす) } } } } } } for(int i = total-1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(PositionSelectByTicket(ticket)) { if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { double open_price = PositionGetDouble(POSITION_PRICE_OPEN); double profit_pips = (Bid - open_price)/_Point; if(profit_pips >= TakeProfit) // 利益確定条件を満たしたら { CloseAllBuyPositions(); // 全ての買いポジションをクローズする } else if(profit_pips <= -StopLoss) // 損切り条件を満たしたら { CloseAllBuyPositions(); // 全ての買いポジションをクローズする } } } } } //+------------------------------------------------------------------+ //| 買いポジションをオープンする関数 | //+------------------------------------------------------------------+ bool Buy(double lot) { MqlTradeRequest request={}; MqlTradeResult result={}; request.action=TRADE_ACTION_DEAL; request.symbol=_Symbol; request.volume=lot; request.type=ORDER_TYPE_BUY; request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK); request.deviation=10; request.magic=MagicNumber; return(OrderSend(request,result)); } //+------------------------------------------------------------------+ //| 全ての買いポジションをクローズする関数 | //+------------------------------------------------------------------+ bool CloseAllBuyPositions() { bool result = true; int total = PositionsTotal(); for(int i = total-1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(PositionSelectByTicket(ticket)) { if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { result = result && ClosePosition(ticket); // 買いポジションをクローズする } } } return(result); } //+------------------------------------------------------------------+ //| ポジションをクローズする関数 | //+------------------------------------------------------------------+ bool ClosePosition(ulong ticket) { MqlTradeRequest request={}; MqlTradeResult result={}; request.action=TRADE_ACTION_DEAL; request.symbol=_Symbol; request.volume=PositionGetDouble(POSITION_VOLUME); request.type=PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ? ORDER_TYPE_SELL : ORDER_TYPE_BUY; request.price=PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_BID) : SymbolInfoDouble(_Symbol,SYMBOL_ASK); request.deviation=10; request.position=ticket; return(OrderSend(request,result)); }
ひとまず、それなりなコードが上がって来たようです。ChatGPTのようにMQL4っぽい雰囲気はあまりなく、しっかりとMQL5仕様になっているように見えます。
そのままコンパイルしてみる
BingAIにいただいたコードをそのままコピペして、ひとまずコンパイルしてみました。
その結果が以下の通りです。
3つのエラーが出てしまいました。でも、わりと少ないです。
エラー箇所を簡単に修正
エラー箇所は、本質的なロジックには直接影響なさそうなところでしたので、その箇所をそのままコメントアウトしてみることにしました。
具体的には、6行目の#property source_urlと、17行目のif(!IsTradeAllowed()) return;です。
すると、エラーなしでコンパイル成功です。第一段階クリアです。
MT5でバックテストしてみる
さて、コンパイルして作成したEAをMT5でバックテストしてみました。
注文が全く入らない
すると、注文が全く入りません。
確認してみたところ、オーダーの関数において、request.type_filling
を設定しないせいだということがわかりました。
コードの追加
そこで、87行目の下と、129行目の下に、以下のコードを追加します。
request.type_filling = ORDER_FILLING_IOC;
以上の修正で、バックテストでも注文がきちんと入ることが確認できました。
パラメータを少し調整してバックテスト
BingAIには特に取引銘柄を伝えずに作成したもらったので、パラメータはこちらで少し調整してみます。
取引銘柄はGOLD#(XMTradingのKIWAMI極口座のゴールド)で、期間は2022年11月1日〜2023年1月31日の3ヶ月間です。最大ポジション数(MaxTrades)、ナンピン間隔(Distance)、利益確定(TakeProfit)、損切り(StopLoss)を少し調整しました。
バックテスト結果
結果は以下の通りです。そこまで悲惨な結果ではないですね。
BingAIにバックテスト結果を評価してもらう
以下の通り、バックテスト結果をBingAIに見せて、評価してもらってみました。
BingAI:
ナンピンマーチンEAのバックテスト結果をご紹介いただきありがとうございます。ナンピンマーチンEAとは、ナンピンとマーチンゲールという2つの手法を組み合わせた自動売買システムです1。ナンピンとは、ポジションを増やしていく方法で、マーチンゲールとは、負けたら倍々に掛け金を増やしていく方法です2。このEAのパフォーマンスを評価するには、以下の点に注意する必要があります。
- ナンピンマーチンEAは損切りをしないと破綻する可能性が高いです2。損失が大きくなるほどリスクも高まります。
- ナンピンマーチンEAは一方通行の相場に弱いです3。例えば、2020年3月のような急激な値動きに対応できない場合があります。
- ナンピンマーチンEAは口座残高グラフが綺麗な右肩上がりに見えるかもしれませんが、そこには落とし穴があります4。実際に運用する際にはドローダウンやリカバリファクターなどの指標も考慮する必要があります。
以上の点から、このEAのパフォーマンスはあまり良くないと言えるでしょう。期間中の総利益よりも総損失の方が大きく、プロフィットファクターも1.02と低いです。また、残高最大ドローダウンや証拠金最大ドローダウンも22%と23%と高く、リカバリファクターも0.21と低いです。これらの指標は、EAの安定性や回復力を示すものです。
ナンピンマーチンEAは、運用する際には資金管理やバックテストが必須です。また、自分流にカスタマイズできるナンピンマーチンEAも存在します。ご参考になれば幸いです。
BingAIのEA開発能力について
以上、BingAI(チャット型AI)に、
- MQL5でナンピンマーチンEAのコードを書いてもらう
- バックテスト結果をEAに評価してもらう
というEA開発全体の流れを一通りお願いしてみました。少し質問の仕方を工夫する必要がありますが、それなりな労力でそれなりなクオリティのものを作るという目標は無事達成できました。
ただ、注意点というか気付いたところがあります。
BingAIから提供された6行目に、
#property source_url "https://tedukapm.tech/mql5/averagedown1/"
という記載があったように、このコードは、”https://tedukapm.tech/mql5/averagedown1/“というサイト様を参考にしているようです。実際にこのサイト様を確認してみると、MQL5でMT5のEA作成をご紹介されていて、ナンピンEAのサンプルコードも掲載されていました。
つまり今回の結果は、「このサイト様のサンプルコードをBingAIに紹介された」ことと同様な気もしています。ただし、上記ページに今回BingAIが出してきたコードがそのまま載っていた訳ではなかったので、色々組み合わせているのだとは思いますが。
最初にBingAIさんがおっしゃっていたように、
私はあくまで検索エンジンとしての役割を果たすだけです。ご了承ください🙏
というのがまさにそのような意味ですね。
まとめ
さて、ChatGPTは、MQL4はそれなりに出来るけど、MQL5はあまり期待通りの結果が返って来なかったという印象でしたが、今回BingAIで同じようなことを試したみたところ、MQL5では使えないコード(MQL4でしか使えないコード)をどんどん出してくるようなことは少なかった印象です。
最後に、BingAIにこんな質問をしてみました。
BingAI:
ChatGPTとBingAIは、どちらもOpenAI社が開発した言語モデルの技術を利用しています12。しかし、ChatGPTはチャットボットに特化しており、自然言語生成タスクを行うことができます3。BingAIは検索エンジンとしてのタスクを行うことができます3。プログラミング能力については、ChatGPTはコードを生成することができますが、BingAIはコードを生成することができません1。したがって、プログラミング能力ではChatGPTの方が優れていると言えるでしょう。
BingAI:
はい、その通りです。BingAIはコードを生成することができませんので、検索結果からコードを引用して返しています。ChatGPTはコードを生成することができますので、自分の言葉でコードを返しています。
つまり、BingAIを使えばサンプルコードを掲載しているようなサイトを見つけやすくなるということはありそうですね。あと、色々なサイトで見つけてきたコードを組み合わせて一連のコードを作り上げたりすることもよくあると思いますので、そのあたりもBingAIがサポートしてくれるという形でしょうか。
やはり、コード生成(プログラミング)自体は、ChatGPTにお願いするのが良さそうです。
他にも試してみたら、またご報告します。
BingAI × Python
BingAIにPythonでFX自動売買ツール(bot)を作成してもらってみました。
ChatGPT × Python
ChatGPTにPythonで動く損益グラフを作成してもらってみました。
キャッシュバック口座の開設
作成したEAを利用して実際に運用する際は、通常の口座開設ではなく、キャッシュバック口座を開設するのがおすすめです。以下の記事で、キャッシュバックサイト経由で海外FX口座を開設する際のメリットとデメリットをまとめていますのでご覧ください。
利用者の特性に応じて、リアル口座をどのように開設するのが最適かを考える参考になると思います。