Forex 알고리즘 거래: 엔지니어를 위한 실용적인 이야기
게시 됨: 2022-03-11아시다시피 외환(Forex 또는 FX) 시장은 통화 쌍 간의 거래에 사용됩니다. 그러나 당신은 그것이 세계에서 가장 유동적인 시장이라는 것을 인식하지 못할 수도 있습니다.
몇 년 전 호기심에 사로잡혀 Meta Trader 4 거래 플랫폼에서 데모 계정을 만들고 시뮬레이션(가짜 돈으로)을 실행하여 Forex 알고리즘 거래의 세계에 첫 발을 내디뎠습니다.
일주일간의 '거래' 후, 나는 거의 두 배의 돈을 벌었습니다. 내 자신의 성공적인 알고리즘 거래에 자극을 받아 더 깊이 파고 결국 여러 FX 포럼에 등록했습니다. 곧 나는 알고리즘 거래 시스템(구매 또는 판매 여부를 결정하는 규칙 세트), 맞춤형 지표, 시장 분위기 등에 대해 읽는 데 몇 시간을 보냈습니다.
내 첫 번째 클라이언트
이 즈음에 우연히 누군가가 간단한 거래 시스템을 자동화할 소프트웨어 개발자를 찾고 있다고 들었습니다. 이것은 내가 Java(스레드, 세마포어 및 모든 정크)에서 동시 프로그래밍에 대해 배우고 있던 대학 시절로 돌아갔습니다. 이 자동화된 시스템은 고급 데이터 과학 과정 작업보다 훨씬 더 복잡할 수 없다고 생각하여 작업에 대해 문의하고 온보드되었습니다.
클라이언트는 주식 관련 작업을 수행하기 위해 Meta Trader 4 플랫폼에서 사용하는 기능적 프로그래밍 언어인 MQL4로 구축된 알고리즘 거래 소프트웨어를 원했습니다.
거래 플랫폼(이 경우 Meta Trader 4)의 역할은 Forex 중개인에 대한 연결을 제공하는 것입니다. 그런 다음 브로커는 시장에 대한 실시간 정보를 플랫폼에 제공하고 매수/매도 주문을 실행합니다. Forex 거래에 익숙하지 않은 독자를 위해 데이터 피드에서 제공하는 정보는 다음과 같습니다.
Meta Trader 4를 통해 내부 기능으로 이 모든 데이터에 액세스할 수 있습니다. 다양한 시간대에 액세스할 수 있습니다. 매분(M1), 5분마다(M5), M15, M30, 매시(H1), H4, D1, W1, MN .
현재 가격의 움직임을 틱 이라고 합니다. 즉, 틱은 통화 쌍에 대한 Bid 또는 Ask 가격의 변경입니다. 활성 시장 동안에는 초당 수많은 틱이 있을 수 있습니다. 슬로우 마켓에서는 틱이 없는 시간이 있을 수 있습니다. 틱은 통화 시장 로봇의 심장 박동입니다.
이러한 플랫폼을 통해 주문을 하면 일정량의 특정 통화를 구매 하거나 판매 하게 됩니다. 손절매 및 이익실현 제한도 설정합니다. 손절매 한도 는 거래를 포기하기 전에 잃을 수 있는 최대 핍 (가격 변동)입니다. 이익실현 한도 는 현금화하기 전에 유리하게 누적될 핍의 양입니다.
클라이언트의 알고리즘 거래 사양은 간단했습니다. 두 가지 지표를 기반으로 하는 Forex 로봇을 원했습니다. 배경지표는 과거 데이터(예: 지난 n 일 동안 가장 높은 가격)를 기반으로 하기 때문에 시장 상태를 정의하고 거래 결정을 내릴 때 매우 유용합니다. 많은 것들이 Meta Trader 4에 내장되어 있습니다. 그러나 내 고객이 관심을 가진 지표는 맞춤형 거래 시스템에서 왔습니다.
그들은 두 개의 맞춤형 지표가 교차할 때마다 특정 각도에서만 거래하기를 원했습니다.
손에
손이 더러워지면서 MQL4 프로그램의 구조가 다음과 같다는 것을 알게 되었습니다.
- [전처리기 지시문]
- [외부 매개변수]
- [글로벌 변수]
- [초기화 기능]
- [디니트 기능]
- [시작 기능]
- [사용자 정의 기능]
시작 기능은 시장이 움직일 때마다 실행되기 때문에 모든 MQL4 프로그램의 핵심입니다(이 기능은 틱당 한 번 실행됩니다). 이것은 사용하는 기간에 관계없이 마찬가지입니다. 예를 들어 H1(1시간) 시간 프레임에서 작업할 수 있지만 시작 기능은 시간 프레임당 수천 번 실행됩니다.
이 문제를 해결하기 위해 함수가 기간 단위당 한 번 실행되도록 했습니다.
int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...
지표 값 얻기:
// Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }
표시기 및 각도의 교차를 포함한 결정 논리:
int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }
주문 보내기:
void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }
관심이 있는 경우 GitHub에서 실행 가능한 전체 코드를 찾을 수 있습니다.

백테스팅
알고리즘 거래 시스템을 구축한 후 1) 적절하게 작동하는지, 2) 사용된 Forex 거래 전략이 좋은지 알고 싶었습니다.
백 테스팅 (때로는 "백 테스팅"으로 작성됨) 은 과거의 사건에서 특정(자동화 여부에 관계없이) 시스템을 테스트하는 프로세스입니다. 즉, 과거를 현재에 대한 프록시로 사용하여 시스템을 테스트합니다.
MT4에는 Forex 거래 전략을 백테스트할 수 있는 허용 가능한 도구가 함께 제공됩니다(요즘에는 더 많은 기능을 제공하는 보다 전문적인 도구가 있습니다). 시작하려면 시간 프레임을 설정하고 시뮬레이션에서 프로그램을 실행합니다. 이 도구는 각 단위에 대해 특정 가격에 열리고 특정 가격에 닫히고 지정된 최고점과 최저점에 도달해야 한다는 것을 알고 각 틱을 시뮬레이션합니다.
프로그램의 동작을 과거 가격과 비교한 후 올바르게 실행되고 있는지 여부를 잘 알 수 있습니다.
백테스팅에서 임의의 시간 간격에 대한 FX 로봇의 반환 비율을 확인했습니다. 말할 필요도 없이, 나는 내 고객이 그것으로 부자가 되지 않을 것이라는 것을 알고 있었습니다 . 그가 선택한 지표와 결정 논리는 수익성이 없었 습니다. 샘플로 다음은 164개 작업에 대해 M15 창에서 프로그램을 실행한 결과입니다.
저울(파란색 선)이 시작점 아래에서 끝납니다.
매개변수 최적화와 그 거짓말
백테스팅을 통해 이 FX 로봇의 유용성에 대해 우려했지만, 외부 매개변수를 가지고 놀기 시작했을 때 흥미를 느꼈고 전체 반환 비율에서 큰 차이를 발견했습니다. 이 특정 과학은 매개변수 최적화 로 알려져 있습니다.
나는 Return Ratio에 대한 외부 매개변수의 중요성을 추론하고 시도하기 위해 몇 가지 대략적인 테스트를 수행했고 다음과 같은 결과를 얻었습니다.
또는 정리:
당신은 (내가 그랬던 것처럼) 매개변수 A를 사용해야 한다고 생각할 수도 있습니다. 그러나 결정은 보이는 것만큼 간단하지 않습니다. 특히 매개변수 A의 예측 불가능성에 주목하십시오. 작은 오류 값의 경우 반환값이 크게 변경됩니다. 다시 말해, 매개변수 A는 불확실한 미래 결과를 과대 예측할 가능성이 매우 높습니다.
그러나 미래는 불확실한 것이 사실입니다! 따라서 매개변수 A의 반환도 불확실합니다. 사실 최선의 선택은 예측 불가능성에 의존하는 것입니다. 종종 최대 수익률은 낮지만 예측 가능성이 우수한(변동이 적은) 매개변수가 수익률은 높지만 예측 가능성이 낮은 매개변수보다 선호됩니다.
당신이 확신할 수 있는 유일한 것은 시장의 미래 를 모른다는 것이고, 과거 데이터를 기반으로 시장이 어떻게 될지 안다고 생각하는 것은 실수입니다. 차례로, Forex 예측에서 이러한 예측 불가능성을 인정해야 합니다.
매개변수 A의 낮은 수익도 매개변수 B보다 더 나은 성능을 발휘하기 때문에 이것이 반드시 매개변수 B를 사용해야 한다는 의미는 아닙니다. 이것은 매개변수를 최적화하면 가능한 미래 결과를 과장하는 테스트를 초래할 수 있으며 그러한 생각은 분명하지 않다는 것을 보여주기 위한 것입니다.
전반적인 Forex 알고리즘 거래 고려 사항
그 첫 번째 알고리즘 방식의 Forex 거래 경험 이후로 저는 고객을 위한 여러 자동화 거래 시스템을 구축했으며, Forex 분석을 수행하고 탐색할 여지가 항상 있다고 말할 수 있습니다. 예를 들어, 나는 최근에 소위 "빅 피쉬(Big Fish)" 움직임을 찾는 것을 기반으로 하는 시스템을 구축했습니다. 즉, 아주 작은 시간 단위의 거대한 핍 변동입니다. 이것은 나를 매료시키는 주제입니다.
자신만의 FX 시뮬레이션 시스템을 구축하는 것은 Forex 시장 거래에 대해 더 많이 배울 수 있는 훌륭한 옵션이며 가능성은 무한합니다. 예를 들어, 한 시장(예: EUR/USD)의 변동성 함수로 가격 변동의 확률 분포를 해독하고 변동성 상태별 분포를 사용하여 몬테카를로 시뮬레이션 모델을 만들 수 있습니다. 원하는 정확도. 열성적인 독자를 위한 연습으로 남겨두겠습니다.
Forex 세계는 때때로 압도적일 수 있지만 이 글을 통해 자신의 Forex 거래 전략을 시작하는 방법에 대한 몇 가지 요점을 얻을 수 있기를 바랍니다.
추가 읽기
요즘에는 Trading System Automations를 구축, 테스트 및 개선할 수 있는 방대한 도구 풀이 있습니다. 테스트용 Trading Blox, 거래용 NinjaTrader, 프로그래밍용 OCaml 등이 있습니다.
나는 통화 시장이라는 신비한 세계에 대해 광범위하게 읽었습니다. 다음은 프로그래머와 열성적인 독자들에게 추천하는 몇 가지 글입니다.
- BabyPips: Forex 거래에 대해 스쿼트를 모르는 경우 시작점입니다.
- 거북이의 길, Curtis Faith: 내 생각에 이것은 Forex 성경 입니다. 거래 경험이 있고 Forex 전략을 알고 나면 읽으십시오.
- 무역 전문가를 위한 기술적 분석 — 오늘날의 격동적인 세계 금융 시장을 위한 전략 및 기법, Constance M. Brown 저
- 전문가 고문 프로그래밍 – Meta Trader 4용 MQL에서 자동화된 거래 시스템 만들기, Andrew R. Young
- 거래 시스템 – 시스템 개발 및 포트폴리오 최적화에 대한 새로운 접근 방식, Urban Jeckle 및 Emilio Tomasini 저: 매우 기술적이고 FX 테스트에 매우 중점을 둡니다.
- 다중 에이전트 통화 거래 시스템의 단계별 구현, Rui Pedro Barbosa 및 Orlando Belo: 이 문서는 거래 시스템 및 테스트 플랫폼을 만드는 방법을 설명하는 매우 전문적입니다.