请问谁有二代妖精百度云资源求,谢谢谢谢(ฅ>ω<*ฅ)

后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
外汇EA之家,是汇友网旗下的外汇交易系统分享社区。在EA之家可以免费下载任何外汇指标、外汇EA。EA编程实训课程
EA编程实训课程(网摘)
第一课:查看基本信息
1.1课程目标:
不同平台、不同货币对的交易规则是不同的
ECN平台上的差点是浮动的
熟悉MQL4四种信息的输出方式:
1、在“屏幕左上角”显示: Comment
2、在智能交易信息栏进行“输出”显示; Print
3、用“信息框”进行显示: Alart
4、用“定位写出”函数进行显示: iDisplayInfo
1.2实训内容:
编写EA程序,用Comment()命令分行显示:
帐户名称、帐户余额、帐户可用保证金、帐户已用保证金、当前货币对;
帐户杠杆、点差、停止水平、隔夜利息(分买卖)、1手保证金、1点价值;
使用Comment函数在主图右上角显示:Ask、Bid价;
要求:显示字符颜色、大小、字体、位置可调。
使用自定义函数iDisplayInfo()在主图右下角显示1根K线的开盘价、最高价、最低价、收盘价。
当前Ask价高于K线的最高价,或低于最低价时,用Alart弹出报警信息框。
编写自定义函数iAdd(),输入两个参数为整数型数字,输出两个参数相加的结果,在图中显示iAdd调用结果。
1.3参考资料:
iDispalyInfo(定位写出)是自定义函数用于在屏幕上显示相关信息,由于其位置、颜色、大小、字体可调而被经常使用。
例:在屏幕上显示标签:
输入参数:标签名称 string LableName
文本内容 string LableDoc
显示位置 int Corner
标签X坐标 int LableX
标签Y坐标 int LableY
文本字号 int DocSize
文本字体 int DocStyle
文本颜色 int DocColor
输出参数:在指定的屏幕位置(X,Y),按照指定的字号、字体、颜色,显示指定的文本。
算法说明:
定位写出(标签名称,文本内容,显示位置,X坐标,Y坐标,字号、字体、颜色)
iDisPalyInfo (string LableName,string LableDoc,int Corner,int
LabltX,int LableY,int Docsize,int DocStyle,int Doccolor)
创建对象(标签名称,对象类型,0,0,0)
ObjectCreate(LableName,OBJ_Lable,0,0,0)
文本属性(标签名称,文本内容,字号,字体,颜色)
ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor)
对象属性(标签名称,显示位置,位置)
ObjectSet(LableName,OBJPROP_CORNER,Corner)
对象属性(标签名称,X坐标,X)
Opjectset(LableName,OBJPROP_XDISTANCE,LableX)
对象属性(标签名称,Y坐标,Y)
OpjectSet(LableName,OBJPROP_YDISTANCE,LableY)
程序中调用举例说明:
定位写出("标注1","当前时间=25",0,1,1,8,"宋体",红色)
iDisStyleInfo("标注1","当前时间=25",0,1,1,8,"宋体",红色)
字符标签名:标注1
显示内容:当前时间=25
显示位置:在右上角 (其中:0-左上角,1-右上角,2-左下角,3-右下角)
标签横坐标X:1
标签纵坐标Y:1
文字大小:8号
字体类型:宋体
文本颜色:红色
自定义函数参考代码:
int iADD(int a,int b)
Return(a+b);
1.4思考题:
1、按照自己的理解,列表详细说明MarkteInfo()函数中28个信息参数(如MODE_LOW、MODE_HIGH等)含义
2、按照自己的理解,列表详细说明Account开头的16个帐户函数(AccountBalance、AccountCredit等)含义
3、将已经编制好的EA分别加载到MM平台和ECN平台,对比查看各项市场参数,说出两者不同之处。
4、将已经编制好的EA分别加载到同一平台不同货币对图表中,对比查看各项市场参数,说出两者不同之处。
5、详细说明滑点(Spread)及停止水平(StopLevel)在订单操作中的作用。
6、找到帮助文件中的字符颜色部分,复制粘贴颜色列表。
K线图与时间序列
2.1课程目标:
K线时间是正整数,与一般的时间日期格式不同,需要进行相互转换。
时间参数的转换
K线序列的定义
2.2实训内容:
编写EA,显示在当前K线以及第5根K线的时间参数,传统的时间日期格式,显示图表中的K线总数
在以上基础上加“时间到期”限制,当时间超过时,显示“期限已到”
在上述基础上,添加两个EA的有效工作时段:2:00-8:00,16:00-21:30
4个起止时间采用exturn定义预设。
另写EA,计算并显示第5到第20间15根K线的最高价、最低价,并显示最高价、最低价在K线上的出现位置(K线序号)
2.3参考资料:
帮助文件中关于“时间和日期函数”章节
EA有效工作时间段可以编写一个自定义函数以便调用,这个函数的参数为:开始时间(hh:mm)、结束时间(hh:mm),输出参数为逻辑型(pool),真(true)为有效,假(false)为无效。
2.4思考题:
1、日期时间返回是一个正整数,这个数字是怎么计算的?计量单位是什么?
2、当前时间函数TimeCurrent()返回是哪里的时间?本地计算机时间怎样获取?
3、如何将时间转换成计算机能识别的正整数?
4、在M1图表中仔细观察图表中K线总数,什么时候发生变化?
5、按照自己的理解,详细列表说明帮助文档中关于时间和日期的18个函数的含义。
开仓与平仓
3.1课程目标:
掌握开仓、平仓命令的使用
学会修改订单的止损、止赢价
学会调用默认、自定义指标
学会在图中标注箭头符号
学会指标两线交叉的应用
3.2实训内容:
编写EA,调用默认指标Moving
Average(按照默认参数),当前价高于MA时,在图中标注绿色向上箭头,表示出现“买入”信号;当前价低于MA时,在图中标注红色向下箭头,表示出现“卖出”信号。
在以上基础上,根据信号执行开仓动作,按实时报价开出1张买入(卖出)0.1手订单,并控制好一根K只操作1次(因为1根K线中会产生多次交易信号,这样要求是避免频繁开仓)
在持有订单的前提下,修改订单的止损、止赢价,止损为120点,止赢为100点。
当有持仓单时,且市场出现了与持仓单方向相反的信号,该持仓单平仓。
在以上基础上,修改默认指标为自定义指标中的Moving
Average(按照默认参数),调用该自定义指标的数据,发出交易信号。
在上述基础上,增加一个MA指标,平均周期为26,第一个默认周期的13。当MA13上穿MA26时,发出买入信号;当MA13下穿MA26时,发出卖出信号。
另写EA,分别执行挂单交易的四种模式。
3.3参考资料:
教材中默认指标的章节、调用自定义指标(iCustom)的使用方法。
编写“交叉”自定义函数,输入参数为快速线当前价、快速线前1K线价、慢速线当前价、慢速线前1K线价,输出参数为无信号“N/A”,上穿信号“Upcross”,下穿信号“Downcross”。
iDrawSign 是一个用于标注符号和画线的自定义函数,在编程中经常用于显示交易信号
Void iDawSign(string myTapy,int myBarPos,doubl myPrice,color
myColor,int mySymbol)
If(myType=”Dot”)
ObjectCreate(myType+TimeToStr(Time[myBarPos]),OBJ_ARROW,0,Time[myBarPos],myPrice);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_COLOR,myCOLOR);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_ARROWCODE,mySymbol);
If(myType=”HLine”)
ObjectCreate(myType+TimeToStr(Time[myBarPos]),OBJ_HLine,0,Time[myBarPos],myPrice);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_COLOR,myCOLOR);
If(myType=”VLine”)
ObjectCreate(myType+TimeToStr(Time[myBarPos]),OBJ_VLine,0,Time[myBarPos],myPrice);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_COLOR,myCOLOR);
iCrossSignal是一个返回两线交叉信号的自定义函数,在程序中判断指标快慢上穿(金叉)、下穿(死叉)的状况。
3.4思考题:
1、为什么通常会建议开仓时不做止损、止赢设置,而要等到开仓后通过修改订单的方式来设置?
2、挂单有4种模式:BuyLimt、BuyStop、SellLimt、SellStop,详细解释这些模式的应用条件,重点说明停止水平(StopLevel)规则
3、详细阅读教材关于默认指标的章节,了解各项常用指标的调用语句
4、详细阅读教材关于自定义指标命令(iCustom)的使用方法
5、用自定义函数标注“*”号
6、找到帮助文件中特殊字符集部分,复制粘贴特殊字符与列表。
4.1课程目标
移动止损(TrallingLoss)是在持仓单盈利时实施一种保护利润的方法。
移动止损一般用“点数”表达,当前订单盈利,且价格区间大于等于移动止损点时,修改订单的止损价位,之后再与持仓单的止损价位比较价格区间,超过移动止损1次就修改价位1次。
通常不使用“移动止盈”概念。
掌握持仓单操作方法
4.2实训内容
在上一章程序的基础上完成以下任务。
用OrderSelect命令选中持仓单,在图表中显示持仓单单号、类型、开仓量、开仓价、止损价、止盈价。
预设移动止损(TrallingLoss)参数为40,编制移动止损自定义函数,在程序中调用。
4.3参考资料
ITrallingLoss是一个实现移动止损的自定义函数,输入参数为目标订单号和移动止损点数。这是一个常用的自定义函数。
Void iTrallingLoss(int myTicket,int myTrallingLoss)
If(!OrderSelect(myTicket,SELECT_BY_TICKET,MODE_TRADES))
Return(1);//选定单出错
If(OrderProfit()&0) return(2);//亏损订单不修改
Double myBaseP//定义基本价变量
If(OrderStopLoss()==0)//如果没有止损价
MyBasePrice=OrderOpenPrice();
MyBasePrice=OrderStopLoss();//有止损价
Double myTLP//定义止损价变量
If(OrderType()==OP_BUY)//买入订单移动止损
MyTLPrice=Bide-myTrallingLoss*P//计算移动止损价
If(myBasePrice&=myTLPrice)
OrderModify(myTicket,OrderOpenPrice(),myTLPrice,OrderTakeProfit(),0);//修改移动止损价
Return(0);
If(OrderType()==OP_SELL)//卖出订单移动止损
MyTLPrice=Ask+myTrallingLoss*P//计算移动止损价
If(myBasePrice&=myTLPrice)
OrderModify(myTicket,OrderOpenPrice(),myTLPrice,OrderTakeProfit(),0);//修改移动止损价
Return(0);
Return(3);
1、哪些订单操作命令在使用前需要用OrderSelect命令?为什么?
2、OrderSelect命令中参数SELECT_BY_POS和SELECT_BY_TICKET有什么区别?
3、为什么通常不使用“移动止赢”概念?
多订单识别
5.1课程目标
持仓订单中包含了注释(Comment)和订单识别码(magicnumber)两个参数,comment参数为字符类型,用于对该单加以描述,magicnumber参数为整数型,用于标注订单代码。
在实际操作过程中,持仓单形态多种多样,同一货币对可能有2张以上反向订单,不同货币对可能会有持仓单,持仓单又可能有成交单和挂单之分。EA必须能够对所有持仓单分类、分别操作。每张持仓单必须拥有一个独立的识别符号。
挂单成交变成成交单、成交单平仓变成历史订单,EA必须能够实时监控订单的这种变化。
5.2实训内容
编写EA,在当前图表按实时报价同时开出1张买入0.1手订单和1张卖出订单,标注comment为“起始单”。
根据行情情况,当“起始单”盈利20点时,追加1张同方向订单,开仓量0.1手。
编写一个自定义函数,动态显示持仓订单情况,包括订单号、订单货币对、订单类型(买入、卖出、挂单),开仓量、开仓价、注释、订单识别码。建议使用comment命令。
将该EA编译后放入三种货币对图表中运行,观察MT4终端窗口订单注释栏情况,观察动态显示持仓单信息。
5.3参考资料
遍历持仓单,挑选目标订单是EA程序常见动作,以下提供一个遍历订单框架式语句。
If(OrdersTotal()&0)
For(cnt=0;cnt&=OrdersTotal()-1;cnt++)
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);//订单操作语句
1、除了订单号,还可以用什么方法定义订单的唯一性?
2、持仓单中的注释和订单识别号能修改吗?为什么?
3、假如有1张持仓单虎仓量为0.1手,能否将该单平仓0.05手?如果可以,平仓后的平仓单的持仓单单号分别是怎么变化的?以这种方式平仓后的订单信息中注释和订单识别码是什么样的?请用程序显示这些信息。
4、仔细阅读教材中关于MM和ECN的章节,写出两者之间的差别。ECN平台上点差和MM平台上的点差有什么区别?为了使程序同时适应MM和ECN平台,点差该怎么处理?
5、我们通常会遇到“5位数报价平台”、“4位数报价平台”的提法,为了使程序同时适应两种类型的平台,我们应该注意哪些地方?
历史订单及持仓单统计
6.1课程目标
订单分为历史订单和持仓订单。历史订单包含了交易完毕的订单记录及入金、出金记录。持仓订单包含了成交单、挂单。
学习历史订单统计方法、持仓订单统计方法。
6.2实训内容
编写EA,统计并显示当前图表(当前货币对)的历史订单总数、买入订单总数、卖出订单总数、亏损订单总数、盈利订单总数。
在上述EA基础上,增加显示历史买入订单胜率、卖出订单胜率、买入订单盈利率、卖出订单盈利率。
在上述EA基础上,增加显示当前货币对持仓单总数,买入持仓单总数、卖出持仓单总数,买入单利润、卖出单利润。如果利润为正数,显示绿色,为负数显示红色,利润为零,显示灰色。
6.3参考资料
iObjectColor是一个根据正数、负数、零数值返回颜色的自定义函数,常用于颜色区分显示盈利状况,以获取更好的视觉效果。
Color iObjectColor(double myTnput)
Color myColor;
If(myInput&0)
MyColor=G//正数颜色为绿色
If(myInput&0)
MyColor=R//负数颜色为红色
If(myColor==0)
MyColor=DarkG//0颜色为灰色
Return(myColor);
1、如何获取当前货币对中的挂单单号?
2、遍历历史订单时会用到”for(cnt=0;cnt&=OrdersHistoryTotal()-1;cnt++)”语句,请问当cnt=0,对应历史订单是哪1单?
3、在网上收集“凯利公式”资料,归纳描述凯利公式,在程序中显示当前货币对的凯利值。
图形化显示交易指标
7.1课程目标
初步熟悉指标程序的格式
指标程序不能执行开仓、平仓、挂单操作
掌握动态线条的画法
了解文本操作基本命令
7.2实训内容
新建一个指标文件
将每张历史订单的开仓和平仓价用虚线连上,买入订单为绿色虚线,卖出订单为红色虚线,开仓价位置用上箭头表示,平仓价位用下箭头标注表示。
将每张持仓单订单的开仓价和当前价用虚线连上,买入订单为绿色虚线,卖出订单为红色虚线,开仓价位置用上箭头标注,要求价格变化时,该虚线也随着变动。
在主图中显示当前货币对、当前浮动利润。
将前一根K线的开盘价、收盘价、最高价、最低价以及货币对名称写入到CSV格式文件中,要求用Excel打开后各项数据在不同的格子中。
7.3参考资料
教材中关于文本读写的章节。
1、指标在主图中显示用什么命令定义?在副图中显示用什么命令定义?
2、仔细阅读帮助中“文件函数”部分,列表说明20个文件操作函数的功能。
十字星K线连线指标
8.1课程目标
IndicatorCounted()是指标程序的专用命令
一个MQL4指标最多输出8个参数
学会图层变量定义
8.2实训内容
新建一个副图显示的指标程序,命名为“十字星K线连线副图测试”。定义一个输出变量,定义该变量在数据窗口中显示的名称。编译,加载到图表中。
修改参考资料中的iSetLable,在该指标所在窗口中用iSetLable函数显示“作者:XXX”信息。理解WindowFind函数的用法,修改程序将“作者:XXX”在主图中显示。
用Print命令打印IndicatorCounted()和Bar()值,对比观察数据的变化。
新建一个主图显示的指标程序,命名为“十字星K线连线”。找到主图中所有十字星K线,并对该缓冲变量赋值。
8.3参考资料
iSetLable是一个在副图中显示文字信息的自定义函数。
Void iSetLable(string LableName,string LableDoc,int LableX,int
LableY,int DocSize,stringDocStyle,color DocColor)
myWindowsHandle=windowFind(“&填写指标名称&”);
ObjectCreate(LableName,OBJ_LABLE,myWindowsHandle,0,0);
ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor);
ObjectSet(LableName,OBJPROP_XDISTANCE,LableX);
ObjectSet(LableName,OBJPROP_YDISTANCE,LableY);
1、阅读教材关于IndicatorCounted()的章节,说明IndicatorCounted()与Bars()的区别。
2、详细描述WindowFind命令的作用。
3、什么是指标的缓冲变量?起什么作用?
资金流向指标
9.1课程目标
掌握自定义指标编制过程
数组函数的使用
多色指标线的实现方式
指标副图中画出柱状线、曲线
理解未来函数的含义
9.2实训内容
指标完成后的图形如下:
柱状图表示对应K线的成交量。当收盘价close[i]大于前一收盘价close[i+1]时,该成交量标注为红色,表示资金流入(CapitalFlowIn);当收盘价小于前一收盘价时,该成交量标注为绿色,表示资金流出(CapitalFlowOut)。
曲线为资金流向(CapitalFlows)的黄金加权值,分两次计算出CFO结果,正数标注为黄色,负数标注为蓝色。
[CapitalFlows算法描述]
第一次计算的黄金加权值。CF(i),其中i表示K线序号
第二次计算的黄金加权平滑值。CFS(I),其中i表示K线序号
资金流入。CFI(I),其中I表示K线序号
资金流出。CFO(i),其中i表示K线序号
指标计算公式:
CF(i)=(CFI(i)*0.5+CFI(i+1)*0.309+CFI(i+2)*0.191)-(CFO(i)*0.5+CFO(i+1)*0.309+CFO(i+2)*0.191)
CFS(i)=CF(i)*0.618+CF(i+1)*0.382
新建一个在副图显示的指标,分色显示成交量柱图CFI、CFO。
在上述程序基础上,当CFS从负数转变为正数时,标注红色向上箭头,当CFS从正数转变为负数时,标注绿色向下箭头。
9.3参考资料
在指标计算中会经常用到数组操作,仔细阅读帮助文件中“Array functions”部分,详细了解每个数组函数的用法。
详细阅读自定义指标中的“ZigZag.Mq4”代码,理解未来函数的含义。
1、列表说明帮助文件中15个数组函数的用法。
2、数组需要预定义,比如myArray[21]就定义了21个元素。当不能确定一个数组最大元素数量时,该数组是否可以这样定义myArray[]?
3、指标线采用双色显示时,为什么要分成两个缓冲变量?
4、上网查找“未来函数”指标的相关资料,详细描述未来指标的概念及其形成的过程,说明未来函数对实际操盘的指导意义。
5、总结编制自定义指标的流程。
网格对冲交易
10.1课程目标
编制需求分析报告
搭建模块化的EA架构
多货币对同时操作
挂单操作(按条件挂单、判断挂单触发、撤销挂单)
持仓单操作(同类型持仓单平仓、判断最新平仓单)
10.2实训内容
[需要说明]
预设开仓量、格子间距、最大格子数量
根据iMA(时间周期21,平均方法Smoothed,应用价格Weighted
Close),当前价高于MA发生买入信号,当前价低于MA发生卖出信号。
以买入为例,当买入单成交后,该订单向上设置1个格子距离有止盈价位。同时向下设置一个格子距离的3倍开仓量的卖出挂单。当该卖出挂单触发后,向下设置1个格子距离的止盈价位(含买入单),同时向上设置1个格子距离的4倍开仓量的买入挂单。以此类推,直到最大格子数量为止。每次挂单的开仓量为反向持仓量+1个开仓量。止盈触发后,清除相关的挂单。
如果市场出现了卖出信号,则开出1张卖出订单,操作方法与上述相反。
一个货币对最多允许根据MA信号开出2张方向相反的订单。
2张订单操作,互不影响。
多货币对同时单独操作,相互不影响。
根据[需求说明]整理需求报告
画出交易流程图,注明各功能模块。
在主图右上角实时显示买入、卖出组的持仓、挂单情况。
10.3参考资料
下载EA委托书(http:///p-.html),熟悉需求报告的写法。
10.4思考题
1、如何判断挂单已经触发?如何判断持仓单已经平仓?
2、汇总EA开发的常用模块
3、总结策略实现的通用流程。
1、控单模板
在外汇操作中,新建1张卖出类型订单有的人叫做“买入1张卖出单”,也有人称作“买入1张渣单”,览全各种称呼的不确定性,为了精确表达概念,在本书中均统一采用以下名词定义。
表1:名词定义
是指保持在场内的所有未平仓订单,包括己成交的订单及挂单
成交持仓单
是指保持在场内的买入、卖出类型的订单,这类订单利润随着价格变动而动
买入单、卖出单
是指场内的买入、卖出类型的成交持仓单
Limit买入挂单、Limit卖出挂单
是指价格低于、高于当前价格的挂单
Stop买入挂单、Stop卖出挂单
是指价格高于、低于当前价格的挂单
买入组、卖出组
是指程序将成交持仓单按照类型分为买入、卖出两组
是指场内随着价格变动被触发,成为了成交持仓单的订单
是指场内没有成交持仓单前提下,新建1张成交持仓单,或者挂单
是指场内有成交持仓单前提下,增加1张成交持仓单
是指场内没有成交持仓单和挂单
是指成交持仓单盈利且当前报价与该单开仓价格超过预设移动止损间距点数而执行的一个不断向盈利方向调整订单止损价位的过程。该订单止损利润≥0
MQL4编程中最繁琐的莫过于对持仓单控制了,例如EURUSD现持有4张买入单和2张卖出单,根据交易策略要求,现在需要买入组盈利最小的订单平仓,卖出组亏损最大的订单平仓,我敢保证编码工作量巨大而且容易出错,再加上EA同时挂在GBPUSD需要区别对待仓单,不能错误操作,此时的你是不是会感觉很无所适从呢?
上述控单策略在EA中屡见不鲜,笔者积累多年编程经验,总结出一套模板,你只需要将新建一个EA的时候将这段程序直接复制粘贴到编辑器,就能又快又好、专心致志地考虑自己的策略流程,不必再为计算“哪张单是第1单”、“哪张单是盈利最小的单”等等要求而大伤脑筋了。
这是一段标准程序,预定义了一组公共变量,随着价格(tick)实时更新,提供你在各类控单模块中随时方便调用。
表2 预定义公共变量
BuyGroupOrders,SellGroupOrders
买入、卖出组成交持仓单数量总计
BuyGroupFirstTicket,SellGroupFirstTicket
买入、卖出组第一单单号
BuyGroupLastTicket,SellGroupLastTicket
买入、卖出组最后一单单号
BuyGrouplots,SellGrouplots
买入、卖出组成交持仓单开仓量总计
BuyGroupProfit,SellGroupProfit
买入、卖出组成交持仓单利润总计
BuyLimitOrders,SellLimitOrders
买入限制挂单、卖出限制挂单数量总计
BuyStopOrders,SellStopOrders
买入停止挂单、卖出停止挂单数量总计
表2列出了22个公共变量,将当前货币对图表中的持仓单分为买入组、卖出组,并对其进一步细分,包括组利润、组成交持仓单数量、组开仓量等等基本控单操作需要用到的数据。
例如:买入单为3张时,不再建仓,代码书写就简单到如下程度:
+-----------------------------------------------------------------+
If(BuyGroupOrders&3)
Return(0);
+-----------------------------------------------------------------+
许多时候,用户会使用不同的EA操作或者手工开仓,我们可以利用MQL4提供的订单特征码(OrderMagicMunber)和订单注释(OrderComment)准确识别本EA开出的订单。
每1张建仓单都可以附加这两个标识符,值得注意的是,订单特征码只能在EA建仓时写入,订单注释则可以手工建仓或者建仓时写入。
因此,当策略要求人工建仓后交还给EA管控,那就只能利用“订单注释”来分辨特定的持仓单了。
如果成交持仓单因止盈、止损平仓,那么,历史订单中该单的注释将在原有注释前增加“[tp]”/“[sl]”字样,例如订单注释为“test”,止盈平仓后订单注释为“[tp]test”。
图1 止盈平仓单的注释
这段标准程序由2个主要自定义函数构成,其中iShowInfo()用来实时更新22个公共变量,iOrderSortTicket()用来计算特定条件下排序(对数组实施冒泡排序法)后的变量,如计算“最值”,详细用法参见源码中注释。
细心的读者会发现,在start()模块调用自定义函数iMain(),iMain()函数中再调用iShowInfo(),为什么不在start()直接使用iShowInfo()呢?原因很简单,为了防止被破解。
众所周知,网上针对MQL4有一个叫做XXX的破解工具(是什么,在哪里下载我就不说了,自己去找吧),能够反编译ex4程序,不过演示版只显示start()、init()、deinit()中的内容,程序中其他自定义函数则仅仅列出函数名称,该破解工具正式版的收费500美元,而MetaTrader公司为了防止EA被破解,经常会通过升级MT4版本方式改变ex4程序加密算法,他们哥俩无休止斗法至今。出现对自己知识产权的保护意识,我建议编程人员应该养成好习惯,最大程度杜绝恶意破解。当然,最佳的加密方法是编写dll,这里就不多说了。
源码1:控单模板
#property copyright“Copyright by --”
#property link “http://--”
----程序预设参数
Extern string str1=“----系统预设参数----”;
Extern double预设开仓量=0.1
Extern string MyOrderComment=”demo’//订单注释
+-----------------------------------------------------------------+
String MyOrderC
Int 订单特征码=0;
Int MyMagicM
//----程序控制参数
Int BuyGroupOrders,SellGroupO//买入、卖出组成交持仓单数量总计
Int BuyGroupFirstTicket,SellGroupFirstT//买入、卖出组第一单单号
Int BuyGroupLastTicket,SellGroupLastT//买入、卖出组最后一单单号
Int BuyGroupMaxProfitTicket, Int
SellGroupMaxProfitTicket;//买入、卖出组最大盈利单单号
Int BuyGroupMinProfitTicket, Int
SellGroupMinProfitTicket;//买入、卖出组最小盈利单单号
Int BuyGroupMaxLossTicket, Int
SellGroupMaxLossT//买入、卖出组最大亏损利单单号
Int BuyGroupMinLossTicket, Int
SellGroupMinLossT//买入、卖出组最小亏损单单号
Double BuyGroupLots,SellGroupL//买入、卖出组成交持仓单开仓量总计
Double BuyGroupProfit,SellGroupP//买入、卖出组成交持仓单利润总计
Int BuyLimitOrders,SellLimitOrders //买入限制挂单、卖出限制挂单数量总计
Int BuyStopOrders,SellStopOrders //买入停止挂单、卖出停止挂单数量总计
//持仓订单基本信息:0-订单,1-开仓时间,2-订单利润,3-订单类型,4-开仓量,5-开仓价,
6-止损价,7-止赢价,8-订单特征码,9-订单佣金,10-掉期,11-挂单有效日期
Double OrdersArray[][12];//第1维;订单序号;第2维:订单信息
Double TempOrdersArray[][12];//临时数组
Int MyArrayRange;//数组记录数量
Int cnt,i,j;//计数器变量
Int start()
Return(0);
Void iMain()
IShowInfo();
Void iShowInfo()
//初始化变量
BuyGroupOrders=0;SellGroupOrders=0;//买入、卖出组成交持仓单数量总计
BuyGroupFirstTicket=0;SellGroupFirstTicket=0;//买入、卖出组持仓单第1张单订单号
BuyGroupLastTicket=0;SellGroupLastTicket=0;//买入、卖出组最后1张单的订单号
BuyGroupMaxProfitTicket=0; Int
SellGroupMaxProfitTicket=0;//买入、卖出组最大盈利单单号
BuyGroupMinProfitTicket=0;Int
SellGroupMinProfitTicket=0;//买入、卖出组最小盈利单单号
BuyGroupMaxLossTicket=0; Int
SellGroupMaxLossTicket=0;//买入、卖出组最大亏损利单单号
BuyGroupMinLossTicket=0;Int
SellGroupMinLossTicket=0;//买入、卖出组最小亏损单单号
BuyGroupLots=0;SellGroupLots=0;//买入、卖出组成交单持仓量
BuyGroupProfit=0;SellGroupProfit=0;//买入、卖出组成交单利润
BuyLimitOrders=0;SellLimitOrders=0;//买入、卖出限制挂单数量总计
BuyStopOrders=0;SellStopOrders=0;//买入、卖出停止挂单数量总计
//初始化订单数组
MyArrayRange=OrdersTotal()+1;
ArrayResize(OrdersArray,MyArrayRange);//重新界定数组
ArrayInintalize(OrdersArray,0.0);//初始化数组
If(OrdersTotal()&0)
//遍历持仓单,创建数组
For(cnt=0;cnt&=MyArrayRcnt++)
//选中当前货币对相关持仓订单
If(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES
&& OrderSymbol()==Symbol()
OrderComment()==MyOrderComment)
OrdersArray[cnt][0]=OrderTicket();//0订单号
OrdersArray[cnt][1]=OrderOpenTime();//1开仓时间
OrdersArray[cnt][2]=OrderP//2-订单利润
OrdersArray[cnt][3]=OrderType();//3-订单类型
OrdersArray[cnt][4]=OrderL//4-开仓量
OrdersArray[cnt][5]=OrderOpenP//5-开仓价
OrdersArray[cnt][6]=OrderStopLoss();//6-止损价
OrdersArray[cnt][7]=OrderTakeProfit();//7-止赢价
OrdersArray[cnt][8]=OrderMagicNumber();//8-订单特征码
OrdersArray[cnt][9]=OrderC//9-订单佣金
OrdersArray[cnt][10]=OrderSwap();//10-掉期
OrdersArray[cnt][11]=OrderExpiration();//11-挂单有效日期
//统计基本信息
For(cnt=0;cnt&MyArrayRcnt++)
//买入持仓单
If(OrdersArray[cnt][0]!=0 &&
OrdersArray[cnt][3]==OP_BUY)
BuyGroupOrders=BuyGroupOrders+1;//买入组订单数量
BuyGroupLots=BuyGroupLots+OrderLots();//买入组开仓量
BuyGroupProfit=BuyGroupProfit+OrderProfit();//买入组利润
//卖出持仓单
If(OrdersArray[cnt][0]!=0 &&
OrdersArray[cnt][3]==OP_SELL)
SellGroupOrders=SellGroupOrders+1;//卖出组订单数量
SellGroupLots=SellGroupLots+OrderLots();//卖出组开仓量
sellGroupProfit=SellGroupprofit+OrderProfit();//卖出组利润
//买入组限制挂单总计
If(OrdersArray[cnt][0]!=0 &&
OrdersArray[cnt][3]==OP_BUYLIMIT)
BuyLimitOrders=BuyLimitOrders+1;
//卖出组限制挂单总计
If(OrdersArray[cnt][0]!=0 &&
OrdersArray[cnt][3]==OP_SELLLIMIT)
SellLimitOrders=SellLimitOrders+1;
//买入组停止挂单总计
If(OrdersArray[cnt][0]!=0 &&
OrdersArray[cnt][3]==OP_BUYSTOP)
BuyLimitOrders=BuyStopOrders+1;
//卖出组停止挂单总计
If(OrdersArray[cnt][0]!=0 &&
OrdersArray[cnt][3]==OP_SELLSTOP)
SellLimitOrders=SellStopOrders+1;
//计算买入、卖出组首尾单号
BuyGroupFirstTicket=iOrderSortTicket(0,0,1);//买入组第1单单号
SellGroupFirstTicket=iOrderSortTicket(1,0,1);//卖出组第1单单号
BuyGroupLastTicket=iOrderSortTicket(0,0,0);//买入组最后1单单号
SellGroupLastTicket=iOrderSortTicket(1,0,0);//卖出组最后1单单号
BuyGroupMinProfitTicket=iOrderSortTicket(0,1,1);//买入组最小盈利单单号
SellGroupMinProfitTicket=iOrderSortTicket(1,1,1);//卖出组最小盈利单单号
BuyGroupMaxProfitTicket=iOrderSortTicket(0,1,0);//买入组最大盈利单单号
SellGroupMaxProfitTicket=iOrderSortTicket(1,1,0);//卖出组最大盈利单单号
BuyGroupMaxLossTicket=iOrderSortTicket(0,2,0);//买入组最大亏损单单号
SellGroupMaxLossTicket=iOrderSortTicket(1,2,0);//卖出组最大亏损单单号
BuyGroupMinLossTicket=iOrderSortTicket(0,2,1);//买入组最小亏损单单号
SellGroupMinLossTicket=iOrderSortTicket(1,2,1);//卖出组最小亏损单单号
Return(0);
int iOrderSortTicket(int myOrderType,int myOrderSort,int
Int myTicket=0;
Int myAraaycnt=0;
Int myArraycnt1=0;
//创建临时数组
Double myTempArray[][12];//定义临时数组
ArrayResize(myTempArray,MyArrayRange);//重新界定临时数组
ArrayInitialize(myTempArray,0.0);//初始化临时数组
Double myTempOrdersArray[][12];//定义临时数组
MyArraycnt=BuyGroupOrders+SellGroupO
If(myArraycnt==0) return(0);
MyArraycnt1=myA
MyArraycnt=myArraycnt-1;
ArrayInitalize(myTempOrdersArray,0.0);初始化临时数组
For(cnt=0;cnt&=MyArrayRcnt++)
If((OrdersArray[cnt][3]==0 || OrdersArray[cnt][3]==1)
&& OrdersArray[cnt][0]!=0)
MyTempOrdersArray[myArraycnt][0]=OrdersArray[cnt][0];
MyTempOrdersArray[myArraycnt][1]=OrdersArray[cnt][1];
MyTempOrdersArray[myArraycnt][2]=OrdersArray[cnt][2];
MyTempOrdersArray[myArraycnt][3]=OrdersArray[cnt][3];
MyTempOrdersArray[myArraycnt][4]=OrdersArray[cnt][4];
MyTempOrdersArray[myArraycnt][5]=OrdersArray[cnt][5];
MyTempOrdersArray[myArraycnt][6]=OrdersArray[cnt][6];
MyTempOrdersArray[myArraycnt][7]=OrdersArray[cnt][7];
MyTempOrdersArray[myArraycnt][8]=OrdersArray[cnt][8];
MyTempOrdersArray[myArraycnt][9]=OrdersArray[cnt][9];
MyTempOrdersArray[myArraycnt][10]=OrdersArray[cnt][10];
MyTempOrdersArray[myArraycnt][11]=OrdersArray[cnt][11];
MyArraycnt=myArraycnt-1;
//按时间降序排列数组-----冒泡排序
If(myOrderSort==0)
For(i=0;i&myArrayRi++)
For(j=myArrayRj&i;j--)
If(OrdersArray[j][1]&OrdersArray[j-1][1])
myTempArray[0][0]=OrdersArray[j-1][0];
myTempArray[0][1]=OrdersArray[j-1][1];
myTempArray[0][2]=OrdersArray[j-1][2];
myTempArray[0][3]=OrdersArray[j-1][3];
myTempArray[0][4]=OrdersArray[j-1][4];
myTempArray[0][5]=OrdersArray[j-1][5];
myTempArray[0][6]=OrdersArray[j-1][6];
myTempArray[0][7]=OrdersArray[j-1][7];
myTempArray[0][8]=OrdersArray[j-1][8];
myTempArray[0][9]=OrdersArray[j-1][9];
myTempArray[0][10]=OrdersArray[j-1][10];
myTempArray[0][11]=OrdersArray[j-1][11];
OrdersArray[j-1][0]= OrdersArray[j][0];
OrdersArray[j-1][1]= OrdersArray[j][1];
OrdersArray[j-1][2]= OrdersArray[j][2];
OrdersArray[j-1][3]= OrdersArray[j][3];
OrdersArray[j-1][4]= OrdersArray[j][4];
OrdersArray[j-1][5]= OrdersArray[j][5];
OrdersArray[j-1][6]= OrdersArray[j][6];
OrdersArray[j-1][7]= OrdersArray[j][7];
OrdersArray[j-1][8]= OrdersArray[j][8];
OrdersArray[j-1][9]= OrdersArray[j][9];
OrdersArray[j-1][10]= OrdersArray[j][10];
OrdersArray[j-1][11]= OrdersArray[j][11];
OrdersArray[j][0]=myTempArray[0][0];
OrdersArray[j][1]=myTempArray[0][1];
OrdersArray[j][2]=myTempArray[0][2];
OrdersArray[j][3]=myTempArray[0][3];
OrdersArray[j][4]=myTempArray[0][4];
OrdersArray[j][5]=myTempArray[0][5];
OrdersArray[j][6]=myTempArray[0][6];
OrdersArray[j][7]=myTempArray[0][7];
OrdersArray[j][8]=myTempArray[0][8];
OrdersArray[j][9]=myTempArray[0][9];
OrdersArray[j][10]=myTempArray[0][10];
OrdersArray[j][11]=myTempArray[0][11];
//按利润降序排列数组
Double myTempArray1[][12];//
ArrayResize(myTempArray1,myArraycnt1);//
ArrayInitialize(myTempArray1,0.0);//
If(myOrderSort==1 || myOrderSort==2)
For(i=0;i&=myArraycnt1;i++)
If(myTempOrdersArray[j][2]&myTempOrdersArray[j-1][2])
MyTempArray1[0][0]=myTempOrdersArray[j-1][0];
MyTempArray1[0][1]=myTempOrdersArray[j-1][1];
MyTempArray1[0][2]=myTempOrdersArray[j-1][2];
MyTempArray1[0][3]=myTempOrdersArray[j-1][3];
MyTempArray1[0][4]=myTempOrdersArray[j-1][4];
MyTempArray1[0][5]=myTempOrdersArray[j-1][5];
MyTempArray1[0][6]=myTempOrdersArray[j-1][6];
MyTempArray1[0][7]=myTempOrdersArray[j-1][7];
MyTempArray1[0][8]=myTempOrdersArray[j-1][8];
MyTempArray1[0][9]=myTempOrdersArray[j-1][9];
MyTempArray1[0][10]=myTempOrdersArray[j-1][10];
MyTempArray1[0][11]=myTempOrdersArray[j-1][11];
MyTempOrdersArray[j-1][0]=myTempOrdersArray[j][0];
MyTempOrdersArray[j-1][1]=myTempOrdersArray[j][1];
MyTempOrdersArray[j-1][2]=myTempOrdersArray[j][2];
MyTempOrdersArray[j-1][3]=myTempOrdersArray[j][3];
MyTempOrdersArray[j-1][4]=myTempOrdersArray[j][4];
MyTempOrdersArray[j-1][5]=myTempOrdersArray[j][5];
MyTempOrdersArray[j-1][6]=myTempOrdersArray[j][6];
MyTempOrdersArray[j-1][7]=myTempOrdersArray[j][7];
MyTempOrdersArray[j-1][8]=myTempOrdersArray[j][8];
MyTempOrdersArray[j-1][9]=myTempOrdersArray[j][9];
MyTempOrdersArray[j-1][10]=myTempOrdersArray[j][10];
MyTempOrdersArray[j-1][11]=myTempOrdersArray[j][11];
MyTempOrdersArray[j][0]=myTempArray1[0][0];
MyTempOrdersArray[j][1]=myTempArray1[0][1];
MyTempOrdersArray[j][2]=myTempArray1[0][2];
MyTempOrdersArray[j][3]=myTempArray1[0][3];
MyTempOrdersArray[j][4]=myTempArray1[0][4];
MyTempOrdersArray[j][5]=myTempArray1[0][5];
MyTempOrdersArray[j][6]=myTempArray1[0][6];
MyTempOrdersArray[j][7]=myTempArray1[0][7];
MyTempOrdersArray[j][8]=myTempArray1[0][8];
MyTempOrdersArray[j][9]=myTempArray1[0][9];
MyTempOrdersArray[j][10]=myTempArray1[0][10];
MyTempOrdersArray[j][11]=myTempArray1[0][11];
//X订单类型最小亏损单
If(myOrderSort==2 &&
myMaxMin==1)
For(cnt=0;cnt&=myArraycnt1;cnt++)
MyType=NormalizeDouble(myTempOrdersArray[cnt][3],0);
If(myTempOrdersArray[cnt][2]&0
&& myType==myOrderType)
MyTicket=NormalizeDouble(myTempOrdersArray[cnt][0],0);
//X订单类型最大亏损单
If(myOrderSort==2 &&
myMaxMin==0)
For(cnt=myArraycnt1;cnt&=0;cnt--)
MyType=NormalizeDouble(myTempOrdersArray[cnt][3],0);
If(myTempOrdersArray[cnt][2]&0
&& myType==myOrderType)
MyTicket=NormalizeDouble(myTempOrdersArray[cnt][0],0);
//X订单类型最大盈利单
If(myOrderSort==1 &&
myMaxMin==0)
For(cnt=0;cnt&=myArraycnt1;cnt++)
MyType=NormalizeDouble(myTempOrdersArray[cnt][3],0);
If(myTempOrdersArray[cnt][2]&0
&& myType==myOrderType)
MyTicket=NormalizeDouble(myTempOrdersArray[cnt][0],0);
//X订单类型最小盈利单
If(myOrderSort==1 &&
myMaxMin==1)
For(cnt=myArraycnt1;cnt&=0;cnt--)
MyType=NormalizeDouble(myTempOrdersArray[cnt][3],0);
If(myTempOrdersArray[cnt][2]&0
&& myType==myOrderType)
MyTicket=NormalizeDouble(myTempOrdersArray[cnt][0],0);
//X订单类型第1开仓单
If(myOrderSort==0 &&
myMaxMin==1)
For(cnt=myArrayRcnt&=0;cnt--)
MyType=NormalizeDouble(OrdersArray[cnt][3],0);
If(OrdersArray[cnt][0]!=0 &&
myType==myOrderType)
MyTicket=NormalizeDouble(OrdersArray[cnt][0],0);
//X类型最后开仓单
If(myOrderSort==0 &&
myMaxMin==0)
For(cnt=0;cnt&=myArrayRcnt++)
MyType=NormalizeDouble(OrdersArray[cnt][3],0);
If(OrdersArray[cnt][0]!=0 &&
myType==myOrderType)
MyTicket=NormalizeDouble(OrdersArray[cnt][0],0);
Return(myTicket);
Int init()
iShowInfo();
//初始化预设变量
Lots=预设开仓量;
MyOrderComment=订单注释;
MyMagicNum=订单特征码;
Return(0);
Int deinit()
Return(0);
EA程序模板
多订单、多货币对的精确控制是外汇自动交易程序的关键。笔者在实践中总结了一套行之有效的代码模板,该模板可以加载运行,并在主图右角显示基本信息。
显示的主要内容包括当前货币对、订单操作信息、买入卖出组订单的数量、总计开仓量以及盈亏。
程序提供以下基本变量,可在控制中随时调用:
BuyGroupOrders,SellGroupOrders
买入、卖出组成交持仓单数量总计
BuyGroupFirstTicket,SellGroupFirstTicket
买入、卖出组第一单单号
BuyGroupLastTicket,SellGroupLastTicket
买入、卖出组最后一单单号
BuyGrouplots,SellGrouplots
买入、卖出组成交持仓单开仓量总计
BuyGroupProfit,SellGroupProfit
买入、卖出组成交持仓单利润总计
BuyLimitOrders,SellLimitOrders
买入限制挂单、卖出限制挂单数量总计
BuyStopOrders,SellStopOrders
买入停止挂单、卖出停止挂单数量总计
OrdersArray[][3]
持仓订单基本信息:开仓时间、订单、订单类型
该模板自定义了iTradingSignals()模块,用于计算交易信息,返回信息如下:
买入开仓信号
卖出开仓信号
BuyLimit信号
SellLimit信号
BuyStop信号
SellStop信号
买入单平仓信号
卖出单平仓信号
以下是该模板源码,如果你不嫌麻烦,就一个字一个字写到你的程序中,如果说你嫌麻烦,有两种方式获得源码。一是直接用豆丁元购买,二是请在文档下面给予不少于20个字的评论并留下电子邮件。
#property copyright“Copyright by --”
#property link “http://--”
----程序预设参数
Extern string str1=“----系统预设参数----”;
Extern double Lots=0.1;
Extern string MyOrderComment=”demo’//订单注释
Extern string str2=“----技术指标参数----”;
//----程序控制参数
Int BuyGroupOrders,SellGroupO//买入、卖出组成交持仓单数量总计
Int BuyGroupFirstTicket,SellGroupFirstT//买入、卖出组第一单单号
Int BuyGroupLastTicket,SellGroupLastT//买入、卖出组最后一单单号
Double BuyGroupLots,SellGroupL//买入、卖出组成交持仓单开仓量总计
Double BuyGroupProfit,SellGroupP//买入、卖出组成交持仓单利润总计
Int BuyLimitOrders,SellLimitOrders //买入限制挂单、卖出限制挂单数量总计
Int BuyStopOrders,SellStopOrders //买入停止挂单、卖出停止挂单数量总计
Double OrdersArray[][3]//持仓订单基本信息:开仓时间、订单、订单类型
Int cnt,i,j;//计数器变量
Int start()
iShowInfo();
iTradingSignals();
return(0);
Void iShowInfo()
//统计持仓单数据
BuyGroupOrders=0;SellGroupOrders=0;//买入、卖出组成交持仓单数量总计
BuyGroupFirstTicket=0;SellGroupFirstTicket=0;//买入、卖出组持仓单第1张单订单号
BuyGroupLastTicket=0;SellGroupLastTicket=0;//买入、卖出组最后1张单的订单号
BuyGroupLots=0;SellGroupLots=0;//买入、卖出组成交单持仓量
BuyGroupProfit=0;SellGroupProfit=0;//买入、卖出组成交单利润
BuyLimitOrders=0;SellLimitOrders=0;//买入、卖出限制挂单数量总计
BuyStopOrders=0;SellStopOrders=0;//买入、卖出停止挂单数量总计
If(OrdersTotal()&0)
ArrayResize(OrdersArray,OrdersTotal());//重新界定数组
ArrayInitialize(OredrsArray,0.0);//初始化数组
For(cnt=0;cnt&=OrdersTotal()-1;cnt++)
//选中当前货币对相关持仓订单
If(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES
&& OrderSymbol()==Symbol()
OrderComment()==MyOrderComment)
OrdersArray[cnt][0]=OrderOpenTime();
OrdersArray[cnt][1]=OrderTicket();
OrdersArray[cnt][2]=OrderType();
//买入持仓单
If(OrderType()==OP_BUY)
BuyGroupOrders=BuyGroupOrders+1;//买入组订单数量
BuyGroupLots=BuyGroupLots+OrderLots();//买入组开仓量
BuyGroupProfit=BuyGroupProfit+OrderProfit();//买入组利润
//卖出持仓单
If(OrderType()==OP_SELL)
SellGroupOrders=SellGroupOrders+1;//卖出组订单数量
SellGroupLots=SellGroupLots+OrderLots();//卖出组开仓量
sellGroupProfit=SellGroupprofit+OrderProfit();//卖出组利润
//Limit挂单数量
If(OrderType()==OP_BUYLIMIT)
BuyLimitOrders=BuyLimitOrders+1;
If(OrderType()==OP_SELLLIMIT)
SellLimitOrders=SellLimitOrders+1;
//Stop挂单数量
If(OrderType()==OP_BUYSTOP)
BuyLimitOrders=BuyStopOrders+1;
If(OrderType()==OP_SELLSTOP)
SellLimitOrders=SellStopOrders+1;
//重新定义持仓单数组边界
Double myTempArray[][3];
myTrallingOrders=BuyGroupOrders+SellGroupOrders+BuyLimitOrders+SellLimitOrders+BuyStopOrders+SellStopO
If (myTrallingOrders&0)
ArrayResize(OrdersArray,myTrallingOrders);//重新界定数组
//ArrayInitialize(ordersArray,0.0);//初始化数组
ArrayResize(myTempArray,myTrallingOrders);//重新界定临时数组
ArrayInitialize(myTempArray,0.0);//初始化临时数组
//按订单开仓时间降序排列,重组订单数组-----冒泡排序
For(i=0;i&myTrallingOrders-1;i++)
For(j=myTrallingOrders-1;j&i;j--)
If(OrdersArray[j][0]&OrdersArray[j-1][0])
myTempArray[0][0]=OrdersArray[j-1][0];
myTempArray[0][1]=OrdersArray[j-1][1];
myTempArray[0][2]=OrdersArray[j-1][2];
myTempArray[j-1][0]=OrdersArray[j][0];
myTempArray[j-1][1]=OrdersArray[j][1];
myTempArray[j-1][2]=OrdersArray[j][2];
myTempArray[j][0]=OrdersArray[0][0];
myTempArray[j][1]=OrdersArray[0][1];
myTempArray[j][2]=OrdersArray[0][2];
//买入卖出组第1单、最后1单变量赋值
For(cnt=0;cnt&myTrallingOrders-1;cnt++)
If(OrdersArray[cnt][2]==0)
BuyGroupLastTicket=StrToInteger(DoubleToStr(OrdersArray[cnt][1],0));
For(cnt=0;cnt&myTrallingOrders-1;cnt++)
If(OrdersArray[cnt][2]==1)
SellGroupLastTicket=StrToInteger(DoubleToStr(OrdersArray[cnt][1],0));
For(cnt=myTrallingOrders-1;cnt&=0;cnt--)
If(OrdersArray[cnt][2]==0)
BuyGroupFirstTicket=StrToInteger(DoubleToStr(OrdersArray[cnt][1],0));
For(cnt=myTrallingOrders-1;cnt&=0;cnt--)
If(OrdersArray[cnt][2]==1)
SellGroupFirstTicket=StrtoInteger(DoubleToStr(OrdersArray[cnt][1],0));
//显示订单信息
iDisplayInfo(Symbol()+”-BuyGroup”,”买入组”,1,70,70,12,”Arial”,Red);
iDispalyInfo(Symbol()+”-Ask”,DoubleToStr(Ask,Digits),1,70,90,12,”Arial”,Red);
iDispalyInfo(Symbol()+”-SellGroup”,”卖出组”,1,5,70,12,”Arial”,Green);
iDisplayInfo(Symbol()+”-Bid”,DoubleToStr(Bid,Digit),1,5,90,12,”Arial”,Green);
//显示买入组信息
iDisplayInfo(Symbol()+”-BuyGroup”,”买入组”,1,70,70,12,”Arial”,Red);
iDispalyInfo(Symbol()+”-Ask”,DoubleToStr(Ask,Digits),1,70,90,12,”Arial”,Red);
iDispalyInfo(Symbol()+”BuyOrders”,BuyGroupOrders,1,80,110,10,”Arial”,iObjectColor(BuygroupProfit));
iDisplayInfo(Symbol()+”buyGroupLots”,DoubleToStr(BuyGroupLots,2),1,80,125,10,”Arial”,iObectColor(BuyGroupProfit));
iDisplayInfo(Symbol()+”buyGroupProfit”,DoubleToStr(BuyGroupProfit,2),1,80,140,10,”Arial”,iObectColor(BuyGroupProfit));
//显示卖出组信息
iDisplayInfo(Symbol()+”-SellGroup”,”卖出组”,1,5,70,12,”Arial”,Green);
iDispalyInfo(Symbol()+”-Bid”,DoubleToStr(Bid,Digits),1,5,90,12,”Arial”,Green);
iDispalyInfo(Symbol()+”SellOrders”,SellGroupOrders,1,10,110,10,”Arial”,iObjectColor(SellGroupProfit));
iDisplayInfo(Symbol()+”SellGroupLots”,DoubleToStr(SellGroupLots,2),1,10,125,10,”Arial”,iObectColor(SellGroupProfit));
iDisplayInfo(Symbol()+”SellGroupProfit”,DoubleToStr(SellGroupProfit,2),1,10,140,10,”Arial”,iObectColor(SellGroupProfit));
return(0);
Void iWait()
While(!IsTradeAllowed() || IsTradeContexeBusy()) Sleep(100);
RefreshRates();
Return(0);
Void iDisPalyInfo (string LableName,string LableDoc,int
Corner,int LabltX,int LableY,int Docsize,int DocStyle,int
创建对象(标签名称,对象类型,0,0,0)
ObjectCreate(LableName,OBJ_Lable,0,0,0)
文本属性(标签名称,文本内容,字号,字体,颜色)
ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor)
对象属性(标签名称,显示位置,位置)
ObjectSet(LableName,OBJPROP_CORNER,Corner)
对象属性(标签名称,X坐标,X)
Opjectset(LableName,OBJPROP_XDISTANCE,LableX)
对象属性(标签名称,Y坐标,Y)
OpjectSet(LableName,OBJPROP_YDISTANCE,LableY)
Void iDawSign(string myTapy,int myBarPos,doubl myPrice,color
myColor,int mySymbol)
If(myType=”Dot”)
ObjectCreate(myType+TimeToStr(Time[myBarPos]),OBJ_ARROW,0,Time[myBarPos],myPrice);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_COLOR,myCOLOR);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_ARROWCODE,mySymbol);
If(myType=”HLine”)
ObjectCreate(myType+TimeToStr(Time[myBarPos]),OBJ_HLine,0,Time[myBarPos],myPrice);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_COLOR,myCOLOR);
If(myType=”VLine”)
ObjectCreate(myType+TimeToStr(Time[myBarPos]),OBJ_VLine,0,Time[myBarPos],myPrice);
ObjectSet(myType+TimeToStr(Time[myBarPos]),OBJPROP_COLOR,myCOLOR);
Color iObjectColor(double myInput)
If(myInput&0)
myColor=G//正数颜色为绿色
if(myInput&0)
myColor=R//负数颜色为红色
if(myInput==0)
myColor=DrakG//0颜色为灰色
return(myColor);
Int init()
iDispalyInfo(“Author”,”作者”,1,18,15,8,””,SlateGray);
iDispalyInfo(“Symbol”,Symbol(),25,30,14,”Arial
Bold”,DodgerBlue);
iDispalyInfo(“TradeInfo”,”最小下单额:”+DoubleToStr(MarketInfo(Symbol(),MODE_MINLOT),2)+”手”,1,5,50,9,””,Olive);
iShowInfo();
Int deinit()
ObjectsDeleteAll();
Comment(“”);
Return(0);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 二代妖精百度云链接 的文章

 

随机推荐