Responsive image

668期货交易大全整站当前内容有:161 个

回到首页 > 更多文章 > MT4包含EA(MA)源代码分析

MT4包含EA(MA)源代码分析

发布日期:2020-11-11 08:42:52
文章点击: 来源:网络

一、通过交易系统的平均线路EA详细信息

MT4平台包括Moving Average(自动交易的EA指标)。我们将详细说明此系统中每个语句的功能说明,详细了解EA的编程内核。我想给初学者一些帮助。

//-

//| Moving Average.mq4|

//|版权所有?2005,MetaQuotes软件公司|

//|/-

#define MAGICMA 20050610

//定义此EA操作的订单的唯一标识号,允许在同一个帐户中执行多系统操作。如果每个任务EA的订单标识码不同,则它们不能正常工作。凡是EA都是不可缺少的,很重要!

Extern double Lots=0.1//每张订单的成交量

Extern double MaximumRisk=0.02//系统最大风险系数,即资金总额的2%可用

extern double decrease factor=3;//下降因素数

Extern double MovingPeriod=12//平均计算周期=12个kk线;

extern double moving shift=6;//Kline处平均线的右偏移=Kline 6个;

//extern外部程序确定输入的变量后,将直接显示输入数据窗口。序列本身不能用作外部变量。

注:iMA的MovingShift(平均移动偏移)是指平均移动指针在图中绘制时左右移动的KK线数。主要是为了更好地查看图片的结果,MA的计算值没有变化。其中,此参数为正数,表示向右移动。负值表示向左移动。

//-

//| Calculate open positions

用户定义的函数(返回-整数数据)仓库查询和统计|

//-

intcalculatecurrentorders(string symbol)//函数作用,用于计算当前持有的仓库数

{

Int buys=0,sells=0;

//两个局部变量定义,整数类型,buys——多重单数,sells——空白单数,订单统计

//-

FOR(INT I=0;IORDERSTOTAL();I)。

//阶数周期(i=0至订单数,i=i 1)-循环目前的订单伫列

{

If (orderselect (I,select _ by _ pos,mode _ trades)==false)break;

//如果此系统交易没有仓库类型,则脱离循环

if(order symbol()==symbol()ordermagicnumber()==magic ma)

//如果仓库货币对是当前货币对,仓库号码是系统号码。

(判断该订单目前是否为EA运营,并防止EA错误地操纵其他程序控制的仓库列表。)

{

if(order type()==OP _ BUY)buys;

//如果仓库类型=多个订单:在多个单数中加上1。

if(order type()==OP _ SELL)sells;

//如果仓库类型=空列表,则在空单数中加上1。

}

}

//- return orders volume-返回订单数

IF(Buys 0)return(Buys);

//0多则返回(多单数)

ELSE Return(-Sells);

//否则返回(-null单数)

//此函数在查询计算结束时返回仓库数。此模式返回假定没有锁。

}

//-

//| Calculate optimal lot size

用户定义的函数(返回-小数数据)资金管理|

//-

Double LotsOptimized()//开放仓库计算函数(按需计算订货量,小数)

{

double lot=Lots(=0.1);//定义本地变量los小数类型

int orders=history total();//history orders total历史平昌单数(平昌)

int losses=0;//number of losses orders without a break-损失声明

//- select lot size

lot=normalize double(accountfreemargin()* maximum risk/1000 . 0,1);

//计算仓库未结订单数量=帐户可用资金*最大风险系数(=2%)/1000.0,保留1位小数的结果

(通过风险系数计算,目前门票需要采用的成交量除以1000,是因为大部分货币对汇率都在这附近。)。

//-calculate number of losses orders without a break-亏损计算

If(DecreaseFactor(=3)0) //下降因素数(=3)为0。

{

FOR(INT I=Orders-1;I=0;I -)

//阶数周期(i=历史平昌阶数-1,i=0,减少1)

{

If (orderselect (I,select _ by _ pos,mode _ history)==false){ print(' error in history)

布雷克;}

//如果没有此系统交易记录,将显示“没有交易历史记录!”输出

If(OrderSymbol())!=symbol()| | order type()op _ sell)continue;

//如果订单的货币对不是当前货币对,或者订单类型为订单,则继续运行

//订单类型为整数类型0-BUY、1-SELL、2-BUYLIMT、3-BUYSTOP、4-SELLLIMT和5-SELLSTOP。在这里

If(OrderProfit()0)中断;

如果顺差为0,则从循环中跳下来。

if(order profit()0)losses;

//收益表数为0时:损失单数加1

}

if(los ses 1)lot=normalize double(lot-lot * losses/decrease factor,1);

//如果发生单数1损失,则重新计算订货量,保留小数点后1位,计算如下:

订货量=(lot-lot * losses/decrease factor(=3))。

}

//- return lot size-返回订货量

IF(lot 0.1)LOT=0.1;/

/如果计算的成交量小于0.1手,成交量为0.1手

返回(LOT);//退货(订货量)

}

//-

//| Check for open order conditions

//自定义函数(无返回值)思洛策略|

//-

Void CheckForOpen()//开闭检查(决定开闭条件及处理)

{

Double ma//将局部变量ma定义为十进制

Int RES//将局部变量RES定义为整数

//-go trading only for first tiks of new bar,

//仅对新Kline的第一个报价运行

If(卷[0]1)return;

//当前Kline的成交价大于1时返回

(不是KK线的开放时间。也就是说,如果当前KK行尚未关闭,则直接返回。否则,如果是KK线的第一个交易价格,就继续向下运营。)

//- get moving average-获取平均值

Ma=IMA (null,0,moving period,moving shift,mode _ SMA,price _ close,0);

//获取基于当前收盘价计算的平均值线值

Ima (null、0、12、6、mod _ SMA、price _ close、0)

//- sell conditions-销售条款

If(Open[1]ma Close[1]ma)

//如果前一条KK线通过平均值线(即KK线的开盘价大于平均值,收盘价小于平均值)。

{

Res=ordersend (symbol(),op _ sell,lotsoptimized(),bid,3,0,0,'',magicma,

//发货仓库清单(目前货币对、销售方向、开仓量计算()、购买价格、滑点=3、无损、无限胜、订单号码、红色箭头指示)

Return//返回

}

//- buy conditions-购买条款

If(Open[1]ma Close[1]ma)

//如果前一条KK线穿均线(即KK的开盘价小于平均值,收盘价大于平均值)。

{

Res=ordersend (symbol(),op _ buy,lotsoptimized(),ask,3,0,0,'',magicma

//发件仓库报表(当前货币对、购买方向、开仓量计算()、售价、滑点=3、无损、无止境的胜利、订单号码、蓝色箭头指示)

Return//返回

}

//-

}

//-

//| check for close order conditions

//自定义函数(无返回值)思洛策略|

//-

Void CheckForClose()//平仓检查(平仓条件及处理决定)

{

Double ma//定义本地变量ma小数类型

//-只有当一个K关闭另一个新的东西时才交易。

If(卷[0]1)return;//如果当前Kline的交易为1,则返回

//- get移动平均值//获取平均值

Ma=IMA (null,0,moving period,moving shift,mode _ SMA,price _ close,0);

//获取基于当前收盘价计算的平均值线值

FOR(INT I=0;IORDERSTOTAL();I) //阶次周期(变量i=1中的订单总数,一次增加1)

{

If (orderselect (I,select _ by _ pos,mode _ trades)==false)break;

//如果该系统没有交易的仓库,请脱离循环。

If(OrderMagicNumber())!=MAGICMA || OrderSymbol()!=Symbol())continue;

//如果仓库编号不是系统编号,或者仓库货币对不是当前货币对,请继续选择

if(order type()==op _ buy)

//如果是多页

{

if(open[1]maclose[1]ma)order close(order ticket()、orderlots()、bid、3、white)

//如果按第一个K线开盘价穿均线(即开盘价高于均价,收盘价低于均价)。

多个平坦的仓库(仓库编号、仓库数量、购买价格、滑点=3,用白色箭头表示)

布雷克;//偏离循环

}

if(order type()==op _ sell)

//如果为空

{

if(open[1]maclose[1]ma)order close(order ticket()、orderlots()、ask、3、white)

//如果对第一条K线的开盘价采用均线(即开盘价低于均价,收盘价高于均价)。

公平窗口(仓库编号、仓库数量、售价、滑点=3,用白色箭头表示)

布雷克;//偏离循环

}

}

//-

}

//-

//| Start function |

//-

Void start()//主程序-每个交易价下的计算过程

{

//- check for history and trading-确认交易历史记录

if(bars 100 | | istradeallowed()==false)return;

//kk行数小于100或允许智能事务=false时返回

//-calculate open orders by current symbol计算当前货币对的仓库打开订单

if(calculatecurrentorders(symbol())=0)checkforopen();

//如果计算出当前货币对仓库订单数=0(即无仓库),则执行仓库检查。

ElseCheckForClose();

//否则(即,如果当前存在仓库清单),则执行仓库检查。

//-

}

二、本EA战略分析

根据本EA系统的源代码,可以使用以下策略进行分析:

1、技术指标:12个周期平均系统;

2、幻灯片点:3分;

3、开放式平仓规则:Kay线穿均线,无仓库,开放式多仓;有空仓库的时候,平空的仓库;

如果在Kk线下穿均线,如果没有仓库,就打开空仓库。有多仓时,平多仓。

4、图片标志:打开多个仓库时,图片上会显示红色箭头。平仓,白色箭头标记;

打开空仓库时,图中没有蓝色箭头。平仓后,将显示白色箭头。

三、模拟交易中系统的结果分析

该EA系统经过详细分析,可以看到EA系统的基本结构和相关战略。下面是EA在模拟盘中1分钟EURUSD(欧元兑美元)的开仓、平昌结果图。

在该系统的模拟交易过程中,该战略的运营思想基本反映出来,其中4个订单中的2个空白订单和2个以上订单如下图所示。

【免责声明】本站收藏的文章均来源于网络,其原创性、真实性以及文中陈述文字和内容未经本站证实,所以对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请自行参考,并核实相关内容。如有侵权,可通过底部联系方式,做删除处理。

看完忍不了?一吐为快就是爽!

来都来了,不发表下看法?
  • 全部评论(0
    还没有评论,快来抢沙发吧!

以下相关内容,总有一个你会爱上!