![見出し画像](https://assets.st-note.com/production/uploads/images/173219740/rectangle_large_type_2_0300ce13957b9caf080834f459b15290.png?width=1200)
遂に人間を超えた!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 intやextern 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にプロンプトを送信してください。
![](https://assets.st-note.com/img/1738743356-yiQjJNUW96BXLhasM1YpVtbl.jpg)
ChatGPTの無料アカウントでも、ご利用いただけます。
【免責事項】
・本EAについて、正当性を保証するものではありません。
・本EAを利用して損失を被った場合でも一切の責任を負いません。
・投資の決定は、自己判断 自己責任でお願いします。