리소스 로딩... 로딩...

간단한 전략 프레임 워크 (스스로 변경할 수 있고 확장할 수 있습니다)

저자:발명가들의 수량화 - 작은 꿈, 2016-08-30 11:38:10, 업데이트: 2017-10-11 10:34:57

간단한 전략 프레임 워크 (스스로 변경할 수 있고 확장할 수 있습니다)

간단한 전략 프레임 워크, 단지 한 가지 방향으로 수행하십시오. 즉, 다중 거래, 평형 거래. 전자 화폐 현금 시장에 사용됩니다. 새로운 사용자가 전략을 작성 할 때 어떻게 구조 프로그램을 익숙하지 않을 수 있습니다. 여기 가장 간단한 아이디어를 제공합니다. 코드에 설명이 있습니다. 인내심을 가지고, 직접 시도하십시오.

  • 설명:

    • 1, 이것은 전략 프레임워크이며, 다중 포지션, 평형의 코드를 촉발하지 않는다. 즉, 전략은 포지션 개시시, 평형시, 포지션 개시, 평형의 조건을 충족시킬 수 있다.
    • 2, 이미 수익 모듈이 설치되어 있고, 프로그램 수익 계산이 완료되어 있습니다. 추가 요구 사항이 있으면 직접 변경할 수 있습니다.
    • 3. 이 프레임워크는 인터페이스 상호 작용 기능을 가지고 있으며, 동적으로 변경할 수 있습니다. 오픈 포트 (Open Coin Number) ؛ 수동 명령어; 오픈 포트, 평형; 추가 상호 작용 명령이 필요한 경우 코드를 읽고 자체 확장 할 수 있습니다.
    • 4, 전략 프레임 워크는 기본적인 K 줄무늬를 보여준다 (그림 템플릿을 사용한다), 전략 프레임 워크의 K 줄무늬에는 지표 줄무늬가 없다. 필요하다면 직접 확장해 주십시오.
    • 5, 사용 편의성을 위해, 전략 프레임 워크는 디지털 통화 거래 클래스 라이브러리를 사용합니다.
    • 6. 전략 프레임 워크 실행 시의 데이터는 상태 탭 표에 표시되며, 획득된 시장 데이터, 계정 정보 등이 포함되며, 추가 프로젝트 정보가 추가될 경우 자동으로 확장될 수 있다.

img

img

기본 거래액은 동전 1개이고, 아래에는 0.5개로 변경했습니다.img

  • 이 글의 본문은
//耐心看完会有收获的!
var Interval = 500;
var _long = 1;
var free = 0;
var state = free; //每次开仓   平仓  重置 
var buyInfo = null; //每次平仓重置
var sellInfo = null; //每次开仓重置
var initAccount = null; //每次平仓重置
var beginAccount = null; //不重置
var Profit = 0; //已实现盈亏
var prefloatProfit = 0;//上次的浮动盈亏,滑动止盈 更新
var openBalance = 0;//开仓量
var isCover = false;

var tiaojian = 0; //这里可以设置  触发条件,比如 自定义的指标函数 发出开仓信号(比如返回了 数值  1 ), 比如 0 时 是等待, 等于 2 时 是平仓
                  //也可能 触发了平仓条件
var Amount = 1;   //这里可以把 交易的量(币数)  写在程序里 自动控制(比如,根据盘口量), 也可以设置在界面上做成界面上的参数,在程序运行的时候传进来。

var NowPositionInfo = {//持仓信息, 每次平仓更新
    avgPrice: 0,
    amount: 0 ,
    floatProfit: 0
};

function openUpdate(){//开仓后的更新
    state = _long;
    sellInfo = null;
    tiaojian = 0;//重置条件
}
function closeUpdate(){//平仓后的更新
    state = free;
    addLevel = 0;
    buyInfo = null;
    initAccount = _C(exchange.GetAccount);
    NowPositionInfo.avgPrice = 0;
    NowPositionInfo.amount = 0;
    NowPositionInfo.floatProfit = 0;
    isCover = true;
    tiaojian = 0;//重置条件
}

function Calculate(nowAccount,nowDepth){//计算并更新收益 、 浮动收益 、计算 持仓均价 、持仓量
    if(typeof(nowAccount) === 'undefined' ){
        nowAccount = _C(exchange.GetAccount);
        nowDepth = _C(exchange.GetDepth);
    }
    var diff_stocks = nowAccount.Stocks - initAccount.Stocks;//币之差
    var diff_balance = nowAccount.Balance - initAccount.Balance;//钱之差
    NowPositionInfo.avgPrice = Math.abs(diff_balance) / Math.abs(diff_stocks);
    NowPositionInfo.amount = Math.abs(diff_stocks);
    NowPositionInfo.floatProfit = diff_balance + diff_stocks * nowDepth.Bids[0].Price; //此次交易的浮动盈亏
    Profit = (initAccount.Stocks - beginAccount.Stocks) * nowDepth.Bids[0].Price + (initAccount.Balance - beginAccount.Balance); //实现盈亏

    //更新入界面
}

function get_Command(){//负责交互的函数,交互及时更新 相关数值 ,熟悉的用户可以自行扩展
    var keyValue = 0;// 命令传来的参数 数值
    var way = null; //路由
    var cmd = GetCommand(); //获取  交互命令API
    if (cmd) {
        Log("按下了按钮:",cmd);//日志显示
        arrStr = cmd.split(":"); // GetCommand 函数返回的 是一个字符串,这里我处理的麻烦了,因为想熟悉一下JSON ,所以先对字符串做出处理,把函数返回的字符串以 : 号分割成2个字符串。储存在字符串数组中。

        if(arrStr.length === 2){//接受的不是 数值型的,是按钮型的。
            jsonObjStr = '{' + '"' + arrStr[0] + '"' + ':' + arrStr[1] + '}'; // 把 字符串数组中的元素重新 拼接 ,拼接成 JSON 字符串  用于转换为JSON 对象。
            jsonObj = JSON.parse(jsonObjStr); // 转换为JSON 对象
            
            for(var key in jsonObj){ // 遍历对象中的  成员名
                keyValue = jsonObj[key]; //取出成员名对应的 值 , 就是交互按钮的值
            }
            
            if(arrStr[0] == "upDateAmount"){// 此处为 数字型  。这里处理分为  按钮  和  数字型  。 详见 策略参数 设置界面 下的 交互设置
                way = 1;
            }
            if(arrStr[0] == "扩展1"){
                way = 2;
            }
            if(arrStr[0] == "扩展2"){
                way = 3;
            }
            if(arrStr[0] == "扩展3"){
                way = 4;
            }
        }else if(arrStr.length === 1){// 此处为 按钮型  
            //路由
            if(cmd == "cmdOpen"){ 
                way = 0;
            }
            if(cmd == "cmdCover"){
                way = 5;
            }
        }else{
            throw "error:" + cmd + "--" + arrStr;
        }
        switch(way){ // 分支选择 操作
            case 0://处理 发出开仓信号
                tiaojian = 1;
                break;
            case 1://处理
                Amount = keyValue;//把交互界面设置的 数值 传递给 Amount
                Log("开仓量修改为:",Amount);//提示信息
                break;
            case 2://处理
                
                break;
            case 3://处理
                
                break;
            case 4://处理
                
                break;
            case 5://处理 发出平仓信号
                tiaojian = 2;
                break;
            default: break;
        }
    }
}

function Loop(){//循环主体
    //获取 行情、账户等信息
    var account = _C(exchange.GetAccount);
    var records = _C(exchange.GetRecords);
    var depth = _C(exchange.GetDepth);
    var len = records.length - 1;
    
    //对获取的数据 容错处理
    if(records.length < 10 ){//这里可以对 API 获取的数据 容错处理,这里举个例子 就是 获取的K线长度 必须大于10,小于10了  就返回 不做处理并在界面显示提示信息。
        //输出到状态栏表格,显示K线长度不足
        msg = "K线长度不足,获取中...";
        return;
    }
    msg = "K line `s length:" + (len + 1);

    //图表模板的使用---------------
    $.Draw(records);
    //---------------------------
    
    
    //第一次启动 处理的内容---------
    if(isFirst === true){
        $.SignOP((new Date()).getTime(),null,null,3,"图表显示启动!");// 测试标记 自定义信息 到图表上
        Log("程序启动!");
        isFirst = false;
    }
    //--------------------------
    
    //策略运行时状态栏表格上的显示数据 table.b1 就是往 b1 这个格子里 写入 "stock:" + account.Stocks + "#ff00ff"; 这些数据,可以对比截图,自己动手试试。
    table.b1 = "stock:" + account.Stocks + "#ff00ff";
    table.c1 = "Fstock:" + account.FrozenStocks + "#ff00ff";
    table.d1 = "balance:" + account.Balance + "#ff00ff";
    table.e1 = "Fbalance:" + account.FrozenBalance + "#ff00ff";
    table.b2 = "open:" + records[len].Open;
    table.c2 = "high:" + records[len].High;
    table.d2 = "low:" + records[len].Low;
    table.e2 = "close:" + records[len].Close;
    table.b3 = "bids[0].price:" + depth.Bids[0].Price;
    table.c3 = "bids[0].amount:" + depth.Bids[0].Amount;
    table.d3 = "asks[0].price:" + depth.Asks[0].Price;
    table.e3 = "asks[0].amount:" + depth.Asks[0].Amount;
    table.c4 = "avgPrice:" + NowPositionInfo.avgPrice;
    table.d4 = "amount:" + NowPositionInfo.amount;
    table.e4 = "floatProfit:" + NowPositionInfo.floatProfit;
    //-------------------------------------------------------------------------
    
    //处理 策略交互
    get_Command();//获取 并处理交互


    //这里可以自定义  触发 操作的代码,比如 指标交叉了(当然这是你自定义的), 就可以给 tiaojian 这个变量赋值 1, 即: tiaojian = 1; 这样下面满足条件就执行相应操作。
    
    
    if(state === free && tiaojian === 1 ){//开仓条件,可以自行扩展,指标形态、差价、交易量 等等
        //触发了上面的if括号内的条件,这个里面就是执行具体的开仓操作了,举个例子是用 数字货币交易类库 这个模板处理开仓。
        buyInfo = $.Buy(Amount);
        if(buyInfo === null){// $.Buy这个函数 返回 null 说明有原因导致 没有买到(即没有开仓成功,原因有多个可能。)
            return;
        }
        $.SignOP((new Date()).getTime(),buyInfo.price,buyInfo.amount,1);// 把操作标记 到图表上 . 图表模板 用法可以看论坛上的帖子
        openUpdate();
    }else if(state === _long && tiaojian === 2 ){
        sellInfo = $.Sell(NowPositionInfo.amount);
        if(buyInfo === null){
            return;
        }
        $.SignOP((new Date()).getTime(),sellInfo.price,sellInfo.amount,0);// 把操作标记 到图表上
        closeUpdate();
    }
    
    
    //如果平仓了,更新收益-----------------------
    Calculate();//计算收益,更新持仓状态
    if(isCover === true){
        LogProfit(Profit);
        isCover = false;
    }
    //----------------------------------------
    
    //更新图表---------------------------
    $.UpDateChart(records);
    //---------------------------------
}

var table = null;
var msg = "";//显示在状态栏表格头部的 消息
var isFirst = true;

function main(){
    //初始化
    beginAccount = _C(exchange.GetAccount);//程序开始运行时的初始账户信息
    initAccount = beginAccount;//每次开仓前的账户信息
    table = $.TableInit(5,6);
    //初始化表格 5,代表 表格生成5列 分别是 a b c d e    , 6代表表格生成 6行 分别是  0  1  2  3  4  5  6    。 这样最左上角的表格单元的坐标就是 a0 ,  table.a0 = 3; 此时就会显示到相应的表格
    
    //给表格写上不许要变动的内容------------------
    table.a1 = "account:" + "#ff00ff";
    table.a2 = "records[length-1]:";
    table.a3 = "depth.Bids[0]/Asks[0]:";
    table.a0 = "beginAccount:";
    table.b0 = "stock:" + beginAccount.Stocks;
    table.c0 = "Fstock:" + beginAccount.FrozenStocks;
    table.d0 = "balance:" + beginAccount.Balance;
    table.e0 = "Fbalance:" + beginAccount.FrozenBalance;
    //----------------------------------------------------

    while(true){
        Loop();//循环函数
        $.UpDateLogStatus(msg);//更新表格 数据
        msg = "";
        Sleep(Interval);
    }
}

마법사의 전송 문현재는 단지 쓰기 쓰기 동작을 트리거하는 모듈에 트리거 값 정책을 주어서 실행을 테스트할 수 있다. 새로운 학생들도 시도해 볼 수 있습니다.


더 많은

18180828122$.TableInit is not a function는 함수가 아닙니다.

네오1898루프와 온티크의 차이점은 무엇일까요?

이 모든 것은 정말 멋지다. 이 사진은 제가 찍은 사진입니다 그리고 그 후로 덤불에 올라갑니다.

발명가들의 수량화 - 작은 꿈$.TableInit는 함수가 아니며, 이러한 오류 메시지는 바이오스피어 쿼리를 번역할 수 있다. 이 전략은 매우 초기 교육 전략으로, 정책에는 그래프 템플릿이 연관되어 있다:https://www.fmz.com/strategy/20967 $.TableInit는 이 그래프 템플릿의 인터페이스 함수입니다. 이 코드를 디제이크할 때 정책이 이 그래프 템플릿을 참조하지 않으면 이 오류가 나타납니다.

발명가들의 수량화 - 작은 꿈이윤을 옮기기. 잘 계산해봤어, 헤지핑이잖아, 전체 금액은 확실히 변하지 않을거야, 전체 금액이 변했는지 여부에 관계없이, 더 많은 , 적은 손실.

~~ 처음에는 순수 이동 수익은 계산할 수 없다고 느꼈습니다 (동적, 가격 변동으로 인해 언제든지 변할 수 있습니다), 그래서 이동 수익을하지 않았습니다. 나중에 모든 공개된 디스크에 순수 이동 수익이 있다는 것을 알게되었습니다.

발명가들의 수량화 - 작은 꿈이 글은 매우 일찍 쓰여졌으며, 실제 디스크가 잘 쓰일 수 있는지 잘 쓰일 수 있는지 알지 못하며, 전략의 전반적인 프레임워크입니다. 전략을 작성하지 않은 신입생들을 위해, 모방을 통해 전략의 어떤 측면이 필요한지 볼 수 있습니다. 이 글에는 그래프, 상호 작용, 수익 계산 등이 있습니다. 계속 최적화 할 수 있습니다.