Jugar JavaScript con el viejo blanco - crear un compañero de compras y ventas (2) nacido en una caja de arena

El autor:Un sueño pequeño., Creado: 2017-03-06 10:41:40, Actualizado: 2017-10-11 10:36:53

Jugar con el viejo blanco y el viejo ladrón de JavaScript para crear un compañero de compras y ventas.

Nacido en una caja de arena

  • Sistema de cajas de arena

    Cuando busco en Internet todo tipo de información para aprender, descubro que el uso de programas informáticos para hacer operaciones de valores financieros se llama operaciones programadas, operaciones cuantificadas. El nivel de matemáticas de los viejos blancos también es a nivel universitario, y la estadística tiene solo algunos conceptos básicos: distribución normal, expectativas, integración, etc. No me atrevo a decir que soy más cuantificado en el aprendizaje de programación, cuantificación. En el proceso de aprendizaje, programación, cuantificación o práctica.

    El viejo blanco siente que una caja de arena útil necesita los siguientes elementos:

    • 1, Simulación máxima de la secuencia de tiempo real, es decir, la secuencia de tiempo cuando se ejecuta un programa en una caja de arena debe ser lo más cercana posible a la situación real, basado en el nivel de tick, para que los resultados de las pruebas tengan un valor de referencia. Puede causar que el programa funcione con una velocidad limitada en la caja de arena, pero la velocidad de ejecución también es un factor muy importante.

    • 2, Varios parámetros de control de opciones, que se requieren no los parámetros del programa probado, sino los parámetros del sistema de caja de arena. Por ejemplo: configuración del intercambio (futuras?

    • 3, ajuste de parámetros del programa: a veces los viejos tienen un montón de parámetros de reserva para probar cuál es mejor. Un buen sistema de caja de arena puede aceptar un montón de parámetros predefinidos y luego ejecutar, analizar los resultados y mostrar lo mejor.

    • 4, prueba de errores: el programa de simulación suele funcionar sin problemas, con viento suave, porque está en el tanque de agua (¿cuántas olas grandes puede haber?), pero en realidad hay un océano profundo inesperado, con tormentas desconocidas que aparecen a cualquier hora. Entonces, el sistema de caja de arena debe crear automáticamente algunas olas de viento en el tanque de agua, simulando al máximo el mal entorno (es decir, emitir toda clase de datos erróneos, informes de errores de la red, incluso datos lógicamente imposibles).

    • 5, gráfico muestra: los gráficos pueden registrar muchos datos útiles para el análisis, como gráficos de ganancias, curvas de diferencias de precios, etc.

  • En la mano tenemos un sistema de caja de arena, primero escribimos un poco de código simple en JS y jugamos.

    • 1. La arquitectura general de los programas de automatización de futuros de productos CTP La base de la que usamos el viejo blanco ya tiene una función envuelta.exchange.IO("status")Para identificar si está conectado al servidor frontal de la empresa de futuros. El viejo dice: Los futuros de commodities utilizan el protocolo CTP, y la estructura de conexión es: el programa terminal del cliente de la empresa de futuros (código blanco antiguo) ----> el servidor frontal de la empresa de futuros -----> el servidor de la bolsa. Volviendo al tema principal, cuando los futuros de mercancías están fuera de mercado, no se puede conectar al servidor frontal de la empresa de futuros (el servidor frontal de la empresa de futuros se cierra después de un cierto tiempo de cierre) ; o el CTP se desconecta debido a ciertas situaciones. Para hacer frente a estas situaciones, los procedimientos tradicionales necesitan un intervalo de tiempo para juzgar el estado de la conexión y evitar realizar algunas operaciones sin conexión, lo que causa problemas.

      function MainLoop(){  //  处理具体工作的函数
                          //  编写处理具体交易逻辑
      }
      function main() {
          var status = null;
          while(true){
              status = exchange.IO("status");      //  调用API 确定连接状态
              if(status === true){                 //  判断状态
                  LogStatus("已连接!");            //  在回测或者实际运行中显示一些实时数据、信息。
                  MainLoop();                      //  连接上 交易所服务器后,执行主要工作函数。
              }else{                               //  如果没有连接上 即 exchange.IO("status") 函数返回 false
                  LogStatus("未连接状态!");         //  显示 未连接状态。
              }
              Sleep(1000);                         //  封装的睡眠函数,参数是毫秒,1000毫秒 等于 1秒,需要有轮询间隔, 以免访问过于频繁。CTP协议是每秒推送2次数据。
          }
      }
      

      En la caja de arena, corre:

      img img

      ¿Ven en el gráfico el monto de la cuenta de revalorización que hemos establecido, 100W?

      img

    • ¿Cómo se obtiene la información de su cuenta en el programa, ya que se envuelve en la base y se hace una función?exchange.GetAccount()¿Por qué no lo haces?

      function MainLoop(){  //  处理具体工作的函数
          exchange.GetAccount();    
      }
      

      Sólo en este tipo de personalizaciónMainLoop()Escribir en la funciónexchange.GetAccount();

      El resultado no muestra nada. ¡Oh! la función corrección está ejecutada, pero no se llama la función de impresión de registro.Log()Los parámetros de la función son para la salida de varias variables, se puede transmitir varios intervalos de coma. Cuando se escribe el código, además de la cadena se puede ingresar en chino, el resto del código cuando se escribe se debe recordar cambiar al inglés, el viejo blanco se pierde el pozo, perder mucho tiempo para descubrir que se escribe el símbolo de entrada en chino.

      function MainLoop(){                     // 处理具体工作的函数
          Log(exchange.GetAccount());          // 写法1
          var Account = exchange.GetAccount(); // 写法2
      }
      

      img

      El MainLoop se ejecuta continuamente (en intervalos de 1 segundo, dependiendo de la función Sleep) por lo que todos los registros del sistema de recuperación son la información de la cuenta simulada.
    • Luego, en la caja de arena, solicita algunos datos más, el viejo blanco solía centrarse en el acero rosado, una variedad de productos futuros, porque también se preocupa por el precio de la vivienda.

      En primer lugar, es necesario saber qué tipo de mercado entender, por ejemplo, sobre el contrato de acero roscado 1705.exchange.SetContractType("rb1705")Además, me gustaría saber si en este momento el contrato rb1705 (en el sistema de retroalimentación es el punto de tiempo en el que se ejecuta) puede ser llamado.exchange.GetTicker()Ahora quiero conocer las estadísticas de los ciclos de precios históricos de este contrato.exchange.GetRecords()¿Qué es esto?MainLoopLa función puede ser modificada:

      var index = 0;                                                // 声明一个全局变量 用来记录循环次数
      function MainLoop(){
          var ContractInfo = exchange.SetContractType("rb1705");    // 设置我要操作的 商品期货合约类型 即 螺纹钢1705合约。
          if(!ContractInfo){
              return;                                               // 如果设置合约没有成功,即返回函数,再次进入重试。
          }
          Log("rb1705 Info:", ContractInfo);                        // 显示一下合约详细信息。
          var ticker = exchange.GetTicker();                        // 通过CTP协议请求 此刻行情数据
          var records = exchange.GetRecords();                      // 通过CTP协议请求 历史K线数据,K线的周期默认周期是在沙盒系统上设置的。
          Log("ticker:", ticker);                                   // 打印出来 此刻行情数据
          Log("records:", records);                                 // 打印出来 历史K线数据
          Log("index:", index++, "#FF0000");                        // 打印循环次数, 在最后参数传入 "#FF0000" 可以使打印的日志显示为红色。
      }
      

      img

      Seleccionar parte de los registros El valor de las variables (tipo de matriz): ¿Qué es esto? El nombre de la banda es el de la banda de rock más grande del mundo. La banda de rock más grande del mundo es la banda de rock más grande del mundo. La banda de rock más grande del mundo es la banda de rock más grande del mundo. Time: el tiempo en milisegundos. Open: precio de apertura, High: precio más alto, Low: precio más bajo, Close: precio de cierre, Volume: volumen de transacción

      El valor de la variable ticker (objeto) que se imprime: ¿Qué es lo que está pasando? ¿Qué está pasando? High: precio más alto actual Low: precio más bajo actual Sell: precio de venta Buy: precio de compra Last: precio de transacción más reciente Volume: precio de transacción más reciente

      Información sobre el contrato rb1705: (Ver la descripción de los campos en el protocolo CTP) ¿Qué es eso? La combinación de tipos de aluminio: 0, En la actualidad, la mayoría de los usuarios de Twitter están usando el nombre de Facebook. En la actualidad, la mayoría de los usuarios de Twitter están en contra de la ley. El año de entrega: 1705. En la actualidad, la mayoría de los usuarios de Twitter están conectados a Facebook. En la actualidad, la mayoría de los usuarios de Facebook están usando el código de código de la red social. En la actualidad, la mayoría de las personas que buscan un sitio web para sus amigos están en la misma situación. En el caso de los niños, el número de niños en el centro de la ciudad es de aproximadamente 10 millones. En la actualidad, la mayoría de los usuarios de Twitter están en Facebook. En la actualidad, la mayoría de los usuarios de la plataforma están conectados a Internet. En la actualidad, la mayoría de los productos de la industria de la construcción están fabricados en China, China, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón, Japón y Japón. ¿Qué es lo que está pasando? En la actualidad, la mayoría de las personas que viven en la ciudad de Nueva York tienen una baja tasa de desempleo. En la actualidad, la mayoría de los usuarios de Twitter están en línea. En la actualidad, la mayor parte de los usuarios de Google están conectados a Internet. En el mercado MaxOrderVolume, el precio es de 30 dólares. En el caso de las personas que se encuentran en una situación de riesgo, el riesgo es muy alto. En el caso de las empresas que no están en el mercado, el precio de compra es el siguiente: La fecha de inicio de la sesión es el 17 de diciembre de 2016. El tipo de opción es: 0, En el caso de los niños, el número de niños que se encuentran en el centro de la ciudad es de: ¿Qué es lo que está sucediendo? El precio de las tickets es de 1%. ¿Qué es lo que está pasando? En la actualidad, la mayoría de los productos están disponibles en el mercado. En la actualidad, la mayoría de los usuarios de Twitter están usando el nombre de Facebook. El nombre de la empresa es el siguiente: El precio de la huelga: 0, "UnderlyingInstrID" tiene un número de código de usuario: El número de personas que se encuentran en el lugar de trabajo. En el caso de las personas que se encuentran en el mismo estado. ¿Qué es eso?

    • Y finalmente, hacemos que el robot se mueva dentro de la caja de arena.

      Aquí se presenta un poco el concepto de los futuros de productos, en los futuros, ya sea que se compre un contrato de venta masiva (contrato de venta al por menor) o un contrato de compra de posición baja (contrato de baja) se llaman posiciones abiertas, para distinguir: comprar un contrato de venta masiva se llama venta masiva, comprar un contrato de posición baja se llama posición abierta. Igualmente, liquidar un contrato de venta masiva y liquidar un contrato de posición baja se llaman liquidación, para distinguir: liquidar un contrato de venta masiva se llama venta masiva, liquidar un contrato de venta masiva se llama posición vacía.

Posicionamiento es la compra o venta por parte de un comerciante de futuros de contratos de la misma variedad, cantidad y mes de entrega que el contrato de futuros que tiene, pero en dirección opuesta a la de la operación, para cerrar posiciones. Los comerciantes de futuros tienen la opción de vender los futuros comprados antes del final del último día de negociación, o de recomprar los futuros vendidos, con el fin de obtener una cantidad igual. La negociación de futuros en dirección contraria para derogar el contrato de futuros original, lo que termina la negociación de futuros, liberando la obligación de realizar entregas físicas a la fecha de vencimiento. ¿Por qué no lo haces?

##### 所以在期货市场做买卖就有4个方向:

用 ```SetDirection()``` 函数来 确定操作的方向

- 开多仓:SetDirection("buy") ,传入参数 "buy" 字符串,明确 exchange.Buy() 函数为 开多仓 操作, Buy 函数稍后讲到。

- 开空仓:SetDirection("sell"), 传入参数 "sell" 字符串,明确 exchange.Sell() 函数为 开空仓 操作,Sell 函数稍后讲到。

- 平多仓:SetDirection("closebuy"), 传入参数 "closebuy" 字符串, 明确 exchange.Sell()函数为 平多仓操作。

- 平空仓:SetDirection("closesell"), 传入参数 "closesell" 字符串,明确 exchange.Buy()函数为 平空仓操作。

下个单试试!继续改写 MainLoop 函数,我们让程序在沙盒里面每隔10分钟 交易一次,开多仓平多仓交替进行。
```
var index = 0;
var isFirst = true;
function MainLoop(){
    if(isFirst){
        Log(exchange.GetAccount());
        isFirst = false;
    }
    var ContractInfo = exchange.SetContractType("rb1705");
    if(!ContractInfo){
        return;                                               // 如果设置合约没有成功,即返回函数,再次进入重试。
    }
    var ticker = exchange.GetTicker();
    if(index % 2 === 0){
        exchange.SetDirection("buy");
        exchange.Buy(ticker.Last + 1, 1, ticker); // exchange.Buy 函数有2个必要参数,第一个参数为下单价格,
                                          // 第二个参数为下单数量(希望交易的数量),之后还可以跟一些参数输出在日志信息。 
                                          //ticker.Last + 1 是为了让单子能成交,意思是在最后成交价的基础上多出1块钱。
    }else if(index % 2 === 1){
        exchange.SetDirection("closebuy");
        exchange.Sell(ticker.Last - 1, 1, ticker); // ticker.Last - 1 是为了在最后成交价的基础上减去1元 卖出。
    }
    index++;
    Sleep(1000 * 60 * 10 - 1000);         // 这里暂停10分钟 ,减去的1000 即1秒是 main 函数循环中的1秒。
    Log(exchange.GetAccount());
}
```

![img](/upload/asset/bd6dd2ef0e5db88c70f0585aee3a417c92227d31.png) 

##### 开始的账户信息 和 最后一次开仓 前的账户信息比较,可见不能胡乱开仓平仓。 >_<

Antes de escribir esto, bienvenido a los lectores a dejarme un comentario! ¡Sugieren y comentan, si les parece divertido, pueden compartirlo con otros amigos que aman el programa y aman las transacciones!

https://www.fmz.com/bbs-topic/724

Programador littleDream, originalmente


Más.