MQL5の口座情報関数・マーケット情報関数を完全解説。AccountInfoDouble・AccountInfoInteger・SymbolInfoDouble・SymbolInfoInteger・SymbolInfoString・MarketBookAdd・SymbolsTotal など、EA開発で必要な口座残高・証拠金・スプレッド・ティック値・取引時間の取得方法をコード付きで解説します。
口座情報関数
口座の残高、証拠金、レバレッジなどの情報を取得する関数群です。EA開発ではロット計算やリスク管理に必須です。
AccountInfoDouble — 口座のdouble値
| プロパティ | 説明 | 使用例 |
|---|---|---|
| ACCOUNT_BALANCE | 口座残高 | ロット計算のベース |
| ACCOUNT_EQUITY | 有効証拠金(残高+含み損益) | リアルタイムのリスク管理 |
| ACCOUNT_PROFIT | 現在の含み損益合計 | 全ポジションの損益確認 |
| ACCOUNT_MARGIN | 使用証拠金 | 証拠金使用率の計算 |
| ACCOUNT_MARGIN_FREE | 余剰証拠金 | 新規注文の可否判定 |
| ACCOUNT_MARGIN_LEVEL | 証拠金維持率(%) | マージンコール判定 |
| ACCOUNT_CREDIT | クレジット | ボーナス額の確認 |
| ACCOUNT_COMMISSION_BLOCKED | ブロックされた手数料 | 手数料の事前計算 |
void PrintAccountInfo()
{
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
double profit = AccountInfoDouble(ACCOUNT_PROFIT);
double margin = AccountInfoDouble(ACCOUNT_MARGIN);
double marginFree = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
double marginLvl = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);
PrintFormat("残高: %.2f 有効証拠金: %.2f 含み損益: %.2f",
balance, equity, profit);
PrintFormat("使用証拠金: %.2f 余剰証拠金: %.2f 維持率: %.2f%%",
margin, marginFree, marginLvl);
// 証拠金使用率(独自計算)
if(balance > 0)
{
double usageRate = margin / balance * 100;
Print("証拠金使用率: ", usageRate, "%");
}
}AccountInfoInteger — 口座のinteger値
| プロパティ | 説明 |
|---|---|
| ACCOUNT_LOGIN | 口座番号 |
| ACCOUNT_LEVERAGE | レバレッジ |
| ACCOUNT_TRADE_ALLOWED | 取引許可(true/false) |
| ACCOUNT_TRADE_EXPERT | EA取引許可 |
| ACCOUNT_TRADE_MODE | 口座タイプ(デモ/コンテスト/リアル) |
| ACCOUNT_LIMIT_ORDERS | 待機注文の最大数(0=無制限) |
| ACCOUNT_MARGIN_MODE | 証拠金計算モード |
| ACCOUNT_MARGIN_SO_MODE | ストップアウトモード(%/金額) |
void CheckAccount()
{
long login = AccountInfoInteger(ACCOUNT_LOGIN);
long leverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
long mode = AccountInfoInteger(ACCOUNT_TRADE_MODE);
string modeStr;
switch((ENUM_ACCOUNT_TRADE_MODE)mode)
{
case ACCOUNT_TRADE_MODE_DEMO: modeStr = "デモ"; break;
case ACCOUNT_TRADE_MODE_CONTEST: modeStr = "コンテスト"; break;
case ACCOUNT_TRADE_MODE_REAL: modeStr = "リアル"; break;
}
PrintFormat("口座: %d レバレッジ: 1:%d タイプ: %s", login, leverage, modeStr);
// ヘッジング/ネッティングの確認
long marginMode = AccountInfoInteger(ACCOUNT_MARGIN_MODE);
if(marginMode == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
Print("ヘッジング口座");
else
Print("ネッティング口座");
// 取引可能かチェック
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
Print("警告: この口座では取引が許可されていません");
if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
Print("警告: EA取引が許可されていません");
}AccountInfoString — 口座の文字列情報
void PrintAccountStrings()
{
string name = AccountInfoString(ACCOUNT_NAME); // 口座名義
string server = AccountInfoString(ACCOUNT_SERVER); // サーバー名
string currency = AccountInfoString(ACCOUNT_CURRENCY); // 口座通貨
string company = AccountInfoString(ACCOUNT_COMPANY); // ブローカー名
PrintFormat("名義: %s サーバー: %s", name, server);
PrintFormat("通貨: %s ブローカー: %s", currency, company);
}実践:証拠金チェックとリスク管理
// 新規注文前の証拠金チェック
bool CanOpenPosition(string symbol, double lot, ENUM_ORDER_TYPE type)
{
// 余剰証拠金を確認
double marginFree = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
// 必要証拠金を計算
double marginRequired;
if(!OrderCalcMargin(type, symbol, lot, SymbolInfoDouble(symbol, SYMBOL_ASK), marginRequired))
{
Print("証拠金計算失敗");
return false;
}
// 余剰証拠金の50%以上は使わない
if(marginRequired > marginFree * 0.5)
{
PrintFormat("証拠金不足: 必要=%.2f 余剰=%.2f", marginRequired, marginFree);
return false;
}
// 証拠金維持率が200%以下にならないか確認
double currentMargin = AccountInfoDouble(ACCOUNT_MARGIN);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
double newMarginLevel = equity / (currentMargin + marginRequired) * 100;
if(newMarginLevel < 200)
{
PrintFormat("証拠金維持率が低下します: 予測=%.1f%%", newMarginLevel);
return false;
}
return true;
}
// 注文前の利益計算
void CalcPotentialProfit(string symbol, double lot, int tpPoints)
{
double profit;
if(OrderCalcProfit(ORDER_TYPE_BUY, symbol, lot,
SymbolInfoDouble(symbol, SYMBOL_ASK),
SymbolInfoDouble(symbol, SYMBOL_ASK) + tpPoints * SymbolInfoDouble(symbol, SYMBOL_POINT),
profit))
{
PrintFormat("予想利益: %.2f %s", profit, AccountInfoString(ACCOUNT_CURRENCY));
}
}OrderCalcMargin()とOrderCalcProfit()は実際に注文を出さずに証拠金と利益をシミュレーションできる便利な関数です。発注前のチェックに必ず使いましょう。
SymbolInfoDouble — 銘柄のdouble値
通貨ペアの価格、スプレッド、ティック値、ロット情報など、取引に必要な銘柄情報を取得します。
| プロパティ | 説明 | 用途 |
|---|---|---|
| SYMBOL_BID | 現在のBid価格 | 売り注文の価格 |
| SYMBOL_ASK | 現在のAsk価格 | 買い注文の価格 |
| SYMBOL_POINT | 1ポイントの価格 | SL/TP計算 |
| SYMBOL_TRADE_TICK_VALUE | 1ティックの価値(口座通貨) | ロット計算 |
| SYMBOL_TRADE_TICK_SIZE | 1ティックのサイズ | 価格正規化 |
| SYMBOL_TRADE_CONTRACT_SIZE | 1ロットの契約サイズ | 証拠金計算 |
| SYMBOL_VOLUME_MIN | 最小ロット | ロット制約 |
| SYMBOL_VOLUME_MAX | 最大ロット | ロット制約 |
| SYMBOL_VOLUME_STEP | ロットステップ | ロット正規化 |
| SYMBOL_SWAP_LONG | 買いスワップ | スワップ計算 |
| SYMBOL_SWAP_SHORT | 売りスワップ | スワップ計算 |
| SYMBOL_MARGIN_INITIAL | 初期証拠金 | 証拠金計算 |
| SYMBOL_TRADE_STOPS_LEVEL | ストップレベル(ポイント)※SymbolInfoIntegerで取得 | SL/TP最小距離 |
| SYMBOL_TRADE_FREEZE_LEVEL | フリーズレベル(ポイント)※SymbolInfoIntegerで取得 | 変更禁止距離 |
void PrintSymbolInfo(string symbol)
{
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
double spread = (ask - bid) / SymbolInfoDouble(symbol, SYMBOL_POINT);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
double tickValue = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
double contract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
double stopLevel = (double)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
PrintFormat("%s Bid=%.5f Ask=%.5f Spread=%.1f pips",
symbol, bid, ask, spread / 10);
PrintFormat("Point=%.5f TickValue=%.5f TickSize=%.5f",
point, tickValue, tickSize);
PrintFormat("Lot: Min=%.2f Max=%.2f Step=%.2f Contract=%g",
minLot, maxLot, lotStep, contract);
PrintFormat("StopLevel=%g points", stopLevel);
}スプレッド取得とフィルター
// 現在のスプレッド(ポイント単位)
int GetSpreadPoints(string symbol)
{
return (int)SymbolInfoInteger(symbol, SYMBOL_SPREAD);
}
// pips単位のスプレッド
double GetSpreadPips(string symbol)
{
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
// 5桁/3桁ブローカーの場合、10で割ってpipsに変換
double spread = (ask - bid) / point;
if(digits == 5 || digits == 3)
return spread / 10.0;
return spread;
}
// スプレッドが閾値以下のときだけエントリー
input double MaxSpreadPips = 3.0;
bool IsSpreadOK(string symbol)
{
double spread = GetSpreadPips(symbol);
if(spread > MaxSpreadPips)
{
PrintFormat("スプレッド広すぎ: %.1f pips (上限: %.1f)", spread, MaxSpreadPips);
return false;
}
return true;
}SymbolInfoInteger — 銘柄のinteger値
| プロパティ | 説明 |
|---|---|
| SYMBOL_DIGITS | 小数点以下の桁数 |
| SYMBOL_SPREAD | 現在のスプレッド(ポイント) |
| SYMBOL_SPREAD_FLOAT | 変動スプレッドかどうか |
| SYMBOL_TRADE_CALC_MODE | 証拠金計算モード |
| SYMBOL_TRADE_MODE | 取引モード(無効/ロングのみ/フル等) |
| SYMBOL_TRADE_EXEMODE | 約定方式(即時/マーケット/エクスチェンジ) |
| SYMBOL_FILLING_MODE | 対応する充填モード |
| SYMBOL_EXPIRATION_MODE | 対応する有効期限モード |
| SYMBOL_TIME | 最終ティック時刻 |
| SYMBOL_SESSION_DEALS | 当日の約定数 |
| SYMBOL_SESSION_BUY_ORDERS | 現在の買い注文数 |
| SYMBOL_SESSION_SELL_ORDERS | 現在の売り注文数 |
// 銘柄の取引可否チェック
bool IsTradeAllowed(string symbol)
{
long tradeMode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
switch((ENUM_SYMBOL_TRADE_MODE)tradeMode)
{
case SYMBOL_TRADE_MODE_DISABLED:
Print(symbol, ": 取引無効");
return false;
case SYMBOL_TRADE_MODE_LONGONLY:
Print(symbol, ": 買いのみ可能");
return true;
case SYMBOL_TRADE_MODE_SHORTONLY:
Print(symbol, ": 売りのみ可能");
return true;
case SYMBOL_TRADE_MODE_CLOSEONLY:
Print(symbol, ": 決済のみ可能");
return false;
case SYMBOL_TRADE_MODE_FULL:
return true;
}
return false;
}
// 適切な充填モードを自動選択
ENUM_ORDER_TYPE_FILLING GetFillingMode(string symbol)
{
long filling = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
if((filling & SYMBOL_FILLING_FOK) != 0)
return ORDER_FILLING_FOK;
if((filling & SYMBOL_FILLING_IOC) != 0)
return ORDER_FILLING_IOC;
return ORDER_FILLING_RETURN;
}充填モード(Filling Mode)はブローカーごとに異なります。FOKが使えないブローカーでFOKを指定するとエラーになります。上記のようにSYMBOL_FILLING_MODEで対応モードを確認してから設定してください。
SymbolInfoString — 銘柄の文字列情報
void PrintSymbolStrings(string symbol)
{
string basis = SymbolInfoString(symbol, SYMBOL_BASIS); // 原資産
string currency = SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE); // 基軸通貨
string profit = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT); // 決済通貨
string margin = SymbolInfoString(symbol, SYMBOL_CURRENCY_MARGIN); // 証拠金通貨
string desc = SymbolInfoString(symbol, SYMBOL_DESCRIPTION); // 銘柄説明
string path = SymbolInfoString(symbol, SYMBOL_PATH); // ツリーパス
PrintFormat("基軸: %s 決済: %s 証拠金: %s", currency, profit, margin);
PrintFormat("説明: %s パス: %s", desc, path);
}SymbolInfoTick — 最新ティック情報
SymbolInfoTick()は最新のティック情報をMqlTick構造体で一括取得します。Bid/Askを個別に取得するより効率的です。
MqlTick tick;
if(SymbolInfoTick(_Symbol, tick))
{
PrintFormat("Bid=%.5f Ask=%.5f Last=%.5f",
tick.bid, tick.ask, tick.last);
PrintFormat("Volume=%d Time=%s Flags=%d",
(int)tick.volume,
TimeToString(tick.time, TIME_DATE | TIME_SECONDS),
tick.flags);
}
// ティック履歴の取得
MqlTick ticks[];
int copied = CopyTicks(_Symbol, ticks, COPY_TICKS_ALL, 0, 1000);
if(copied > 0)
{
Print("取得ティック数: ", copied);
Print("最新: Bid=", ticks[copied-1].bid, " Ask=", ticks[copied-1].ask);
}ロット正規化(実践)
計算したロット数をブローカーの仕様に合わせて正規化する関数です。ロットステップ、最小/最大ロットの制約を考慮します。
// ロットをブローカー仕様に合わせて正規化
double NormalizeLot(string symbol, double lot)
{
double minLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double lotStep = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
// ロットステップに合わせる(切り捨て)
lot = MathFloor(lot / lotStep) * lotStep;
// 最小/最大ロット制約
lot = MathMax(lot, minLot);
lot = MathMin(lot, maxLot);
// 小数点の丸め(lotStepの桁数に合わせる)
int digits = 0;
double step = lotStep;
while(step < 1.0)
{
step *= 10;
digits++;
}
return NormalizeDouble(lot, digits);
}
// SL/TP価格の正規化とストップレベル確認
double NormalizePrice(string symbol, double price)
{
double tickSize = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
if(tickSize == 0) return price;
return NormalizeDouble(MathRound(price / tickSize) * tickSize,
(int)SymbolInfoInteger(symbol, SYMBOL_DIGITS));
}
// SLがストップレベル以上離れているか確認
bool CheckStopLevel(string symbol, double price, double sl, bool isBuy)
{
double stopLevel = (double)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL) * SymbolInfoDouble(symbol, SYMBOL_POINT);
if(stopLevel == 0) return true; // 制限なし
double distance = isBuy ? (price - sl) : (sl - price);
if(distance < stopLevel)
{
PrintFormat("SLがストップレベルに近すぎます: distance=%.5f required=%.5f",
distance, stopLevel);
return false;
}
return true;
}SymbolsTotal / SymbolName — 銘柄一覧
利用可能な銘柄の一覧を取得する関数です。マルチ通貨EAや銘柄スクリーニングに使用します。
// 気配値表示中の全銘柄を取得
void PrintMarketWatchSymbols()
{
int total = SymbolsTotal(true); // true=気配値表示中のみ
Print("気配値表示中の銘柄数: ", total);
for(int i = 0; i < total; i++)
{
string name = SymbolName(i, true);
double spread = (SymbolInfoDouble(name, SYMBOL_ASK) - SymbolInfoDouble(name, SYMBOL_BID))
/ SymbolInfoDouble(name, SYMBOL_POINT);
PrintFormat("%s Spread=%.1f", name, spread);
}
}
// 特定条件の銘柄をフィルタ(例: JPY関連のFXペア)
void FindJPYPairs()
{
int total = SymbolsTotal(false); // false=全銘柄
for(int i = 0; i < total; i++)
{
string name = SymbolName(i, false);
// JPY関連を探す
if(StringFind(name, "JPY") >= 0)
{
// FX通貨ペアか確認
long calcMode = SymbolInfoInteger(name, SYMBOL_TRADE_CALC_MODE);
if(calcMode == SYMBOL_CALC_MODE_FOREX)
{
// 気配値表示に追加
SymbolSelect(name, true);
Print("JPYペア発見: ", name);
}
}
}
}取引セッション情報
銘柄の取引時間帯(セッション)を取得できます。市場が開いているかどうかの判定に使用します。
// 現在取引可能かチェック
bool IsMarketOpen(string symbol)
{
MqlDateTime dt;
TimeCurrent(dt);
datetime from, to;
// 当日のセッションを確認(複数セッションがある場合はループ)
for(int session = 0; session < 10; session++)
{
if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)dt.day_of_week, session, from, to))
break;
// 時刻部分だけ比較
int currentMinutes = dt.hour * 60 + dt.min;
MqlDateTime fromDt, toDt;
TimeToStruct(from, fromDt);
TimeToStruct(to, toDt);
int fromMinutes = fromDt.hour * 60 + fromDt.min;
int toMinutes = toDt.hour * 60 + toDt.min;
if(currentMinutes >= fromMinutes && currentMinutes < toMinutes)
return true;
}
return false;
}
// 取引セッション一覧を表示
void PrintTradeSessions(string symbol)
{
string dayNames[] = {"日", "月", "火", "水", "木", "金", "土"};
for(int day = 0; day < 7; day++)
{
for(int session = 0; session < 5; session++)
{
datetime from, to;
if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)day, session, from, to))
break;
MqlDateTime fromDt, toDt;
TimeToStruct(from, fromDt);
TimeToStruct(to, toDt);
PrintFormat("%s曜日 セッション%d: %02d:%02d - %02d:%02d",
dayNames[day], session + 1,
fromDt.hour, fromDt.min,
toDt.hour, toDt.min);
}
}
}MQL4との比較
MQL4の口座情報・マーケット情報関数とMQL5の対応関係です。
| MQL4関数 | MQL5対応 |
|---|---|
| AccountBalance() | AccountInfoDouble(ACCOUNT_BALANCE) |
| AccountEquity() | AccountInfoDouble(ACCOUNT_EQUITY) |
| AccountFreeMargin() | AccountInfoDouble(ACCOUNT_MARGIN_FREE) |
| AccountMargin() | AccountInfoDouble(ACCOUNT_MARGIN) |
| AccountProfit() | AccountInfoDouble(ACCOUNT_PROFIT) |
| AccountLeverage() | AccountInfoInteger(ACCOUNT_LEVERAGE) |
| AccountNumber() | AccountInfoInteger(ACCOUNT_LOGIN) |
| AccountCurrency() | AccountInfoString(ACCOUNT_CURRENCY) |
| AccountCompany() | AccountInfoString(ACCOUNT_COMPANY) |
| MarketInfo(symbol, MODE_BID) | SymbolInfoDouble(symbol, SYMBOL_BID) |
| MarketInfo(symbol, MODE_ASK) | SymbolInfoDouble(symbol, SYMBOL_ASK) |
| MarketInfo(symbol, MODE_SPREAD) | SymbolInfoInteger(symbol, SYMBOL_SPREAD) |
| MarketInfo(symbol, MODE_POINT) | SymbolInfoDouble(symbol, SYMBOL_POINT) |
| MarketInfo(symbol, MODE_DIGITS) | SymbolInfoInteger(symbol, SYMBOL_DIGITS) |
| MarketInfo(symbol, MODE_STOPLEVEL) | SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL) |
| MarketInfo(symbol, MODE_LOTSIZE) | SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE) |
| MarketInfo(symbol, MODE_TICKVALUE) | SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE) |
| MarketInfo(symbol, MODE_MINLOT) | SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN) |
| MarketInfo(symbol, MODE_MAXLOT) | SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX) |
| MarketInfo(symbol, MODE_LOTSTEP) | SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP) |
| MarketInfo(symbol, MODE_SWAPLONG) | SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG) |
| MarketInfo(symbol, MODE_SWAPSHORT) | SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT) |
TerminalInfo — ターミナル情報
MT5ターミナル自体の情報を取得する関数です。EAの動作環境の確認に使用します。
void PrintTerminalInfo()
{
// 取引許可状態
bool tradeAllowed = (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED);
bool connected = (bool)TerminalInfoInteger(TERMINAL_CONNECTED);
bool dlls = (bool)TerminalInfoInteger(TERMINAL_DLLS_ALLOWED);
PrintFormat("取引許可: %s 接続: %s DLL: %s",
tradeAllowed ? "YES" : "NO",
connected ? "YES" : "NO",
dlls ? "YES" : "NO");
// パス情報
string dataPath = TerminalInfoString(TERMINAL_DATA_PATH);
string commonPath = TerminalInfoString(TERMINAL_COMMONDATA_PATH);
Print("データパス: ", dataPath);
Print("共通パス: ", commonPath);
// メモリ情報
int physicalMem = (int)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL);
int availMem = (int)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);
int usedMem = (int)TerminalInfoInteger(TERMINAL_MEMORY_USED);
PrintFormat("メモリ: 物理=%dMB 利用可能=%dMB 使用中=%dMB",
physicalMem, availMem, usedMem);
}
// MQLプログラム自体の情報
void PrintMQLInfo()
{
bool isOptimization = (bool)MQLInfoInteger(MQL_OPTIMIZATION);
bool isTesting = (bool)MQLInfoInteger(MQL_TESTER);
bool isVisual = (bool)MQLInfoInteger(MQL_VISUAL_MODE);
bool tradeAllowed = (bool)MQLInfoInteger(MQL_TRADE_ALLOWED);
PrintFormat("テスト: %s 最適化: %s ビジュアル: %s 取引: %s",
isTesting ? "YES" : "NO",
isOptimization ? "YES" : "NO",
isVisual ? "YES" : "NO",
tradeAllowed ? "YES" : "NO");
string programName = MQLInfoString(MQL_PROGRAM_NAME);
Print("プログラム名: ", programName);
}バックテスト中はMQLInfoInteger(MQL_TESTER)がtrueを返します。ライブとテストで異なる処理をしたい場合(例: ログの詳細度を変える、WebRequestを無効にする等)に使ってください。
プロが開発したEAをお探しの方は → シストレ.COM EA一覧





