#04 「なんちゃってEA」を動かしてみる
FX
2025年10月13日:記
ようやく外部のヒストリカルデータを MT4 に移植できたので、EA を動かせるかテストしてみます。
動きさえすればいいので、超テキトーなロジックを考えます。
なんちゃってEA・ロジック(笑
0.
資金は10万円。注文は0.01ロットとする。期間は2024.10.05 ~ 2025.10.04
1.
「今出来つつあるローソクから時間的に最も近い過去の陽線(以後"target"と呼ぶ)」の始値で売り建て玉。
target の最安値と高値を憶えておく。
2.
ひとつの建玉を決済するまで、新たな建玉はしない。
3.
建玉を保持している場合、
target の最安値に達したらクローズ。
target の高値に達したらクローズ。
4.
「3.」にヒットしなかった場合、
今のローソクが出来上がったら=次のローソクの始値でクローズ。
「4.」は、本当は
”「3.」にヒットしなかった場合、23:59:50秒にクローズ”
にしたいのですが、今は日足データしか無いので、諦めました。
EA が動くかどうかだけのテストなのでね・・・。
※ 何故、「23:59:50秒にクローズ”にしたい」か?
週明けで窓を開けると、
大変な損失になるからです。
ま、今回はいいや(笑
とりあえず、コードを載せときます。
#property strict
#property copyright "Ore"
#property version "1.00"
#property description "Test_EA"
//--- 外部変数 ---
extern double Lots = 0.01; // ポジションサイズ
//--- グローバル変数 ---
double target_open;
double target_low;
double target_close;
//--- 新しいバーの確定をチェックする変数
datetime last_bar_time;
//+------------------------------------------------------------------+
//| Expert Advisor初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
last_bar_time = iTime(Symbol(), PERIOD_CURRENT, 0);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert Advisor終了関数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| 新しいティックが来たときの処理 |
//+------------------------------------------------------------------+
void OnTick()
{
//--- 新しいバーが確定したら決済するロジック ---
if(last_bar_time != iTime(Symbol(), PERIOD_CURRENT, 0))
{
last_bar_time = iTime(Symbol(), PERIOD_CURRENT, 0);
//--- 全てのポジションを決済
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) == true)
{
if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue) == true)
{
Print("新しいバーが確定したため、ポジションを決済しました。");
}
}
}
}
//--- ポジションがない場合のエントリーロジック ---
if(OrdersTotal() == 0)
{
//--- 直近の陽線を探す
for(int i = 1; i < 1000; i++) {
if(Open[i] < Close[i]) // 陽線を見つけた {
target_open = Open[i];
target_low = Low[i];
target_close = Close[i];
//--- 始値に売り指値注文を出す ---
if(Open[0] > target_open)
{
int ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, target_open, 3, 0, 0, "MyEA", 0, 0, Red);
if(ticket > 0)
{
Print("売り指値注文を建てました。価格:", target_open);
}
} return; // 最初の陽線を見つけたらループを抜ける
}
}
}
//--- ポジションを持っている場合の決済ロジック(利確・損切り) ---
else
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) == true)
{
if(Bid <= target_low || Bid >= target_close)
{
if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue) == true)
{
Print("ポジションを決済しました。価格:", Bid);
}
}
}
}
}
==
→ 次に、MT4 の MetaEditor で新しい Expert Advisor を作成し、上記のコードを貼り付けます。
→ 「コンパイル」ボタンをクリックして、エラーがないことを確認します。
→ MT4に戻り、「ストラテジーテスター」でこのEAを選択し、バックテストを実行します。
動いたぁ~!ヽ(;▽;)ノ
×![]()
Is it OK?