Turnstile Order Gateway
- ライブラリ
- バージョン: 1.0
- アクティベーション: 5
エキスパートアドバイザーと OrderSend の間に入る MQL5 ライブラリです。すべてのリクエストは送信前に 9 つのゲート(接続、Algo Trading、シンボルモード、セッション、注文タイプのフラグ、ロット、ストップ、証拠金、OrderCheck)を通過します。フリーズレベル、セッション外、接続断でブロックされた決済と変更はキューに入り、後で送信されます。ライブラリ自体が勝手に取引することはありません。お届けするのはコンパイル済みの Turnstile_Order_Gateway.ex5 で、このページが API の完全なリファレンスです。
クイックスタート
- Turnstile_Order_Gateway.ex5 を MQL5/Libraries にコピーします(ファイル > データフォルダを開く)。
- 下の #import ブロックを EA またはスクリプトに貼り付けます。
- 任意:OnInit で TOG_Configure を呼びます(既定値 20, 3, 300, true, false)。
- OnTick または OnTimer で TOG_ProcessQueue を呼びます。
- TOG_Open、TOG_Modify、TOG_Close で取引します。0 または false の場合は TOG_ReasonText(TOG_LastReason()) を出力します。
- 確認:下の例をストラテジーテスターで実行すると、ログにチケットと理由が表示されます。実口座では Algo Trading を有効にしてください。無効だとチェックは -3 を返します。
インポート宣言(そのままコピー可)
#import "Turnstile_Order_Gateway.ex5" void TOG_Configure(int deviation, int retries, int delay_ms, bool adjust_stops, bool verbose); double TOG_NormalizeVolume(string symbol, double volume); double TOG_NormalizePrice(string symbol, double price); double TOG_RiskVolume(string symbol, ENUM_ORDER_TYPE type, double entry, double sl, double risk_money); double TOG_MaxVolume(string symbol, ENUM_ORDER_TYPE type, double share); ENUM_ORDER_TYPE_FILLING TOG_FillingMode(string symbol); int TOG_CheckMarket(string symbol, ENUM_ORDER_TYPE type); int TOG_CheckStops(string symbol, ENUM_ORDER_TYPE type, double price, double sl, double tp); int TOG_CheckFreeze(ulong ticket); int TOG_Preflight(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp); ulong TOG_Open(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp, ulong magic, string comment); bool TOG_Modify(ulong ticket, double price, double sl, double tp); bool TOG_Close(ulong ticket, double volume); int TOG_CloseAll(string symbol, long magic, bool pending); int TOG_ProcessQueue(); int TOG_QueueCount(); void TOG_ClearQueue(); int TOG_LastReason(); uint TOG_LastRetcode(); string TOG_ReasonText(int reason); int TOG_RetcodeClass(uint retcode); int TOG_GetStats(long &stats[]); #import
理由コード
TOG_LastReason がコードを、TOG_ReasonText が大文字のテキストを返します。
- 0 OK、1 NO CHANGE(同じ値のため送信なし)、2 DEFERRED(キュー登録)。
- -1 BAD PARAMETERS:不明なシンボルやタイプ、指値・逆指値の価格 0、ロット 0。
- -2 NO CONNECTION:接続断または気配値なし。
- -3 TRADING DISABLED:Algo Trading または口座の取引がオフ。
- -4 SYMBOL MODE:無効、決済のみ、買いのみ、売りのみ。
- -5 MARKET CLOSED:取引セッション外。
- -6 INVALID VOLUME:最小/最大の範囲外、ステップ不一致、ロット上限超過。
- -7 INVALID STOPS:SL、TP、待機注文価格が逆側またはストップレベル内。
- -8 FREEZE ZONE:価格がフリーズレベル内。
- -9 NO MARGIN:成行注文の証拠金が余剰証拠金を超過。
- -10 ORDER TYPE BLOCKED:タイプや SL/TP が不可、または待機注文数の上限。
- -11 ORDERCHECK FAILED と -12 SERVER REJECTED:TOG_LastRetcode を参照。
- -13 TICKET NOT FOUND、-14 QUEUE FULL(256 件待機中)。
API リファレンス
type:ORDER_TYPE_BUY、ORDER_TYPE_SELL、ORDER_TYPE_BUY_LIMIT、ORDER_TYPE_SELL_LIMIT、ORDER_TYPE_BUY_STOP、ORDER_TYPE_SELL_STOP(stop-limit は -1)。価格は絶対値で、sl や tp が 0 なら設定なしです。
TOG_Configure
deviation:スリッページ(ポイント、0 以上、無効時 20)。retries:0-10(無効時 3)。delay_ms:再試行間隔 0-5000 ミリ秒(無効時 300)。adjust_stops:true なら、正しい側にあるがストップレベル内の SL/TP を最も近い有効価格+1 ティックへ移動(サーバーがなお拒否すればスプレッド分を追加)。false なら -7 を返します。verbose:ブロック、再試行、延期をプレフィックス [TOG] 付きでログ出力します。
TOG_NormalizeVolume
ロットステップに切り捨て、最大値で制限します。最小未満、ロット 0、不明なシンボルでは 0.0。
TOG_NormalizePrice
ティックサイズと桁数に丸めます。価格 0 は 0.0 を返すため、空の SL は 0 のままです。
TOG_RiskVolume
sl で risk_money(口座通貨)を失うロットを OrderCalcProfit で計算し(クロス通貨、貴金属、指数、株式でも正確)、切り捨てます。entry が 0 なら買いは Ask、売りは Bid を使用。最小ロットでもリスク超過なら 0.0 と -6、sl が逆側なら -7、入力不正なら -1。
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, AccountInfoDouble(ACCOUNT_BALANCE) * 0.01);
TOG_MaxVolume
証拠金が 余剰証拠金 x share(0-1、それ以外は 1)に収まる最大の有効ロット。最大ロットと残りのロット上限も考慮します。最小ロットも入らなければ 0.0 と -9。
TOG_FillingMode
成行の執行方式:許可されていれば FOK、次に IOC、それ以外は RETURN。サーバーが拒否すると TOG_Open が自動で切り替えます。
TOG_CheckMarket
新規注文のゲート 1-4:接続と気配値、Algo Trading、その方向のシンボルモード、セッション(サーバー時刻とセッション表を照合、表がなければ取引可とみなす)。0 または -1 から -5 を返します。
TOG_CheckStops
成行:sl と tp が Bid(買い)または Ask(売り)の正しい側にあり、SYMBOL_TRADE_STOPS_LEVEL 以上離れていること。待機注文:価格も市場から同様に、sl と tp は注文価格から測ります。0、-7、-1、-2 を返します。
TOG_CheckFreeze
Bid(買い)または Ask(売り)がポジションの SL または TP から SYMBOL_TRADE_FREEZE_LEVEL 以内、または市場が待機注文の価格に同じだけ近いとき -8。レベル 0 なら 0、不明なチケットは -13。
TOG_Preflight
9 つのゲートを順に実行し、何も送信しません:市場ゲート、注文タイプのフラグと待機注文上限、ロット、ストップ、証拠金(成行)、OrderCheck。最初の失敗理由または 0 を返します。
if(TOG_Preflight(_Symbol, ORDER_TYPE_SELL, 0.10, 0, sl, tp) != 0) Print(TOG_ReasonText(TOG_LastReason()));
TOG_Open
ロットと価格を正規化し、有効ならストップを調整、TOG_Preflight を実行して送信します。成行(price 0)はリクオート、価格変更、タイムアウト、接続エラー時に新しい価格で再試行。待機注文は GTC、GTC 不可なら DAY を使用。ポジションのチケット(成行)、注文のチケット(待機)、または 0 を返します。新規注文はキューに入りません。
TOG_Modify
ポジションの SL/TP、または待機注文の価格/SL/TP を変更します(price 0 は現価格を維持)。同じ値なら true、理由 1。フリーズゾーン、セッション外、接続断でブロックされた場合は false、理由 2 でキュー登録。同じチケットへの新しい呼び出しが置き換えます。
TOG_Close
ポジションを決済、または待機注文を削除します。volume 0 または全量で全決済、それ未満は部分決済(切り捨て)、残りが最小未満なら全決済。ブロック時は上と同じく false、理由 2 でキュー登録(キュー内の変更を置き換え)。
TOG_CloseAll
symbol("" = すべて)と magic(-1 = 任意)に一致する各ポジション(pending が true なら待機注文も)に TOG_Close を実行。今回決済できた数を返します。
TOG_ProcessQueue
ブロックが解けたキューの操作を送信します。OnTick または OnTimer で呼んでください。操作は成功、チケット消滅、その他の失敗でキューから外れ、サーバー拒否後は 1 秒待ちます。完了数を返します。
TOG_QueueCount と TOG_ClearQueue
待機中の操作数(最大 256)と、送信せずに全件破棄。
TOG_LastReason、TOG_LastRetcode、TOG_ReasonText
直前の呼び出しの理由、サーバーの最後のリターンコード(未送信なら 0)、理由コードのテキスト(それ以外は "UNKNOWN")。
TOG_RetcodeClass
0 DONE(発注済、約定、部分約定、変更なし、ポジション決済済)、1 RETRY(リクオート、拒否、エラー、タイムアウト、価格変更や無効価格、気配なし、リクエスト過多、ロック、接続)、2 FIX(無効なリクエスト、ロット、ストップ、有効期限、執行方式、注文)、3 WAIT(市場休止、フリーズ)、4 FATAL(その他、例:資金不足)。
TOG_GetStats
stats[] に 10 個のカウンターを入れて 10 を返します:0 リクエスト、1 送信、2 完了、3 ブロック、4 再試行、5 延期、6 キューから完了、7 拒否、8 ストップ調整、9 破棄。
動作する統合例
#import "Turnstile_Order_Gateway.ex5"
double TOG_RiskVolume(string symbol, ENUM_ORDER_TYPE type, double entry, double sl, double risk_money);
ulong TOG_Open(string symbol, ENUM_ORDER_TYPE type, double volume, double price, double sl, double tp, ulong magic, string comment);
bool TOG_Close(ulong ticket, double volume);
int TOG_ProcessQueue();
int TOG_LastReason();
string TOG_ReasonText(int reason);
#import
ulong ticket = 0;
bool tried = false;
void OnTick()
{
TOG_ProcessQueue();
if(!tried)
{
tried = true;
double sl = SymbolInfoDouble(_Symbol, SYMBOL_BID) - 300 * _Point;
double lots = TOG_RiskVolume(_Symbol, ORDER_TYPE_BUY, 0, sl, 10.0);
ticket = TOG_Open(_Symbol, ORDER_TYPE_BUY, lots, 0, sl, 0, 7001, "turnstile");
Print("open ", ticket, ": ", TOG_ReasonText(TOG_LastReason()));
}
if(ticket > 0 && PositionSelectByTicket(ticket) && PositionGetDouble(POSITION_PROFIT) > 5.0)
Print("close: ", TOG_Close(ticket, 0), " ", TOG_ReasonText(TOG_LastReason()));
} アーキテクチャと注意事項
- ライブラリをインポートする各プログラムが独自の設定、統計、メモリ上のキューを持ちます(EA の削除やターミナル再起動で消えます)。
- チェック関数はターミナルのデータを読むだけです。送信するのは TOG_Open、TOG_Modify、TOG_Close、TOG_CloseAll、TOG_ProcessQueue のみで、すべて同期送信です。
- 設定例:バリデーター対策 = 既定値+OnTick で TOG_ProcessQueue、厳格なストップ = adjust_stops false、開発時 = verbose true とパネルに TOG_GetStats を表示。
- MetaTrader 5、ネッティングとヘッジング、全シンボル対応、EA とスクリプト専用。ストラテジーテスター、最適化、MQL5 Cloud Network で安全(DLL、ファイル、Web リクエストなし、テスターでは再試行の待機なし)。
- チャートオブジェクト、タイマー、ファイル、グローバル変数は使いません。気配値取得のため気配値表示にシンボルを追加することがあります。
- セッション表にない祝日もサーバーの応答から -5 として検出します。
- 非対応:stop-limit 注文、close-by、OrderSendAsync。
リスクに関する注意
本ライブラリはあなたのコードのリクエストを検査して送信するだけです。エントリーを決めることはなく、約定、価格、利益を保証しません。まずデモ口座でテストしてください。
