Jogar JavaScript com os velhos - criar um parceiro que faça compras e vendas (2) nasceu em uma caixa de areia

Autora:Sonhos pequenos, Criado: 2017-03-06 10:41:40, Atualizado: 2017-10-11 10:36:53

Jogar JavaScript com o velho e criar um parceiro para comprar e vender.

Nascido numa caixa de areia

  • Sistema de caixa de areia

    Ao pesquisar na internet, descobri que os programas de computador para negociar em títulos financeiros são chamados de negociação programada, negociação quantitativa. O nível de matemática do velho branco também é de nível universitário, a estatística tem apenas alguns conceitos básicos: distribuição normal, expectativa, integração, etc. Não se atreva a dizer que é mais quantificado no aprendizado de programação, quantificação. No processo de aprendizado, programação, quantificação ou prática.

    A ideia de que uma caixa de areia útil precisa de:

    • 1, o máximo de simulação de sequências de tempo reais, ou seja, quando um programa está sendo executado em uma caixa de areia, a sequência de tempo deve ser o mais próxima possível das condições reais, com base no nível de tick, para que os resultados dos testes tenham um valor de referência. Pode causar uma velocidade limitada do programa em uma caixa de areia, mas a velocidade de execução também é um fator muito importante.

    • 2, vários parâmetros de controle de opções, que não são os parâmetros do programa testado, mas os parâmetros do sistema de caixa de areia. Por exemplo: configuração da bolsa (futuros? Ações? Forex?), informações de contas simuladas da bolsa em teste, taxas de transação da bolsa, taxa de deslizamento que pode ocorrer, controle de tempo, etc.

    • 3, ajuste de parâmetros do programa: às vezes, o velho tem uma pilha de parâmetros de reserva, para tentar ver qual é o melhor. Um bom sistema de caixa de areia pode aceitar uma pilha de parâmetros predefinidos e, em seguida, executá-los, analisar os resultados e mostrar o melhor.

    • 4, teste de erro: o programa de simulação geralmente corre sem problemas, com o vento calmo, porque está dentro da bacia de água (quantas ondas podem ser?), mas na realidade há um oceano profundo inesperado, com tempestades desconhecidas em todo momento. Então o sistema de caixa de areia deve criar algumas ondas de vento mecânicas na bacia de água, simulando o máximo possível o ambiente ruim (é lançar todos os tipos de dados errados, relatórios de erros da rede, até mesmo dados logicamente impossíveis).

    • 5o, gráficos mostram: os gráficos podem registrar muitos dados úteis para análise, como gráficos de ganhos, curvas de diferença de preços, etc.;

  • A primeira coisa que fizemos foi escrever um código simples em JS, que foi usado para criar um sistema de sandbox.

    • 1, Arquitetura geral do programa de automação de futuros de commodities CTP O fundo usado pelo velho branco já envelopou uma função.exchange.IO("status")Para identificar se o servidor frontal da empresa de futuros está conectado. O velho respondeu: Os futuros de commodities usam o protocolo CTP, e a estrutura de conexão é: o terminal do cliente da empresa de futuros (código branco antigo) ----> o servidor frontal da empresa de futuros -----> o servidor da bolsa. Voltar ao assunto, quando os futuros de mercadorias estão fora de circulação, é a impossibilidade de se conectar ao servidor frontal da empresa de futuros (o servidor frontal da empresa de futuros fica fechado após um determinado período de tempo de fechamento); ou o CTP que causa a desconexão de algumas situações. Para lidar com essas situações, os procedimentos tradicionais precisam de intervalo de tempo para determinar o estado da conexão, evitando fazer algumas operações sem conexão, causando 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次数据。
          }
      }
      

      O que você pode fazer é correr dentro da caixa de areia:

      img img

      Como você pode ver no gráfico, a conta de teste de retorno que configuramos é de 100W.

      img

    • Como é que o programa consegue obter os seus dados de informação de conta, uma vez que o fundo é encapsulado e transformado numa função?exchange.GetAccount()O que você pode fazer é tentar essa simples frase.

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

      A única coisa que eu sei é queMainLoop()Escrever funçõesexchange.GetAccount();

      O resultado é que nada aparece. A função está executada, mas não foi chamada a função de impressão de logs.Log(), o parâmetro da função é para a saída de várias variáveis, pode ser transmitido vários com intervalos de vírgulas.

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

      img

      O MainLoop é executado continuamente (intervalo de 1 segundo dependendo da função Sleep) para que todos os registros do sistema de retrospecção sejam dados de contas simuladas.
    • Em seguida, em uma caixa de areia para solicitar alguns outros dados, o velho branco costumava se concentrar no aço de roscas, a variedade de produtos futuros, porque também se concentra no preço da casa. O problema é positivo, já que para que o programa faça compras e vendas por pessoas, o mercado é indispensável.

      A primeira coisa que você precisa saber é qual a variedade do mercado, por exemplo, sobre o contrato de aço 1705 de borracha.exchange.SetContractType("rb1705")Além disso, eu gostaria de saber o que está acontecendo com o contrato rb1705 no momento (o ponto de tempo no sistema de retrospecção é quando ele está em execução).exchange.GetTicker()Em seguida, eu gostaria de conhecer as estatísticas do ciclo histórico de preços do contrato.exchange.GetRecords()A partir deMainLoopA função pode 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

      Selecionar parte dos registros Valor da variável (tipo de matriz): Não. {Time:1486083600000,Open:3354,High:3358,Low:3071,Close:3272,Volume:328708.00000000006}, {Time:1486083900000,Open:3272,High:3272,Low:3228,Close:3228,Volume:133542},... O Time: é um botão de tempo, em milissegundos. Open: preço de abertura, High: preço máximo, Low: preço mínimo, Close: preço de fechamento, Volume: volume de transações

      O valor da variável ticker (objeto) impresso: {High:3090.5,Low:3088.5,Sell:3090.5,Buy:3088.5,Last:3089.5,Volume:100} High: preço mais alto atual; Low: preço mais baixo atual; Sell: preço de venda atual; Buy: preço de compra atual; Last: preço de transação atual; Volume: volume de transação atual

      Informações sobre o contrato rb1705: ((Vere a descrição dos campos no protocolo CTP.)) - Não. Combinação Tipo: 0, A partir de agora, o Google vai criar um novo aplicativo para o seu site. O que é o que você está fazendo? O que é que ele está a fazer? O EndDelivDate está disponível em: 20170522 O que é o que você está fazendo? O que é o que você está fazendo? A partir de agora, a empresa está a trabalhar com a empresa para a criação de um novo projeto. O filme foi produzido pela Disney e foi produzido pela Disney. O instrumento de identificação é o rb1705. O nome do instrumento é RB1705 O IsTrading disse: O Long Margin Ratio é de 0,06%. O que é o que você está fazendo? O MaxMarginSideAlgorithm é: O MaxMarketOrderVolume é: O que é o que você está fazendo? O MinMarketOrderVolume é: A partir de agora, o site será disponibilizado para o público em geral. Opções Tipo: 0, PositionDateType :49, O que é o que você está fazendo? O preço do Ticket é um: O que é o que você está fazendo? O produto é um produto que você pode usar em qualquer lugar. A taxa de margem de curto prazo é de 0,06%. A partir de agora, a empresa vai continuar a oferecer serviços de marketing online. O que é o que você está fazendo? "UnderlyingInstrID": O SubjacenteMultiple: 0, O que é o que você está fazendo? Não.

    • Finalmente, fizemos com que o robô se movimentasse dentro da caixa de areia.

      Aqui é apresentado um pouco do conceito de commodity futures, os futuros, quer seja um contrato de compra de mais posições (contrato de verbo) ou um contrato de compra de empréstimo livre (contrato de queda), são chamados de negociação aberta, para distinguir: um contrato de compra de mais posições é chamado de negociação aberta, um contrato de compra de empréstimo livre é chamado de negociação aberta. Da mesma forma, um contrato de negociação aberta e um contrato de negociação aberta são chamados de negociação aberta.

O equilíbrio é o ato de um comerciante de futuros comprar ou vender um contrato de futuros com o mesmo código de variedade, número e mês de entrega do contrato de futuros que ele detém, mas com a direção oposta do negócio. Os negociantes de futuros optam por vender os contratos de futuros comprados antes do final do último dia de negociação, ou recomprar os contratos de futuros vendidos, a fim de obter uma quantidade igual, ou seja, uma quantidade igual, para a compra de um contrato de futuros. A negociação de futuros em direção oposta para desembolsar o contrato de futuros original, encerrando assim a negociação de futuros, liberando a obrigação de realizar entregas físicas no vencimento. Não.

##### 所以在期货市场做买卖就有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 escrever isto, bem-vindo leitores para me deixar um comentário! Faça sugestões e comentários, e se você se sentir divertido, pode compartilhar com mais amigos que gostam de programas e gostam de negócios.

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

Criado pelo programador littleDream


Mais.