Diario de aprendizaje de química cuantitativa del inventor (a)

El autor:Un sueño pequeño., Creado: 2016-05-23 23:10:46, Actualizado: 2019-08-01 10:31:25

Antes era raro escribir un diario, ahora siento que necesito registrar algo todos los días, ¿no puedo mirar a la luz? ¿Qué escribir? ¡Registra tu aprendizaje, trabaja! (de hecho, casi todo..) Hoy en día, además del trabajo diario, es escribir un módulo para el cliente, volver a probar todo el código, no hay ningún problema, excepto una línea de indicador extraña en el gráfico, todo lo demás parece normal, OK, prueba de simulación.

¿Qué es lo que está pasando?

  • 1, la línea K del gráfico a veces está faltando un BAR, está buscando BUG. El problema se encuentra, se analiza y no se reciben datos cuando se prueba con el disco analógico. En el momento de recibir los datos, ya se han pasado 2 BAR, por lo que los datos más recientes están pintados en el gráfico, lo que hace que el intervalo pase uno o más.
  • 2, corre por un tiempo (circuito de la línea K de 1 minuto) sin problemas, intenta de nuevo (circuito de la línea K de 30 minutos) el problema viene y aparece de forma misteriosa:

TypeError: cannot read property length of null duk_hobject_props.c:2258 WToneAndWTtwo __FIL Este error fue reportado.

Lo que veo a continuación es un error que debería estar en la función WToneAndWTtwo, se lee el nombre de la función null, una propiedad llamada length, es decir, una variable como var name = null; y luego yo Se ha leído name.length y se busca el lugar donde se puede llamar a la longitud de todo el código. También se ha escrito una función para resolver este error:

function isNullAndLog(arr,strArrName){//空数组报错
     if(!arr){
         Log("arr is:",arr,"name:",strArrName);
         return true;
      }
      return false;
}

Piensa, ¡oh! Ahora todas las variables que se utilizan para la longitud las pongo en esta función para comprobar si hay un BUG nulo que no pueda escapar. Después de 30 minutos de prueba de K-Line, se borra... otra vez:

TipoError: no puede leer la propiedad length de duk_hobject_props.c:2258 WToneAndWTtwoEl archivoNo puedo creerlo.

¡Pasiencia! sal a dar una vuelta y cambia de opinión o quizás te despiertes! De regreso, me pregunto si se ha llamado a la base de datos, los parámetros que se han enviado son nulos, se ha producido un error al ejecutar la base de datos.

function isNullAndLog(arr,strArrName){//空数组报错
    if(!arr){
        Log("arr is:",arr,"name:",strArrName);
        return true;
    }
    return false;
}

function main(){
   if(typeof(x) === undefined ){
       Log(typeof(x));
   }
    var aaa = null;
    Log(isNullAndLog(aaa));
    /*
    while(!aaa || aaa.length < 9){
        Log("while xunhuan");
        Sleep(5000 * 1000);
    } 
    */
    talib.EMA(aaa,5);
} 

Talib.EMA ((aaa,5); la clave es aaa es null, la puse a propósito y pasé a ver qué ocurría. TypeError: Cannot read property length of null ~~OK. Es muy probable que este sea el problema, continúa modificando el código.

¿Qué es esto?

El otro problema es que antes se pensaba en grabar el código ahora:

function DeleteNullEle(initArr){
    var dealArr = [];
    var initArrLen = initArr.length;
    for(var i = 0,j = 0 ; i < initArrLen ; i++,j++){
    //Log("initArr-",i,":",initArr[i]);//ceshi
    if(initArr[i] === null || isNaN(initArr[i]) ){
        j--;
        //Log("i:",i);//ceshi
        continue;
    }
        dealArr[j] = initArr[i];
    }
    //Log("dealArr:",dealArr);//ceshi
return dealArr;
}

La razón por la que añadimos esta función es que algunas matrices son como [NaN, NaN, NaN, 22, 3, 56, 78, 4, 23]. Pero cuando los inventores cuantificaron la prueba con la función Log, mostraron que era nulo, esto es, que la función log es la misma que la función log. Me ha dejado perplejo durante mucho tiempo, gran pozo, hay que recordar que lo que ves es null o NaN, por lo que no se puede juzgar nada.
Y otro punto, es este while ((!aaa gbla aaa.length < 10) {...}, si aaa === null, ¿por qué no se devuelve el error, porque en el caso de la expresión de este operador ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Algunas de las APIs se han utilizado.

¿Qué es esto?

Además, un grupo de amigos me pidió que cambiara el monitoreo de diferencias, que en realidad es un rango de detección de diferencias, y WeChat lo empujó, muy simple.

 if (diff != __lastDiff) {
//--------------------------------------------------------------------------------------------
        if(openWeixin){
            if( (diff <= price1 || diff >= price2 ) && off_on === true ){
                Log("差价:"+diff+"微信推送@");
                off_on = false;
                Sleep(1000);
            }else{
                off_on = true;
                Sleep(1000);
                }
        }
//---------------------------------------------------------------------------------------------
        // add添加数据到series, 参数格式为[series序号, 数据];
        __chart.add([0, [new Date().getTime(), diff]]);
        __lastDiff = diff;
    }

img

El código que se agrega entre las líneas de código vacías es muy sencillo y puede no ser perfecto.

Pregunta 4 (no es un problema, sólo un poco de estudio)

Hoy en día, la estrategia de aprendizaje de futuros es más compleja que la del mercado de a pie (¡Afortunadamente, hay un modelo de comercio de futuros grande Z, o escribir los detalles de la transacción es suficiente para beber >____

  • exchange.GetPosition ((() // se utiliza para obtener información sobre el almacenamiento. Tenga en cuenta que esta función devuelve una matriz de una estructura de posiciones que contiene información específica sobre el almacenamiento.
  • exchange.SetMarginLevel ((MarginLevel) // Esta función es para establecer el apalancamiento. Parámetros específicos MarginLevel Selección ((5 veces? 10 veces?) Dependiendo de la variedad, el intercambio, específicamente, algunos no pueden cambiar ((como futuros de productos CTP)
  • exchange.SetDirection ((Direction) // Esta es una API muy importante, que se llama antes del siguiente menú, porque acabo de introducir cuatro operaciones ((vendir y vender...), esta función es la que establece estas operaciones (aunque hay un poco de contenido adicional), y el segundo parámetro de CTP aún no se ha estudiado.
  • exchange.SetContractType ((ContractType) // Una de las funciones es establecer el tipo de contrato antes de la apertura o liquidación de la operación (más? vacío? plano?), mientras que la otra es establecer el tipo de contrato (más? blanco? algodón?), por lo que se utiliza esta función para establecer el tipo de contrato. En el fondo, también se usan estas funciones. Las funciones restantes son las mismas que las actuales.
  • exchange.Buy ((() // Comprar
  • exchange.Sell() // Vender A continuación se muestra el código de mi experimento, con sólo un segmento seleccionado (se puede copiar en la función principal para probar) y se repetió.img
 if (!manager) {//Z大写的商品期货模板类库,用来管理交易的对象(manager 初始时null)。不明白的可以去看源代码,QQ群共享有注释版。
        if (_C(exchange.GetPosition).length > 0) {
            throw "策略启动前不能有持仓.";
        }
        Log('交易平台:', exchange.GetName(), _C(exchange.GetAccount));  //输出当前交易所 信息
        var insDetail = _C(exchange.SetContractType, ContractTypeName);  // 用容错函数 _C ,容错调用 SetContractType函数  首先明确 设置交易的合约类型。
        Log("合约", insDetail.InstrumentName, "一手", insDetail.VolumeMultiple, "份, 最大下单量", insDetail.MaxLimitOrderVolume, "保证金率:", insDetail.LongMarginRatio.toFixed(4), insDetail.ShortMarginRatio.toFixed(4), "交割日期", insDetail.StartDelivDate);
        // 上面这个Log 显示出合约的一些信息,注意 在回测的时候,与实际运行的结果不一样,可以看图杠杆都是null,保证金率都是0,可以试试看。
        manager = $.NewPositionManager();  // 这个生成管理者 对象
    }
    exchange.SetMarginLevel(10); //不支持       在这里我试着设置了一下杠杆试试,发现  显示 错误:Not support     ,CTP商品期货 应该不能自己调整杠杆
    var positions = exchange.GetPosition();     在所有的操作前 ,我试着调用了一下 GetPosition 函数  获取一下持仓信息,显示的null
    Log(positions[0]);
    exchange.SetDirection("buy"); // 在所有的操作前需要设置  操作方向  ,这里设置 买开仓(做多)。
    var id = exchange.Buy(1911,1); // 执行买入操作  下了一个  限价单,  有兴趣的同学 可以试试 市价单。(嘿嘿!自己动手记得牢)
    positions = _C(exchange.GetPosition); //再获取下 持仓信息 看看
    Log(positions);  //有持仓信息了,  在上面 Buy的时候  有兴趣的同学 试试 用低价格 买入。  Buy(1000,1) 看看。

Pregunta 5: Hoy un amigo escribió un fragmento de código preguntando por la función Sleep (()) con un error muy grande que afecta a la política de alta frecuencia.

function main(){
    for(var i = 0 ; i < 10 ; i++){
        var b1 = 0;
        var b2 = 0;
        var b3 = 15;
        while(b1 < 200){
            var t2s1 = (new Date()).getTime();
            b1++;
            Sleep(b3);
            var t2s6 = (new Date()).getTime();
            b2 += (t2s6 - t2s1);
        }
        Log("Sleep()",b3,"MS",b1,"平均次数",b2/b1);
    }
    throw 2;
}

Hice un retrospecto y encontré que la función Sleep se ejecuta en el retrospecto en un segundo (un error de tiempo antes y después de 1000), entonces el error de tiempo del código de prueba es muy grande, pero si se ejecuta con el simulador, el error es básicamente de menos de un milisegundo. Puede ser que el sistema de retrospección pertenece al modelo de caja de arena, el error causado por el algoritmo de tiempo de ejecución en el interior. La simulación tiene un error pequeño (dentro de 1 segundo).

Pregunta 6: Esta mañana un amigo de M me dijo que el administrador se había caído a medianoche y me envió el registro del sistema.

- Este es el diario.

runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7f332c591cc9 m=2

goroutine 0 [idle]:

goroutine 1 [select, 207 minutes]:

Desde la primera línea se ve que el proceso de generación del hilo ha fracasado, los recursos están temporalmente no disponibles (insuficiencia). La solución: 1, comprueba si el código de la política del robot está en ejecución, si los recursos utilizados no se han liberado, si hay una API que utiliza múltiples hilos; 2, el uso del comando ulimit para comprobar las limitaciones del sistema en el que se encuentra el administrador ((Linux) ).http://smilejay.com/2012/04/fork_resource/¿Qué es esto? 3.Preocupación por el uso de la memoria del sistema.

Para mostrar el valor de ulimit -a:img

Los parámetros del comando ulimit: -H establece una restricción de recursos de hardware. -S establece restricciones de recursos de software. -a muestra todas las restricciones de recursos actuales. -c size: Es el valor máximo que se puede establecer para el archivo de núcleo. Unidad: blocks -d size: el valor máximo del segmento de datos. Unidad: kbytes -f size: establece el valor máximo para crear un archivo. Unidad: blocks -l size: Es el valor máximo que se establece para bloquear el proceso en memoria. Unidad: kbytes -m size: Es el valor máximo de la memoria permanente que se puede establecer. Unidad: kbytes -n size: establece el valor máximo de los descriptores de archivos que pueden abrirse simultáneamente en el núcleo. Unidad: n -p size: el valor máximo de la zona de amortiguación de la tubería. Unidad: kbytes -s size: Es el valor máximo que se puede establecer para el montón. Unidad: kbytes -t size: límite máximo de tiempo de uso de la CPU. Unidad:seconds -v size: Es el valor máximo de la memoria virtual. Unidad: kbytes -u < Número de programas > Número máximo de programas que puede ejecutar un usuario

Un amigo que tuvo este problema descubrió que la función de filtro errónea podría ser la causa del problema, y encontró la causa del colapso del administrador (memoria en expansión); la causa está en la política. SetErrorFilter (( 502: 503: tcp character unexpected network timeout WSARecv Connect GetAddr no such reset httppreceived EOF reused ); Función de uso indebido, la función sólo necesita una llamada y no puede escribirse en la estructura de la vuelta. El problema de la memoria continua es que la función se escribe en la función onTick, la llamada continua de la vuelta, lo que conduce a la caída final.

Pregunta 7: Resumen sencillo de la función _C (), la función _N (), la función _G (), el uso de la función.

  • La función _C()

Explicación: Esta función se utiliza principalmente para la API de errorización, por ejemplo, la función exchange.GetAccount ((), llamada así: _C ((exchange.GetAccount); tenga en cuenta que el nombre de la función no incluye paréntesis, si la función tolerante a errores requiere la adición de parámetros, se escribe en el segundo parámetro de la función _C(, en seguida, hacia atrás. Usar ejemplos.

function main(){
    var account = null;
    var amount = 1;
    var price = 2000;
    account = exchange.GetAccount();
    Log("_C 函数使用前  account :",account);
    //exchange = null; 
    _C(exchange.Buy,price,amount);
    //exchange.Buy(price,1);
    account = exchange.GetAccount();
    Log("_C 函数使用后  account :",account);
}

Es probable que la función_C se vea así:

 function ___C(functionName,p1){
    functionName("执行需要容错的函数,传入的测试参数为:",p1);
    Log("__C 容错函数启动,容错完毕");
}
function main(){
    pstr = "测试参数--hello";
    ___C(Log,pstr);
}

Los resultados de la ejecución:img

  • Función _N() Explicación: Esta función se utiliza para manejar el exceso de postdigitos de decimales, conservando algunos decimales. Ejemplos de uso:
function main(){
    var pi = 3.1415926535897;
    Log("使用_N函数 前pi:",pi);
    var piOfDeal = _N(pi,2);
    Log("使用_N函数后 pi:",piOfDeal);
}

Los resultados de la ejecución:img

  • La función _G() Explicación: Esta es una lista de diccionarios globales que se puede guardar en la documentación de la API. Tabla KV, archivos permanentemente guardados localmente, una base de datos separada para cada robot, que persiste después de un reinicio o una salida del administrador K debe ser un número o una cadena, sin distinción de tamaño o letra baja, y V puede ser cualquier contenido que pueda ser ordenado en JSON _G ((num, 1); // establece una variable global num, con un valor de 1 _G ((num, ok); // Cambiar una variable global num, con el valor de la cadena ok _G ((num, null); // Elimina las variables globales num _G ((num); // devuelve el valor de la variable global num _G(); // devuelve el ID del bot actual _G(null); // Elimina todas las variables globales
function main(){
    Log("totalYLMoney 初始赋值 0");
    var totalYLMoney = 0;
    Log("totalYLMoney 已赋,  = ",totalYLMoney);
    if(typeof(_G("totalYLMoney_save")) !== "object"){
        totalYLMoney = _G("totalYLMoney_save"); 
        Log("读取 totalYLMoney 本地数据库 名称为totalYLMoney_save 的值 赋给 totalYLMoney ");
    }else{
        totalYLMoney = 100.12546328765458;
        _G("totalYLMoney_save",totalYLMoney.toString());
        Log("记录 totalYLMoney 保存到本地数据库");
    }
    Log("totalYLMoney",totalYLMoney);
    Log("typeof\(_G(\"totalYLMoney_save\"))",typeof(_G("totalYLMoney_save")));
}

El código de prueba de la función _G ((() anterior requiere una prueba en el robot, la prueba de retraso no es compatible. El método de prueba, si se implementa un programa en el robot, la primera vez que se inicia el robot, el robot registrará 100.12546328765458; este valor en el diccionario global "totalYLMoney_save" en el nombre de "totalYLMoney_save", una vez que se ejecute el robot, se encontrará que var totalYLMoney = 0, que después de la inicialización de la variable totalYLMoney, aún lee el valor almacenado en el diccionario cuando se ejecuta la política por primera vez.

¿Qué es lo que está sucediendo con el dinero? ¿Qué es lo que está sucediendo con el dinero?

Muchas veces veo a los nuevos compañeros en el grupo, preguntando por los algoritmos de ganancias y pérdidas estratégicas. En general, hay varios métodos de tratamiento, aquí se envía un poco más simple, las ideas también son proporcionadas por el maestro en el grupo, aquí me encargo de explicar.

  • Los beneficios flotantes:

El beneficio flotante es: dividido por (moneda actual - moneda inicial) x precio actual + (moneda actual - moneda inicial)

Ejemplo: por ejemplo, el precio inicial de la moneda es de 10 dólares, la cuenta comienza con 5 monedas, 100 dólares. Durante un cierto período de tiempo, compré 3 monedas a un precio promedio de 15 dólares. Al final de este período, el precio de la moneda aumenta a 20 dólares. En este momento, mi cuenta es: 8 monedas, 55 dólares. Profit = (8 - 5) * 20 + (55 - 100) = 60 + (-45) = 15 Este método de cálculo La ganancia es de 15 yuanes. (Nota: en este momento, sus ganancias son flotantes, porque si el precio de la moneda cae mucho en este momento, tal vez no solo no gane, sino que también pierda dinero, por supuesto, perder dinero también es flotante, porque sus ganancias en este momento siguen el precio de la moneda flotante, la razón es que hace una gran caída de la bolsa). Además, si en el momento en que el precio de la moneda es de 20 dólares, el equilibrio, es decir, 20 dólares para vender 3 monedas compradas por 15 dólares, en este momento la cuenta es: 5 monedas, 115 dólares; o el algoritmo anterior: Profit = (5 - 5) * 20 + (115 - 100) = 15, la ganancia sigue siendo de 15 yuanes, la diferencia es que si no se considera la devaluación inicial de la moneda, la ganancia no fluctúa con el precio.

  • Los beneficios de cuenta:

La ganancia de la cuenta: (Coin ahora x precio ahora + dinero ahora) - (Coin inicial x precio inicial + dinero inicial)

Usemos el ejemplo anterior: por ejemplo, el precio inicial de las monedas es de 10 dólares, la cuenta comienza con 5 monedas, 100 dólares. Durante un cierto período de tiempo, compré 3 monedas a un precio promedio de 15 dólares. Al final de este período, el precio de las monedas aumentó a 20 dólares. Profit = (8 * 20 + 55) - (5 * 10 + 100) = 215 - 150 = 65 Este método de cálculo tiene una ganancia de 65 dólares. De la misma manera, he comprado 3 monedas a un precio promedio de 15 y las he vendido a un precio promedio de 20 dólares. Profit = (5 * 20 + 115) - (5 * 10 + 100) = 215 - 150 = 65 también.

La comparación de los dos métodos anteriores, un beneficio de 15 y un beneficio de 65, no es difícil de ver. El primer método ignora las ganancias y pérdidas derivadas de la devaluación de la moneda inicial. El segundo algoritmo calcula las ganancias y pérdidas al incluir las ganancias derivadas de la devaluación de la moneda inicial. El cálculo de las ganancias en cuenta se aplica a los fondos de liquidación. Las ganancias flotantes se aplican a las ganancias y pérdidas generadas por transacciones durante un período de tiempo. Estos son algunos de los experimentos de análisis de sueños pequeños, si hay errores, por favor, el dios de los dedos correctos, gracias por adelantado ^-^

Pregunta 9: Un miembro del grupo vio que el bar de estado de una política abierta mostraba una tabla, por lo que fue a revisar la API y encontró que parecía haber añadido una nueva función, la función LogStatus en la API, que podía dibujar tablas.

Para empezar, veamos la API de la plataforma:

LogStatus(Msg); //	此信息不保存到日志列表里, 只更新当前机器人的状态信息, 在日志上方显示, 可多次调用, 更新状态
LogStatus('这是一个普通的状态提示');
LogStatus('这是一个红色字体的状态提示 #ff0000');
LogStatus('这是一个多行的状态信息\n我是第二行');
var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]};
LogStatus('`' + JSON.stringify(table)+'`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格)
LogStatus('第一行消息\n`' + JSON.stringify(table)+'`\n第三行消息'); // 表格信息也可以在多行中出现
LogStatus('`' + JSON.stringify([table, table])+'`'); // 支持多个表格同时显示, 将以TAB显示到一组里

El código de prueba:

function main(){
    var value1 = 99;
    var value2 ="ceshi 01";
    var table1 = { type : "table", title : "ceshi1", cols : ["列1","列2","列3"] , rows : [ ["abc","def","ghi"] , ["1","2","3"] ] };
    var table2 = { type : "table", title : "ceshi2", cols : ["列1","列2","列3"] , rows : [ ["abc",value1,"ghi"] , [value2,"2","3"] ] };
    LogStatus("测试文本1\n`" + JSON.stringify([table1,table2]) + "`");
}

imgEn el primer gráfico se puede ver que en la tabla ceshi1 que hemos dividido en páginas, el formato de datos de la tabla es var table1 y var table2, las dos variables declaradas. Por supuesto, el contenido de la tabla 1 es una cadena fija. Hay que tener en cuenta que antes y después de la función JSON.stringify (([table1, table2]) se debe añadir `; de lo contrario, la tabla no se muestra. Por supuesto, debemos mostrar datos dinámicos con tablas, no siempre puede ser contenido de texto fijo. La tabla 2 contiene dos datos de prueba, value1 y value2, que se encuentran en esta sección.imgLos nuevos estudiantes pueden copiar el código, probarlo y cambiarlo ellos mismos.

Pregunta 10: Un usuario que desea un gráfico de rendimiento puede que actualmente la descripción de la documentación de la API cuantificada por el inventor sea más simple y el uso del gráfico pueda ser más difícil. Aquí escribo abierto, tirando guiones.

En el gráfico, la curva de rendimiento se muestra usando un número aleatorio de variaciones dinámicas de rendimiento.

var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A',enabled:true,valueDecimals:2,valueSuffix:'%'}, //提示框  就是鼠标在线上时 显示的一个 框框 里面有一些内容,这里是设置提示框的格式
    chart: { zoomType:'x',panning:true },//图表缩放  
    title: { text: '收益率 %'}, //标题
    rangeSelector: { //范围 区域 选择 
            buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
            selected: 0,
            inputEnabled: false
        },
    subtitle: {text: " 显示瞬时收益率 % "},//副标题
    xAxis:{type: 'datetime'}, //设置 X轴  的数值为时间类型
    yAxis: [{
            title: {text: '收益率 %'},//标题
            style: {color: '#4572A7'},//样式 
            //opposite: false  //生成右边Y轴
        }
    ],
    series: [//系列
        {name:'收益率',dataLables:{enabled:true,format:'{y} %'},type:'spline',yAxis:0,data:[]} //该图标只用到一条曲线  ,所以 只用设置一个数据序列
        ]                  
};
var chart = Chart(ChartObj);  //初始化

function main(){ //测试用的主函数
    chart.update(ChartObj); //更新
    chart.reset(); //清空图表
    var i = 0; //初始一个 i 值 , 后面循环用,   用来限制循环次数
    var randomNum = 0; //声明一个  随机数 初始化 0
    while(i < 5000){ //限制循环次数
        randomNum = Math.random() * 10;  // 生产随机数 0  -  9.9999
        //chart.add([0,[(new Date()),randomNum]]);
        chart.add(0,[(new Date()).getTime(),randomNum + 5]);  //把生成的随机数  按照时间(X 坐标)     把随机数 画在图表上(Y坐标)     
        Sleep(1000*60); // 程序 每次循环暂停60秒
        //chart.update(ChartObj);
        //chart.reset(500);
    }
    Log("over");
}
  • Aquí hay un problema que me ha confundido durante medio día, y también lo he registrado. En el momento de escribir el tiempo, debe ser de milisegundos, así que escriba: new Date (().getTime (() Esto es de milisegundos, si es new Date (()) entonces hay un pequeño problema, como la visualización del tiempo, y el aumento del eje X no se puede usar. También hay una herramienta: {xDateFormat: %Y-%m-%d %H:%M:%S, %A,enabled:true,valueDecimals:2,valueSuffix:%}, esta configuración se ve en el buscador de datos.

Más.

- ¿ Qué?¿Puede decirme, por favor, si tengo un pedido que no se ha completado, cómo debo cancelarlo?

- ¿ Por qué?¡Esto tiene que ser un elogio!

La lluvia está muy fuerte.Hay muchas cosas que la documentación de la API no dice.

Las hojas caen en otoñoLo bueno de todo lo que Shirin ha organizado

Las estrategias de venta a alto precio de las líneas cortas¡Qué bueno!

Un sueño pequeño.¿Qué es lo que está pasando? https://dn-filebox.qbox.me/bf52888dc68aba5326c403f2280994e81fbce2ee.png En la actualidad, la mayoría de los botvs están conectados a Internet.

Un sueño pequeño.¡Es fácil de aprender!