Дневник изобретателя по количественной химии (II) (завершен)

Автор:Маленькие мечты, Создано: 2016-05-22 20:05:36, Обновлено: 2019-08-01 10:31:58

Несколько дней назад, после решения нескольких проблем, когда я писал код для клиента, я почувствовал необходимость написать шаблон графика, показывающий показатели (особенно показатели, которые я написал сам), торговые позиции и т. д.

Вопрос первый:

 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);
}

Нехорошо наклеивать код ~ может показаться немного небрежным, можно наклеить и посмотреть на sublime text, прежде чем просто сказать, что проблема, это то, что код написан во время запуска, столкнулся с странным эпизодом, см. рисунок:

Странно, что прогрессная полоса доходит до 100%, постоянно застряла, не двигалась, не притворялась мертвой, должна была застрять. Я также использовал различные методы для тестирования, например: ограничение количества циклов, показывающее количество циклов, показывающее, что все застряло до последнего цикла. Посмотрев на программный код, я почувствовал, что ничего плохого не должно быть. Когда я инициировал график, последовательность данных была написана так:

 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:[]}   //......
        ] 

Например, в программе можно записать данные в график так:

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

Я перевела его на:

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

Все коды, которые были записаны на графике, были изменены (в основном 1 в 0).

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

Это потрясающе, не застряло, работает без проблем. Хотя я не знаю, почему, я думаю, что это должно быть проблемой с графикой.


Вопрос 2

Сегодня мы обновили пост, потому что друзья в группе задали вопросы, и мы сделали это путем исследования, решения вопросов и записи.

Почему цена фьючерса отличается от реальной?img

Я проверил это сам, и это действительно не то же самое. Изобретатель количественно настроил робот. Биржа - это OK futures, последние цены на рынке, полученные с помощью GetTicker. Я написал в своем блоге, что я не могу найти ни одного человека, который мог бы мне помочь.

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);
    }
}

Осуществление:img imgЯ нашел разные валютные курсы, и я получил их с помощью двух различных API-функций.imgПосмотрев на презентацию API, можно сказать, что не OK Futures использует свой собственный курс.

Если вы не знаете, что это такое, вы можете перейти к следующему шагу:imgПоскольку цены на сайте ОК находятся только на одном месте после запятой (остальные не отображаются полностью), предполагается, что произойдет небольшая ошибка. Поскольку результаты в основном одинаковые, можно не быть абсолютно уверенным, что рыночная цена, полученная GetTicker, отличается от цены, полученной на официальном сайте OK Futures, вероятно, из-за несоответствия валютных курсов.


Вопрос 3: Вопрос о рыночной цепочке платформы Bitcoin OKcoin (Этот вопрос был скорректирован и теперь объединяет рыночную цепочку при повторном тестировании и рыночную цепочку в реальном времени.https://www.fmz.com/bbs-topic/474


Вопрос 4: Вчера вечером один из моих друзей спросил меня, где есть примеры использования кнопок для взаимодействия, и я подумал, просто напишите сами, практикуйте, и, кстати, для того, чтобы вы могли учиться вместе, старые методы, сначала код!

/* 交互按钮 测试
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);
    }
}

Код, который я тестировал, не был опубликован на площадке, поэтому друзья, которые хотят его проверить, должны вручную добавить кнопку взаимодействия.imgПосмотрите, как это делается.

Посмотрите, как это работает:

img img

Разумеется, повторение стратегии не может быть проверено, необходимо самостоятельно создать робота, протестировать его с помощью анимационной диски, нажать на кнопку взаимодействия, и соответствующие действия будут отмечены на графике. Здесь бросается запятая, надеюсь, что все напишут стратегию NB.


Вопрос 5: У пользователей возникает вопрос, как получить название электронной валюты, которая в настоящее время работает, и как получить текущий цикл K-линии.

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);
}

Друзья, которые заинтересованы, могут попробовать.


Вопрос 6: Если вы не понимаете функции, добавленные к новой версии класса "Коммерческие фьючерсы", вы можете поделиться новым кодом комментариев с группой QQ.

  • Схема стратегии может быть скопирована на площади стратегии.img

Вопрос 7: Что означает x = [1 for i in range ((n)) ]?

  • В эти два дня, когда у меня есть свободное время, я смотрю на python, и в целом мне не очень сложно учиться, но я все равно сталкиваюсь со многими проблемами.

    Вопрос: Что означает x = [1 for i in range ((n)) ]? Когда я впервые увидел это место, я тоже был взрослым, и такой грамматики, кажется, я никогда не видел раньше.

Это расшифровка списка в Python, которая означает формирование списка от 1 до n. О расшифровке списка можно прочитать ниже: Определение и описание Одним из сильных свойств >Python является его расшифровка списка, которая предоставляет компактный способ, который позволяет наложить функцию на каждый элемент в списке и таким образом отобразить один список в другой list. > Расшифровка списка, также называемая списковой индукцией (list comprehension) > Расшифровка списка удобнее и быстрее, чем for, особенно для больших данных. Расшифровка списка может заменить большинство случаев, когда требуется использование maps и filters. 2. Основные списки для анализа основы [x for x in range ((5)] # [0, 1, 2, 3, 4] l1 = [1, 2, 3,4] [x*2 for x in l1] # [2, 4, 6,8] Многозначный [ %s = %s for (k, v) in a_map.items (()) ] Два цикла l1 = [1, 2, 3, 4]. L2 = [1,2,3,4] [x+y для x в l1 для y в l2] [2, 3, 4, 5, 3, 4, 5, 6, 4, 5, 6, 7, 5, 6, 7, 8] Можно вызвать функцию [ func ((x) for x in l1] #, равной map Обратите внимание, что анализ списка не меняет значения исходного списка, но создает новый список. 3. Рассмотрение списка условий [ x for x in range ((100) if x%2 ==0 ] 4., несетный список резюмеmat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] обменный матриц [ [row[i] for row in mat] for i in (0,1,2) ] # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] Это статья из блога CSDN, написанного Линью.

Честно говоря, я не совсем понимаю вышеизложенное, но концептуально это кажется ясным, что это утверждение должно иметь некоторую повторяющуюся роль.
Посмотрите на другие активные люди:

i циркулирует в диапазоне range ((n), т. е. i = 0, 1, 2,..., n-1, соответственно, вычисляется для предыдущих значений выражения, используемых в качестве пункта в списке Если выражение 1, соответствующее значение 1, 1, 1..., для n 1, получается список, содержащий n 1 [1, 1].

Это кажется более понятным, посмотрим дальше.

x = [i для i в списке] Карта одного списка в другой список, каждый элемент настраивается на i x = [1 for i in range ((n) ] Мапируйте список range ((n) к списку x, где каждый элемент имеет постоянную 1. Добро пожаловать на forpython.com

Вопрос 8: Python не имеет прочных оснований, был возвращён, не обращал внимания на пол дня, посмотрите проблему ниже

Вчера я написал тест-стратегию на Python CTP Commodity Futures Equilibrium, и начальник попросил меня проверить Python CTP Commodity Futures Retesting System. Продолжаем сегодня тестирование и обнаруживаем, что стратегия полностью не соответствует уравненной линии золотой вилки, чтобы открыть игровой баланс, чувствую, что должны быть проблемы, проверка, тестирование и обнаружение функции. Кросс-функция не возвращает правильное значение кода по своей конструкции:

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

Как? Видите, это очень необычная ошибка! Я написал return n в условный отрасль, и это, кажется, не проблема. Какие значения мы вернем?

Мы провели небольшой эксперимент:

img

Определите тест-функцию, которая выводит только одно сообщение

img

Позвольте мне назвать это и написать это так, и, кстати, посмотреть, не будет ли None равно -1

img

Если мы посмотрим на результаты, то увидим, что при выполнении функции без return она возвращает значение None, и None не равняется -1, но если None меньше 0, это верно.

Вопрос 9: Вопрос JS циркуляции ссылки.

Например, этот код дает ошибку:

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 (Эта ошибка отнимала у меня полчаса!), эта ошибка, проверив её на Baidu, означает, что в коде есть циркулярные ссылки, которые JSON не может разрешить.

Полгода мы думали, а потом поняли, что это не так.obj.exchange = exchange;Это привело к циркуляции цикла, которая решительно перескакивает, когда в цикле for ((var k in obj) встречается k === exchange , попробуйте.

Код выглядит так:

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

Это нормально, но можно ли увидеть, как циркулируют ссылки?

Вопрос 10: Коммерческие фьючерсы В пятницу вечером Открыть позицию, держать позицию, после того, как в следующий понедельник будет открыт рынок, вызвать функцию GetPosition Получить информацию о позиции, почему

img

Посмотрите, почему:

img

Показать различные значения свойства type для конкретных позиций.https://www.fmz.com/bbs-topic/672

Посмотрев на это, я почувствовал, что должен приступить к практике... а вы?

Больше

Ботвизинг2Сделайте это прямо сейчас.

Маленькие мечтыЯ готов много писать, поэтому специально заказал QQ-пространство, чтобы было легко смотреть и искать.