佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

12
返回列表 发新帖
楼主: 柒侠伍义

MT4_EA 制作速成班_基础篇

[复制链接]
发表于 27-5-2009 01:42 PM | 显示全部楼层
仙剑没有买药给你刺咩
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 6-6-2009 05:17 PM | 显示全部楼层
/*
MACD Sample详解
//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright ?2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
以上是垃圾
*/
//这是自定义函数
extern double TakeProfit = 50;   //盈利目标点数
extern double Lots = 0.1;       //每单入场的手数
extern double TrailingStop = 30; //追踪止损的点数
extern double MACDOpenLevel=3; //MACD开仓的参考位置
extern double MACDCloseLevel=2; //MACD出场的参考位置
extern double MATrendPeriod=26; //条件中使用的MA均线的周期数
//程序最上面extern开始的这些数据都是程序参数,
//也就是在使用者调用的时候可以修改的部分。
//这个EA是个常见的技术指标条件入场,条件出场
//同时又移动止损功能的完成示意,
//很适合初学者研究。
//先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。
//多头入场条件:buy
  // MACD小于0 并且 小于指定的参数MACDOpenLevel   
   //并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势
//多头出场条件:Close buy
  // MACD大于0 并且 大于指定的参数MACDCloseLevel
   //并且 MACD信号线上传基准线(金叉)
//空头入场条件:sell
//MACD大于0 并且 大于指定的参数MACDOpenLevel   
//并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势
//空头出场条件: Close sell
//MACD小于0 并且 小于制定的参数MACDCloseLevel   
//并且 MACD讯号线下穿基准线(死叉)
//=============================================================
//有了以上的初步了解,下面开始进行EA程序基本结构的分析:
//1、start()函数是最重要的执行部分,
//每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里
//2、程序的基本流程都是按照以下步骤进行,
//我们先牢牢记住这个结构,然后再对号入座去理解程序。
//先判断当前自身的仓位状态,因为start函数式循环运行的,
//所以中间的每个步骤都会使用start函数,因此,
//当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,
///并进一步根据状态进行不同分支的计算。
//程序开始的以下两个部分不重要 简单说一下:
int start()
  {
//这是自定义函数
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
//这是多余的检查
if(Bars<100)
    {
   Print("bars less than 100");
   return(0);  
    }
//以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。
//这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。
//这是多余的检查
if(TakeProfit<10)
    {
   Print("TakeProfit less than 10");
   return(0);   // check TakeProfit
    }
   
//以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,
//则发出报警,并返回不进行运算。
//这是为了防止乱设数值,引起后面计算的错误。
//这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,
//所以写程序的时候也可以忽略不写。
//下面这段:
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);
//这部分是变量赋值部分,
//等于提前计算出为后面用到的当前MACD数值以及MA数值,
//这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。

//   再下面开始最主要的程序逻辑部分,
  // 首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。
total=OrdersTotal();
//通过函数获得当前持仓单的个数,
//如果持仓单个数小于1,则说明是空仓状态,
//那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:
if(total<1)
    {
   // no opened orders identified
   if(AccountFreeMargin()<(1000*Lots))  
   //  这句诗判断保证金余量是否够下单,
   //如果不够则直接返回,并不进行后续入场判断
       {
      //这是多余的检查+打印
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0);  
       }
   // check for long position (BUY) possibility
   if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
      MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
      //这句就是多头入场条件的判断,可以看到2个技巧,
      //1、交叉 的数学意思是“前面再下后面在上”或反
      // 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值
       {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); //
      //这是入场语句 记得一定要判断入场是否成功,
      //因为很多服务器由于滑点或者服务器价格变动而不能入场成功,
      //所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。
      if(ticket>0) //大于0说明入场成功
          {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
          }
      else Print("Error opening BUY order : ",GetLastError());
      //这是多余的检查
      //入场不成功,输出不成功的系统原因。
      return(0); //这里为什麽使用了返回呢。
      //因为一种情况是入场成功,
      //那末直接返回等待下一个价格到来的时候再执行start函数,
      //另一种情况是入场不成功,
      //则返回也是等待下一个价格到来的时候在此执行入场操作。
       }
   //下面就是空单入场的判断了,大家自己对照观看即可
   // check for short position (SELL) possibility
   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); //返回
        }
      return(0);//返回
     }
   // it is important to enter the market correctly,
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 检查sell的单
         OrderSymbol()==Symbol())  // check for symbol如果货币对一样
        {
         if(OrderType()==OP_BUY)   // long position is opened检查buy的单
           {
            // 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
                }
            // check for trailing stop检查追踪止损
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                    //如果条件符合就OrderModify更改
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position 检查buy的单
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
              //如果以上条件符合就关闭buy的单
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop检查buy的追踪止损
            if(TrailingStop>0)  //追踪止损重复了2次(没有水准的编写)
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                    //如果检查条件符合就OrderModify buy的单
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);//返回上面再从头执行
  }
// the end.完
回复

使用道具 举报

 楼主| 发表于 6-6-2009 05:39 PM | 显示全部楼层
 
鸿原创
MT4 EA 烟酒烟酒-外汇EA编写
版权所有 请勿翻版
初级EA教程
主题:MT4 EA 烟酒烟酒-外汇初级EA编写
原创:李沂鸿(柒侠伍义)
疫苗:
[email protected]
网站:www.7x51.com
SMS:+60125534397
版权保留 谢绝转载
第8章:
最最简单的EA



  • 打开你的 METAEDITOR
    COPY 下面的源码
    & PRESS 去 METAEDITOR
    save 一个名字
    比如 my1ea
    按 《编写》后
    这个EA就可以执行了



    extern int SL         =30 ;
    extern int TP         =30 ;
    extern double lot   =1  ;
    int start()
      {

    if(Volume[0]==1)
    OrderSend(Symbol(), OP_SELL, lot, Bid,10, Bid+(SL*Point), Bid-(TP*Point),"my1ea", 12340, 0,Red);

       return(0);
      }

    //end


  • 当然以上的 my1ea EA
    不是什么了不起的EA
    也不是什么赚钱的EA

  • 让你体验一下编写EA
    原来可以那么简单。。。。




    一天你就会编写EA
    五天你就是EA高手
    任何人都可以成功



    (未完)
回复

使用道具 举报

 楼主| 发表于 6-6-2009 06:13 PM | 显示全部楼层
 
鸿原创
MT4 EA 烟酒烟酒-外汇EA编写
版权所有 请勿翻版
初级EA教程
主题:MT4 EA 烟酒烟酒-外汇初级EA编写
原创:李沂鸿(柒侠伍义)
疫苗:
[email protected]
网站:www.7x51.com
SMS:+60125534397
版权保留 谢绝转载
第9章:
My1ea 进化 My2ea



  • my1ea 只能开一个单
    而且只是买下 sell only


  • 如果要再进化一点
    可以买上又买下的会不会困难?
    所有的EA都是从简单到复杂



  • 注意下面我修改了什么


    extern int SL =100 ; //止损
    extern int TP =100 ; //止盈
    extern double lot =0.1; //注码
    int start() //EA开始阅读命令
    {
    if(OrdersTotal()==0&&Close[0]-Open[0]<-TP*Point)
    OrderSend(Symbol(), OP_SELL, lot, Bid,10, Bid+(SL*Point), Bid-(TP*Point),"my2ea", 0125534397, 0,Red);
    if(OrdersTotal()==0&&Close[0]-Open[0]>TP*Point)
    OrderSend(Symbol(), OP_BUY, lot, Ask,10, Ask-(SL*Point), Ask+(TP*Point),"my2ea", 0125534397, 0,Red);
    return(0);//命令EA返回上面再重新读下来
    }
    //end 编写结束
    //这个是示范的EA,千万不要拿去玩真钱下注



  • 终于这个EA可以买上又买下了
    当然以上的EA
    不是什么了不起的EA
    也不是什么赚钱的EA



  • 让你体验一下编写EA
    原来可以那么简单。。。。


  • 会编写EA可以令你的投资高枕无忧



    一天你就会编写EA
    五天你就是EA高手
    任何人都可以成功



    (未完)
回复

使用道具 举报

发表于 6-6-2009 07:56 PM | 显示全部楼层
一天你就会编写EA
五天你就是EA高手
任何人都可以成功     


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 7-3-2025 02:55 AM , Processed in 0.097393 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表