Diário de Inventores de Química Quântica (II) (Completado)

Autora:Sonhos pequenos, Criado: 2016-05-22 20:05:36, Atualizado: 2019-08-01 10:31:58

Nos últimos dias, depois de resolver alguns problemas, quando escrevi o código para o cliente, senti a necessidade de escrever um modelo de gráfico, mostrando indicadores (especialmente indicadores escritos por mim), posições de negociação, etc. Como eu sou um estudante de infância, não estou familiarizado com os highcharts, mas vi um exemplo de um futuro de mercadoria de tamanho Z, senti que o tigre fotógrafo deveria ser capaz de resolver. Então comecei a fazer.

Pergunta 1:

 var ChartObj = {//画图
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},
    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'},
    yAxis: [{
            title: {text: 'K线'},//标题
            style: {color: '#4572A7'},//样式 
            opposite: false  //生成右边Y轴
        },
       {
            title:{text: 'WT'},
            opposite: true  //生成右边Y轴  ceshi
       }
    ],
    series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]                  
};
var chart = Chart(ChartObj);
var isFirst = true;
var preRecordTime = 0;
function Draw(){
    var strState = "";
    var fcolor = "";
    var msg = "";
    getRecords();
    if(isFirst === true){
        chart.reset();
        isFirst = false;
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    if(preRecordTime === globalRecords[globalRecords.length - 1].Time){
        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ],-1]);
    }else{
        //更新前一柱
        chart.add([1,[globalRecords[globalRecords.length - 2].Time,globalRecords[globalRecords.length - 2].Open,globalRecords[globalRecords.length - 2].High,globalRecords[globalRecords.length - 2].Low,globalRecords[globalRecords.length - 2].Close ],-1]);

        chart.add([1,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRecords.length - 1].Open,globalRecords[globalRecords.length - 1].High,globalRecords[globalRecords.length - 1].Low,globalRecords[globalRecords.length - 1].Close ]]);
       
        preRecordTime = globalRecords[globalRecords.length - 1].Time;
    }
    chart.update(ChartObj);
    //chart.reset(500);
}

O código não é bom - pode parecer um pouco desleixado, você pode colar para ver o texto sublime, antes de simplesmente dizer o problema, é que o código é escrito durante a execução, encontrando uma cena estranha, veja:

É estranho, a barra de progresso chega a 100%, está sempre presa, está imóvel, não está morta, deveria estar presa. Eu também usei vários métodos para testar, como: limitar o número de ciclos, mostrar o número de ciclos, mostrar o que está preso até a última vez que o ciclo foi executado. Olhando para o código do programa, parece que não deve haver nenhum problema. Bartus não conseguiu resolvê-lo. Quando iniciei o gráfico, a sequência de dados que eu escrevi era:

 series: [//系列
        {name:'wt1',type:'spline',yAxis:1,data:[]},        //    索引为0的 数据项,   
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  // 索引为1
        {name:'wt2',type:'spline',yAxis:1,data:[]},    //索引为2
        {type:'flags',onSeries:'wt',data:[]}   //......
        ] 

O programa escreve os dados para o gráfico da seguinte forma:

  chart.add([1,[globalR.........    (太长了 没写完)      //   可以看到这里 我写入索引为1 的数据序列,就是add后面[ 符号后的 1,代表写入到{type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},  这个序列中。问题就在这,我越过了索引0,直接写入索引1的数据序列里,就会导致卡死。

O que eu fiz foi alterar para:

  series: [//系列
        {type:'candlestick',yAxis:0,name:'K',id:'wt',data:[]},
        {name:'wt2',type:'spline',yAxis:1,data:[]},
        {type:'flags',onSeries:'wt',data:[]}
        ]  

Todos os códigos para grafar dados (principalmente 1 para 0)

 chart.add([0,[globalRecords[globalRecords.length - 1].Time,globalRecords[globalRe..........(太长了。。。)

É maravilhoso, não pega, não tem problemas de funcionamento. Embora não saiba exatamente por que, a sensação é que deve ser um problema da biblioteca de gráficos.


Pergunta 2

Hoje, atualizamos a postagem porque alguns amigos fizeram perguntas no grupo, por meio de pesquisa, resolução de problemas e gravação específica.

O getticker obtém preços futuros por que são diferentes dos preços reais?img

Eu fiz um teste, e foi diferente. O inventor quantificou o robô. A bolsa é o OK Futures, a última transação obtida com o GetTicker. A partir daí, escrevi um teste específico de código:

function main(){
    exchange.SetContractType("this_week");
    var ticker = exchange.GetTicker();
    var huilv = exchange.GetRate();
    var OKhuilv = exchange.GetUSDCNY();
    while(true){
        huilv = exchange.GetRate();
        ticker = exchange.GetTicker();
        OKhuilv = exchange.GetUSDCNY();
        LogStatus("ticker:",ticker,"\n","huilv",huilv,"OKhuilv",OKhuilv);
        Sleep(1000);
    }
}

O que acontece:img imgEu descobri que as taxas de câmbio são diferentes, eu peguei a taxa de câmbio aqui usando duas funções diferentes de API.imgO que é que isso tem a ver com o que é que o Bitcoin é, e o que é que o Bitcoin é?

O resultado é óbvio: o número de pessoas que usam o aplicativo é de R$ 5 mil, e o número de pessoas que usam o aplicativo é de R$ 5 mil.imgComo o preço no site da OK é apenas um dígito depois de um dígito decimal (o restante não está exposto), estima-se que haverá um pequeno erro. Vendo que os resultados são basicamente iguais, não se pode dizer com certeza que o preço de mercado obtido pelo GetTicker e o preço obtido no OK Futures são diferentes, provavelmente devido a uma inconsistência no câmbio.


Questão 3: Questão da lista de preços da plataforma Bitcoin OKcoin (este problema foi ajustado e agora unifica a lista de preços do mercado em tempo real com a lista de preços do mercado em tempo real).https://www.fmz.com/bbs-topic/474


Pergunta 4: Ontem à noite, um amigo me perguntou onde eu poderia encontrar um exemplo de uso de um botão de interação estratégico, e eu pensei, basta escrever e praticar sozinho, e, por falar nisso, é fácil para todos aprenderem juntos, o velho método, primeiro o código!

/* 交互按钮 测试
while (true) {
  var cmd = GetCommand();
  if (cmd) {
    Log(cmd);
  }
  Sleep(1000);
}
*/
function main(){
    var cmd = null; //初始化一些用到的变量,这个变量是直接接受 GetCommand 函数 返回值的。
    var jsonObjStr = null; //接收JSON对象字符串 的变量
    var jsonObj = null; // JSON 对象
    var keyValue = null; // JSON 对象中的  KEY 的值
    var arrStr = null; // 字符串数组
    var ticker = exchange.GetTicker(); 
    while(true){
        $.Draw(); // 画图函数 , 图表模板的 导出函数
        while(!ticker){
            ticker = exchange.GetTicker();
            Sleep(500);
        }
        cmd = GetCommand(); //获取  交互命令
        if (cmd) {
            Log("按下了按钮:",cmd);
            arrStr = cmd.split(":"); // GetCommand 函数返回的 是一个字符串,这里我处理的麻烦了,因为想熟悉一下JSON ,所以先对字符串做出处理,把函数返回的字符串以 : 号分割成2个字符串。储存在字符串数组中。
            
            
            jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
            //Log(jsonObjStr);//ceshi
            //Log(typeof(cmd));//ceshi
            /*ceshi
            for(var obj1 in cmd){ //  测试用  注释掉了
                Log(cmd[obj1]);
            }
            */
            
            jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象
            //Log("ceshi"); //ceshi
            for(var key in jsonObj){ // 遍历对象中的  成员名
                keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
            }
            Log(keyValue); //ceshi 
            switch(keyValue){ // 分支选择 操作
                case 1:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); //开多仓
                    break;
                case 2:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue ); // 开空仓
                    break;
                case 0:
                    $.SignOP((new Date()).getTime(),ticker.Last,1,keyValue );//平仓
                    break;
                default: break;
            }
        }
        Sleep(2000);
    }
}

O código acima foi testado e não está disponível na praça, então, se você quiser testá-lo, adicione manualmente um botão interativo.imgA partir daí, o projeto foi lançado no Brasil.

Veja como funciona:

img img

É claro que a retrospecção de estratégias não pode ser testada, é necessário criar o próprio robô, testá-lo com um disco de simulação, clicar no botão de interação, e o gráfico marcará a operação correspondente. Aqui, lance um ponto, espero que todos escrevam a estratégia do NB.


Pergunta 5: Um usuário perguntou como obter o nome da moeda eletrônica atualmente em operação e como obter o ciclo da linha K atual.

function main() {
    var records = exchange.GetRecords();
    while(!records || records.length < 2){
        records = exchange.GetRecords();
        Sleep(500);
    }
    var currency = exchange.GetCurrency();
    var diffTime = records[records.length - 1].Time - records[records.length - 2].Time;
    if(diffTime/1000 >= 1 && diffTime/1000 < 60){
        Log("周期:",diffTime/1000,"秒");
    }else if(diffTime/1000/60 >= 1 && diffTime/1000/60 < 60 ){
        Log("周期:",diffTime/1000/60,"分钟");
    }else if(diffTime/1000/60/60 >= 1 && diffTime/1000/60/60 < 24 ){
        Log("周期:",diffTime/1000/60/60,"小时");
    }else if(diffTime/1000/60/60/24 >= 1){
        Log("周期:",diffTime/1000/60/60/24,"天");
    }
    Log("货币品种:",currency);
}

Os amigos interessados podem experimentar.


Questão 6: Se você não entende as funções adicionadas para a nova versão da biblioteca de commodity futures, você pode compartilhar o código da nova versão de anotação para o grupo QQ.

  • O modelo de estratégia pode ser copiado na Praça das Estratégias.img

Pergunta 7: o que significa x = [1 for i in range ((n) ]?

  • Os dois dias livres em que eu estava assistindo ao Python, em geral, não foi muito difícil aprender, mas ainda me deparei com muitos problemas, eu lembro.

    A pergunta é: o que significa x = [1 for i in range ((n) ]? Quando eu vi aqui, eu também tinha a cabeça crescida, e essa sintaxe parecia nunca ter visto antes. Guess Guess, não sei o que isso significa.

Esta é a análise de listas em Python, que significa formar uma lista de 1 a n. A descrição da análise de listas pode ser vista abaixo: Definição e explicação Uma das características mais fortes do Python é a sua análise de lists, que fornece um método compacto para mapear uma lista para outra list através da aplicação de uma função a cada elemento da lista. A análise de lists, também conhecida como compreensão de lista, é mais simples e rápida do que a análise de lists for, especialmente para dados maiores. A análise de lists substitui a maioria dos casos em que são necessários mapas e filtros. A análise de lists fornece uma maneira simples de criar links sem o uso de map, filter e lambda. 2. Lista básica para análise básica [x para x no range ((5)] # [0, 1, 2, 3, 4] l1 = [1, 2, 3,4] [x*2 for x in l1] # [2, 4, 6,8] Múltiplos valores de [ %s = %s for (k, v) in a_map.items (()) ] Então, o ciclo de duas vezes é l1 = [1, 2, 3, 4]. L2 é igual a [1, 2, 3, 4]. [x + y para x em l1 para y em l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] A função [ func ((x) for x in l1] # é igual a map Observe que a análise de listas não altera o valor da lista original, mas cria uma nova lista. 3. Parálise da lista de condições [ x for x in range ((100) if x%2 ==0 ] 4., lista de parâmetros de ninho mat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] troca de matriz [ [row[i] para row in mat] for i in (0, 1, 2) ] # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] O texto acima foi reproduzido do blog do CSDN de Ling Yue.

Para ser honesto, eu não entendi muito o que foi dito acima, mas parece um pouco claro no conceito de que essa frase deve ter algum tipo de função de repetição.
Veja outras pessoas que ajudaram:

i circula no intervalo range ((n), ou seja, i = 0, 1, 2,..., n-1, respectivamente o valor da expressão anterior calculado for, como um item da lista A expressão é 1, com os valores correspondentes 1, 1, 1..., para n 1, gerando uma lista que contém n 1 [1, 1...]

O que parece mais claro, mais tarde veremos.

x = [i para i na lista] Mapear uma lista para outra lista, com cada elemento definido como i x = [1 for i in range ((n) ] Mapear a lista range ((n) para a lista x, com cada elemento definido como constante 1 Bem-vindo ao forpython.com para conversar

Pergunta 8: A base do python não é sólida, foi devolvida, foi negligenciada por meio dia, veja o problema abaixo.

O presidente do banco de dados do Google, Mark Zuckerberg, escreveu ontem uma estratégia de teste para o Python CTP commodity futures equilátero, e pediu para testar o Python CTP commodity futures retesting system. Hoje continuamos a testar e descobrimos que a estratégia não segue completamente a linha uniforme para abrir e liquidar a operação, sentimos que deve haver problemas, verifique, teste e descubra funções individualmente. A função de cruzamento não retorna o código de valor correto como foi projetado:

def Cross(records,fast,slow): # 交叉函数 ,参数是  records K线数据   、  fast 快线周期   、slow 慢线周期
    global array_S_MA,array_F_MA   # 使用外部的 全局变量
    array_F_MA = TA.MA(records,fast)  # 调用指标函数
    array_S_MA = TA.MA(records,slow)
    n = 0   # 返回的信号值   0:不操作   , 1 : 金叉     -1: 死叉 
    if array_F_MA[-2] > array_S_MA[-2] and array_F_MA[-3] < array_S_MA[-3] and array_F_MA[-4] < array_S_MA[-4]:
        n = 1
        return n
    elif array_F_MA[-2] < array_S_MA[-2] and array_F_MA[-3] > array_S_MA[-3] and array_F_MA[-4] > array_S_MA[-4]:
        n = -1 
        return n

Como é que é? Veja, é um erro muito novato! Eu escrevi o return n no ramo condicional, o que parece ser um problema. O que é que isso vai retornar?

A partir daí, fizemos uma pequena experiência:

img

Definir uma função de teste que produz apenas uma mensagem

img

Vamos chamar isso e escrever isso para ver se nenhum é igual a menos um.

img

Quando a função não executa um retorno, o valor de retorno da função é None, que também não é igual a -1, mas se a função for menor que 0, é um valor verdadeiro.

Pergunta 9: Pergunta de referências circulares no JS.

O que é que eu faço com esse código?

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

TypeError: Converting circular structure to JSON (Este erro me levou meia hora!)

Depois de meio dia de pesquisa, descobri o problema.obj.exchange = exchange;A citação resultante do ciclo, resolutamente, salta para a frente quando for (var k in obj) é encontrado no ciclo k === exchange .

O código é o seguinte:

function main(){
    obj = {
        exchange : null,
        initAccount : null,
        state : 0,
        exchangeName : "",
    }
    obj.name = "OKCoin";
    obj.exchange = exchange;
    obj.initAccount = obj.exchange.GetAccount();
    obj.state = 2;
    var table = {
        type : 'table',
        title : '测试',
        cols : ['obj属性名', '值'],
        rows : [],
    };
    for(var k in obj){
        if(k === 'exchange'){  // 增加的代码
            continue;
        }
        table.rows.push([k, obj[k]]);
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

img

É normal, mas é possível ver como a citação circula?

Pergunta 10: Futures de commodities Em uma sexta-feira à noite, abrir uma posição, manter uma posição, após a abertura da segunda-feira seguinte, invocar a função GetPosition Obter informações sobre a posição e por quê

img

A razão é a seguinte:

img

Para ver os valores dos atributos do tipo dos objetos de informação de posições específicas:https://www.fmz.com/bbs-topic/672

Quando vi isso, senti que deveria começar a praticar... e você?

Mais.

Botvsing2A gente tem que fazer isso.

Sonhos pequenosO blogueiro, que tem um grande interesse em escrever, pediu um espaço QQ para que fosse fácil de ver e encontrar.