最新股票全自动交易系统模板代码 var m_sys_mode = m_sys_exec_mode; //系统运行模式 dobj.textcolor = 0xffffff; //对象前景颜色 dobj.execstep = 1000; //程序执行速度参数 var m_path = GetExecPath(); //安装文件路径 var m_target_name.strVal = ThisDocName; //当前画面文件名 var m_start_flug = 0; //自动交易启动标记 var m_mpu_change_flug = 0; //画面动态保存标记 // var m_tab_str = appstr_tab(); //制表符 var m_return_str = appstr_enter(); //回车换行 // var m_pz_name = "600100"; //交易品种名称 var m_pz_no = -1; //交易品种序号 var m_str0000 = m_pz_name; //查交易品种序号 m_str0000 = MakeLowerStr(m_str0000); //字串变为小写 m_str0000 = TrimLeftStr(m_str0000); //字串左边去空 m_str0000 = TrimRightStr(m_str0000); //字串右边去空 for (var kk = 0;kk < 24;kk++) { if (m_str0000 == GetPzName(kk)) { m_pz_no = kk; break; } } var m_pz_type = GetPzType(m_pz_no) ; //获得品种类型 //交易品种序号为-1,表示无该品种 dobj.text = m_pz_name + "自动交易系统"; dobj.textcolor = 0xffffff; //系统变量定义区 var m_sys_time = 0; var m_pc_str = "平仓"; //当日平今,隔日平仓 var m_xd_size = 2500; //下单手数 var m_buy_flag = 0; //多标记 var m_buy_kdelay = 0; //开多等待时间 var m_buy_pdelay = 0; //平多等待时间 var m_sell_flag = 0; //卖标记 var m_sell_kdelay = 0; //开空等待时间 var m_sell_pdelay = 0; //平空等待时间 var m_tick_cmp = 20000; //正常20秒 if (m_sys_mode == 0) m_tick_cmp = 10000; //模拟时10秒 var m_xd_js = 0; //下单记数 var m_log_str = ""; //用于记录交易情况 var m_log_js = 0; //log记数 //系统变量定义区 var m_last_cal = 0; //最后计算位置 var m_macd00=0.0;//当前MACD值 var m_dif00=0.0; var m_dea00=0.0; var m_last_macd00=0.0;//上次MACD值 var m_last_dif00=0.0; var m_last_dea00=0.0; //建立系统循环 while (TRUE) { var m_return = Wait(0x80 | 0x10 | 0x20 | 0x40, 100, 0); //等待各种希望捕捉的事件 //事件处理 if ((m_return&0x10) == 0x10) { //有鼠标双击事件 if (m_start_flug == 1) { SetAskItem = "询问:"; SetAskText = "自动交易过程可能未能完成,如关请仔细检查, 真的关闭自动交易?"; if (QueryMessage == 1) { m_start_flug = 0; //置启动标记 dobj.text = m_pz_name + "自动交易系统"; dobj.textcolor = 0xffffff; } } else { SetAskItem = "询问:"; SetAskText = "真的打开自动交易?"; if (QueryMessage == 1) { m_start_flug = 1; //置启动标记 dobj.text = m_pz_name + "自动交易系统启动"; dobj.textcolor = 0x2099e0; //启动后改变文字颜色 SetAutoExecFlug = 1; //置自动交易标记,当用户关闭该画面时将出现提示对话框 } } } if ((m_return&0x20) == 0x20) { //有鼠标移入事件 if (m_start_flug == 0) dobj.textcolor = 0x2099e0; } if ((m_return&0x40) == 0x40) { //有鼠标移出事件 if (m_start_flug == 0) dobj.textcolor = 0xffffff; } if ((m_return&0x80) == 0x80) { //有其他对象发来的消息,则处理 } if (m_start_flug == 1) { if (m_pz_no < 0) { m_start_flug = 0; //无该品种则清启动标记 continue; } //自动交易已经启动 //这里编制策略程序 var m_new_jg = GetPzNew(m_pz_no); //最新价; if ((m_new_jg > 0) && (m_xd_js < 60)) { //判买卖条件 //m_buy_flag==1---开多平空 ==2只平空 //m_sell_flag==1---开空平多 ==2只平多 // var m_cyear = GetYear(); //年 var m_ctime0 = GetMonth() * 100 + GetDay(); //月日 if (m_sys_time == 0) m_sys_time = m_sys_exec_data_time; if (m_sys_mode == 0) { if (m_sys_time == 0) continue; //模拟运行时 m_cyear.lVal = m_sys_time / 10000; //年 m_ctime0.lVal = m_sys_time % 10000; //月日 } // //执行买卖 //可平持仓 var m_pz_dsize1=CheckWtCmd(m_pz_no,"多仓","全部成交",0)+CheckWtCmd(m_pz_no,"多仓","现有持仓",0); var m_pz_ksize1=CheckWtCmd(m_pz_no,"空仓","全部成交",0)+CheckWtCmd(m_pz_no,"空仓","现有持仓",0); //总持仓 var m_pz_dsize1_a=m_pz_dsize1; var m_pz_ksize1_a=m_pz_ksize1; //检查成交回报,T+1交易用现有持仓查隔夜仓,根据代码的前两位判别是不是权证 var m_pz_name0000=GetSubStr(m_pz_name,0,2); if((m_pz_name0000!="58")&&(m_pz_name0000!="03")) { //不是权证交易 m_pz_dsize1=CheckWtCmd(m_pz_no, "多仓", "现有持仓", 0)+CheckWtCmd(m_pz_no,"多仓","平全部成交",0); m_pz_ksize1=CheckWtCmd(m_pz_no, "空仓", "现有持仓", 0)+CheckWtCmd(m_pz_no,"空仓","平全部成交",0); } if (m_sys_mode == 0) { //复盘模拟时 m_pz_dsize1 = CheckWtCmd(m_pz_no, "多仓", "全部成交", 0); m_pz_ksize1 = CheckWtCmd(m_pz_no, "空仓", "全部成交", 0); } var m_pz_dsize21 = CheckWtCmd(m_pz_no, "多仓", "开等待成交", 0); var m_pz_dsize22 = CheckWtCmd(m_pz_no, "多仓", "平等待成交", 0); var m_pz_ksize21 = CheckWtCmd(m_pz_no, "空仓", "开等待成交", 0); var m_pz_ksize22 = CheckWtCmd(m_pz_no, "空仓", "平等待成交", 0); //打开期货当日数据接口,下面的参数值0表示是一分钟线 //改为1表示是日线 //改为4表示是5分钟线 //改为5表示是30分钟线 //改为6表示是60分钟线 //改为7表示是3分钟线 //具体用法查函数说明 OpenLsLib(m_pz_name, m_pz_type, 0, m_ctime0*10000); //一分钟线 // var m_data_size = GetLsLibDataSize(); //获取一分钟线总数 var m_end_dir = m_data_size - 1; //最后读取指针 if (m_end_dir < 12) continue; //不足12点则结束本次运算 var m_nth00.lVal = GetLsLibData(0, m_end_dir); //获得最新交易时间 m_nth00 = m_nth00 % 10000; //分时 if ((m_nth00 >= 901) && (m_nth00 <= 1501)) { if (m_last_cal != m_end_dir) { m_last_cal = m_end_dir; //求MACD值 //当前m_end_dir位置上的MACD值还未固定,只能用前一点 m_last_macd00=m_macd00;//上次MACD值 m_last_dif00=m_dif00; m_last_dea00=m_dea00; var m_macd_str=GetLsLibEXMACD(m_end_dir - 1,12,26,5); m_macd00.dblVal=GetSubStr(m_macd_str,0,16); m_dif00.dblVal=GetSubStr(m_macd_str,17,33); m_dea00.dblVal=GetSubStr(m_macd_str,34,50); if((m_last_macd00<0)&&(m_macd00>0)) { //买入 m_buy_flag = 1; m_sell_flag = 0; } else if((m_last_macd00>0)&&(m_macd00<0)) { //平仓 m_buy_flag = 0; m_sell_flag = 2; } // dobj.text = m_pz_name + "自动交易系统启动...." + m_macd00; //显示m_macd00值,这里可按需修改 dobj.textcolor = 0x2099e0; //启动后改变文字颜色 } } //中午或下午收市平仓,可按需修改 if ((m_nth00 > 1126) && (m_nth00 < 1135) || (m_nth00 > 1456)) { m_buy_flag = 2; m_sell_flag = 2; } if (m_buy_flag >= 1) { //是买 var m_bjg = GetPzSelPrice(m_pz_no); //卖出报价 if (m_bjg == 0) m_bjg = m_new_jg; // if(TRUE) { var m_int00.lVal=m_bjg*1000; if((m_int00%10)==9) m_bjg=m_int00/1000+0.001; else m_bjg=m_int00/1000; } // if (m_pz_ksize1 > 0) { var m_pktick = GetTimeTick(m_sell_pdelay); //毫秒级计时 if ((m_pz_ksize22 == 0) && ((m_sell_pdelay == 0) || (m_pktick > m_tick_cmp / 3))) { //平空单 SetWtCmd(m_pz_no, m_pc_str, "买入", m_pz_ksize1, m_bjg, 0); //1是数量 m_sell_pdelay = GetTimeTick(0); if (m_sell_pdelay == 0) m_sell_pdelay = 1; m_log_str = m_log_str + "开空" + m_tab_str + m_bjg + m_return_str; m_xd_js++; } else if ((m_pz_ksize22 > 0) && (m_pktick > m_tick_cmp)) { //超时撤平空 SetWtCmd(m_pz_no, "撤平单", "买入", 0, 0, 0); m_sell_pdelay = GetTimeTick(0); if (m_sell_pdelay == 0) m_sell_pdelay = 1; } } else if (m_pz_dsize1_a == 0) { m_sell_pdelay = 0; var m_kdtick = GetTimeTick(m_buy_kdelay); //毫秒级计时 if ((m_pz_dsize21 == 0) && ((m_buy_kdelay == 0) || (m_kdtick > m_tick_cmp / 3))) { if (m_buy_flag == 1) { //开多 SetWtCmd(m_pz_no, "开仓", "买入", m_xd_size, m_bjg, 0); m_buy_kdelay = GetTimeTick(0); if (m_buy_kdelay == 0) m_buy_kdelay = 1; m_log_str = m_log_str + "开多" + m_tab_str + m_bjg + m_return_str; m_xd_js++; } } else if ((m_pz_dsize21 > 0) && (m_kdtick > m_tick_cmp)) { //超时撤开多 SetWtCmd(m_pz_no, "撤开单", "买入", 0, 0, 0); m_buy_kdelay = GetTimeTick(0); if (m_buy_kdelay == 0) m_buy_kdelay = 1; } } else m_buy_kdelay = 0; } if (m_sell_flag >= 1) { //是卖 var m_sjg = GetPzBuyPrice(m_pz_no); //卖出报价 if (m_sjg == 0) m_sjg = m_new_jg; if(TRUE) { var m_int00.lVal=m_sjg*1000; if((m_int00%10)==9) m_sjg=m_int00/1000+0.001; else m_sjg=m_int00/1000; } if (m_pz_dsize1 > 0) { var m_pdtick = GetTimeTick(m_buy_pdelay); //毫秒级计时 if ((m_pz_dsize22 == 0) && ((m_buy_pdelay == 0) || (m_pdtick > m_tick_cmp / 3))) { //平多单 SetWtCmd(m_pz_no, m_pc_str, "卖出", m_pz_dsize1, m_sjg, 0); //1是数量 m_buy_pdelay = GetTimeTick(0); if (m_buy_pdelay == 0) m_buy_pdelay = 1; m_log_str = m_log_str + "平多" + m_tab_str + m_sjg + m_return_str; m_xd_js++; } else if ((m_pz_dsize22 > 0) && (m_pdtick > m_tick_cmp)) { //超时撤平多 SetWtCmd(m_pz_no, "撤平单", "卖出", 0, 0, 0); m_buy_pdelay = GetTimeTick(0); if (m_buy_pdelay == 0) m_buy_pdelay = 1; } } else if (m_pz_ksize1_a == 0) { m_buy_pdelay = 0; var m_kktick = GetTimeTick(m_sell_kdelay); //毫秒级计时 if ((m_pz_ksize21 == 0) && ((m_sell_kdelay == 0) || (m_kktick > m_tick_cmp / 3))) { if (m_sell_flag == 1) { //开空 SetWtCmd(m_pz_no, "开仓", "卖出", m_xd_size, m_sjg, 0); m_sell_kdelay = GetTimeTick(0); if (m_sell_kdelay == 0) m_sell_kdelay = 1; m_log_str = m_log_str + "开空" + m_tab_str + m_sjg + m_return_str; m_xd_js++; } } else if ((m_pz_ksize21 > 0) && (m_kktick > m_tick_cmp)) { //超时撤开空 SetWtCmd(m_pz_no, "撤开单", "卖出", 0, 0, 0); m_sell_kdelay = GetTimeTick(0); if (m_sell_kdelay == 0) m_sell_kdelay = 1; } } else m_sell_kdelay = 0; } } //这里编制策略程序 } else { //交易停止后清除全局变量 m_sys_time = 0; m_buy_flag = 0; m_buy_kdelay = 0; m_buy_pdelay = 0; m_sell_flag = 0; m_sell_kdelay = 0; m_sell_pdelay = 0; CloseLsLib(); //关闭历史数据库 } //添加进记录文件 if (m_log_str != "") { m_log_js++; if (m_log_js > 50) { AddStrToFile(m_log_str, "message\交易记录.txt"); m_log_str = ""; m_log_js = 0; } } //程序有没有被动态修改,有则保存 if (m_mpu_change_flug == 1) { SaveDocToFile = 1; //保存当前画面 m_mpu_change_flug = 0; } }