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..........(太长了。。。)
奇妙で,固まりません. 動作も問題ありません. 原因はわかりませんが,グラフライブラリの問題だと感じます.
今日投稿を更新したのは,グループ内の友人が質問したため,調査,問題解決,特別記録. 新しいユーザーに類似した疑問がある場合は,簡単に説明します. OK質問は以下の通りです.
gettickerは,先物価格を入手します. なぜ実際の価格と違うのか?
私は自分でテストしてみた.本当に違う. 発明者の量化上のロボット. 取引所はOKのフューチャーです. 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);
}
}
運営状況: 換算は異なるので,2つの異なるAPI関数を使って換算しました. (OK フューチャー公式サイトでは,人民元に設定できます)公式なAPIの紹介を見て,OKフューチャーではなく,自分の通貨を使っている.
グラフに直接表示される結果です.OKの公式サイトでは,価格が小数から1位 (残りは全部表示されていない) しかありませんので,少し誤りがあると考えられています. 結果は基本的には同じで,GetTickerの市場価格とOKフューチャー公式サイトの価格の違いが,通貨格差によるものだと確信することは不可能である.
/* 交互按钮 测试
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);
}
}
このコードはテスト済みで,スクエアでは公開されていませんので,テストしたい人は,インタラクティブボタンを手動で追加します.また,グラフのテンプレートも追加します.スクリーンショットも持っています.画像の設定に従ってください.
運営状況を見てください:
もちろん,戦略復習はテストできません. ロボット自身が作成し,模擬盤でテストする必要があります. インタラクションボタンをクリックすると,グラフに対応する操作が表示されます. ここで引数を投げるので,NBの戦略を書き込むことを希望します.
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);
}
興味のある友人は試してみてください.もっと良い方法があるので,フォローしてください.
この2日間は空いた時間でpythonを見ていて,全体的に学習は難しくありませんが,多くの問題に直面しています.
この質問は,x = [1 for i in range ((n)) ] は何を意味するのか? この文法を見たとき,私はすでに頭が大きくなり,このような文法を見たことがないように感じました. 推測して推測して,何を意味するか推測できません. 断固としたバウダを見て,バウダもこのことを話すことがほとんどないことに気づきました. 幸いにもいくつか見つけました.
これは,python のリスト解析です. 1 から n までのリストを構成します. リスト解析については,以下のように説明します: 定義と説明 >Pythonの強みの一つは,リスト解析である.それはリスト内のすべての要素に関数を適用することで,リストを別のリストにマッピングするコンパクトな方法を提供している. リスト解析は,リストインデクティブと呼ばれる. リストインデクティブは,特に大きなデータに対して, for より精密に,より速く動作する. リストインデクティブは,マップとフィルターを使用する必要のあるほとんどの場合を代替する. リストインデクティブは,map (マップ), filter (フィルター) および lambda を使用せずにリンクを作成するための簡単な方法を提供します. 定義方法でリストを取得することは,通常,構造関数を使用するよりも,これらの列表を明確に作成します. すべてのリストインデクティブは,if (if) 式,if (if) 式,if (if) 式,if (if) 式,if (if) 式,if (if) 式から構成された要素をリストに追加する必要があります. 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 (()) ] この2回回転を l1 = [1,2,3,4] とします. これは,x^2の2乗です. x+y=x in l1=y in l2 とすると, [2,3,4,5,3,4,5,6,4,5,6,7,5,6,7,8] これは,この2つの数字を 函数[ 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]] この記事へのトラックバック一覧です.
i は range ((n) の範囲を回転し,i=0,1,2,...,n-1 となる.それぞれは, for を計算する前の表現の値としてリストの項目を計算する. 式は1で,対応値は1,1,1...,nつの1のために,nつの1を含むリストを生成する[1,1...]
x = [i for i in list] i はリスト内のi について 一つのリストを別のリストにマッピングし,各要素を変数 i に設定します x = [1 for i in range ((n) ] は,x は,x について,x は,x について,x は,x について,x は,x について,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x は,x です. リストのrange (n) をリストxにマッピングし,各要素を定数1にします. Forpython をご利用ください.
昨日は,Python CTPの商品先物取引の均線テスト戦略を書きました. 今日もテストを続けると,戦略は均線金
死 に従って取引を平衡させていないことが判明しました. クロス関数は,設計上正しい値コードを返さない:
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 を書き込みました. これは問題ではありません. テストの問題がやってきました. 金叉,死叉を起動しないときの Cross 関数です. 返される値は?
テスト関数を定義し,単一のメッセージを出力します.
この式を書き,Noneが -1 に等しいかを確認しましょう.
函数では return を実行しない場合,返される値は None です. None は -1 ではありません. しかし,None が 0 未満だと判断すると,これは真値です.
このコードがエラーを返します.
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) + '`');
}
TypeError: Converting circular structure to JSON (このエラーが私を半時間悩ませた!),このエラーは,バヨタで調べてみました.
半日考えたら,問題を見つけました.obj.exchange = exchange;
この句は, for (var k in obj) ループで k ===
コーデは以下の通りです.
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) + '`');
}
引用の回転がどうなっているか分かりますか? (暫くの間,少し曖昧さがありますが,指で示してください!)
理由は次のとおりです.
特定の positions 収蔵された情報オブジェクトの type 属性の各値を参照してください:https://www.fmz.com/bbs-topic/672
ボットスイング2直接貼り付けました
小さな夢QQのスペースを特別に申請したので,見やすく,簡単に見つけることができます.