見出し画像

遂に人間を超えた!MQL4プログラミングがノーコードで作成可能!ChatGPT-OpenAI o3-miniでMT4EA自動売買が無料で開発し放題!

この動画を最後までご覧いただくことで、完全無料かつノーコードでEAを作成する方法を習得できます。

昨年度、2024年には、ChatGPTの4oを活用してEA開発に挑戦してきました。しかし、エラーが頻発したり、トレードが実行されないEAができるなど、様々な不具合に直面していました。

しかし、2025年2月、オープンAIからリリースされた

OpenAI o3-mini

やmini-highが登場。これにより、リアルタイム検索機能と高度な推論能力を備え、熟練のEAクリエイターと同等、いやそれ以上のスキルを発揮できるようになりました。まさに、プログラミングの水準が人間を超えるまでに高まったのです。

ただし、ここで高品質なEAを作成するために、ひとつだけ大切な条件があります。それは、『EAのテンプレート』が必要ということです。

確かに、ChatGPTはプログラミングスキルにおいては上級プログラマー並みの能力を持っています。しかし、FXの知識やMT4のトレードルールのように、論理や言葉で表現するのが難しい部分については、まだ未熟な面が残っています。そのため、エントリーや決済のロジック、さらにはナンピンシステムの組み込みを試みると、トレードルールに関する不具合が原因で、ユーザーの期待通りの動作をしないケースが少なくありません。

そこで、今回無料で公開するプロンプトには、一定の縛りを設け、単一ポジションで動作するEAとして安定性を確保しています。

それでは、動画のご視聴よろしくお願いします。

完全無料のMT4のEAテンプレートは下記より無料ダウンロードできます!

▽▼▽▼▽ここにトレード条件を書く▽▼▽▼▽
具体的に細かく指示することで成功しやすいです。
ドテン売買のワンポジ型のEA以外は失敗する可能性が高くなります。
▲△▲△▲ここまでトレード条件▲△▲△▲
上記の条件に応じて//ここから改変可能から//ここまで改変可能までの範囲のみ書き変えてください。
MT4のEAのソースコードをMQL4で生成します。
以下のテンプレートを使用してコードを生成してください。
入力する条件でLongSign=trueの時はロングのポジションを、ShortSign=trueの時はショートのポジションを持ちます。
決済のタイミングをユーザーが指定しない場合は、ドテン方式で決済します。
パラメータ値は変更できるように、プロパティ項目にextern intextern doubleで記述します。
デフォルト設定では、3本の移動平均線を使用したパーフェクトオーダーのロジックのEAになります。

ポジションの決済条件を指示されたら/*ここに決済ロジックを挿入*/の箇所に以下の決済条件を記述します。
if(CalculateCurrentOrders() == 1){// ロングポジション保有
//ここに決済の条件を入力
CloseLongPosition();// ロングポジションを決済
} else if(CalculateCurrentOrders() == -1){// ショートポジション保有
//ここに決済の条件を入力
CloseShortPosition();// ショートポジションを決済
}

/*ここに決済ロジックを挿入*/以降のテンプレート、つまり82行目以降のコードの改変を禁止します。
82行目以降のコードを改変する場合、ユーザーに改変しますか?と確認してください。


//---START--------
#property copyright "Copyright 2024, Masayan."
#property version   "1.01"
#property strict
#property description "https://fx.reform-network.net"

extern int Magic = 20250205;// Magic number
extern double Lots = 0.1;//1.0=100000 0.1=10000 0.01=1000
extern double StopLossRequest = 4.0;// StopLoss 0.5=50pips 10=1000pips
extern double TakeProfitRequest = 5.0;// TakeProfit 0.5=50pips 10=1000pips
extern int MaxSpread = 50;// Max spread (50=5pips)
extern int MaxError = 100;// Continuous order count limit (Max=100)
extern string CommentPositions = "Masayan EA Generator";

//ここから改変可能
extern int ShortMovingPeriod = 20;
extern int MiddleMovingPeriod = 75;
extern int LongMovingPeriod = 100;
//ここまで改変可能

string tmpstr;
string error_msg;
string spread_msg;
string position_msg;
bool LongSign = false;
bool ShortSign = false;
double Pips = 0.01;
int e = 0;
int Adjusted_Slippage= 0;

// ティックが動くごとに処理
void OnTick()
{
 if(Bars < 10){
 return;
 }
 if(StopLossRequest <= 0.1){
 StopLossRequest = 0.1;
 }
 if(TakeProfitRequest <= 0.1){
 TakeProfitRequest = 0.1;
 }
 if(MaxError >= 100){
 MaxError = 100;
 }
double Info_Spread = MarketInfo(Symbol(),MODE_SPREAD);
string value = Symbol();
string target = "JPY";
int pos = StringFind(value, target);
double Symbol_RATE = Close[1];
 if (pos > 0) Pips = 1.00; 
 else if (Symbol_RATE > 10 && Symbol_RATE <= 100) Pips = 0.1;
 else if (Symbol_RATE > 100 && Symbol_RATE <= 1000) Pips = 1.0;
 else if (Symbol_RATE > 1000 && Symbol_RATE <= 10000) Pips = 10.0;
 else if (Symbol_RATE > 10000) Pips = 100.0;

//ここから改変可能
double shortMA = iMA(NULL, 0, ShortMovingPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double middleMA = iMA(NULL, 0, MiddleMovingPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double longMA = iMA(NULL, 0, LongMovingPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
 if(shortMA > middleMA && middleMA > longMA){
 LongSign = true;
 ShortSign = false;
 }else if(shortMA < middleMA && middleMA < longMA){
 ShortSign = true;
 LongSign = false;
 }else{
 LongSign = false;
 ShortSign = false;
 }
//ここまで改変可能

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

    if (MaxSpread < Info_Spread) {
        LongSign = false;
        ShortSign = false;
        spread_msg = "Max spread Orber\n";
    } else {
        spread_msg = "";
    }

    if (Hour() == 4 && Minute() == 0 && Seconds() < 6) {
        e = 0;
    }
    if (Hour() == 11 && Minute() == 0 && Seconds() < 6) {
        e = 0;
    }
    if (Hour() == 18 && Minute() == 0 && Seconds() < 6) {
        e = 0;
    }
    if (e > MaxError) {
        LongSign = false;
        ShortSign = false;
        error_msg = "Continuous order count limit\n";
    } else {
        error_msg = "";
    }

    if (LongSign == true) {
        position_msg = "LongSign = true\n";
    } else if (ShortSign == true) {
        position_msg = "ShortSign = true\n";
    } else if (LongSign == false && ShortSign == false) {
        position_msg = "No Sign\n";
    }

    // 売買指示
    if (LongSign == true) {
        if (CalculateCurrentOrders() == 0) { // ポジション無し
            CheckForOpenLong(); // 新規ロングオーダー処理
            e++;
        } else { // ポジション保有中
            CloseShortPosition(); // ショートポジションを決済
        }
    }

    if (ShortSign == true) {
        if (CalculateCurrentOrders() == 0) { // ポジション無し
            CheckForOpenShort(); // 新規ショートオーダー処理
            e++;
        } else { // ポジション保有中
            CloseLongPosition(); // ロングポジションを決済
        }
    }

    tmpstr = StringConcatenate(error_msg, spread_msg, position_msg);
    Comment(tmpstr);
}

// 保有中のポジションを計算
int CalculateCurrentOrders(void)
{
    int buys = 0;
    int sells = 0;
    int icount;
    for (icount = 0; icount < OrdersTotal(); icount++) {
        if (OrderSelect(icount, SELECT_BY_POS, MODE_TRADES) == false) {
            break;
        }
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
            if (OrderType() == OP_BUY) {
                buys++;
            }
            if (OrderType() == OP_SELL) {
                sells++;
            }
        }
    }
    if (buys > 0) {
        return (buys);
    } else {
        return (-sells);
    }
}

// ロングオーダー処理
void CheckForOpenLong()
{
    int res;
    double entrylot;
    entrylot = NormalizeDouble(Lots, 2);
    res = OrderSend(Symbol(), OP_BUY, entrylot, Ask, Adjusted_Slippage, Ask - (Pips * StopLossRequest), Ask + (Pips * TakeProfitRequest), CommentPositions, Magic, 0, clrRed);
    return;
}

// ショートオーダー処理
void CheckForOpenShort()
{
    int res;
    double entrylot;
    entrylot = NormalizeDouble(Lots, 2);
    res = OrderSend(Symbol(), OP_SELL, entrylot, Bid, Adjusted_Slippage, Bid + (Pips * StopLossRequest), Bid - (Pips * TakeProfitRequest), CommentPositions, Magic, 0, clrBlue);
    return;
}

// ショートポジション⇒ロングクローズ処理
void CloseShortPosition()
{
    int icount;
    bool ret;
    for (icount = 0; icount < OrdersTotal(); icount++) {
        if (OrderSelect(icount, SELECT_BY_POS, MODE_TRADES) == false) {
            break;
        }
        if (OrderMagicNumber() != Magic || OrderSymbol() != Symbol()) {
            continue;
        }
        if (OrderType() == OP_SELL) {
            ret = OrderClose(OrderTicket(), OrderLots(), Ask, Adjusted_Slippage, clrBlue);
            if (ret == false) {
                Print("エラーコード=", GetLastError());
            }
            break;
        }
    }
}

// ロングポジション⇒ショートクローズ処理
void CloseLongPosition()
{
    int icount;
    bool ret;
    for (icount = 0; icount < OrdersTotal(); icount++) {
        if (OrderSelect(icount, SELECT_BY_POS, MODE_TRADES) == false) {
            break;
        }
        if (OrderMagicNumber() != Magic || OrderSymbol() != Symbol()) {
            continue;
        }
        if (OrderType() == OP_BUY) {
            ret = OrderClose(OrderTicket(), OrderLots(), Bid, Adjusted_Slippage, clrRed);
            if (ret == false) {
                Print("エラーコード=", GetLastError());
            }
            break;
        }
    }
}
//---END---

使い方
▽▼▽▼▽ここにトレード条件を書く▽▼▽▼▽
具体的に細かく指示することで成功しやすいです。 ドテン売買のワンポジ型のEA以外は失敗する可能性が高くなります。
▲△▲△▲ここまでトレード条件▲△▲△▲

上記の部分に具体的なロジックを記入して、o3-miniにプロンプトを送信してください。

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

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

いいなと思ったら応援しよう!