جاوا اسکرپٹ کے ساتھ کھیلنا - خرید و فروخت کے لئے ایک چھوٹا سا پارٹنر بنانا (6) روبوٹ کے لئے استعمال کردہ ٹول کوڈ تیار کرنا

مصنف:چھوٹا سا خواب, تخلیق: 2017-03-15 11:22:52, تازہ کاری: 2017-10-11 10:37:43

ایک چھوٹا سا پارٹنر بنانا جو خرید و فروخت کرتا ہے جب وہ جاوا اسکرپٹ کے ساتھ کھیلتا ہے۔


روبوٹ تیار کرنے کے عمل میں بہت سے چھوٹے کوڈ ٹکڑے ٹکڑے جمع کیے گئے ہیں ، جن میں سے کچھ اپنے کوانٹیمیشن اسٹریٹیجی پروگرام میں استعمال کیے جاسکتے ہیں ، یہاں بوہو باؤ نے اپنے لکھے ہوئے کوڈ میں سے کچھ کو ہٹا دیا ہے۔

  • 1، کسی بھی K لائن سائیکل کو تبدیل کریں

    یہ کوڈ ماڈیول کلاس لائبریری کے طور پر نہیں لکھا جاتا ہے ، صرف ایک فنکشن لکھتا ہے ، اور بعد میں اس میں ترمیم کرنے کے لئے بھی آسان ہے۔ اس کا کام ایک مخصوص دورانیے کی بنیاد پر بنیادی K لائن ڈیٹا کو جمع کرنے کے لئے بڑے دورانیے کی K لائن ہے ، عام طور پر مارکیٹ دیکھنے یا پلیٹ فارم لکھنے کی حکمت عملی کا استعمال کرتے وقت ، ڈیفالٹ عام طور پر استعمال شدہ دورانیے کی K لائن ہے ، جیسے 1 دن ، 1 گھنٹہ ، 1 منٹ وغیرہ۔ اگر آپ کو دوسرے دورانیوں کے اعداد و شمار جیسے 4 گھنٹے ، 6 گھنٹے ، 8 گھنٹے کی لائن پر کام کرنے کی ضرورت ہے تو ، آپ کو خود ہی شروع کرنے کی ضرورت ہوگی۔ لہذا یہ لکھا گیا ہے۔ اس کا ماخذ ایڈریس:https://www.fmz.com/strategy/35986

    // K线周期合成  扩展为 根据基础K线 合成 为任意周期。
    

var cloneObj = function ((obj) { // گہری کاپی آبجیکٹ فنکشن var str، newobj = obj.constructor === Array ؟ [] : {}؛ if (typeof obj!== object) { واپسی } else if (JSON) { str = JSON.stringify ((obj) ؛ // سیریل شدہ اشیاء newobj = JSON.parse ((str) ؛ // ریڈورڈ } else { for (var i in obj) { newobj[i] = typeof obj[i] === Object ٹائپ کریں؟ cloneObj ((obj[i]) : obj[i]؛ } } واپسی newobj؛ }؛ کیا آپ جانتے ہیں؟ var DAY = 0؛ var HOURS = 1؛ var MINUTES = 2; var isFirstFind = true؛ var FirstStamp = null؛ کیا آپ جانتے ہیں؟ function GetDHM ((objTime، BaseCycle، NewCycleForMS) { var ret = [؛ if ((BaseCycle % (1000 * 60 * 60 * 24) === 0) { ret[0] = objTime.getDate ((); ret[1] = DAY؛ }else if(BaseCycle % (1000 * 60 * 60) === 0) { ret[0] = objTime.getHours ((); ret[1] = HOURS؛ }else if(BaseCycle % (1000 * 60) === 0) { ret[0] = objTime.getMinutes ((); ret[1] = MINUTES؛ } if ((NewCycleForMS % (1000 * 60 * 60 * 24) === 0) { ret[2] = DAY؛ }else if ((NewCycleForMS % (1000 * 60 * 60) === 0) { ret[2] = HOURS؛ }else if ((NewCycleForMS % (1000 * 60) === 0) { ret[2] = MINUTES؛ } واپسی ret؛ } کیا آپ جانتے ہیں؟ function SearchFirstTime ((ret، BaseCycle، NewCycleForMS) { if ((ret[1] === DAY && ret[2] === DAY) { var array_day = [؛ for ((var i = 1 ؛ i < 29; i += (NewCycleForMS / BaseCycle)) { array_day.push ((i) ؛ } for ((var j = 0 ؛ j < array_day.length؛ j++)) { if(ret[0] === array_day[j]) { واپس سچ؛ } } }else if(ret[1] === HOURS && ret[2] === HOURS) { var array_hours = []؛ for ((var i = 0 ؛ i < 24; i += (NewCycleForMS / BaseCycle)) { array_hours.push ((i) ؛ } for ((var j = 0 ؛ j < array_hours.length ; j++) { if(ret[0] === array_hours[j]) { واپس سچ؛ } } }else if(ret[1] === MINUTES && ret[2] === MINUTES) { var array_minutes = [؛ for ((var i = 0؛ i < 60؛ i += (NewCycleForMS / BaseCycle)) { array_minutes.push ((i) ؛ } for ((var j = 0؛ j < array_minutes.length؛ j++) { if(ret[0] === array_minutes[j]) { واپس سچ؛ } } {else{ throw ہدف کا دورانیہ بنیادی دورانیے سے مماثل نہیں ہے۔ ہدف کا دورانیہ ملی سیکنڈ: + NewCycleForMS + " بنیادی دورانیہ ملی سیکنڈ: " + BaseCycle؛ } } کیا آپ جانتے ہیں؟ function Calc_High ((AssRecords، n، BaseCycle، NewCycleForMS) { var max = AssRecords[n].High؛ for ((var i = 1 ؛ i < نیو سائیکلForMS / بیس سائیکل؛ i++) { max = Math.max ((AssRecords[n + i].High، max) ؛ } واپسی زیادہ سے زیادہ؛ } کیا آپ جانتے ہیں؟ function Calc_Low ((AssRecords، n، BaseCycle، NewCycleForMS) { var min = AssRecords[n].Low؛ for ((var i = 1 ؛ i < نیو سائیکلForMS / بیس سائیکل؛ i++) { min = Math.min ((AssRecords[n + i].Low، min) ؛ } واپسی منٹ؛ } کیا آپ جانتے ہیں؟ function AssembleRecords ((records، NewCycleForMS) { var AssRecords = records.slice ((0) ؛ // گہری کاپی var AfterAssRecords = [؛

if(!records || records.length < 2){
    throw (!records) ? "传入的records参数为 错误" + records : "基础K线长度小于2";
}
var BaseCycle = records[records.length - 1].Time - records[records.length - 2].Time;
if(NewCycleForMS % BaseCycle !== 0){
    throw "目标周期‘" + NewCycleForMS + "’不是 基础周期 ‘" + BaseCycle + "’ 的整倍数,无法合成!";
}
if(NewCycleForMS / BaseCycle > records.length){
    throw "基础K线数量不足,请检查是否基础K线周期过小!";
}

// ٹائم لائن کا تعین کرتا ہے، بنیادی K لائن کو ہدف K لائن کے آغاز کے وقت کے مقابلے میں تلاش کرتا ہے۔ var objTime = new Date ((); for (var i = 0؛ i < AssRecords.length؛ i++) { objTime.setTime ((AssRecords[i].Time) ؛ var ret = GetDHM ((objTime، BaseCycle، NewCycleForMS) ؛

    if (isFirstFind === true && SearchFirstTime(ret, BaseCycle, NewCycleForMS) === true) {
        FirstStamp = AssRecords[i].Time;
        for (j = 0; j < i; j++) {
            AssRecords.shift();        // 把目标K线周期前不满足合成的数据排除。
        }
        isFirstFind = false;
        break;                         // 排除后跳出
    }else if(isFirstFind === false){
        if((AssRecords[i].Time - FirstStamp) % NewCycleForMS === 0){
            for (j = 0; j < i; j++) {
                AssRecords.shift();    // 把目标K线周期前不满足合成的数据排除。
            }
            break;
        }
    }
}
var BarObj = {                         // 定义一个 K线柱结构
    Time: 0,
    Open: 0,
    High: 0,
    Low: 0,
    Close: 0,
    Volume: 0,
};
var n = 0;
for (n = 0; n < AssRecords.length - (NewCycleForMS / BaseCycle); n += (NewCycleForMS / BaseCycle)) {     // 合成
    /*
    {
    Time    :一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
    Open    :开盘价
    High    :最高价
    Low :最低价
    Close   :收盘价
    Volume  :交易量
    }
    */
    BarObj.Time = AssRecords[n].Time;
    BarObj.Open = AssRecords[n].Open;
    BarObj.High = Calc_High(AssRecords, n, BaseCycle, NewCycleForMS); 
    BarObj.Low =  Calc_Low(AssRecords, n, BaseCycle, NewCycleForMS); 
    BarObj.Close = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Close;
    BarObj.Volume = AssRecords[n + (NewCycleForMS / BaseCycle) - 1].Volume;
    AfterAssRecords.push(cloneObj(BarObj));
}

BarObj.Time = AssRecords[n - (NewCycleForMS / BaseCycle) ].Time + NewCycleForMS؛ // آخری وقت تبدیل نہیں کیا جا سکتا، BarObj.Open = AssRecords[n].Open؛ BarObj.Close = AssRecords [AssRecords.length - 1].Close؛ BarObj.Volume = AssRecords[AssRecords.length - 1].Volume؛ var max = AssRecords[n].High؛ var min = AssRecords[n].Low؛ for ((var index_n = n + 1 ;index_n < AssRecords.length; index_n++) { max = Math.max ((max، AssRecords[index_n].High) ؛ min = Math.min ((min، AssRecords[index_n].Low) ؛ } BarObj.High = max؛ BarObj.Low = min؛ AfterAssRecords.push ((cloneObj ((BarObj)) ؛

return AfterAssRecords;

} کیا آپ جانتے ہیں؟ function main() { // ٹیسٹ کوڈ while(!exchange.IO("status")) { LogStatus ((براہ کرم رابطہ نہ کریں! } var Info = _C ((exchange.SetContractType, MA705); // ٹیسٹ میٹول 705 معاہدے کے K لائن ڈیٹا کی ترکیب var records = exchange.GetRecords ((); while (!records کے لئے ریکارڈز.length < 24) { records = exchange.GetRecords ((); }
// انٹرفیس کے پیرامیٹرز کو ہینڈل کریں، اگر آپ اپنی پالیسی میں لکھتے ہیں تو آپ اس کا حوالہ دے سکتے ہیں var Num_UI_NewCycleForMS = 1؛ var arrayNum = UI_NewCycleForMS.split (("*"); for ((var indexNum = 0 ; indexNum < arrayNum.length ; indexNum++) { Num_UI_NewCycleForMS = Num_UI_NewCycleForMS * نمبر ((arrayNum[indexNum]) ؛ } Log (( اپنی مرضی کے مطابق سائیکل ملی سیکنڈ کا وقت: , Num_UI_NewCycleForMS) ؛
while ((true) { records = _C ((exchange.GetRecords) ؛ // Log (( خام K لائن ڈیٹا: لمبائی کیڑے، records.length، کیڑے ڈیٹا: کیڑے، records) ؛ records = AssembleRecords ((records, Num_UI_NewCycleForMS); // پہلا پیرامیٹر بیس K لائن ہے، دوسرا پیرامیٹر اس دورانیے کی ملی سیکنڈ ہے جسے تبدیل کرنا ہے، 1000 * 60 * 20 یعنی 20 منٹ میں تبدیل کرنا // Log (( تبدیل کرنے کے بعد K لائن کے اعداد و شمار: لمبائی کیڑے، records.length، کیڑے کے اعداد و شمار: کیڑے، records؛ .plotRecords (ریکارڈز، بٹ کوائن کی جڑیں) // throw stop ؛ // ceshi Sleep ((1000) ؛ } }


- #### 2、传统期货差价监控 (CTP)

当需要分析两个品种差价走势的时候,会用上这段代码。有时候也会把这段代码修改集成到自己的策略程序里面(比如跨期对冲策略),代码会绘制出一个差价走势图,在学习如何让机器人程序画图也是很有帮助的,很好的例子。
源码地址: https://www.fmz.com/strategy/5379

var __lastDiff = 0؛ var __AType = [Last,Buy,Sell][AType]; var __BType = [Last,Buy,Sell][BType]; کیا آپ جانتے ہیں؟ function _N ((v, precision) { if (typeof ((precision)!= number ) { precision = 4؛ } var d = parseFloat ((v.toFixed ((Math.max ((10, precision + 5))); s = d.toString (().split ((""); if (s.length < 2つの s[1].length <= precision) { واپسی d؛ } کیا آپ جانتے ہیں؟ var b = Math.pow ((10, precision) ؛ return Math.floor ((d * b) / b؛ } کیا آپ جانتے ہیں؟ function EnsureCall ((method) { کو یقینی بنائیں var r؛ while (!(r = method.apply ((this، Array.prototype.slice.call ((arguments).slice))) { نیند ((Interval) ؛ } return r؛ } کیا آپ جانتے ہیں؟ function onTick ((() { var a = EnsureCall ((exchange.SetContractType, AInstrument) ؛ var tickerA = EnsureCall ((exchange.GetTicker) ؛ var b = EnsureCall ((exchange.SetContractType, BInstrument) ؛ var tickerB = EnsureCall ((exchange.GetTicker) ؛ var diff = _N ((tickerA[__AType] - tickerB[__BType]) ؛ LogStatus ((a.InstrumentName, _N ((tickerA[__AType]), b.InstrumentName, _N ((tickerB[__BType]), فرق کی قیمت: فرق, diff); if (__lastDiff!= 0) { if (Math.abs(Math.abs(diff) - Math.abs ((__lastDiff)) > 200) { واپسی } } if (diff!= __lastDiff) { // add اعداد و شمار کو سیریز میں شامل کرتا ہے، جس کی شکل [سیریز سیریل نمبر، ڈیٹا] ہے۔ __chart.add (([0، [new Date (().getTime ((), diff)) ؛ __lastDiff = diff؛ } } کیا آپ جانتے ہیں؟ function main (() { if (exchange.GetName().indexOf(Futures_CTP) == -1) { throw کیم صرف روایتی فیوچر (CTP) کیم کو سپورٹ کرتی ہے۔ } SetErrorFilter ((loginreadyforcontrolofflow) یا Timeout کی طرف سے کنکشن کی ناکامی) ؛ // چارٹ فنکشن کو ایک ایسا ڈھانچہ دیا جانا چاہیے جو اس کے سیاق و سباق سے بے تعلق ہو۔ (HighStocks کے قواعد کے ساتھ، HighStocks کے استعمال کے طریقہ کار کے بارے میں تفصیلی پیرامیٹرز) __chart = چارٹ (({ ٹول ٹپ: xDateFormat: %Y-%m-%d %H:%M:%S، %A }، title: { text: پیٹرولیم مصنوعات کی قیمتوں کا تجزیہ }، rangeSelector: { اس کے بعد آپ کو منتخب کریں گے بٹن: [{ ٹائپ کریں: hour count: ایک، text: 1h }، { ٹائپ کریں: hour گنتی: تین text: 3h }، { ٹائپ کریں: hour گنتی: 8 text: 8h }، { ٹائپ کریں: text: All }، selected: 0، inputEnabled: غلط }، x محور: { ٹائپ کریں: ٹائم ٹائم }، y محور: { plotLines: [{] value: NormalDiff، رنگ: ہری مرچ ڈیش اسٹائل: shortdash width: 1، }، { value: HighDiff، رنگ: پیلے رنگ کا، ڈیش اسٹائل: shortdash width: 1، }، { value: -NormalDiff، رنگ: ہری مرچ ڈیش اسٹائل: shortdash width: 1، }، { value: -HighDiff، رنگ: پیلے رنگ کا، ڈیش اسٹائل: shortdash width: 1، }] }، سیریز: [{ name: ایلومینیم کی قیمتوں میں کمی ڈیٹا: [،] ٹول ٹپ: valueDecimals: 2 } }] }؛ // reset تمام چارٹ سے پہلے کی معلومات کو صاف کرتا ہے // __chart.reset ((); var a = EnsureCall ((exchange.SetContractType, AInstrument) ؛ var b = EnsureCall ((exchange.SetContractType, BInstrument) ؛ Log ((a.InstrumentName + . + __AType, -, b.InstrumentName + . + __BType, فرق آمدنی کے طور پر دکھایا گیا ہے چارٹ کی طرف سے); TickInterval = Math.max ((TickInterval، 50) ؛ Interval = Math.max ((Interval، 50) ؛ while (true) { onTick (() ؛ نیند ((ٹیک انٹرفیس) ؛ } }


- #### 3、CTP手动全平CTP商品期货持仓

在Simnow 上测试 商品期货策略时经常需要把已经开过的仓位平掉重新测试代码,这样就需要个类似一键平仓的程序来处理 恢复模拟账号未开仓状态。这里使用了一个交易处理模块: $.NewPositionManager 就是该模块的接口函数,作用是生成一个对象,可以调用该对象的方法处理具体操作,比如 全平仓: CoverAll(); 。  做了一点额外的功能,在全部平仓完以后,会打印出所有交易的标的物名称。

var p = $.NewPositionManager (() ؛ فنکشن main() { جبکہ ((سچ) { اگرexchange.IO("status") === true) { p.CoverAll ((); var positions = _C ((exchange.GetPosition) ؛ if ((positions.length === 0) { Log ((positions is :, positions); break؛ } }else{ لاگ اسٹیٹس (سرور سے منسلک نہیں، انتظار کر رہا ہے) ؛ } Sleep ((2000) ؛ } var dict =exchange.IO("instruments"); // تبادلہ میں تمام مصنوعات کی فہرست { مصنوعات کا نام: تفصیلات} ڈکشنری کی شکل میں لوٹاتا ہے for ((var k in dict) { Log ((ڈکٹ کا نام: ڈکٹ, k, تفصیلی معلومات: ڈکٹ کا نام: ڈکٹ, dict[k] ); } لاگ (exit., _C (exchange.GetPosition) ؛ }

  
- #### 4、商品期货主力合约过滤

  在处理商品期货合约的连续性时会遇到主力合约的问题,如何更快的过滤识别出主力合约呢? 同样也写了个代码模块,可以改造,嵌入,或者单独使用。
  在 filter 变量中指定要 扫描的合约代码头。(即不含日期信息的合约代码的部分)  
    

var str = null؛ var strArray = [؛ function main (() { var filter = [MA,CF,zn,SR,pp,l,ni,i,v,jm,al,jd,cs,p]; var products = [؛ لاگ (ٹرانزیکشن سرور ٹرانزیکشن سرور سے منسلک ہونے کا انتظار کر رہا ہے) ؛ while (!exchange.IO("status")) Sleep ((1000) ؛ لاگ (آپ نے تمام معاہدوں کو حاصل کرنے کے لئے شروع کر دیا ہے) ؛ var instruments = _C(exchange.IO، instruments) ؛ لاگ (معاہدہ کی فہرست کامیابی حاصل کرنے کے لئے) ؛ var len = 0؛ for (var instrumentId in instruments) { len++؛ } لاگ (معاہدہ کی فہرست کی لمبائی: لین) ؛ for (var instrumentId in instruments) { if (instruments[instrumentId].IsTrading) { var found = false؛ for (var i = 0؛ i < filter.length; i++) { if (instruments[instrumentId].ProductID == filter[i]) { found = true؛ } } if (!found) { جاری رکھیں؛ } if (typeof(products[instruments[instrumentId].ProductID]) === undefined ) { products[instruments[instrumentId].ProductID] = []؛ } products[instruments[instrumentId].ProductID].push ((instrumentId) ؛ products[instruments[instrumentId]؛ products[instruments[instrumentId]؛ products[instruments[instrumentId]؛ products[instrumentId]؛ products[instruments[instrumentId]؛ products[instrumentId]؛ products[instruments[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ products[instrumentId]؛ productID]؛ productID]؛ } } for (var product in products) { مصنوعات میں مختلف مصنوعات var ss = products[product]; لاگ ((مشترکہ مرجان، مصنوعات، مرجان کی مرجان، ss.length، مرجان کے معاہدے، اہم معاہدے کی مرجان کی شناخت کے لئے) ؛ var vol = 0، volIdx = 0؛ for (var i = 0؛ i < ss.length؛ i++) { _C ((exchange.SetContractType, ss[i]); } Sleep ((5000) ؛ for (var i = 0؛ i < ss.length؛ i++) { _C ((exchange.SetContractType, ss[i]); var ticker = exchange.GetTicker (() ؛

        if (ticker) {
            var obj = JSON.parse(exchange.GetRawJSON());
            if (obj.OpenInterest > vol) {
                vol = obj.OpenInterest;
                volIdx = i;
            }
        }
    }
    // 取消订阅行情(之后此合约K线将停止收集), 当然也可以不取消, 这里演示用
    for (var i = 0; i < ss.length; i++) {
        _C(exchange.SetContractType, "-" + ss[i]);
    }
    strArray.push(ss[volIdx]);
    Log("主力合约为", ss[volIdx], "持仓", vol, '#ff0000');
}
for(var i = 0 ; i < strArray.length; i++){
    str += strArray[i] + ',';
}
Log("主力合约:", str);

}


- #### 5、交互模块

  有时候需要给机器人交互,需要下命令、改参数、获取详细运行状态参数 就需要交互代码了。
  

function get_Command ((() {// ایک فنکشن جو بات چیت کے لئے ذمہ دار ہے ، جو بات چیت کو بروقت اپ ڈیٹ کرتا ہے۔ متعلقہ اقدار ، واقف صارفین خود ہی بڑھا سکتے ہیں۔ var keyValue = 0؛// کمانڈ کی طرف سے بھیجے گئے پیرامیٹرز کی تعداد var way = null؛ // روٹر var cmd = GetCommand ((); // حاصل کریں انٹرایکٹو کمانڈ API if (cmd) { لاگ (بٹن دبائیں: لاگ ، سی ایم ڈی) ؛// لاگ دکھاتا ہے arrStr = cmd.split ((":"); // GetCommand تقریب واپس آتا ہے ایک تار ہے، اور یہاں میں نے کے ساتھ نمٹنے کے لئے پریشانی ختم ہو گئی ہے کیونکہ میں JSON کے ساتھ واقف ہونا چاہتے ہیں //، لہذا پہلے سٹرنگ پر عملدرآمد کریں اور اس فنکشن کو واپس کرنے والے سٹرنگ کو دو سٹرنگوں میں تقسیم کریں: نمبر؛ سٹرنگ صف میں ذخیرہ کریں۔

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

} }


  有时我们甚至需要在机器人运行时插入运行JS 代码:

var cmd = GetCommand ((); // API کو کال کریں تاکہ انٹرفیس انٹرایکٹو کنٹرولز کے بارے میں معلومات حاصل کی جا سکیں۔ if (cmd) { // کوئی پیغام ہے یا نہیں کا فیصلہ کرتا ہے var js = cmd.split ((:, 2) [1]; // تقسیم واپس آنے والے پیغامات سٹرنگ ، 2 واپس کرنے کی حد ، 1 کے طور پر انڈیکس عنصر کو تفویض کرنے کے لئے ایک متغیر جس کا نام js ہے لاگ (( عملدرآمد ڈیبگنگ کوڈ:?? ، js) ؛ // پیداوار عملدرآمد کوڈ try { // غلطی کا پتہ لگانا eval ((js) ؛ // eval فنکشن کو چلاتا ہے، جو کہ داخل کردہ پیرامیٹرز ((کوڈ) کو چلاتا ہے۔ } catch(e) { // غیر معمولی پھینک Log ((Exception, e); // غلط معلومات کی پیداوار } }




当然还有很多代码工具尽在 : https://www.fmz.com/square


#### 先写到这,欢迎读者给我留言!提出建议和意见,如果感觉好玩可以分享给更多热爱程序热爱交易的朋友 
https://www.fmz.com/bbs-topic/735

### 程序员 littleDream 原创

مزید