客服热线:18391752892

MT4的MACD编程EA详解

   日期:2019-01-12     浏览:694    
马上注册,结交更多好友,下载更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 在MT4安装后,默认会给用户提供几个例子程序,这些程序对于新学习EA开发过程中有很大的帮助,下面我们就来对MACD Sample这个例子EA来做个解读,来看看别人是如何开发一个EA的。首先是注释,在MQL语言中所有//的这一行就是注释行,系统本身不会去执行它,它只是用来解释当前代码的含义的,我们在代码中加入这些注释为了是让我们能够清楚的阅读代码的含义,在程序中加入详细的注释是一个很好的编程习惯,我们鼓励大家多加入注释。很多人觉得注释这东西因为没用在写代码中觉得很麻烦而忽略它,但是即使是自己编写的程序如果不加注释过几天就会忘记意思,还要再一行一行地看这些代码,所以注释是非常重要的。下面这些就是定义变量,我们发现前面加上了extern关键字,如果在定义变量的前面有这个词说明这个变量将会被作为EA运行的参数,举个例子,比如我要编写一个EA,在使用过程中我想改变它的止盈和止损值,如果我程序都是事先编好的止盈止损,那么以后要改动它必须要改代码,这样不仅麻烦也不灵活,如果我把这些信息作为EA运行参数,那么在EA运行中就可以随时调整它了。extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MATrendPeriod=26;上面定义了6个变量并且都是当作参数,这里设定变量名称的时候尽量使用用户可以理解的词汇,在EA的参数设置里这些变量名就是参数的名字。值得注意的是EA里变量名称是可以用中文的。int start()start()函数是EA运行的核心,MQL语言规定了几个默认函数,其中EA第一次运行时会调用init()函数,在这个函数里我们可以放入一些需要初始化的信息,start()函数中放我们EA的核心代码,每次一个TICK(换句话说就是新报价)来到后,系统会自动调用start()函数。deinit()函数是当EA关闭的时候调用的,这里放一些我们程序停止后需要“善后”的代码。start()函数是必须要有的,其它两个函数如果不需要可以不用写。if(Bars 100){     Print( bars less than 100      return(0); }上面代码的意思是如果当前图表中的k线少于100根将会在日志信息里输出提示信息并且结束start()函数的执行。return的意思是返回,如果在程序中判断出有错误,下面的代码无法继续执行了,我们调用return()函数让他退出start()函数的执行。if(TakeProfit 10){                                                           Print( TakeProfit less than 10      return(0); // check TakeProfit}上面的代码意思是如果参数里的TakeProfit变量小于10也提示一条信息并结束执行,TakeProfit从字面的意思中我们可以知道是止盈的意思,有些平台会限制下单时的止盈点数不得小于某个点,如果小于某值会在下单时报错,为了避免这种错误我们会限制参数中止盈的设定。其实这里可以调用MarketInfo()函数得到我们当前平台中允许的止盈止损最小值从而根据平台的不同自动计算出最小的止盈点数,详细情况请参阅文档MarketInfo()函数的描述。MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);以上语句是调用了MQL的一些内置指标函数,在MQL语言中,对于常用的指标如均线,MACD,KD等MQL已经提供给我们现成的函数,我们只要调用他即可得到指标的值(相见文档技术指标部分:http://docs.mql4.com/cn/indicators)。就上面的代码,MacdCurrent的值是参数为12,26,9的MACD主线当前K线的值,MacdPrevious则是MacdCurrent前一根K线的值,SignalCurrent和SignalPrevious则是相同参数信号线的当前值和前一根值。后两个是调用均线指标函数,这里的均线周期参数则是使用了EA的参数变量MATrendPeriod,这样写是个好习惯,把调用指标的参数放到EA参数里,这样可以随时在运行中调整这些参数方便我们改变策略。MaCurrent和MaPrevious是得到26均线的当前K线值和前一根的值。total=OrdersTotal();if(total 1)上面的代码就是判断我们当前是否有单子在做,他调用了OrdersTotal()函数,它可以计算当前账户中一共还没有平仓的单子和挂单的个数,如果它小于1说明当前没有任何单子,这种判断方法只是一种简单的判断法,如果这个EA在运行过程中人为也去下单则EA永远不会下单了,如果要更加精确的计算这个EA所下的单子数量还需要利用其他方法,这些技巧我们会在以后的文章中介绍。if(AccountFreeMargin() (1000*Lots)){     Print( We have no money. Free Margin = , AccountFreeMargin());     return(0); }    上面的代码是计算当前的剩余保证金是否小于1000,如果太少钱会不够用,所以会输出下当前的保证金还剩多少并退出。if(MacdCurrent 0 MacdCurrent SignalCurrent MacdPrevious SignalPrevious MathAbs(MacdCurrent) (MACDOpenLevel*Point) MaCurrent MaPrevious){     ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, macd sample ,16384,0,Green);     if(ticket 0)     {     if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print( BUY order opened : ,OrderOpenPrice());     }     else Print( Error opening BUY order : ,GetLastError());      return(0); }上面这段就是多单开仓部分了,条件是这样:如果当前MACD主线在0轴以下,MACD“金叉”,MACD的主线不在0轴附近(这块是EA的参数来指定0轴附近多少点)并且还要当前的均线是上升的。这里最精彩的部分在于如何判断MACD“金叉”,如何判断MACD值不在0轴附近和均线目前是上升的还是下降的。“金叉”的判断是EA里用的比较多的,这里我们用了判断大小的方法就能很容易的计算它,首先得到MACD两根线当前的值和上一根K线的MACD值,如果上一根K线的MACD主线大于信号线并且当前的MACD主线小于信号线那么就相当于这两根线做了一个“交叉”,因此我们可以认为MACD“金叉”了。从这里我们也能看出来用计算机的方法来解决我们人类所认知的问题靠的都是这种具体数值的计算,所以计算机还是比较“死板”的,如果两根线“扭”在了一起那么用计算机程序很难判断出来,这些就是目前计算机程序的缺点。0轴附近这种判断方法这里利用了一点数学方面的知识,不过不用担心都是很简单的算法。把MACD值做绝对值运算然后判断是否大于指定的值,因为MACD会是负值做绝对值运算后直接判断是否大于设定的值就行了,这块相当于是简化了判断语句的条件。均线的上升和下降判断和“金叉”的算法差不多,得到当前均线值和前一根线的均线值,如果前一根均线值小于当前值那么就说明均线是上升的。if(MacdCurrent 0 MacdCurrent SignalCurrent MacdPrevious SignalPrevious MacdCurrent (MACDOpenLevel*Point) MaCurrent MaPrevious){     ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, macd sample ,16384,0,Red);     if(ticket 0)     {             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print( SELL order opened : ,OrderOpenPrice());     }     else            Print( Error opening SELL order : ,GetLastError());      return(0);这段代码就是空单的进场条件,和上面的正相反。值得说明是这两个下单代码中会遇到下单失败的情况,因为当用OrderSend()函数下单后会返回一个大于0的整数订单号数值,利用这一点就可以很容易的知道下单是否成功了。下面的代码是平仓和移动止损部分,这段代码比较难懂,但是却是非常重要的部分,因为在编写EA中这些操作会经常遇到,让我们来一点一点的拆解开来理解下它们的含义。for(cnt=0; cnt total; cnt++)当前存在的订单中我们要判断是否到达平仓的条件,所以第一步我们首先要对所有在下的单子进行一次遍历,一个一个的去判断它们是否达到平仓条件。此代码中利用了一个循环语句从第一单开始一单一单的循环,这里值得注意的是所有单子都是按照下单的先后顺序存放的,第一张单子的编号是0而不是1,这是编程语言中一般都采取的方法,我们在编写程序的时候一定要注意它的值要从0开始。OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);上面是选择订单操作,当循环一次订单后,必须调用OrderSelect()函数来锁定这一订单,这样下面的操作才可以正常运行。这里最容易出错的地方是函数的第二个参数如果查一下文档我们会发现它有两个选项:SELECT_BY_POS和SELECT_BY_TICKET。第一种方式是根据订单的位置进行选定操作,这个例子中就是使用了这种方式,第二种方式是根据订单号来进行选定操作,因为我们并不知道所有单子的订单号是多少所以我们只能使用第一种方式来选择订单,刚才说过订单是按照下单的先后顺序来存放的,因此如果是第一个单子那么就是0,如果是第二个单子就是1,最后一个单子是总单子数减一。if(OrderType() =OP_SELL    // check for opened position      OrderSymbol()==Symbol()) // check for symbol上面的代码段又运用了一个小技巧,它首先调用了OrderType()函数来得到所选定的订单是多单还是空单,但是我们查下这个函数的定义(http://docs.mql4.com/cn/constants/trading)发现多单的值是0,空单的值是1,那么如果OrderType()函数小于等于空单的值那么相当于在判断当前订单是否是非挂单。第二个条件是判断当前单子的货币对是否和当前图表相同,这个判断是为了防止我们处理订单过程中误操作了其他不是EA所下的单子。if(OrderType()==OP_BUY)   // long position is opened{     // should it be closed?     if(MacdCurrent 0 MacdCurrent SignalCurrent MacdPrevious SignalPrevious MacdCurrent (MACDCloseLevel*Point))     {            OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position            return(0); // exit     }多单的平仓部分代码,这里其实就是去掉均线条件的空单下单信号,平仓操作中一定要注意在平仓完成后必须终止这个遍历订单的循环,因为平仓后会打乱所有单子的顺序,造成误操作其他订单。我们在这里举个例子就能明白为什么要这么做:比如当前有三个单子没有平仓,按照顺序排列序号是0、1、2,如果第二个单子平仓后第三个单子序号就会提前,这样当下一轮循环执行到OrderSelect()函数后会因为没有这个编号而出现错误。if(TrailingStop 0) {               if(Bid-OrderOpenPrice() Point*TrailingStop)     {            if(OrderStopLoss() Bid-Point*TrailingStop)            {               OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);               return(0);            }     }}   这段代码就是多单的移动止损部分,当参数TrailingStop大于0的时候EA就开启了移动止损功能(默认设定是30,也就是说默认情况下是开启移动止损的),我们就用我们这个例子EA的默认参数30点来说明,当单子的盈利大于30点并且单子的止损点和当前价位相差30点以上时,修改订单的止损到当前价格以下30点位置。我们在上面的程序里屡次发现作者使用Point变量来计算点位,这个变量是MT4运行环境中自动设定的值,它在MQL语言中叫做预定义变量(关于预定义变量可以参考这里:http://docs.mql4.com/cn/predefined/variables),Point告诉我们当前货币对的价格最小点值是多少,举个例子:欧元对美元的价格总是X.XXXX这种形式,它的Point值就是0.0001,当我们想设定当价格大于30点这种情况时,我们只要用30乘以Point就可以计算这个货币对的实际30点值。不过Point常量在很多平台中不能正确的来实现它本身的功能了,原因是很多平台已经改为小数点后5位,这样Point值变成了0.00001,我们直接用他来乘以点位得到是却是实际点位的十分之一,这样会在EA的运行中出现致命的逻辑错误。因此如果是5位的平台,需要在那些点位的值上乘以10来修正这个问题。关于Point的完美解决方法我们将在后续的文章中继续讨论。以上就是MT4例子EA的解读,这个程序虽然比较复杂但是它却是一个很好的例子,里面涉及到了我们在写EA程序过程中常用到的一些功能,对于初学EA程序的人来说帮助很大,我们也可以修改这个程序的开仓、平仓部分直接变成我们自己的逻辑。 好指标如何应用到EA上 第一部分:指标风险投资家 寻找金融市场每一个获利的机会为了能赚钱而不是亏损,无论是专业的交易商还是个体,都在研究各和总结各种种的规律,并做成指标,我们经常会发现一些指标图线看起来很完美,于是都会想到要根据指标的变化进行交易。但这样做会赚钱吗?能否赚钱,我们就要看这些指标有没有作弊。即确定指标是否有未来函数的计算,也就是说指标会不会根据现在的K线,计算后将指标在历史K线上标示做更改。比如原来是卖的提示,改为买。(恐怖吧)。(当然还有一些EA特有的环节也会影响盈利问题,在这里不讲)确定是否有未来函数的方法有两种:1.白盒校验(即查看源码)直接看源码中的循环部分,如果有修改历史曲线数组的行为,则可以立刻断定有未来函数。2.黑盒观察当没有源码的时候,可以将指标加载到1分钟的图线上,连续不断观察其标示的变化,尤其注意与当前K线状态最接近的历史K线标示的变化。如果随着当前K线的变化出现过历史变化更改,则也可以确定有未来函数指标EA化之前必须要确认的事情:如果一个指标含有 未来函数,那么这个指标是没有多大意义的。也就是说,我们要将指标改为EA前,必须确认这个指标是不含未来函数的,这样指标EA化才有意义。第二部分 指标EA化接下来将指标EA化大致的做法是:在EA中通过函数iCustom读取这个指标的当前K线输出值,得出当前的状态,来决定是否入场或者平仓并反向入场。iCustom的具体用法:指标一般都是曲线或者箭头两种。在这里我们要把曲线和箭头都看成是数组就容易理解了。对于指标来说每一条曲线或者箭头都是写在与每个K线对应的数组中的,也就是说一条曲线对应一个数组,一个方向的箭头也是对应一个数组(有箭头的数组值是当时的价格,没箭头地方的数组值是“空”) iCustom MT4的帮助里说的是:“计算指定的客户指标并且退回它的值”,即这个函数可以让你获取指定指标的第几个数组对应第几根K线上的计算数值。具体如下:double iCustom(string symbol, int timeframe, string name, ..., int mode, int shift)计算指定的客户指标并且退回它的值。 必须在terminal_directoryexpertsindicators目录内编写客户指标(*.EX4文件)。参量:symbol        -        计算指标数据上的货币对名称. NULL表示当前货币对.timeframe        -       时间周期。 可以时间周期列举任意值. 0表示当前图表的时间周期.name        -        客户指标完整的程序名称....        -        参量设置(如果需要)。通过的参量和他们的顺序必须与desclaration命令和客户指标的外部可变物的种类对应。mode        -        索引行。 从0到7并且必须对应以其中一个使用的索引的 SetIndexBuffer 函数.shift        -        从显示缓冲采取的值的索引(转移相对当前柱特定相当数量期间前).示例:double val=iCustom(NULL, 0, 示例Ind ,13,1,0);double va2=iCustom(NULL, 0, 示例Ind ,13,0,1);例如:一个指标,画了两条曲线,则可以用iCustom取得这个指标在第4根K线上对应的第一条曲线的数值。我们现在已经可以根据自己的想法去获得一个指定指标的任何K线上的状态数值了。那麽下一步我们就要开始EA的概念。因为EA只针对当前价格状态下的动作进行控制。所以一般而言我们就取指定指标在当前K线下的计算数值用于EA的条件判断。如果你认为当前K线没有结束,其数值始终在变化,有可能一会有讯号一会没讯号,那麽你可以采用取前一K线的指标数值的方式作为基础。(如果用当前K线指标数值作为条件会有不确定的结果,但如果用前一K线数值做条件则有“错过最佳入场点”的问题。这是需要程序设计者权衡的问题。)另外的一个问题,就是怎末去判断指标输出的数值与我们肉眼看到的讯号一致起来的问题。如果参考的指标是一种变色线,则一定是一种颜色一个数组的方式叠加起来显示的。我们在取其数值的时候只需要看看不同颜色的数组的数值比较一下就知道其结果是哪种颜色,并作为EA的条件进行动作就行了。如果是箭头的方式,则一样是去取其数值,无箭头的K线上指标对应的数值是“空”,有箭头的地方数组对应的数值肯定不是空。用这个来判断是否发生了讯号就行了。比如双色线,就一定是两个数组分别显示不同颜色,当指标认为应该显示其中一种颜色的时候就将这个颜色对应的数组在当前K线中的数值设成当前价。反之则设为“空”。这样循环一遍后 你肉眼看到的就是变色线了现在我们可以轻松获得指标的当前讯号状态了!下一步就是结合进EA中,就是把指标中的数组值拿过来第三部分 EA 编程逻辑EA就是一个循环往复的过程。每来一个价格就运行一次。EA是电脑,并不知道你现在的仓位情况也不知道指标的情况,除了计算什么都不知道,一切都是编程者赋予的。因此,编程者脑子里一定要建立一种综合状态的概念。EA的一开始一定要先进行仓位的情况检查。大致的逻辑如下: 1 先查出持仓情况和持仓单的方向。2. 然后获得指标的数值。   3   判断并操作持仓状态下:根据持仓单的方向进行对应来判断反向讯号是否发生。如果发生则平仓并反向入场。如果没发生则直接返回,等待下一次价格的而到来。空仓状态下:则两个方向的讯号都做判断,哪边发生了就按那边的方向入场。4.   其他的的细节不论入场还是出场都要在发出动作后马上判断是否正确执行的判断。如果没有执行成功则一定要立刻放弃后面的操作直接返回。等待下一个价格来的时候在此发出同样的动作。另外说明的是数据是自动更新的。

    近年,由於很多學校學習的知識不一定能適應社會變化。,於是各種教育培訓機構應運而生,其中有技能性培訓、知識性培訓等。但隨著培訓機構數量的增加,競爭也越來越激烈。如何從數以萬計的培訓機構中脫穎而出,打造一個深受喜愛,並值得信賴的教育培訓品牌成為機構管理者和管理團隊,甚至是教育培訓機構業界的主題。

為實現以上目標,推廣顯得尤為重要。而『活動策劃』(ActivityPlanning)這一塊蛋糕也是不得不重視的部分,活動策劃對於一個教育培訓機構來說,算不上是大事,但也不是小事。忽略了這一塊,營銷推廣效果將會被打折。太原代办银行卡出售QQ:1809793000 TEL:15600090098教育培訓業界知名的某外語培訓機構負責人。就為我們分析了活動策劃對提高業績和銷量,打造品牌的重要性:
活動策劃是提高市場佔有率的重要措施,如果是一份創意突出,而且具有良好的可執行性和可作性的活動策劃案,無論對於培訓機構的知名度,還是對於品牌的美譽度,都將起到積極的提高作用。相對於市場策劃案而言的,嚴格地說它是從屬於市場策劃案的,他們是互相聯系,相輔相成的。它們都從屬於企業的整體市場營銷思想和模式,只有在此前提下做出的市場策劃案和活動策劃案纔是具有整體性和延續性的廣告行為,也只有這樣,纔能夠使受眾群體,也就是有接受某種技能培訓的客戶,同意一個品牌的文化內涵,並對其優勢進行傳播。
一個好的活動策劃直接營銷一個教育培訓機構的品牌。如北京櫻花國際日語6月推出的『輕松學日語,開心游日本』的特惠活動、『新東方暑期百萬課程一元競拍』等活動毋庸置疑在提高品牌知名度方面起到相當大的作用。上海代办银行卡出售QQ:1809793000 TEL:15600090098各教育培訓機構往往以活動為引爆點,回饋老客戶,吸引新客戶,挖掘潛在客戶。此類型活動的主要特點是活動本身就是一塊『磁場』,具有足夠吸引客戶熱情和消費者眼球的魅力。

所以,如何做好一個活動策劃,成為普通的各大中小教育培訓機構思考的問題。培訓機構中的策劃部門自行策劃活動的方式在此就不贅述了,重點要向大家推薦的是采用『威客外包』獲得活動策劃的方式。在互聯網時代,學會利用網絡資源來獲取自己需要的信息是必修課,它能為你節約時間、精力、資金等。而據調查,已經在采用威客模式獲取創意活動策劃方案的教育培訓機構目前已站業界的35%。而對此類機構的統計中發現,他們一致認為多獲得的方案大部分都具有創意,並且實現程度都相當不錯。需要建議的一點是,如果采用威客外包做活動策劃方案,可以選擇國內威客界『老大』-豬八戒網。

下面是了解到的關於豬八戒網的平臺介紹,供各教育培訓機構的管理運營人員參考。經過6年的努力,豬八戒網已經成為國內最大的創意服務交易平臺。另外,記者還對該網站790萬用戶進行了關於『豬八戒網用戶體驗評估指數』的抽樣采訪。采訪結果大致可歸納總結為以下幾點:

①平臺實力指數:★★★★★
截止目前,豬八戒網共擁有超過700萬名的用戶總數,除中國而外還有部分用戶分布在美國、英國、印度等其它多國。2011年9月,成都代办银行卡出售QQ:1809793000 TEL:15600090098豬八戒網榮獲重慶市『優秀網購平臺』稱號;同年11月,央視《經濟半小時》報道豬八戒網文化創意產業。無論是央視報道,還是其它媒體雜志的新聞報道,都在證明豬八戒網提供的威客服務模式正在滲透每個人的生活;

②威客專業技能指數:★★★★★
在700多萬名威客中,做活動策劃的威客有近35萬。其中有的威客是大公司供職的專業策劃工作者,還有高校策劃專業授課講師、教授,以及活動策劃的狂熱愛好者,甚至是一些在校學生,可謂匯集了全國各地的策劃高手。他們的策劃方式創意多變,能很好的滿足來自各教育培訓機構的策劃要求;


③服務性價比指數:★★★★☆
活動策劃價格由客戶自己定,最低50元起發布推廣需求。豬八戒網提供的此類服務,可為客戶節省約線下成本的30%-50%左右;而且,可以得到很多推廣高手為您策劃;

④消費者保障滿意指數:★★★★★
2012年8月,豬八戒網開通消費者保障服務,網上交易更加有保障。在該網站上為客戶提供專業服務的威客,均100%通過網站實名認證;客戶在豬八戒網發布需求,但卻未獲得有效稿件,豬八戒網全額退款;作為第三方交易擔保平臺,豬八戒網向客戶承諾滿意後付款;網站也為有發票需求的客戶提供正規發票。在豬八戒網進行交易,消費者將享受最真誠保障。

以上就是對部分在豬八戒網成功做了推廣營銷的客戶的調查結果。另外,目前豬八戒網一年一度的為教育培訓機構的策劃優惠活動已經拉開序幕。重庆代办银行卡出售QQ:1809793000 TEL:15600090098這是一個專門為教育培訓機構打造的『優惠推廣+策劃的套餐』,希望各位機構管理者或者推廣負責人不要錯過這個讓培訓脫穎而出的機會。』此次優惠推廣套餐活動鏈接:活動的目標:讓各大中小機構花最少的錢,達到最好的推廣效果,再創品牌銷售新高。

在距寒假兩個月左右的時間中,教育培訓機構如果想要報名爆滿,銷售達到制高點的話,目前就應該著手准備推廣營銷工作,而創意的活動策劃是必不可少的一個部分。
nload="thumbImg(this)" border="0" alt="" />
www.bajyhk.com
外汇交易有很大的风险性,本站所有资源均来自网络,请选择使用,如若出现亏损,本站不承担任何责任!


特别提示:本信息由相关企业自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


0相关评论
相关行情
推荐行情
点击排行