Turnstile Order Gateway
- 라이브러리
- 버전: 1.0
- 활성화: 5
전문가 어드바이저(EA)와 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 ms(잘못된 값: 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, 파일, 웹 요청 없음, 테스터에서는 재시도 대기 없음).
- 차트 객체, 타이머, 파일, 전역 변수를 만들지 않으며, 시세를 읽기 위해 심볼을 시장 관찰 창에 추가할 수 있습니다.
- 세션 표에 없는 휴일도 서버 응답으로 -5 로 감지합니다.
- 미지원: stop-limit 주문, close-by, OrderSendAsync.
위험 고지
이 라이브러리는 사용자의 코드가 만든 요청을 검사하고 전송합니다. 진입을 결정하지 않으며 체결, 가격, 수익을 보장하지 않습니다. 먼저 데모 계좌에서 테스트하세요.
