オンラインで様々な資料を検索して学ぶと,コンピュータプログラムを使って金融証券取引を行うことをプログラム化取引,定量化取引と呼びます. 古い白人の数学レベルも大專レベル,統計学にはいくつかの基本的な概念しかありません:正規分布,期待,協和,など. 自分はプログラミング,定量化,または実践の過程で自己を定量化しているとは言いません. サンドボックスのシステムは不可欠です. これはサンドボックスのゲームのようなもので,規則は様々な定義されたリソースを持っています.
古い白人は,有用な砂箱には以下の要素が必要だと感じています.
1,最大限に真实的時間配列を模擬する.つまり,サンドボックスでプログラムを実行する時の時間配列は,真实的状況にできるだけ近いもので,ティックレベルに基づいて,テスト結果には参照値があります.これは,サンドボックスでプログラムを実行する速度が制限される可能性があります.しかし,実行速度も重要な要因です.
2、様々なパラメータオプション制御,この要求はテストされているプログラムのパラメータではなく,サンドボックスシステムのパラメータである.例えば:取引所の設定 (期貨?A株?外為?) ・テスト中の取引所の模擬口座情報,取引所の手続料,起こり得るスライドポイント率,時間範囲制御等.
3. プログラムのパラメータ調整: 時々,老人は,何よりも良いものを試すために,バックアップパラメータをたくさん持っている. 良いサンドボックスシステムは,プリセットパラメータをたくさん受け入れ,それを実行し,結果を分析し,最高のものを表示します.
4. 試行錯誤: プログラムシミュレーションの実行は,通常は帆風順で,風が平らで,波が静かである.それは
5 グラフ表示: グラフは,分析のための多くの有用なデータを記録することができます. 例えば,収益グラフ,格差曲線など.
1.CTP商品先物自動化プログラムの一般的な構造
古い白紙の底には,関数が包まれている.exchange.IO("status")
フューチャー会社のフロントサーバーに接続されているかどうかを識別する. ここで実行する質問: フューチャー会社のフロントサーバー? 取引所ではありませんか?
古い白人は:
商品先物取引はCTPプロトコルを使用し,接続構造は:先物取引会社のクライアントの端末プログラム (旧白のコード) ---->先物取引会社の前置サーバー------->取引所サーバー
本題に戻る.商品先物取引が休止されたとき,先物会社の前置サーバーに接続できない (休止の一定時間後に先物会社の前置サーバーが休止);またはいくつかの状況が原因でCTPが接続を切断.これらの状況に対処する老舗の手順は,接続状態を判断するために一定の時間間隔で,接続されていない状態でいくつかの操作を避けるために問題を引き起こします.
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次数据。
}
}
砂箱の中を走って:
プログラムで自分のアカウントの情報データを取得する方法, 底層を包み込み,関数としてexchange.GetAccount()
このシンプルな文章を試してください.
function MainLoop(){ // 处理具体工作的函数
exchange.GetAccount();
}
デザインはMainLoop()
函数に書き込むexchange.GetAccount();
プログラムが実行されているが,ログのプリント機能は呼び出されていない.これはまた,包装されたログの出力機能です.Log()
函数パラメータは,様々な変数を出力するために,複数のコマ間隔を転送することができます. 文字列の入力を除いて,コードを書くときに中国語入力法で入力することができます. 残りのコードを書くときに,英語を切り替えるのを忘れないでください.
function MainLoop(){ // 处理具体工作的函数
Log(exchange.GetAccount()); // 写法1
var Account = exchange.GetAccount(); // 写法2
}
その後,砂箱で他のデータをお願いします.老白は以前は,シート鋼の商品先物品種を頻繁に注目していました. それは同時に,不動産価格にも注目しているからです.
まず,どの品種の市場を知りたいかを知る必要があります. 例えば,exchange.SetContractType("rb1705")
また,この rb1705 契約の状況 (回帰システムでは実行する時点) を知りたい.exchange.GetTicker()
この関数は,この契約の過去価格周期統計について説明します.exchange.GetRecords()
解き放たれMainLoop
この関数は,次のように変更します.
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" 可以使打印的日志显示为红色。
}
選択部分records 変数の値 ((配列型):
[ メディアの声]
{
プリントされたティッカーの変数の値 (オブジェクト):
{
rb1705 契約の情報: (CTP プロトコルで欄の説明を参照してください.
{cH00ffff}
そして最後に,ロボットが砂箱の中を動き回るようにしました.
ここでは,商品先物に関する概念を少し紹介します.先物には,多株購入契約 (見
平行取引とは,先物取引者が,持っていた先物取引の種類,数量,配達月が同じだが取引方向が逆の先物取引を購入または売却し,ポジションを閉じる行為である. フューチャートレーダーは,最終取引日の終わりまでに購入したフューチャー契約を売却するか,売却したフューチャー契約を買い戻すというオプションを選択し,同じ金額で取引を行う. 逆方向のフューチャー取引は,元のフューチャー契約をオフショートし,フューチャー取引を終了し,期限が切れたときに実物での配達を行う義務を解除する. ` `
##### 所以在期货市场做买卖就有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)
##### 开始的账户信息 和 最后一次开仓 前的账户信息比较,可见不能胡乱开仓平仓。 >_<
https://www.fmz.com/bbs-topic/724