ChatGPTにドル円の自動トレードのプログラムを作らせてみた その2:エントリー条件の追加
前回作成した自動トレードプログラムにエントリー条件を追加しました。今回はその過程を追っていきます。
// ドル円のトレンドフォロー戦略
// パラメーター
input int FastMAPeriod = 10; // 短期移動平均線の期間
input int SlowMAPeriod = 30; // 長期移動平均線の期間
input double Lots = 0.1; // 取引量
input int MagicNumber = 123456; // 注文識別番号
// 変数
int ticket; // 注文番号
int maFast; // 短期移動平均線
int maSlow; // 長期移動平均線
// 初期化関数
void OnInit() {
// 移動平均線を初期化
maFast = iMA(NULL, PERIOD_M1, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
maSlow = iMA(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
}
// エントリーポイント
void OnTick() {
// 注文が既に存在する場合は処理しない
if (OrdersTotal() > 0) {
return;
}
// 短期移動平均線が長期移動平均線より上にある場合は買い注文を作成
if (maFast > maSlow) {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-20*Point, Bid+20*Point, "Trend Follow Buy", MagicNumber, 0, Blue);
if (ticket > 0) {
Print("Buy order placed: ", ticket);
} else {
Print("Error placing buy order: ", GetLastError());
}
}
// 短期移動平均線が長期移動平均線より下にある場合は売り注文を作成
else if (maFast < maSlow) {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+20*Point, Ask-20*Point, "Trend Follow Sell", MagicNumber, 0, Red);
if (ticket > 0) {
Print("Sell order placed: ", ticket);
} else {
Print("Error placing sell order: ", GetLastError());
}
}
}
double iMA(string symbol, int timeframe, int ma_period, int ma_shift, int ma_method, int applied_price, int shift)
// 短期移動平均線の値を取得
double ema_fast = iMA(NULL, 0, 10, 0, MODE_EMA, PRICE_CLOSE, 0);
// 長期移動平均線の値を取得
double ema_slow = iMA(NULL, 0, 50, 0, MODE_EMA, PRICE_CLOSE, 0);
この辺りはプログラミングの知識ゼロだと厳しいか?
実際に修正したコードはこちら。
// 初期化関数
void OnInit() {
// 移動平均線を初期化
maFast = iMA(NULL, PERIOD_M1, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE,0);
maSlow = iMA(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE,0);
}
そして本題の指示を出してみます。
// グローバル変数
datetime last_entry_time;
// エントリー条件
bool should_enter() {
// 現在のローソク足の時間を取得
datetime current_time = Time[0];
// 前回のエントリー時刻と同じであればエントリーしない
if (current_time == last_entry_time) {
return false;
}
// エントリー条件を判定
double ema_fast = iMA(NULL, 0, 10, 0, MODE_EMA, PRICE_CLOSE, 0);
double ema_slow = iMA(NULL, 0, 50, 0, MODE_EMA, PRICE_CLOSE, 0);
return (ema_fast > ema_slow);
}
// エントリー処理
void enter() {
// エントリーする
OrderSend(...);
// 前回のエントリー時刻を更新
last_entry_time = Time[0];
}
// メイン関数
void OnTick() {
// エントリー条件を判定
if (should_enter()) {
// エントリーする
enter();
}
}
これで短時間に大量オーダーをエントリーすることがなくなりました。ただ、実際に修正するには、プログラミングの知識が必要な部分もあるため、初心者には少し難しいかもしれません。
また、この回答を引き出すために何回も回答を「Regenerate」していたため、コードの生成に手間取ってしまいました。
そんな中でも、ここまでのソースコードは問題なくコンパイルでき、少し手を加えることで期待通りの動作をすることができました。
// ドル円のトレンドフォロー戦略
// パラメーター
input int FastMAPeriod = 10; // 短期移動平均線の期間
input int SlowMAPeriod = 30; // 長期移動平均線の期間
input double Lots = 0.1; // 取引量
input int MagicNumber = 123456; // 注文識別番号
int sl = 500; // ストップロス
int tp = 1000; // テイクプロフィット
// 変数
int ticket; // 注文番号
int maFast; // 短期移動平均線
int maSlow; // 長期移動平均線
// グローバル変数
datetime last_entry_time;
// 初期化関数
void OnInit() {
// 移動平均線を初期化
maFast = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE,0);
maSlow = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE,0);
}
// エントリー条件
bool should_enter() {
// 現在のローソク足の時間を取得
datetime current_time = Time[0];
// 前回のエントリー時刻と同じであればエントリーしない
if (current_time == last_entry_time) {
return false;
}
// エントリー条件を判定
maFast = iMA(NULL, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
maSlow = iMA(NULL, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
return (maFast > maSlow);
}
// エントリー処理
void enter() {
// エントリーする
// 短期移動平均線が長期移動平均線より上にある場合は買い注文を作成
if (maFast > maSlow) {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Bid-sl*Point, Bid+tp*Point, "Trend Follow Buy", MagicNumber, 0, Blue);
if (ticket > 0) {
Print("Buy order placed: ", ticket);
} else {
Print("Error placing buy order: ", GetLastError());
}
}
// 短期移動平均線が長期移動平均線より下にある場合は売り注文を作成
else if (maFast < maSlow) {
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask+20*Point, Ask-20*Point, "Trend Follow Sell", MagicNumber, 0, Red);
if (ticket > 0) {
Print("Sell order placed: ", ticket);
} else {
Print("Error placing sell order: ", GetLastError());
}
}
// 前回のエントリー時刻を更新
last_entry_time = Time[0];
}
// エントリーポイント
void OnTick() {
// 注文が既に存在する場合は処理しない
if (OrdersTotal() > 0) {
return;
}
// エントリー条件を判定
if (should_enter()) {
// エントリーする
enter();
}
}
次回は、この自動トレードプログラムに利益確定ロジックを追加してみたいと思います。
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?