Jugar JavaScript con el viejo blanco - crear un compañero que haga compras y ventas - desarrollar el código de herramientas para el robot

El autor:Un sueño pequeño., Creado: 2017-03-15 11:22:52, Actualizado: 2017-10-11 10:37:43

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


En el proceso de desarrollo de robots se han acumulado muchos fragmentos de código pequeños, algunos de los cuales se pueden aprovechar en su propio programa de estrategia de cuantificación, aquí el viejo blanco saca algunos de los códigos que escribió para tirar al margen, como un menú de comparación para principiantes, todos los lectores están en lo correcto.

  • 1, para convertir cualquier ciclo de K.

    Este módulo de código no está escrito como una biblioteca de clases, sólo escribe una función, y también es fácil de modificar y ampliar posteriormente. Su función es la línea K para la síntesis de grandes ciclos de datos de línea K basados en ciertos ciclos, en el momento de ver el mercado normal, o cuando se utiliza la estrategia de escritura de la plataforma, por defecto son las líneas K de ciclos comunes, como 1 día, 1 hora, 1 minuto, etc. Si se necesita procesar datos de otros ciclos, como 4 horas, 6 horas, 8 horas K línea, entonces se necesita para comenzar por sí mismo. El código fuente es:https://www.fmz.com/strategy/35986

    // K线周期合成  扩展为 根据基础K线 合成 为任意周期。
    

var cloneObj = function ((obj) { // Copiar profundamente las funciones de objetos var str, newobj = obj.constructor === Array? [] : {}; Si (tipo de objeto!== Objeto de tipo) { ¿Qué es lo que está pasando? } otro si (JSON) { str = JSON.stringify ((obj); // Objetos serializados newobj = JSON.parse ((str); // redirigido ¿Por qué no? para (var i en obj) { newobj[i] = typeof obj[i] === ¿Qué tipo de objeto es obj? cloneObj ((obj[i]) : obj[i]; también se puede hacer un clone de Obj. ¿Por qué no? ¿Por qué no? ¿Cómo se hace esto? ¿Qué es esto? ¿Qué es esto? var DAY = 0; var HOURS = 1; var MINUTES = 2 y var esFirstFind = verdadero; var Primero estampado = null; ¿Qué es esto? Función GetDHM ((objTime, BaseCycle, NewCycleForMS) VAR ret = []; si ((BaseCycle % (1000 * 60 * 60 * 24) === 0) { ret[0] = objTime.getDate ((); el nombre de la página es ret[0] ret[1] = DÍA; }else if ((BaseCycle % (1000 * 60 * 60) === 0) { ret[0] = objTime.getHours (en inglés); ret[1] = HORAS; }else if ((BaseCycle % (1000 * 60) === 0) { ret[0] = objTime.getMinutes (en inglés); ret[1] = MINUTOS; ¿Por qué no? si ((NewCycleForMS % (1000 * 60 * 60 * 24) === 0) { ret[2] = DÍA; }else if ((NewCycleForMS % (1000 * 60 * 60) === 0) { ret[2] = horas; }else if ((NewCycleForMS % (1000 * 60) === 0) { ret[2] = MINUTOS; ¿Por qué no? ¿Cómo se hace esto? ¿Por qué no? ¿Qué es esto? Función de búsqueda de primer tiempo (ret, BaseCycle, NewCycleForMS) si ((ret[1] === DAY && ret[2] === DAY) { Var array_day = []; y var array_day = []; para ((var i = 1 ; i < 29; i += (NewCycleForMS / BaseCycle)) ¿Cómo se puede hacer esto? array_day.push ((i); ¿Por qué no? para ((var j = 0 ; j < array_day.length; j++)) { Si el día de la matriz es el día de la matriz, el día de la matriz es el día de la matriz. ¿Qué es esto? ¿Por qué no? ¿Por qué no? }else if(ret[1] === HOURS && ret[2] === HOURS) { Var array_hours = []; el valor de las horas de la matriz para ((var i = 0 ; i < 24; i += (NewCycleForMS / BaseCycle)) En el caso de las personas que no están en la lista, el nombre de la persona que no está en la lista es: ¿Por qué no? para ((var j = 0 ; j < array_hours.length ; j++) { Si el número de horas de la matriz es igual a 0, entonces el número de horas de la matriz es igual a 0, y si el número de horas de la matriz es igual a 0, entonces el número de horas de la matriz es igual a 0. ¿Qué es esto? ¿Por qué no? ¿Por qué no? }else if(ret[1] === MINUTES && ret[2] === MINUTES) { Var array_minutes = []; y var array_minutes = []; y var array_minutes = []; para ((var i = 0; i < 60; i += (NewCycleForMS / BaseCycle)) ¿Qué está haciendo el equipo? ¿Por qué no? para ((var j = 0; j < array_minutes.length; j++) { Si el número de minutos es igual a 0, entonces el número de minutos es igual a 0, y si el número de minutos es igual a 0, entonces el número de minutos es igual a 0. ¿Qué es esto? ¿Por qué no? ¿Por qué no? ¿Qué quieres decir? ¡Millisegundos del ciclo objetivo: mm + NewCycleForMS + " Millisegundos del ciclo base: " + BaseCycle; ¿Por qué no? ¿Por qué no? ¿Qué es esto? Función Calc_High ((AssRecords, n, BaseCycle, NewCycleForMS) {) var max = AssRecords[n].High; para ((var i = 1 ; i < NewCycleForMS / BaseCycle; i++) { max = Math.max ((AssRecords[n + i].High, max); y ¿Por qué no? ¿Qué es lo que está pasando? ¿Por qué no? ¿Qué es esto? Función Calc_Low ((AssRecords, n, BaseCycle, NewCycleForMS) {) var min = AssRecords[n].Low; var min = AsRecords[n].Low; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n] para ((var i = 1 ; i < NewCycleForMS / BaseCycle; i++) { Min = Math.min ((AssRecords[n + i].Low, min); y ¿Por qué no? ¿Qué es lo que se está haciendo? ¿Por qué no? ¿Qué es esto? Función Asamblea de registros (Records, NewCycleForMS) { var AssRecords = records.slice ((0); // Copia profunda var Después de Ases = [];

if(!records || records.length < 2){
    throw (!records) ? "传入的records参数为 错误" + records : "基础K线长度小于2";
}
var BaseCycle = records[records.length - 1].Time - records[records.length - 2].Time;
if(NewCycleForMS % BaseCycle !== 0){
    throw "目标周期‘" + NewCycleForMS + "’不是 基础周期 ‘" + BaseCycle + "’ 的整倍数,无法合成!";
}
if(NewCycleForMS / BaseCycle > records.length){
    throw "基础K线数量不足,请检查是否基础K线周期过小!";
}

// Determina la línea de tiempo y encuentra el tiempo de inicio de la línea K base con respecto a la línea K objetivo. var objTime = nuevo Date (); Para (var i = 0; i < AssRecords.length; i++) { ObjTime.setTime ((AssRecords[i].Time)); ObjTime.setTime también se utiliza para registrar el tiempo. var ret = GetDHM (objTime, BaseCycle, NewCycleForMS);

    if (isFirstFind === true && SearchFirstTime(ret, BaseCycle, NewCycleForMS) === true) {
        FirstStamp = AssRecords[i].Time;
        for (j = 0; j < i; j++) {
            AssRecords.shift();        // 把目标K线周期前不满足合成的数据排除。
        }
        isFirstFind = false;
        break;                         // 排除后跳出
    }else if(isFirstFind === false){
        if((AssRecords[i].Time - FirstStamp) % NewCycleForMS === 0){
            for (j = 0; j < i; j++) {
                AssRecords.shift();    // 把目标K线周期前不满足合成的数据排除。
            }
            break;
        }
    }
}
var BarObj = {                         // 定义一个 K线柱结构
    Time: 0,
    Open: 0,
    High: 0,
    Low: 0,
    Close: 0,
    Volume: 0,
};
var n = 0;
for (n = 0; n < AssRecords.length - (NewCycleForMS / BaseCycle); n += (NewCycleForMS / BaseCycle)) {     // 合成
    /*
    {
    Time    :一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
    Open    :开盘价
    High    :最高价
    Low :最低价
    Close   :收盘价
    Volume  :交易量
    }
    */
    BarObj.Time = AssRecords[n].Time;
    BarObj.Open = AssRecords[n].Open;
    BarObj.High = Calc_High(AssRecords, n, BaseCycle, NewCycleForMS); 
    BarObj.Low =  Calc_Low(AssRecords, n, BaseCycle, NewCycleForMS); 
    BarObj.Close = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Close;
    BarObj.Volume = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Volume;
    AfterAssRecords.push(cloneObj(BarObj));
}

BarObj.Time = AssRecords[n - (NewCycleForMS / BaseCycle)].Time + NewCycleForMS; // La última hora no puede cambiarse, por lo que no se puede cambiar la fecha de inicio de la sesión. BarObj.Open = AssRecords[n].Open; el nombre de la página en inglés es BarObj.Open BarObj.Close = AssRecords [AssRecords.length - 1].Close; el nombre del archivo es el mismo que el nombre del archivo. BarObj.Volume = AssRecords [AssRecords.length - 1].Volume; el nombre del archivo se encuentra en el siguiente enlace. var max = AssRecords[n].High; var min = AssRecords[n].Low; var min = AsRecords[n].Low; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n]; var min = AsRecords[n] Por ejemplo, si el valor de un índice es igual a un valor de un índice de un índice de un índice de un índice de un índice de un índice de un índice de un índice. max = Math.max ((max, AssRecords[index_n].High)); el valor de las notas de cálculo es el mismo que el valor de las notas de cálculo. Min = Math.min ((min, AssRecords[index_n].Low)); y también se puede obtener una descripción de la cantidad de datos que se han registrado en el archivo. ¿Qué quieres decir? BarObj.High = max; BarObj.Low = min; Después de AssRecords.push ((cloneObj ((BarObj)));

return AfterAssRecords;

¿Qué es eso? ¿Qué es esto? Función principal ()) { // código de prueba ¡Mientras!exchange.IO¿Qué es el estado? LogStatus (¡no está conectado!); ¿Por qué no? var Info = _C ((exchange.SetContractType, cloruro de magnesio MA705)); // Síntesis de datos de línea K del contrato de metanol 705 de ensayo Var records = exchange.GetRecords (en inglés); Mientras (!records.length < 24) { Los registros = exchange.GetRecords (en inglés); ¿Por qué no?
// maneja los parámetros de la interfaz, si escribe su propia política, puede consultar var Num_UI_NewCycleForMS = 1; y var arrayNum = UI_NewCycleForMS.split (("*"); y para ((var indexNum = 0 ; indexNum < arrayNum.length ; indexNum++) { Num_UI_NewCycleForMS = Num_UI_NewCycleForMS * Número ((arrayNum[indexNum]); Num_UI_NewCycleForMS * Número (arrayNum[indexNum]); Num_UI_NewCycleForMS * Número (arrayNum[indexNum]); Num_UI_NewCycleForMS * Número (arrayNum[indexNum]); Num_UI_NewCycleForMS * Número (arrayNum[indexNum]); Num_UI_NewCycleForMS * Número (arrayNum[indexNum]); ¿Qué quieres decir? Log (el tiempo de milisegundos de un ciclo personalizado es: log, Num_UI_NewCycleForMS);
mientras (true) { Los registros = _C (exchange.GetRecords); // Log (( Datos de la línea K primaria: barra de longitud, records.length, Datos de la barra: barra, records); records = AssembleRecords ((records, Num_UI_NewCycleForMS); // El primer parámetro es la línea base K, el segundo parámetro es el milisegundo de ciclo a convertir, 1000 * 60 * 20 es la conversión a 20 minutos // Log (después de la conversión de los datos de las líneas K: barra de longitud, records.length, barra de datos: barra, records); Los registros de los usuarios de los sitios web de las plataformas de Internet están en línea con los registros de las plataformas de Internet. // lanzar stop ; // ceshi Sleep ((1000)); ¿Por qué no? ¿Por qué no?


- #### 2、传统期货差价监控 (CTP)

当需要分析两个品种差价走势的时候,会用上这段代码。有时候也会把这段代码修改集成到自己的策略程序里面(比如跨期对冲策略),代码会绘制出一个差价走势图,在学习如何让机器人程序画图也是很有帮助的,很好的例子。
源码地址: https://www.fmz.com/strategy/5379

var __lastDiff = 0; var __AType = [Last, Buy, Sell][AType]; var __BType = [Last,Buy,Sell][BType]; ¿Qué es esto? Función _N ((v, precisión) { si (typeof ((precision)!= number ) { Precisión = 4; ¿Qué es eso? var d = parseFloat ((v.toFixed ((Math.max ((10, precision + 5))); s = d.toString (().split ((""); if (s.length < 2つの s[1].length <= precision) { ¿Cómo se hace esto? ¿Qué es eso? ¿Qué es esto? var b = Math.pow ((10, precisión); return Math.floor ((d * b) / b; y ¿Qué es eso? ¿Qué es esto? Función de seguridad de llamada (método) { ¿Qué es esto? mientras (!(r = method.apply ((this, Array.prototype.slice.call ((arguments).slice))) { ¿Qué es lo que está pasando? ¿Qué es eso? ¿Cómo se hace esto? ¿Qué es eso? ¿Qué es esto? La función está en tick ((() { var a = EnsureCall ((exchange.SetContractType, AInstrument)); y var a es el nombre de la aplicación de contratación de la que se trata. Var ticker A = Garantizar la llamada (exchange.GetTicker); var b = EnsureCall (exchange.SetContractType, BInstrument); y var b es el nombre de la aplicación de contratación de la aplicación. Var ticker B = EnsureCall (exchange.GetTicker) y var ticker B es el nombre de la aplicación. var diff = _N (ticker A [__AType] - ticker B [__BType]); LogStatus ((a. InstrumentName, _N ((tickerA[__AType]), b. InstrumentName, _N ((tickerB[__BType]), Diferencia de precio: Si (__lastDiff! = 0) { si (Math.abs(Math.abs(diff) - Math.abs ((__lastDiff)) > 200) { ¿Qué es esto? ¿Qué es eso? ¿Qué es eso? Si (diff! = __lastDiff) { // add agregar datos a series, con el formato de parámetros [número de serie, datos]; __chart.add (([0, [new Date (().getTime ((), diff))); __lastDiff = dif; ¿Qué es eso? ¿Qué es eso? ¿Qué es esto? La función principal (()) { If (exchange.GetName).indexOf (Futures_CTP) == -1) { El lanzamiento de la criptomoneda sólo es compatible con los futuros tradicionales (CTP). ¿Qué es eso? SetErrorFilter ((loginreadydeflowcontroldeflowcontroldeflowcontroldeflowcontroldeflow) el filtro de error de inicio de sesión de la conexión de la página de inicio de sesión de la página de inicio de sesión de la página); // Lo que se transmite a la función Chart debe ser una estructura que no esté relacionada con el contexto (incluida la regla de HighStocks, el parámetro detallado de cómo usar HighStocks) __chart = gráfico Es una herramienta. xDateFormat: %Y-%m-%d %H:%M:%S, %A ¿Qué es esto? ¿Por qué no lo haces? text: Diagrama de análisis de la diferencia de precios del aluminio ¿Qué es esto? Selector de rango: { ¿Por qué no lo haces? El tipo: hour, El número es uno. El texto es el siguiente: ¿Por qué? El tipo: hour, Cuenta: 3. El texto es el siguiente: ¿Por qué? El tipo: hour, Cuenta: ocho. El texto es: ¿Por qué? El tipo: texto: All ¿Qué es esto? Selected: 0 InputEnabled: false (Entrada habilitada para: falso) ¿Qué es esto? Así que el eje de x es: { tipo: barra de fecha y hora barra ¿Qué es esto? Y el eje y: { ¿Por qué no lo haces? Valor: NormalDiff Color: amarillo-verde amarillo. DashStyle: el acrónimo de DashShort es: width: 1, el número de páginas ¿Por qué? Valor: HighDiff Color: amarillo amarillo, DashStyle: el acrónimo de DashShort es: width: 1, el número de páginas ¿Por qué? El valor es: - NormalDiff, Color: amarillo-verde amarillo. DashStyle: el acrónimo de DashShort es: width: 1, el número de páginas ¿Por qué? El valor es -HighDiff. Color: amarillo amarillo, DashStyle: el acrónimo de DashShort es: width: 1, el número de páginas ¿Qué es eso? ¿Qué es esto? ¿Qué es esto? Name: El precio del aluminio está bajando Los datos: [], Es una herramienta. Valor decimales: 2 ¿Qué es eso? ¿Qué es eso? ¿Qué es esto? // reset Descarga toda la información anterior al gráfico // __chart.reset (); var a = EnsureCall ((exchange.SetContractType, AInstrument)); y var a es el nombre de la aplicación de contratación de la que se trata. var b = EnsureCall (exchange.SetContractType, BInstrument); y var b es el nombre de la aplicación de contratación de la aplicación. Log ((a.InstrumentName + . + __AType, -, b.InstrumentName + . + __BType, diferencia de precios como ganancias se muestra en la barra del gráfico); TickInterval = Math.max ((TickInterval, 50)); el valor de las letras de las letras de las letras de las letras de las letras de las letras de las letras Interval = Math.max ((Interval, 50); el valor de la intervalo es el valor de la intervalo. mientras (verdadero) { En este caso, el nombre de la persona es "Tick" (tick). ¿Qué es lo que está sucediendo? ¿Qué es eso? ¿Qué es eso?


- #### 3、CTP手动全平CTP商品期货持仓

在Simnow 上测试 商品期货策略时经常需要把已经开过的仓位平掉重新测试代码,这样就需要个类似一键平仓的程序来处理 恢复模拟账号未开仓状态。这里使用了一个交易处理模块: $.NewPositionManager 就是该模块的接口函数,作用是生成一个对象,可以调用该对象的方法处理具体操作,比如 全平仓: CoverAll(); 。  做了一点额外的功能,在全部平仓完以后,会打印出所有交易的标的物名称。

var p = $.NewPositionManager ((); Función principal Mientras que ((verdadero) { Si es asíexchange.IO("status") === verdadero) { p.CoverAll ((); el nombre de la página en inglés Var positions = _C (exchange.GetPosition); y var positions = _C (exchange.GetPosition); y var positions = _C (exchange.GetPosition); y var positions = _C (exchange.GetPosition) Si el número de puntos es igual a 0, entonces el número de puntos es igual a 0. Log ((positions is :, positions); ¿Qué es lo que está pasando? ¿Por qué no? ¿Qué es eso? LogStatus (no se ha conectado al servidor, está en espera); ¿Por qué no? ¿Qué es lo que está pasando? ¿Por qué no? Var dict =exchange.IO("instruments"); // devuelve la lista de todos los productos de la bolsa {nombre del producto: detalles} en formato diccionario ¿Por qué no lo haces? Log ((Nombre del producto: , k, Detalles del producto: , dict[k]); ¿Por qué no? Log ((exit., _C ((exchange.GetPosition)); y el nombre de la página web de la empresa. ¿Por qué no?

  
- #### 4、商品期货主力合约过滤

  在处理商品期货合约的连续性时会遇到主力合约的问题,如何更快的过滤识别出主力合约呢? 同样也写了个代码模块,可以改造,嵌入,或者单独使用。
  在 filter 变量中指定要 扫描的合约代码头。(即不含日期信息的合约代码的部分)  
    

var str = null; y var strArray = []; La función principal (() { var filter = [MA,CF,zn,SR,pp,l,ni,i,v,jm,al,jd,cs,p]; el valor de las acciones de la empresa es el valor de las acciones. Log (se espera la conexión al servidor de transacciones); ¡Mientras!exchange.IO("status")) Sleep ((1000); y el nombre de la persona que está en el sitio. Log (comenzó a obtener todos los contratos); var instrumentos = _Cexchange.IOEn la actualidad, la mayoría de los usuarios de Twitter no tienen acceso a la red social. Log (Lista de contratos para obtener el botón de éxito); var len = 0; para (Id de instrumento en instrumentos) { ¿Qué es lo que está sucediendo? ¿Por qué no? Log (Lista de contratos de la longitud de las hojas: hojas, len); para (Id de instrumento en instrumentos) { Si (Instruments[instrumentId].IsTrading) { es el valor de las operaciones de negociación var encontrado = falso; para (var i = 0; i < filter.length; i++) { Si (Instruments[instrumentId].ProductID == Filtro[i]) { Encuentro = verdadero; ¿Qué es eso? ¿Por qué no? Si (!found) { Continuar; ¿Por qué no? si (typeof(products[instruments[instrumentId].ProductID]) === undefined) { En el caso de los productos [instruments[instrumentId].ProductID] = []; ¿Qué es eso? Los productos [instruments [instrumentId].ProductID].push (Id de instrumento) y los productos [instruments [Id de instrumento] y los productos [Id de instrumento] ¿Qué es eso? ¿Qué es eso? para (var producto en productos) { var ss = productos; Log ((Log de la culebra de suscripción, product, culebra de la culebra, ss.length, culebra de contratación, para identificar la culebra de contratación principal); Var vol = 0, VolIdx = 0; para (var i = 0; i < ss.length; i++) { _C ((exchange.SetContractType, ss[i]); el tipo de contrato es el siguiente: ¿Por qué no? ¿Qué es lo que está pasando? para (var i = 0; i < ss.length; i++) { _C ((exchange.SetContractType, ss[i]); el tipo de contrato es el siguiente: Var ticker = exchange.GetTicker (en inglés) y var ticker = exchange.GetTicker (en inglés).

        if (ticker) {
            var obj = JSON.parse(exchange.GetRawJSON());
            if (obj.OpenInterest > vol) {
                vol = obj.OpenInterest;
                volIdx = i;
            }
        }
    }
    // 取消订阅行情(之后此合约K线将停止收集), 当然也可以不取消, 这里演示用
    for (var i = 0; i < ss.length; i++) {
        _C(exchange.SetContractType, "-" + ss[i]);
    }
    strArray.push(ss[volIdx]);
    Log("主力合约为", ss[volIdx], "持仓", vol, '#ff0000');
}
for(var i = 0 ; i < strArray.length; i++){
    str += strArray[i] + ',';
}
Log("主力合约:", str);

}


- #### 5、交互模块

  有时候需要给机器人交互,需要下命令、改参数、获取详细运行状态参数 就需要交互代码了。
  

function get_Command ((() {// Función responsable de la interacción, la interacción se actualiza en tiempo real. Los valores relacionados, los usuarios familiarizados pueden ampliarse por sí mismos var keyValue = 0;// Parámetros enviados por el comando var way = null; // el enrutamiento var cmd = GetCommand ((); // obtención de la API de comandos interactivos Si (cmd) { Log (el botón está pulsado: log, cmd);// muestra el registro arrStr = cmd.split ((":"); // La función GetCommand devuelve una cadena, y aquí terminé el problema, porque quiero familiarizarme con el JSON //, por lo que primero se trata de la cadena y se divide la cadena que devuelve la función en dos cadenas: el número; y se almacena en la matriz de cadenas.

  if(arrStr.length === 2){//接受的不是 按钮型的,是数值型。
      jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 
                                                                        //拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
      jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象

      for(var key in jsonObj){ // 遍历对象中的  成员名
          keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
      }

      if(arrStr[0] == "upDateAmount"){// 此处为 数字型  。这里处理分为  按钮  和  数字型  。 详见 策略参数 设置界面 下的 交互设置
          way = 1;
      }
      if(arrStr[0] == "扩展1"){
          way = 2;
      }
      if(arrStr[0] == "扩展2"){
          way = 3;
      }
      if(arrStr[0] == "扩展3"){
          way = 4;
      }
  }else if(arrStr.length === 1){// 此处为 按钮型  
      //路由
      if(cmd == "cmdOpen"){ 
          way = 0;
      }
      if(cmd == "cmdCover"){
          way = 5;
      }
  }else{
      throw "error:" + cmd + "--" + arrStr;
  }
  switch(way){ // 分支选择 操作
      case 0://处理 发出开仓信号
          tiaojian = 1;
          break;
      case 1://处理
          Amount = keyValue;//把交互界面设置的 数值 传递给 Amount
          Log("开仓量修改为:",Amount);//提示信息
          break;
      case 2://处理

          break;
      case 3://处理

          break;
      case 4://处理

          break;
      case 5://处理 发出平仓信号
          tiaojian = 2;
          break;
      default: break;
  }

} }


  有时我们甚至需要在机器人运行时插入运行JS 代码:

var cmd = GetCommand ((); // Llama a la API para obtener el mensaje del control de interacción de la interfaz. if (cmd) { // Determina si hay un mensaje var js = cmd.split ((:, 2) [1]; // dividir El mensaje devuelto Una cadena, restringida a dos, que devuelve un elemento de 1 en el índice. Log (( ejecuta el código de depuración:??, js); // Exporta el código ejecutado Try { // Detección de anomalías eval ((js); // Ejecuta la función eval, que ejecuta el parámetro ((código) enviado. } catch(e) { // Echa una excepción Log ((Exception, e); // Produce información errónea ¿Por qué no? ¿Por qué no?




当然还有很多代码工具尽在 : https://www.fmz.com/square


#### 先写到这,欢迎读者给我留言!提出建议和意见,如果感觉好玩可以分享给更多热爱程序热爱交易的朋友 
https://www.fmz.com/bbs-topic/735

### 程序员 littleDream 原创

Más.