一、MACD Sample 注解//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright 2005-2014, MetaQuotes Software Corp. |//| http://www.mql4.com|//+------------------------------------------------------------------+#property copyright "2005-2014, MetaQuotes Software Corp."#property link "http://www.mql4.com"input double TakeProfit =50; // 盈利目标点数input double Lots =0.1; // 每单入场的手数input double TrailingStop =30; // 跟踪止损的点数input double MACDOpenLevel =3; // MACD开仓的参考位置input double MACDCloseLevel =2; // MACD平仓的参考位置input int MATrendPeriod=26; // 交易条件中运用的MA均线的周期数程序最上面input开始的该数据均为外部变量,也就是在运用者调用的时机可以修改的部分。这个EA是个常见的技术指标条件入场、条件出场、同期又执行移动止损功能的设置,很适合初学者研究。先归纳这个程序的策略逻辑,以方便大家对号入座,赶紧理解。多头开仓条件:MACD位于0轴以下 而且 差于指定的参数MACDOpenLevel*Point同期 MACD信号线上穿基准线(金叉)而且 MA趋势往上。多头平仓条件:MACD位于0轴上方 而且 大于指定的参数MACDCloseLevel*Point同期 MACD信号线下穿基准线(死叉)。空头开仓条件:MACD位于0轴上方 而且 大于指定的参数MACDOpenLevel*Point同期 MACD信号线下穿基准线(死叉)而且 MA趋势朝下。空头平仓条件:MACD位于0轴以下 而且 大于指定的参数MACDCloseLevel*Point同期 MACD信号线上穿基准线(金叉)。有了以上的初步了解,下面开始执行EA程序基本结构的分析:1、OnTick()函数是最重要的实施部分,每来一个价格,此函数都自动实施一次,所以首要的逻辑结构都在这个函数里面。2、程序的基本流程均为依照下方步骤执行,我们先牢牢记住这个结构,然后再对号入座去理解程序。先分析目前本身的仓位状态,由于OnTick函数式循环运行的,所以中间的每个步骤全将运用OnTick函数,所以,当函数开始的时机我们首先要通过MT4的仓位操作函数得到目前的仓位状态,并更深一步依据状态执行不同分支的计算。void OnTick(void){double MacdCurrent,MacdPrevious;double SignalCurrent,SignalPrevious;double MaCurrent,MaPrevious;int cnt,ticket,total;//---// initial data checks// it is important to make sure that the expert works with a normal// chart and the user did not make any mistakes setting external// variables (Lots, StopLoss, TakeProfit,// TrailingStop) in our case, we check TakeProfit// on a chart of less than 100 bars//---if(Bars<100){Print("bars less than 100");return;}if(TakeProfit<10){Print("TakeProfit less than 10");return;}程序开始的下方两个部分不重要 简单说一下:if(Bars<100){Print("bars less than 100");return;}上面代码的意思是假使目前图表中的k线少于100根将令在日志信息里输出提示信息而且终结OnTick()函数的实施。return的意思是返回,假使在程序中分析出有错误,下面的代码就不再继续实施了,我们调用return函数让它退出OnTick()函数的实施。 然而该种情形一般不会显现,所以我们自己写程序的时机可以不写这部分。if(TakeProfit<10){Print("TakeProfit less than 10");return;}上面的代码意思是假使参数里的TakeProfit移动止损点数的设定假使差于10点,也提示一条信息并终结实施。TakeProfit从字面的意思中我们可以知道是止盈的意思,有些平台会制约下单时的止盈点数不得差于某个点,假使差于某值会在下单时报错,为了避免该种错误我们会制约参数中止盈的设定。其实这里可以调用MarketInfo()函数得到我们目前平台中允许的止盈止损最小值进而依据平台的不同自动计算出最小的止盈点数,详细情形请参阅文档MarketInfo()函数的描述。加入这段代码是为了防止乱设数值,引起后面计算的错误。这部分,假使程序导致我们自己运用,预期不会犯该种低级错误,所以写程序的时机也可以忽视不写。下面这段://--- to simplify the coding and speed up access data are put into internal variablesMacdCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,0);MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,1);这部分是变量赋值部分,等于提早计算出为后面用到的目前MACD数值以及MA数值,如此提早写出来在后面直接运用赋值后的变量就很清楚了,这是一个很好的编程习惯。以上语句调用了MQL的一部分内置指标函数,在MQL语言中,对于常用的指标如MA,MACD,KD等MQL4已经供应给我们现成的函数,我们只要调用这些内置的函数即可得到指标的值。上面的代码,MacdCurrent的值是参数为12,26,9的MACD主线目前的值,MacdPrevious则是MacdCurrent前一根K线MACD主线的值,SignalCurrent和SignalPrevious则是相同参数MACD信号线的目前值和前一根值。 后两个是调用均线指标函数,这里的均线周期参数则是运用了EA的参数变量MATrendPeriod,如此写是个好习惯,把调用指标的参数放到EA参数里,如此可以随时在运行中调整这些参数方便我们更改策略。MaCurrent和MaPrevious是得到26期均线的目前K线值和前一根的值。再下面开始最首要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数得到目前状态的部分。total=OrdersTotal();if(total<1){//--- no opened orders identified上面的代码分析我们目前能否有单子在做,它调用了OrdersTotal()函数,该函数可以计算目前账户中一共还没有平仓的单子和挂单的个数,假使它差于1,则表明是空仓状态,那么接下去就执行多头和空头的入场条件分析,假使满足条件则执行入场。if(AccountFreeMargin()<(1000*Lots)){Print("We have no money. Free Margin = ",AccountFreeMargin());return;}上面的代码是计算目前的可用预付款能否充足下单,假使不够就输出目前可用预付款只剩多少,然后直接退出,不执行后续入场条件分析。//--- check for long position (BUY) possibilityif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPreviousMT4自带EA:MACD Sample详解与实战分析
外汇网2021-06-17 09:41:06
794
一、MACD Sample 注解//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright 2005-2014, MetaQuotes Software Corp. |//| http://www.mql4.com|//+------------------------------------------------------------------+#property copyright "2005-2014, MetaQuotes Software Corp."#property link "http://www.mql4.com"input double TakeProfit =50; // 盈利目标点数input double Lots =0.1; // 每单入场的手数input double TrailingStop =30; // 跟踪止损的点数input double MACDOpenLevel =3; // MACD开仓的参考位置input double MACDCloseLevel =2; // MACD平仓的参考位置input int MATrendPeriod=26; // 交易条件中运用的MA均线的周期数程序最上面input开始的该数据均为外部变量,也就是在运用者调用的时机可以修改的部分。这个EA是个常见的技术指标条件入场、条件出场、同期又执行移动止损功能的设置,很适合初学者研究。先归纳这个程序的策略逻辑,以方便大家对号入座,赶紧理解。多头开仓条件:MACD位于0轴以下 而且 差于指定的参数MACDOpenLevel*Point同期 MACD信号线上穿基准线(金叉)而且 MA趋势往上。多头平仓条件:MACD位于0轴上方 而且 大于指定的参数MACDCloseLevel*Point同期 MACD信号线下穿基准线(死叉)。空头开仓条件:MACD位于0轴上方 而且 大于指定的参数MACDOpenLevel*Point同期 MACD信号线下穿基准线(死叉)而且 MA趋势朝下。空头平仓条件:MACD位于0轴以下 而且 大于指定的参数MACDCloseLevel*Point同期 MACD信号线上穿基准线(金叉)。有了以上的初步了解,下面开始执行EA程序基本结构的分析:1、OnTick()函数是最重要的实施部分,每来一个价格,此函数都自动实施一次,所以首要的逻辑结构都在这个函数里面。2、程序的基本流程均为依照下方步骤执行,我们先牢牢记住这个结构,然后再对号入座去理解程序。先分析目前本身的仓位状态,由于OnTick函数式循环运行的,所以中间的每个步骤全将运用OnTick函数,所以,当函数开始的时机我们首先要通过MT4的仓位操作函数得到目前的仓位状态,并更深一步依据状态执行不同分支的计算。void OnTick(void){double MacdCurrent,MacdPrevious;double SignalCurrent,SignalPrevious;double MaCurrent,MaPrevious;int cnt,ticket,total;//---// initial data checks// it is important to make sure that the expert works with a normal// chart and the user did not make any mistakes setting external// variables (Lots, StopLoss, TakeProfit,// TrailingStop) in our case, we check TakeProfit// on a chart of less than 100 bars//---if(Bars<100){Print("bars less than 100");return;}if(TakeProfit<10){Print("TakeProfit less than 10");return;}程序开始的下方两个部分不重要 简单说一下:if(Bars<100){Print("bars less than 100");return;}上面代码的意思是假使目前图表中的k线少于100根将令在日志信息里输出提示信息而且终结OnTick()函数的实施。return的意思是返回,假使在程序中分析出有错误,下面的代码就不再继续实施了,我们调用return函数让它退出OnTick()函数的实施。 然而该种情形一般不会显现,所以我们自己写程序的时机可以不写这部分。if(TakeProfit<10){Print("TakeProfit less than 10");return;}上面的代码意思是假使参数里的TakeProfit移动止损点数的设定假使差于10点,也提示一条信息并终结实施。TakeProfit从字面的意思中我们可以知道是止盈的意思,有些平台会制约下单时的止盈点数不得差于某个点,假使差于某值会在下单时报错,为了避免该种错误我们会制约参数中止盈的设定。其实这里可以调用MarketInfo()函数得到我们目前平台中允许的止盈止损最小值进而依据平台的不同自动计算出最小的止盈点数,详细情形请参阅文档MarketInfo()函数的描述。加入这段代码是为了防止乱设数值,引起后面计算的错误。这部分,假使程序导致我们自己运用,预期不会犯该种低级错误,所以写程序的时机也可以忽视不写。下面这段://--- to simplify the coding and speed up access data are put into internal variablesMacdCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PR洲际交易所_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,0);MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PR洲际交易所_CLOSE,1);这部分是变量赋值部分,等于提早计算出为后面用到的目前MACD数值以及MA数值,如此提早写出来在后面直接运用赋值后的变量就很清楚了,这是一个很好的编程习惯。以上语句调用了MQL的一部分内置指标函数,在MQL语言中,对于常用的指标如MA,MACD,KD等MQL4已经供应给我们现成的函数,我们只要调用这些内置的函数即可得到指标的值。上面的代码,MacdCurrent的值是参数为12,26,9的MACD主线目前的值,MacdPrevious则是MacdCurrent前一根K线MACD主线的值,SignalCurrent和SignalPrevious则是相同参数MACD信号线的目前值和前一根值。 后两个是调用均线指标函数,这里的均线周期参数则是运用了EA的参数变量MATrendPeriod,如此写是个好习惯,把调用指标的参数放到EA参数里,如此可以随时在运行中调整这些参数方便我们更改策略。MaCurrent和MaPrevious是得到26期均线的目前K线值和前一根的值。再下面开始最首要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数得到目前状态的部分。total=OrdersTotal();if(total<1){//--- no opened orders identified上面的代码分析我们目前能否有单子在做,它调用了OrdersTotal()函数,该函数可以计算目前账户中一共还没有平仓的单子和挂单的个数,假使它差于1,则表明是空仓状态,那么接下去就执行多头和空头的入场条件分析,假使满足条件则执行入场。if(AccountFreeMargin()<(1000*Lots)){Print("We have no money. Free Margin = ",AccountFreeMargin());return;}上面的代码是计算目前的可用预付款能否充足下单,假使不够就输出目前可用预付款只剩多少,然后直接退出,不执行后续入场条件分析。//--- check for long position (BUY) possibilityif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious
标签:
- 上一篇: 与狼共舞
- 下一篇: MQL4编程中有关 Ask、Bid 用法的表明
随机快审展示
加入快审,优先展示
推荐文章
- 黑马在线:均线实战利器 9367 阅读
- 短线交易技术:外汇短线博弈精讲 4587 阅读
- MACD震荡指标入门与技巧 4743 阅读
- 黄金操盘高手实战交易技巧 5158 阅读
- 做精一张图 3848 阅读
热门文章
- 港币符号与美元符号的区别是什么啊? 27546 阅读
- 我国各大银行汇率为什么不一样啊? 17553 阅读
- 越南盾对人民币怎么算的?越南盾对人民币汇率换算方法是什么 12472 阅读
- 百利好环球欺诈,不给出金,无法联系。 11485 阅读
- 港元符号是什么啊 港元符号跟美元符号是一样吗 10637 阅读