見出し画像

【新連載】ChatGPTでMT4のインジケーターを開発!「Masayan Indicator Generator for MT4」リリースのお知らせ!


ChatGPT担当のナナミです。

この度、新たな連載をスタートすることとなりました!

その名も「ChatGPTでMT4のインジケーターを開発する」シリーズです。

■ブログURL【無料】MT4対応の新ツール登場!ノーコードでインジケーター作成!

MT4を使ったトレードをされている方なら、インジケーターを使用したことはあると思います。

ですが、インジケーターの開発にはプログラミングの知識が必要で、なかなか自作するのは難しいですよね。

そこで今回、AIの力を活用して、初心者でも簡単にインジケーターを作成できるツールをリリースすることにしました。

ツールの名前は、Masayan EA Generator for MT4のインジケーター版である『Masayan Indicator Generator for MT4』です。

『Masayan Indicator Generator for MT4』は、ChatGPT(GPTs)を活用し、MT4用のインジケーターをプログラミングの知識がなくても簡単に作成できるツールです。

ChatGPTのアカウントがあれば、無料でご利用いただけます。

ChatGPTを使って、どのようにインジケーターをゼロから作り上げるか、そのプロセスを一緒に学んでいきましょう。

この連載では、プログラムの書き方や具体的な使い方、さらにカスタマイズのコツなども詳しく解説していきます。

プログラムに不安のある方も、安心してご覧いただける内容となっています。

ぜひ、この機会にChatGPTを使ったインジケーター開発を体験してみてください。

GPTsのリンクはこちら(GPT Store)
■Masayan Indicator Generator for MT4
https://chatgpt.com/g/g-t1m5iewUY-masayan-indicator-generator-for-mt4

■ゴゴジャンでEA・インジケーター販売中!


それでは、連載1回目ということで、GPTsの制作の過程をお届けします。

おそらく、ChatGPTを使用したことがあっても、GPTsの制作をした経験のある方は少ないと思います。

GPTsとは簡単に言えば、あらかじめプロンプトを登録し、それを活用してChatGPTの回答を希望する方向に導くためのツールです。

EA版の『Masayan EA Generator for MT4』は、あらかじめ登録されたEAのテンプレートを使用してEAを作成するツールです。

ロジック部分をChatGPTが考え出し、その部分だけを入れ替えることでEAを生成する仕組みになっています。

つまり、テンプレートさえ用意できれば、インジケーター版も作成可能ということになります。

それではGPTsの制作に取り掛かります。

まず、GPTsの管理ページに行き、指示の内容の所に入力するテンプレートを作りたいと思います。

テンプレートは、以前の動画で作成したGrid Rashのテンプレートを使用します。

Grid Rashはロジックが複雑なので、テンプレートには3本の移動平均線を使用したパーフェクトオーダーのシンプルなロジックを使用します。

パラメータ値は、以前開発したHyper Scalping Arrow Indicatorのロジックがそのまま使用できそうなので、今回はこちらのロジックを使用することとします。


ちなみに、スイングトレードのインジケーターを作成しても意味が無いので、スキャルピングトレードということで移動平均線のパラメータ値はこのようにスキャルピングトレードに対応した値を使用します。

■1分足チャートでの使用を想定
短期移動平均線の期間:10
中期移動平均線の期間:30
長期移動平均線の期間:75

2013年からのバックテスト結果では優位性は確認できます。


今回作成するインジケーターは、条件が揃ったらサインとアラートでお知らせするサインインジケーターになります。

最終的には、LINE通知やメールでお知らせするなんて機能まで拡張できれば最強ですね。

とりあえず、簡単に実装できるアラート機能は入れたいと思います。

それではテンプレートとプロンプトを作成します。

まず、元になるソースコードを前回のnoteの記事よりダウンロードして、パーフェクトオーダーのインジケーターを作成しました。

パーフェクトオーダーのロジックだと、新しいバーが出現する度に、アラートが鳴りますね。

ゴールデンクロスでロング、デッドクロスでショートのインジケーターだと、クロスしたタイミングでしかアラートが鳴らないので、ゴールデンクロスの方がこのインジケーターとの相性は良いです。

次に、ASCTrend&フラクタルズのインジケーターを作成してもらいましょう。

次に、以前の動画で失敗に終わったカギ足ロジックのインジケーターを作成してもらいます。

ここで、問題となるのが決済のロジックをどう扱うかです。

わたしのオリジナルのインジケーター「Grid Rash Arrow Indicator」では、斜め上の矢印がロングで、斜め下の矢印がショートで×印が決済です。


ロジックが複雑だと決済の部分がうまく処理できないのが悩みの種です。

プロンプトには決済のロジックが指定された場合、ロングの決済のサインは×印でショートの決済のサインはレ点チェックとしました。

試しに、カギ足ロジックのインジケーターにRSIによる逆張りの決済ロジックを追加してとプロンプトを送信してみますが、思ったような動作はしないみたいです。

エラーの状態としては、サインが出なかったり連続アラートが止まらないバグが発生します。

やっぱり複雑なロジックはうまくいかないですね。

今回作成したGPTsの中身のソースコードはこんな感じです。

//----------------------------------------------------
//バーが更新されたタイミングでアラートが鳴るように修正済み
//----------------------------------------------------

//---START--------
#property copyright "Copyright 2024, Masayan."
#property version   "1.01"
#property strict
#property description "Masayan Indicator Generator for MT4"  // インジケーター名
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red  // ロングシグナルの色
#property indicator_color2 Aqua   // ショートシグナルの色

//ここから改変可能
extern int MAPeriod1 = 10;  // 短期移動平均
extern int MAPeriod2 = 30;  // 中期移動平均
extern int MAPeriod3 = 75;  // 長期移動平均
//ここまで改変可能
input bool AlertOnOff = true; // アラート通知音 オンtrue オフfalse
extern int AlertTime = 2; // アラートの鳴る秒数(範囲1~10)
bool UpdateOnOff = false; //新しいバーが更新されたタイミングでサインを出す処理
double LongBuffer[];
double ShortBuffer[];


int OnInit()
{
    SetIndexBuffer(0, LongBuffer);
    SetIndexBuffer(1, ShortBuffer);
    SetIndexStyle(0, DRAW_ARROW);
    SetIndexArrow(0, 233);  // ロングシグナル矢印
    SetIndexStyle(1, DRAW_ARROW);
    SetIndexArrow(1, 234);  // ショートシグナル矢印

    return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
    if (rates_total < MAPeriod3) return 0;

    int start = prev_calculated > 0 ? prev_calculated - 1 : 0;

    if ( AlertTime <= 1 ){
    AlertTime = 1;
    }
    if ( AlertTime >= 10 ){
    AlertTime = 10;
    }
    if(Seconds() < AlertTime){
    UpdateOnOff = true;//アラートあり
    }else{
    UpdateOnOff = false;//アラートなし
    }
    bool LongSign = false;
    bool ShortSign = false;
 //■□■□■□■□■ 現在チャートに反映 ■□■□■□■□■
 //ここから改変可能
        double MA10 = iMA(NULL, 0, MAPeriod1, 0, MODE_SMA, PRICE_CLOSE, 1);
        double MA20 = iMA(NULL, 0, MAPeriod2, 0, MODE_SMA, PRICE_CLOSE, 1);
        double MA100 = iMA(NULL, 0, MAPeriod3, 0, MODE_SMA, PRICE_CLOSE, 1);
    if ( UpdateOnOff == true) {// サインを点灯させる時間のみ
        if (MA10 > MA20 && MA20 > MA100) {
            LongSign = true;
        } else if (MA10 < MA20 && MA20 < MA100) {
            ShortSign = true;
        }
    }
//ここまで改変可能

/*ここに決済ロジックを挿入*/

        if (LongSign) {
            LongBuffer[1] = low[1];
            ShortBuffer[1] = EMPTY_VALUE;
            if (UpdateOnOff == true && AlertOnOff == true) {
                Alert("Long sign alert: Indicator = Masayan Indicator");
            UpdateOnOff = false;//サインを表示したらリセットする
            LongSign = false; //サインを表示したらリセットする
            }
        } else if (ShortSign) {
            ShortBuffer[1] = high[1];
            LongBuffer[1] = EMPTY_VALUE;
            if (UpdateOnOff == true && AlertOnOff == true) {
                Alert("Short sign alert: Indicator = Masayan Indicator");
            UpdateOnOff = false;//サインを表示したらリセットする
            ShortSign = false; //サインを表示したらリセットする
            }
        }
 //■□■□■□■□■ 過去チャートにのみ反映 ■□■□■□■□■
    for (int i = start; i < rates_total; i++)
    {
        LongSign = false;
        ShortSign = false;
//ここから改変可能
        MA10 = iMA(NULL, 0, MAPeriod1, 0, MODE_SMA, PRICE_CLOSE, i);
        MA20 = iMA(NULL, 0, MAPeriod2, 0, MODE_SMA, PRICE_CLOSE, i);
        MA100 = iMA(NULL, 0, MAPeriod3, 0, MODE_SMA, PRICE_CLOSE, i);
        if (MA10 > MA20 && MA20 > MA100) {
            LongSign = true;
        } else if (MA10 < MA20 && MA20 < MA100) {
            ShortSign = true;
        }
//ここまで改変可能
        if (LongSign) {
            LongBuffer[i] = low[i];
            ShortBuffer[i] = EMPTY_VALUE;
        } else if (ShortSign) {
            ShortBuffer[i] = high[i];
            LongBuffer[i] = EMPTY_VALUE;
        } else {
            LongBuffer[i] = EMPTY_VALUE;
            ShortBuffer[i] = EMPTY_VALUE;
        }
    }
    return rates_total;
}
//---END---

以上がコードの中身となりますが、EAと違いインジケーターの場合は、今現状でどれくらいポジションを保有しているかまでは監視しないので、ロングポジションを保有で決済とかの処理が上手く指示できません。

決済のロジックの精度は、今後行われるであろうChatGPTのバージョンアップで改善すると思います。

しばらくはバグの修正が必要と思われますが、オリジナルのインジケーターを作成するツールとしてご利用いただければと思います。

他にも、こんな企画やってほしいみたいなリクエストがあれば、コメントお願いします。


【免責事項】
・本GPTsについて、正当性を保証するものではありません。
・本GPTsを利用して損失を被った場合でも一切の責任を負いません。
・投資の決定は、自己判断 自己責任でお願いします。

この記事が気に入ったらサポートをしてみませんか?