SQL Server 2005/2008 加密存储过程解密

SQL Server 2005 以上存储过程无法进行查看和编辑,解密存储过程代码如下:

Create PROCEDURE [dbo].[sp_windbi$decrypt]
(@procedure sysname = NULL, @revfl int = 1)
AS
/*
调用形式为:
exec dbo.sp__windbi$decrypt @procedure,0
如果第二个参数使用1的话,会给出该存储过程的一些提示。
--版本4.0  修正存储过程过长解密出来是空白的问题
*/
SET NOCOUNT ON
IF @revfl = 1
BEGIN
PRINT '警告:该存储过程会删除并重建原始的存储过程。'
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
RETURN 0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int
select @maxColID = max(subobjid) FROM
sys.sysobjvalues WHERE objid = object_id(@procedure)
--select @maxColID as 'Rows in sys.sysobjvalues'
select @procNameLength = datalength(@procedure) + 29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
declare @objtype varchar(2),@ParentName nvarchar(max)
select @real_decrypt_01a = ''
--提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称
select @objtype=type,@parentname=object_name(parent_object_id)
from sys.objects where [object_id]=object_id(@procedure)
-- 从sys.sysobjvalues里提出加密的imageval记录
SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) and valclass = 1 order by subobjid)

--创建一个临时表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--开始一个事务,稍后回滚
BEGIN TRAN
--更改原始的存储过程,用短横线替换
if @objtype='P'
  SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
  SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
  SET @fake_01='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
  SET @fake_01='ALTER trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
EXECUTE (@fake_01)
--从sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) and valclass = 1 order by subobjid )
if @objtype='P'
  SET @fake_01='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
  SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
  SET @fake_01='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
  SET @fake_01='Create trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
--开始计数
SET @intProcSpace=1
--使用字符填充临时变量
SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 ))
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace=1
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END

--通过sp_helptext逻辑向表#output里插入变量
insert #output (real_decrypt) select @real_decrypt_01
--select real_decrypt AS '#output chek' from #output --测试
-- -------------------------------------
--开始从sp_helptext提取
-- -------------------------------------
declare @dbname sysname
,@BlankSpaceAdded int
,@BasePos int
,@CurrentPos int
,@TextLength int
,@LineId int
,@AddOnLen int
,@LFCR int --回车换行的长度
,@DefinedLength int
,@SyscomText nvarchar(max)
,@Line nvarchar(255)
Select @DefinedLength = 255
SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATE TABLE #CommentText
(LineId int
,Text nvarchar(255) collate database_default)
--使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY
--获取文本
SELECT @LFCR = 2
SELECT @LineId = 1
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
--通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
--如果找到回车
IF @CurrentPos != 0
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@CurrentPos-@BasePos + @LFCR) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +
@BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
SELECT @BasePos = @CurrentPos+2
INSERT #CommentText VALUES( @LineId, @Line )
SELECT @LineId = @LineId + 1
SELECT @Line = NULL
END
ELSE
--如果回车没找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines长度的新值大于定义的长度
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@TextLength-@BasePos+1 ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength -
(isnull(LEN(@Line),0) + @BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =
0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
if LEN(@Line) < @DefinedLength and charindex(' ',
@SyscomText, @TextLength+1 ) > 0
BEGIN
SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1
END
END
END
END
FETCH NEXT FROM ms_crs_syscom into @SyscomText
END
IF @Line is NOT NULL
INSERT #CommentText VALUES( @LineId, @Line )
select Text from #CommentText order by LineId
CLOSE ms_crs_syscom
DEALLOCATE ms_crs_syscom
DROP TABLE #CommentText
-- -------------------------------------
--结束从sp_helptext提取
-- -------------------------------------
--删除用短横线创建的存储过程并重建原始的存储过程
ROLLBACK TRAN
DROP TABLE #output
go

TFS2013升级Update 2错误 - TFS255440

TF255440: The following account has a SQL Server login, but the login was denied access: lsw\lishewen. The server selected to host the databases for Team Foundation Server is: lswserver. The SQL Server login associated with the user account must be granted access to the SQL Server instance on that server.

解决方法:

首先将你的账号加入sqlserver管理员组(如果是,则不用加)

如security\logins下添加账号   赋予systemadmin,serveradmin权限

利用旧版Android漏洞的E-Z-2-Use攻击代码发布

  利用 Android 操作系统 WebView 编程接口漏洞的攻击代码已作为一个模块加入到开源漏洞利用框架 Metasploit 中。漏洞影响 Android 4.2 之前的版本,Google 在 Android 4.2 中修正了这个漏洞,但根据官方统计,超过五成用户仍然使用存在漏洞的旧版本。

  WebView 的漏洞允许攻击者在 Android 浏览器和其它应用中注入恶意 JavaScript 代码,获得与目标程序相同的访问权限,攻击者可以开启一个 shell 窗口访问受害者的文件系统、照相机,地理位置数据、SD 卡数据和地址簿。漏洞还可通过不安全网络的中间人攻击触发。漏洞存在于 Android 系统中,而不是私有的 GMS 应用平台,只有更新系统才能修正漏洞。安全研究人员 Tod Beardsley 希望,攻击代码的披露能迫使供应商尽快升级系统。

ECShop实现立刻购买与添加到购物车并存的方法

在后台开启“一步购物则”可以不用到购物车“直接结算” 。从而实现立刻购买。然而购物车的功能又没有了。有没有像淘宝那样即可以立刻购买。又有购物车功能呢?

    1、首先我们先将“添加购物车”的跳转链接复制替换“收藏商品”的按钮上然后设一个bool值为1 。

<a href="javascript:bool =1;addToCart({$goods.goods_id})">。

    2、然后打开JS处理文件“common.js” ,在这个脚本的第一行代码之上加一个全局变量var bool =0; 查找点击购物车之后的那条链接即:flow.php?step=cart  ,找到这个(在第88行
那块)之后,在下面加这句话(bool == 1) && (cart_url = 'flow.php?step=consignee');

    意思是 当bool = 1 条件满足时 则cart_url链接到  'flow.php?step=consignee' 直接购买的页面

    这样就实现了“立刻购买”与“添加到购物车”并存的方法

如何在Windows Store应用闪退的时候自动生成dump

    当开发者在测试或者用户使用Windows store 应用的时候,我们可能希望Windows store程序能够在发生异常的时候自动生成dump文件以便于以后分析。在写桌面应用的时候,我们可以通过调用API MiniDumpWriteDump来实现。但是这个API在Windows store应用中是不被支持的。那么有没有其他办法来生成dump了呢? 其实以前的Windows Error Reporting机制针对Windows store应用还是有效的,所以你可以通过改写注册表的办法让应用程序自动生成dump,具体步骤如下:

1) 运行REGEDIT.EXE 找到 “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps”. 如果该键不存在的话则新建LocalDumps 键,。

2) 创建一个与你的Windows store应用进程同名的子键,比如说MyApp.exe。

3) 在子键中创建一个名为DumpFolder,类型为REG_EXPAND_SZ的值,设置它的值为你需要生成dump的目录(保证要存在),比如说C:\Dumps。

4) 在同一个子键中创建一个名为DumpCount,类型为REG_DWORD的值,设置他的值为5 (生成dump的最大数目)。

5) 在同一个子键中创建一个名为DumpType,类型为REG_DWORD的值,设置他的值为2 (full dump)。

其结果如图所示:

这样在你的Windows store应用闪退的时候就可以自动得到full dump了。你可以将上述注册表键值放在一个注册表文件中,当用户有闪退的情况是,让用户倒入该注册表文件,然后将生成的dump文件上传。

别错把需求当市场

  创业团队经常弄混了「需求」与「市场」的差别,从根本上说,需求是需求,但市场的构成除了有需求存在,还得有供给,同时透过共识的价格交集而成交,方能形成市场。简单说,有需求未必能形成市场,那得看供给与价格;反过来说,只有供给而不存在需求,或者供给与需求具备但价格没有共识,市场也不存在。

  虽然是很简单的道理,但我还是经常发现多数团队并没有把重心摆在谈论「市场」,而是谈论「需求」,甚至连需求也没碰触到,只谈自己做了什么、想做什么,仿佛产品、服务做出来就卖得掉,这当然是比较不成熟的创业观点,但事实上多数团队就是如此。

  当局者迷是很正常的事,即便我自己创业过几次,每每听到不错的点子还是会瞬间陷入「过度放大」的迷思里,一下子以为可以接触的市场很大,可以满足的需求很多,但实际上根本就只有很少数的消费者才可能采用这个产品或服务,这当中最大的问题还不在于消费者少,而在于你根本不知道这群消费者在哪里。

  等到奋不顾身执行下去才恍然大悟,原来要搜寻出这群人得花非常多钱,然而业绩成长速度跟不上你的烧钱速度,自己都开始怀疑当初的想法是否真的有这么好,追本溯源来说还是老话那一句,只想到自己想做的,以为点子很好,但这都是供给端、制造端的思维,完全忽略了「需求」,更别提到底有没有存在那个你自以为存在的「市场」。

  举一个最近朋友的案例,一个多月前他偶然知道,原来自己某个远亲是在种苹果的���品质优良又可口,当他了解零售的苹果价格与生产端有不小的差距后,自己兴起了想直接跟远亲批苹果去卖的念头。他认为他有巨大的成本优势,透过网路去卖应该可以有不少的利润,于是跑来跟我聊他的点子可不可行。

  于是我问他是否知道苹果零售市场一年多大产值?市售苹果有几种?消费者多半都在哪里购买?是菜市场、大卖场、便利商店还是其他?分别是哪些人去买?买苹果的理由或需求是什么?不同品种的苹果大约落在什么价位?如果多数消费者在实体通路卖,那虚拟通路是加分还是减分?

  他听完我的问题,顿时愣了一下,不知道该怎么回答。不过他这样的情况还算是好的,因为至少「苹果零售市场」是存在的,也就是说最差的情况下,他就是去菜市场租个小摊位卖苹果,再怎么糟糕应该一天也能有个几百块进帐,划不划算就是另一回事,但很多团队是自己做了一个产品,却不知道最后应该跟谁收钱?哪些人会付钱?这就是因为没弄清楚到底最后该走向什么市场的原因。

  如果是我,我会先把上述的「市场」问题先弄清楚,接着才是思考应该怎么切入「苹果零售市场」。比方说,假设苹果零售市场一年有 50 亿的成交值,其中实体通路与虚拟通路大约是9:1,实体通路中菜市场、大卖场、便利商店各占1/3,网路与电视购物则是各1/2;菜市场购买的族群是婆婆妈妈,平均年龄 40 岁以上;大卖场则是以小家庭为主,便利商店则是 25 岁左右的 OL;以需求来说,妈妈们买苹果可能是给家人吃,或者新手妈妈是打成苹果泥给小 baby 吃;为了健康因素吃的可能占了 50%,为了加入沙拉当作正餐的因素可能占了 20%。

  分析完之后可能你最后卖的未必是苹果本身,而是选择卖苹果泥,切入苹果零售的网路市场,同时针对新手妈妈为销售对象,也因此产生了广告费该买什么关键字,或者该与有许多新手妈妈存在、活跃的网站策略合作,部落客也专找有影响力的新手妈妈撰写专文推荐。

  这里我想说的重点是「顺序」,就是你得先有「市场」为基础的分析,于是有了某种商业出发点,接着才去探讨消费者行为背后的需求,进而衍生出你可能可以做什么产品或服务,去满足这个需求,进而切入该市场。这样就能确保你做出来的东西可以对应到某个市场去,而不是做出来了却不知道自己应该怎么走下去。

  这道理不会只用在卖苹果,卖任何东西都一样,必然会指引你走向某个特定的市场--「有供、有需、有共识价格的市场」,而不是你自以为会有的需求。诚如我所说,Google 并不是经营一个「搜索市场」,因为没有人为搜索付费,这是一个只有供给没有付费的「需求」,同理 Facebook 是经营一个「社交网站」而非「社交市场」,但他们两者都从「(网路)广告市场」赚钱,而广告市场老早就存在,至少网路兴起之前,多数广告是买在报纸、杂志跟电视。

  因此,无论你的创业多创新,你的收入来源最终必然指向某个「市场」,而且通常是既有的、存在许久的市场。历史上,只有非常非常少数的发明可以创造「新市场」,你会不会是那个引领潮流的人要看你的本事,但如果你没什么资源,或者创业经验还不够,我会建议你尽可能别去做「创造市场」的创业路,而是去做一个可以从既有市场赚到钱的创业路,应该会比较妥当一些。即便你认为自己的产品很创新,但产品的创新未必能真正创造新市场,因为最终它还是得回归到能解决某些问题,对应某个市场,你才赚得到钱。

  总而言之,别错把需求当市场,需求只是市场的一部份,有人真正愿意为你所做的事情掏钱才是商业的基础,也是你创业的根本之道。胜兵先胜而后求战,败兵往往是先战而后求胜,虽然看起来只是次序不同,但其中风险与经营智慧却是天壤之别。

诺基亚发布“Lumia软件恢复工具”

早在Symbian时代,诺基亚就有过一款名叫“Nokia Software Recovery”的工具软件。有了它,人们就能够轻松地自行擦除内部软件和数据、甚至还可以选择重装软件。遗憾的是,在Lumia系列智能机于市场上冲锋陷阵的这几年里,诺基亚却移除了这款工具。不过今天,Nokia Care已经重新发布了“Software Recovery Tool for Lumia devices”。

该软件与其前辈一样地出色。如果你的Lumia设备遇到了软件问题或故障(如失去响应、卡住、无法启动等),Nokia Software Recovery Tool就能够帮助你恢复手机,同时安装更新。

该工具会自动检测设备并下载相应数据。根据设备的不同,该工具的数据下载量可以多达4GB。当然,有些事情你得注意——请务必在Windows 7或版本更高的系统中运行、并注意保存现有重要数据的备份!(除非设备已彻底变砖)

Nokia Software Recovery Tool传送门:

http://www.nokia.com/us-en/support/software-recovery/

如何查询本月信用卡账单金额

以下是各银行查询信用卡账单的方式,可以选择您最适合的方式进行查询(以下联系方式仅供参考,以银行公告为准)

银行名称 客服热线 人工服务 账单查询
兴业银行 95561 拨打95561-按1-按8-人工服务 发送30+卡号末四位到95561
中信银行 4008895558 拨打4008895558-按1-身份证号和查询密码-按0-人工服务 发送ZD+卡号末四位到106980095558
平安银行 95511 拨打95511-按2-按9-身份证和查询密码-人工服务 移动用户发送8602至95511
深发展银行 95511 拨打95511-按2-按9-身份证和查询密码-人工服务 移动用户发送8602至95511
农业银行 4006695599 拨打4006695599-按1-按0-身份证号-人工服务 暂不支持
招商银行 4008205555 拨打4008205555-身份证好和查询密码-按9-人工服务 移动用户发送#ZD到1065795555
工商银行 4006695588 拨打4006695588-按2-按2-人工服务 发送CXZD+#卡号#+短信密码发送到95588
交通银行 4008009888 拨打4008009888-按1-身份证号和查询密码-按0-按6-人工 发送CC账单#卡号末四位到95559
广发银行 95508 拨打95508-按1中文服务-查询密码-按4-按0-人工服务 发送XZD+卡号末四位+查询年月(YYYYMM)到95508
建设银行 4008200588 拨打4008200588-输入身份证号和查询密码-按0-人工服务 发送CCZD#卡号末四位到95533
民生银行 4006695568 拨打4006695568-按2-查询密码-按1-按0-人工服务 移动用户发送ZD+卡号末四位到106902895568
中国银行 4006695566 拨打4006695566-按1-按0-身份证号-人工服务 暂不支持
光大银行 4008195595 拨打4008195595-按0-按1-卡号和查询密码-人工服务 发送账单+卡号后四位到95595
浦发银行 4008208788 拨打4008208788-按1-按0-身份证号-查询密码-人工服务 发送ZDCX+空格+卡号末四位到95528
江苏银行 4008696098 拨打4008696098-按1-按0-人工服务 暂不支持
宁波银行 962528 拨打962528-按2-按0-身份证号码-人工服务 移动用户发送ZD+卡号后四位到1065752574896528
上海银行 95594 拨打95594--按1--按0--人工服务 暂不支持
北京银行 4006601169 拨打4006601169-按0-人工服务 暂不支持
杭州银行 4008888508 拨打4008888508-按2-按6-身份证号或者卡号-人工服务 暂不支持

MQL4关键函数

如何抓取价格数据
1 如何获得本货币对的买价、卖价
double ask = Ask; // Ask是关键字,表示本货币对买价;
double bid = Bid; // Bid是关键字,表示本货币对卖价;

2 如何获得任意货币对的买价、卖价
double MarketInfo(string symbol, int type);
MarketInfo("EURUSD", MODE_ASK); // 获得欧元的买价
MarketInfo("EURUSD", MODE_BID); // 获得欧元的卖价

3 如何获得本货币对,本时间周期,任意K线的开盘价、收盘价、最高价、最低价
double Open[]; // 开盘价
double Close[]; // 收盘价
double High[]; // 最高价
double Low[]; // 最低价
// 序号从最后一根K线开始按照0、1、2编号。

4 如何获取任意货币对,任意时间周期,任意K线的开盘价、收盘价、最高价、最低价
double iOpen(string symbol, int timeframe, int shift)
double iClose(string symbol, int timeframe, int shift)
double iHigh(string symbol, int timeframe, int shift)
double iLow(string symbol, int timeframe, int shift)
// symbol,货币对名称;
// timeframe,时间周期;
// shift,K线序号;

如何调用指标数据
1 调用MT4自带指标
直接调用函数字典“Technical indicators”里面系统自带的指标函数即可。
比如均线:double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift) 计算移动平均指标并返回它的值。
参数:
symbol   -   计算指标数据上的货币对名称。NULL表示当前货币对。
timeframe   -   时间周期。可以时间周期列举任意值。0表示当前图表的时间周期。
period   -   平均周期计算。
ma_shift   -   MA转移。指标线垂直与图表的时间周期。
ma_method   -   MA方法。它可以是其中任意 滑动平均值列举值。
applied_price   -   应用的价格。它可以是应用价格列举的任意值。
shift   -   K线索引序列(最后一根为0)。

KD指标:iStochastic;
布林指标:iBands;
MACD指标:iMacd;

2 调用自定义指标或者第三方指标
保证自定义指标*.ex4已经放入安装目录experts\indicators目录。
double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift) 计算指定的客户指标并且退回它的值。
参数:
symbol   -   计算指标数据上的货币对名称。NULL表示当前货币对。
timeframe   -   时间周期。 可以时间周期列举任意值. 0表示当前图表的时间周期。
name   -   客户指标完成程序名称。
...   -   参量设置(如果需要)。通过的参量和他们的顺序必须与desclaration命令和客户指标的外部可变物的种类对应。
mode   -   索引行。 从0到7并且必须对应以其中一个使用的索引的 SetIndexBuffer 函数。打开数据窗口可以看到画线的列表,从0开始。
shift   -   K线索引序列(最后一根为0)。

如何调用下单、操作订单函数
1
如何下市价单及挂单
int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, void comment, void magic, void

expiration, void arrow_color)
参数:
symbol   -   交易货币对。
cmd   -   下单类型。
volume   -   下单手数。
price   -   开仓价格。
slippage   -   最大允许滑点数。
stoploss   -   止损价格。
takeprofit   -   止盈价格。
comment   -   订单注释。
magic   -   订单指定码。可以作为用户指定识别码使用。
expiration   -   订单有效时间(只限挂单)(不指定时间输入0)。
arrow_color   -   图表上箭头颜色。

下单类型:
OP_BUY 0 买仓
OP_SELL 1 卖仓
OP_BUYLIMIT 2 买挂单交易 (低价买入,常规的。)
OP_SELLLIMIT 3 卖挂单交易 (高价卖出,常规的。)
OP_BUYSTOP 4 买停挂单交易(高价买入)
OP_SELLSTOP 5 卖停挂单交易 (低价卖出)

示例:
// 市价买入
int ticket;
ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0, 0, "my_buy", 1001, 0, Red);
if(ticket < 0) {
    Print("OrderSend 失败错误 #", GetLastError());
    return(0);
}
// 市价卖出
int ticket;
ticket = OrderSend(Symbol(), OP_SELL, 1, Bid, 3, 0, 0, "my_sell", 1001, 0, Green);
if(ticket < 0) {
    Print("OrderSend 失败错误 #", GetLastError());
    return(0);

2 如何调用订单函数
bool OrderSelect(int index, int select, void pool) 函数选择定单。如果函数成功,返回的值为TRUE。如果函数失败,返回的值为FALSE。
参数:
index   -   定单索引(订单序列或订单编号)。
select   -   选定模式。可以为以下的任意值: SELECT_BY_POS(按照序列)、SELECT_BY_TICKET(按照订单编号)。
pool   -   可选择定单索引。当选择SELECT_BY_POS参量时使用。可以为以下的任意值: MODE_TRADES (default)- 来自交易的定单(开单和挂单),MODE_HISTORY - 来自历史的定

单(平仓和取消定单)。

3 如何修改市价单和挂单的止损、止盈,以及如何修改挂单的价格
bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color) 对于先前的开仓或挂单进行特性修改。如果

函数成功,返回的值为 TRUE。如果函数失败,返回的值为FALSE。
参数:
ticket   -   定单编号。
price   -   新的挂单价格,不想修改就输入原先的价格。
stoploss   -   新止损价格,不想修改就输入原先的价格。
takeprofit   -   新盈利价格,不想修改就输入原先的价格。
expiration   -   新挂单有效时间。
arrow_color   -   图表中标价挂单箭头的颜色。

4 如何市价平仓
bool OrderClose( int ticket, double lots, double price, int slippage, void Color) 对定单进行平仓操作。如果函数成功,返回的值是真实的。如果函数失败,返回的值

是假的。
参数:
ticket   -   订单编号。
lots   -   平仓的手数。
price   -   平仓的价格。
slippage   -   最大允许滑点数。
Color   -   图表中平仓箭头的标记颜色。

注意:OrdersTotal()函数获取的是所有的订单包括不同品种跟未成交的挂单统统包括在内;
// 全部平仓
int cnt, total;
total = OrdersTotal();
for(cnt=total-1; cnt>=0; cnt--) {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderType()==OP_SELL) {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
    }
    if(OrderType()==OP_BUY) {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
    }

5 如何删除挂单
bool OrderDelete(int ticket, void Color) 删除先前打开挂单。成功返回true,失败返回false。

// 删除所有挂单
int total = OrdersTotal();
for(int i=total-1; i>=0; i--) {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();
    bool result = false;
    switch(type) {
      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    if(result == false) {
      Print("Order " + OrderTicket() + " failed to close. Error:" + GetLastError());
    }
}