目次
目的
後から改善しやすいEAは、ロジックの分離、パラメータ化、ログの可観測性が鍵です。ここでは雛形の考え方とサンプルを示します。
設計方針
- 構造:OnInit / OnTick / OnDeinit と、
Signals.mqh(仕掛け)、Filters.mqh(フィルター)、Risk.mqh(ロット計算/SLTP)、Utils.mqh(時間/夏時間/ログ)に分割 - パラメータ:全て extern/inputs 化(時間足、指標期間、ATR係数、RR、日次±% など)
- ログ:シグナル判定、約定、SL/TP移動、日次停止イベントをCSV出力
サンプル(疑似MQL4)
//+------------------------------------------------------------------+
// EA_Starter.mq4 (骨子)
//+------------------------------------------------------------------+
#property strict
#include <Signals.mqh>;
#include <Filters.mqh>;
#include <Risk.mqh>;
#include <Utils.mqh>;
input double RiskPerTrade = 1.0; // % of balance
input double DailyMaxLoss = 3.0; // % day
input double DailyMaxProfit = 3.0; // % day
input double ATRmultSL = 1.8; // SL = ATR * mult
input double RR = 1.7; // TP = SL * RR
input bool UseBreakEven = true; // TP*0.5 でBE
datetime dayStart;
double dayPnL=0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
dayStart = Utils::DayStartTime();
Utils::InitLog();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
if(Utils::IsNewDay(dayStart))
{
dayStart=Utils::DayStartTime();
dayPnL=0;
}
if(Utils::DailyGuard(dayPnL, DailyMaxLoss, DailyMaxProfit))
return;
int signal = Signals::Entry(); // 1=BUY, -1=SELL, 0=NONE
if(signal!=0 && Filters::Pass())
{
double slPips = Risk::CalcSLPips(ATRmultSL);
double lot = Risk::CalcLot(AccountBalance(), RiskPerTrade, slPips);
Risk::PlaceOrder(signal, lot, slPips, RR, UseBreakEven);
}
dayPnL = Utils::UpdateDailyPnL(dayStart);
}
//+------------------------------------------------------------------+
テストと移行
- バックテスト:開発/検証/フォワードのデータ分割
- 最適化:指標期間・ATR係数・BEトリガ等は上限/下限を絞る
- デモ→少額リアル:同一条件(スプ/手数料/サーバ時刻)の整合
次のアクション
- 雛形の完全版と各
.mqh例を入手 - シグナル/フィルター設計の記事で精度を向上
- 運用方針と成績の見える化を確認
免責
本記事は情報提供のみを目的としています。投資判断はご自身の責任でお願いいたします。


コメント