Racing Game 3D
- Utilidades
-
Yu Zhang
I am a senior practitioner in Fintech industry.
And I have done a lot of academic research on financial markets.
From 2012, I work as a Quant.
Forex, stock and futures are my main trading varieties.
I can use MQL4, MQL5, C++, MySql, and Python. - Versión: 1.0
- Activaciones: 20
# Juego de carreras en 3D - Juego de carreras en 3D basado en velas japonesas 🎮🏎️
`Racing_Game_3D` es un innovador script de juego de carreras en 3D que se ejecuta dentro de la plataforma MetaTrader 5 (MT5). Desarrollado por **Musa Ziyad** en 2025, entre las características principales del juego destacan **la generación de circuitos 3D con muchas curvas a partir de los datos de velas japonesas en tiempo real (OHLC) del gráfico actual**, el renderizado con API 3D nativas de DirectX, la implementación de cajas de objetos interactivas y la posibilidad de competir cara a cara contra 5 oponentes controlados por la CPU.
---
## 🌟 Conceptos y características clave
1. **Circuito sinuoso en 3D basado en velas japonesas**
* El script consulta las velas históricas del símbolo activo (omitiendo la barra más reciente que no se ha completado).
* El tamaño del cuerpo de cada vela (Cierre - Apertura) determina el desplazamiento de la curva lateral de ese segmento de la pista. **Cuanto más volátil es el mercado, más sinuosa y desafiante se vuelve la pista de carreras**.
* Un cálculo de centrado integrado crea curvas dinámicas al estilo slalom, al tiempo que evita que la pista se desvíe infinitamente.
2. **Motor de renderizado nativo de DirectX**
* Funciona a través de la interfaz interna `DXContext` de MetaTrader 5 , combinada con un sombreador de vértices personalizado (`Shaders/vertex.hlsl`) y un sombreador de píxeles (`Shaders/pixel.hlsl`) para la proyección 3D acelerada por GPU.
* Alimenta el sombreador de píxeles con una estructura`PSInputBuffer`, que transmite la resolución, el tiempo, las coordenadas del jugador, las coordenadas de los 5 competidores controlados por IA, las matrices de curvatura de la pista local, las cajas de objetos activos y los proyectiles en vuelo.
3. **Potenciadores y sistema de combate**
* Las cajas de objetos se distribuyen cada 30 metros a lo largo de la carretera y contienen tres habilidades distintas:
* 🟦 **Caja azul (impulso de velocidad)**: Otorga aceleración nitro, aumentando significativamente la velocidad máxima durante 3,0 segundos.
* 🟥 **Caja roja (trampa)**: activa una trampa de derrape que reduce la velocidad del coche a 2 km/h y desactiva la dirección durante 1,5 segundos.
* 🟨 **Caja amarilla (Disparo de llamas)**: Otorga una bola de fuego. Pulsa **[SHIFT]** para dispararla hacia delante.
* Las bolas de fuego siguen las curvas de la pista. Al chocar con un vehículo, se desactivan durante 1,5 segundos.
4.**Competidores con IA inteligente** de
* Compite contra 5 coches controlados por la CPU.
* Los vehículos controlados por IA tienen diferentes velocidades de base, cambian de carril para esquivar obstáculos, buscan cajas de velocidad azules y lanzan bolas de fuego cuando se acercan por detrás al jugador u otros oponentes.
5. **Física realista y acabado visual**
* **Ángulo de guiñada 3D**: calcula en tiempo real el ángulo de inclinación/guiñada de los coches basándose en la velocidad de la dirección, lo que ofrece animaciones de conducción inmersivas.
* **Colisiones con la pared y fricción**: Salirse de los límites de la pista (`ROAD_HALF_WIDTH` = 6,0 m) reduce la velocidad del vehículo. Chocar con otros pilotos reduce la velocidad del coche y activa la física de empuje hacia atrás.
* **Fondo translúcido del HUD**: Garantiza que los textos del HUD sean legibles frente a cielos brillantes o campos de césped verde.
---
## 🕹️ Guía de controles
* **↑**: Acelerar.
* **↓**: Desacelerar / Marcha atrás.
* **←** y **→**: Girar a la izquierda y a la derecha.
* **SHIFT**: Lanzar bola de fuego (requiere mantener pulsado un potenciador de bola de fuego amarilla).
* **Enter**: Reiniciar la carrera.
* **ESC**: Salir del juego y restaurar la vista de gráfico predeterminada.
---
## 🛠️ Arquitectura del código
1. **`rates[]` Copia y seguimiento de la construcción**
* Copia los datos de velas desde el índice 1 utilizando `CopyRates`.
* Calcula `rates[i].close - rates[i].open` para definir las compensaciones de curvatura y las guarda en la matriz global `RoadOffsets[]`.
2. **`PSInputBuffer` Búfer de sombreado**
* Empaqueta las entradas de renderizado activas (resoluciones, coordenadas absolutas, vectores de vehículos IA, 32 desplazamientos de carretera locales, objetos de caja más cercanos, listas de proyectiles) y las registra en el sombreador de píxeles.
3. **`UpdateGame(double dt)` Bucle físico**
* Gestiona velocidades, tiempos de recarga, desaceleración natural y resistencia aerodinámica.
* Calcula las coordenadas absolutas del mundo 3D para todos los coches.
* Interpola los centros de las carreteras con `GetRoadXCPU(z)` para hacer cumplir los límites.
* Ejecuta las trayectorias de los proyectiles, las cajas de colisión y la lógica de colisión entre coches.
* Define los desencadenantes de victoria/derrota en función de la línea de meta (`FinishLineDistance`).
4. **Renderizado de fotogramas (`DXDrawIndexed` + mapas de bits)**
* Vacía la profundidad, incrementa las líneas de tiempo de los shaders y llama a `DXDrawIndexed`.
* Exporta los búferes de fotogramas a la matriz `image[]` de la CPU mediante `DXContextGetColors`.
* Superpone los textos del HUD (estadísticas de carrera, velocidades, tiempos y duraciones de los objetos activos) antes de actualizar el objeto gráfico del gráfico.
---
## ⚙️ Parámetros de configuración
Ajusta estas entradas al ejecutar el script:
* **InputKLineCount** (`Track Candlesticks`): Valor predeterminado `1000`. Establece la longitud del nivel.
* **CurveIntensity** (`Intensidad de la curva`): Valor predeterminado `2.5`. Unos coeficientes más altos dan como resultado curvas más cerradas y pronunciadas.
* **SegmentLength** (`Segment Depth`): Valor predeterminado `10,0` metros. Representa la longitud física de cada segmento de vela en el espacio 3D.
---
## 🚀 Cómo ejecutarlo
1. Abre MetaTrader 5.
2. Seleccione el símbolo y el marco temporal deseados (por ejemplo, GBPUSD, M15).
3. Navega por el árbol del «Navegador»: **Scripts -> My_Scripts -> 3D动画 -> Racing_Game_3D**.
4. Haz doble clic o arrastra `Racing_Game_3D` al gráfico.
5. Configura los parámetros en la ventana de diálogo y, a continuación, haz clic en «Aceptar».
6. El gráfico de trading se ocultará y comenzará la carrera. Pulsa **ESC** en cualquier momento para salir.
---

