关于MAP
Params //此处添加参数 Numeric length(50); //定义数值行参数Length,默认值为10; 该值决定序列Series可以回溯以前多少个BAR的值 Numeric millsecs(1000); Numeric Buy_O(0); Numeric Buy_C(0); Numeric Sellshort_O(0); Numeric Sellshort_C(0); Vars //此处添加变量 Integer i(0); Integer j(0); //Map是一种字典类型的数据。Map<keys,values>的结构提供了不重复的key与数值的一一对应的存储。 //Price的keys是String字符串,存放时间点,values是Array<Numeric>一维数组,存放历史N天某一时间点的收盘价序列(或者开盘价) //keys=0900_O是09:00bar的开盘价,keys=0900是09:00bar的收盘价,也是就是9:05的价格。 //keys=2100_O是21:00bar的开盘价,keys=2100是21:00bar的收盘价,也是就是21:05的价格。 //Spread是某一时间点与开盘价价差的每日历史价差序列,Numeric是序列长度 //求标准差的类型,1 – 求总体方差,2 – 求样本方差 //Global Series<String> Time("0900","0930");// Global Numeric S(0); //Global Map<String, Array<Numeric>> Price; Global Map<integer, Array<Numeric>> Price_Close; Global Map<integer, Array<Numeric>> Price_Open; Global Map<integer, Array<Numeric>> Spread; Global Map<integer, integer> Var; Global Array<Numeric> Time5M([900,905,910,915,920,925,930,935,940,945,950,955,1000,1400,1405,1410,1415,1420,1425,1430,1435,1440,1455]); Global Array<Numeric> Time5MOpen([900]); //Global Array<Numeric> inte(0); Global Integer timerId; Global Numeric BS_Open(0); Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { timerId=createTimer(millsecs); //与数据源有关 Range[0:DataCount-1] //初始化字典Price,Spread,Var,将KEY设置为时间,VALUE全部设置为O。 for i=0 to GetArraySize(Time5M)-1 { print("Time5M[i]:" +Text(Time5M[i])); for j=0 to length-1 { Price_Close[Time5M[i]][j]=0; Spread[Time5M[i]][j]=0; } Var[Time5M[i]]=0; print("Price_Close:" +TextArray(Price_Close[Time5M[i]])); print("Spread:" +TextArray(Spread[Time5M[i]])); //print("Var:" +TextArray(Var[Time5M[i]])); print("Var:" +Text(Var[Time5M[i]])); } for i=0 to GetArraySize(Time5MOpen)-1 { print("Time5MOpen:" +Text(Time5MOpen[i])); for j=0 to length-1 { Price_Open[Time5MOpen[i]][j]=0; } //print("Price:" +TextArray(Price[Time5M[i]])); //print("Spread:" +TextArray(Spread[Time5M[i]])); //print("Var:" +TextArray(Var[Time5M[i]])); } { //=========数据源相关设置============== //AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权 //AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格 //AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓 //AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 //AddDataFlag(Enum_Data_OnlyDay()); //设置仅日盘 //AddDataFlag(Enum_Data_OnlyNight()); //设置仅夜盘 //AddDataFlag(Enum_Data_NotGenReport()); //设置数据源不参与生成报告标志 //=========交易相关设置============== //MarginRate rate; //rate.ratioType = Enum_Rate_ByFillAmount; //设置保证金费率方式为成交金额百分比 //rate.longMarginRatio = 0.1; //设置保证金率为10% //rate.shortMarginRatio = 0.2; //设置保证金率为20% //SetMarginRate(rate); //CommissionRate tCommissionRate; //tCommissionRate.ratioType = Enum_Rate_ByFillAmount; //tCommissionRate.openRatio = 5; //设置开仓手续费为成交金额的5%% //tCommissionRate.closeRatio = 2; //设置平仓手续费为成交金额的2%% //tCommissionRate.closeTodayRatio = 0; //设置平今手续费为0 //SetCommissionRate(tCommissionRate); //设置手续费率 //SetSlippage(Enum_Rate_PointPerHand,2); //设置滑点为2跳/手 //SetOrderPriceOffset(2); //设置委托价为叫买/卖价偏移2跳 //SetOrderMap2MainSymbol(); //设置委托映射到主力 //SetOrderMap2AppointedSymbol(symbols, multiples); //设置委托映射到指定合约,symbols是映射合约数组,multiples是映射倍数数组 } //与数据源无关 //SetBeginBarMaxCount(10); //设置最大起始bar数为10 //SetBackBarMaxCount(10); //设置最大回溯bar数为10 //=========交易相关设置============== //SetInitCapital(1000000); //设置初始资金为100万 //AddTradeFlag(Enum_Trade_Ignore_Buy()); //设置忽略多开 //AddTradeFlag(Enum_Trade_Ignore_Sell()); //设置忽略多平 //AddTradeFlag(Enum_Trade_Ignore_SellShort()); //设置忽略空开 //AddTradeFlag(Enum_Trade_Ignore_Buy2Cover()); //设置忽略空平 } //在所有的数据源准备完成后调用,应用在数据源的设置等操作 OnReady() { } //基础数据更新事件函数 OnDic(StringRef dicName,StringRef dicSymbol,DicDataRef dicValue) { } //在新bar的第一次执行之前调用一次,参数为新bar的图层数组 OnBarOpen(ArrayRef<Integer> indexs) { } //onbar 是每个bar都执行一次 OnBar(ArrayRef<Integer> indexs) { /* if (10000*Time()>=900 && 10000*Time()<=1000) { Print("year:" + Text(year())); Print("month:" + Text(Month())); Print("day:" + Text(Day())); Print("当前Bar时间(Time函数):" + Text(Time())); //Print("Time:" + Text(Hour())); //Print("Minute:" + Text(Minute())); //S=10000*Time(); //Print("当前Bar时间(Time函数):" + Text(S)); } */ for i=0 to GetArraySize(Time5MOpen)-1 { if (Time5MOpen[i]==10000*Time()) { ArrayErase(Price_Open[Time5MOpen[i]],0,1);//删除一维数组Price_Open[Time5MOpen[i]]的第一个元素 ArrayPushBack(Price_Open[Time5MOpen[i]],Open);//一维数组Price_Open[Time5MOpen[i]]的最后一个元素赋值为Open //print("Price_Open:" +TextArray(Price_Open[Time5MOpen[i]])); } } for i=0 to GetArraySize(Time5M)-1 { //print("Time5M[i]:" +Text(Time5M[i])); //Price[Time5M[i]]=0; //print("Price:" +TextArray(Price[Time5M[i]])); //10000*Time(),time的显示格式是0.0930,所以要乘以1000. if (Time5M[i]==10000*Time()) { //ArrayErase(ArrayRef arr, Integer pos, Integer count)将数组中从位置pos开始的count个元素删除 //ArrayPushBack-一维数组末尾添加元素 ArrayErase(Price_Close[Time5M[i]],0,1);//删除一维数组Price_Close[Time5M[i]]的第一个元素 ArrayPushBack(Price_Close[Time5M[i]],Close);//一维数组Price_Close[Time5M[i]]的最后一个元素赋值为Close //print("Price:" +TextArray(Price[Time5M[i]])); //Na1Dev:一维数组的减法,Spread[Time5M[i]]=Price_Close[Time5M[i]]-Price_Open[Time5MOpen[0]] //比如09:00bar的收盘价(即09:30的价格)-09:00bar的开盘价,存到Spread中 Numeric val = Na1Dev(Price_Close[Time5M[i]],Price_Open[Time5MOpen[0]],Spread[Time5M[i]]); //就一维数组Spread[Time5M[i]]的标准差 Numeric a_val = StandardDevArray(Spread[Time5M[i]],1); Var[Time5M[i]] = a_val; //print("Price_Close[Time5M[i]]:" + TextArray(Price_Close[Time5M[i]])); //print("Price_Open[Time5MOpen[0]]:" + TextArray(Price_Open[Time5MOpen[0]])); //print("Spread[Time5M[i]]:" + TextArray(Spread[Time5M[i]])); Print("当前Bar时间(Time函数):" + Text(Time())); print("Time5M[i]:" + Text(Time5M[i])); print("Var[Time5M[i]]:" + Text(Var[Time5M[i]])); Print("10000*Time(): " + Text(10000*Time())); Print("Var: " + Text(Var[10000*Time()])); print("Var[Time5M[i]]:" + Text(Var[Time5M[i]])); } } }苹果期货主力合约5分钟K线,为什么1410,1415,1420,1425,1430,1435,1440这几个点Var[10000*Time()]值等于N/A,其他时间,Var[Time5M[i]]和Var[10000*Time()]相等。