MT4 EA编程 模块化函数

1. 全平仓函数

 

2.设置按钮  给按钮添加功能的函数

//---------------------初始化函数  创建按钮

int OnInit()
  {
//---Print("EA需求请联系QQ601681702"); 

      Print("价格童叟无欺");
   ObjectCreate(0,"BUY",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"BUY",OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-100);
   ObjectSetInteger(0,"BUY",OBJPROP_YDISTANCE,50);
   ObjectSetString(0,"BUY",OBJPROP_TEXT,"Buy");
   ObjectCreate(0,"SELL",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"SELL",OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-100);
   ObjectSetInteger(0,"SELL",OBJPROP_YDISTANCE,80);
   ObjectSetString(0,"SELL",OBJPROP_TEXT,"Sell");
//---
   ObjectSetInteger(0,"BUY",OBJPROP_XDISTANCE,X_SIZE); 
   ObjectSetInteger(0,"BUY",OBJPROP_YDISTANCE,Y_SIZE);
   ObjectSetInteger(0,"SELL",OBJPROP_XDISTANCE,X_SIZE); 
   ObjectSetInteger(0,"SELL",OBJPROP_YDISTANCE,Y_SIZE+30);
   return(0);
  }

//----给图表上的元素添加功能-------------------------------------------
      void OnChartEvent(const int id, 
                  const long &lparam,     //长整形的参数
                  const double &dparam,   //double类型的参数
                  const string &sparam)   //字符串类型的参数
  { 
//--- Check the event by pressing a mouse button 
   double ticket1=0;
   
     //--- If you click on the object with the name buttonID 点一下BUY按钮就会对当前货币现价买入,
   if(id==CHARTEVENT_OBJECT_CLICK&&sparam=="BUY"&&ObjectGetInteger(0,"BUY",OBJPROP_STATE)) 
     { 
         //--- State of the button - pressed or not 
         bool selected1=ObjectGetInteger(0,"BUY",OBJPROP_STATE); 
         //--- log a debug message 
         Print("BUY Button pressed = ",selected1); 
          ticket1=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,NormalizeDouble(Ask-StopLoss1*Point,Digits),
            0,"My EA",Magic,0,Red);//NormalizeDouble(Ask+TakeProfit1*Point,Digits)
          ObjectSetInteger(0,"BUY",OBJPROP_STATE,0); 
     }
    if(id==CHARTEVENT_OBJECT_CLICK&&sparam=="SELL"&&ObjectGetInteger(0,"SELL",OBJPROP_STATE)) 
     { 
         //--- State of the button - pressed or not 
         bool selected2=ObjectGetInteger(0,"SELL",OBJPROP_STATE); 
         //--- log a debug message 
         Print("SELL Button pressed = ",selected2); 
          ticket1=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3,NormalizeDouble(Bid+StopLoss1*Point,Digits),
            0,"My EA",Magic,0,Green);//NormalizeDouble(Ask+TakeProfit1*Point,Digits)
          ObjectSetInteger(0,"SELL",OBJPROP_STATE,0); 
     }
   }  

3. 计算服务器和GMT时间平移

//+------------------------------------------------------------------+
//|                                      计算服务器和GMT时间平移.mq4 |
//|                                  Copyright 2013 By Xiyu QQ:19646 |
//|                                                    www.520FX.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013 By Xiyu QQ:19646"
#property link      "www.520FX.com"


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   iGMTDifference();
   return(0);
  }
//+------------------------------------------------------------------+
/*
函    数
输出参量:
输出参数:
算    法:
*/
double iGMTDifference()
  {
    int GMT=StrToDouble(iWorldTime(0,0)); //获得格林威治时间
    int ServerTime=StrToDouble(TimeToStr(TimeCurrent(),TIME_MINUTES)); //获得MT4服务器时间
    iDisplayInfo("Author", "作者:熙羽 520FX",1,10,15,8,"Times New Roman",SlateGray);
    iDisplayInfo("wing",CharToStr(175),1,20,25,30,"Wingdings", Gold);
    Alert("历史数据中心平移时差为: "+(ServerTime-GMT));
  }
/*
函    数:计算当地时间
输入参数:int myTimeZone 本地时区 string myLocalSummerTime 夏令时
输出参数:指定时区时间,格式:hh:mm:ss
算    法:获取本地计算机时间,北京时间,计算GMT时间
          根据夏令时调整
*/
string iWorldTime(int myTimeZone, string myLocalSummerTime)
   {
      string myTime; //函数返回参数
      //计算夏令时起止
      int mySummerStartTime = StrToTime(StringSubstr(myLocalSummerTime, 0, 16));
      int mySummerEndTime = StrToTime(StringSubstr(myLocalSummerTime, 17, 16));
      //
      string myHH,myMM,mySS;
      int GMT = TimeHour(Time[0])-2; //计算GMT时间
      int myLocalTime = GMT+myTimeZone;
      if (myLocalTime < 0) myLocalTime = myLocalTime+24;
      if (myLocalTime >= 24) myLocalTime = myLocalTime-24;
      myHH = DoubleToStr(myLocalTime,0);
      if (StringLen(myHH) == 1) myHH = "0"+myHH;
      myMM = DoubleToStr(TimeMinute(TimeLocal()),0);
      if (StringLen(myMM) == 1) myMM = "0"+myMM;
      mySS = DoubleToStr(TimeSeconds(TimeLocal()),0);
      if (StringLen(mySS) == 1) mySS = "0"+mySS;
      myTime = myHH+":"+myMM;
      if (StrToTime(myTime) > mySummerStartTime && StrToTime(myTime) < mySummerEndTime)
         {
            myHH = DoubleToStr(StrToDouble(myHH)+1,0);
            if (StringLen(myHH) == 1) myHH = "0"+myHH;
            myTime = myHH+":"+myMM+"*";
         }
      return (myTime);
   }
 
 /*
4.函    数:在屏幕上显示文字标签
输入参数:标签名称 文本内容 文本显示角 标签X位置坐标 标签Y位置坐标 文本字号 文本字体 文本颜色
输出参数:
算    法:
*/
void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
   {
      if (Corner == -1) return(0);
      ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
      ObjectSetText(LableName, LableDoc, DocSize, DocStyle,DocColor);
      ObjectSet(LableName, OBJPROP_CORNER, Corner);
      ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
      ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
   }

5. 获取最近的订单

//---get the last order's open price.   the order latest, the cnt bigger.
if (LastPrice==0) 
   {
      for(cnt=0;cnt<OrdersTotal();cnt++)
      {    
        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//  cnt=1 corresponding the first order,cnt=2 corresponding the second order,
         mode=OrderType();    
         if (OrderSymbol()==Symbol()) 
         {
            LastPrice=OrderOpenPrice();
            if (mode==OP_BUY) { myOrderType=2; }
            if (mode==OP_SELL) { myOrderType=1;    }
         }
      }
   }

6. 马丁模块,

//--- 如果之前开的是卖单(myOrderType==1),允许继续开单,且当前订单比之前订单的开单价高了Pips*Point个点,那么继续做空mylotsi,
//---通过continueOpening控制开单的总量,Pips是马丁间隔
      if (myOrderType==1 && ContinueOpening) 
      {    
         
         if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1) 
         {        
            SellPrice=Bid;                
            LastPrice=0;
            //  如果TakeProfit!=0,则将tp定义为bid-takeProfit
            if (TakeProfit==0) { tp=0; }
            else { tp=SellPrice-TakeProfit*Point; }    
            if (InitialStop==0) { sl=0; }
            else { sl=SellPrice+InitialStop*Point;  }
            if (OpenOrders!=0) 
            {
                  mylotsi=lotsi;            
                  for(cnt=1;cnt<=OpenOrders;cnt++)
                  {
                     // 如果允许的总订单数大于12,则下一次开仓量是前一次的1.5倍
                     if (MaxTrades>12) { mylotsi=NormalizeDouble(mylotsi*1.5,2); }
                     // 如果允许开的总订单数小于等于12,则下一次开单量是前一次的两倍
                     else { mylotsi=NormalizeDouble(mylotsi*2,2); }
                  }
            } else { mylotsi=lotsi; }
            if (mylotsi>100) { mylotsi=100; }
            OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,sl,tp,NULL,0,0,Red);                        
            return(0);
         }
      }
      
      if (myOrderType==2 && ContinueOpening) 
      {
         if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1) 
         {        
            BuyPrice=Ask;
            LastPrice=0;
            if (TakeProfit==0) { tp=0; }
            else { tp=BuyPrice+TakeProfit*Point; }    
            if (InitialStop==0)  { sl=0; }
            else { sl=BuyPrice-InitialStop*Point; }
            if (OpenOrders!=0) {
               mylotsi=lotsi;            
               for(cnt=1;cnt<=OpenOrders;cnt++)
               {
                  if (MaxTrades>12) { mylotsi=NormalizeDouble(mylotsi*1.5,2); }
                  else { mylotsi=NormalizeDouble(mylotsi*2,2); }
               }
            } else { mylotsi=lotsi; }
            if (mylotsi>100) { mylotsi=100; }
            OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,sl,tp,NULL,0,0,Blue);           
            return(0);
         }
      }   

7. profit 计算模块

    //赋值给变量profit,盈利计算模块
    for(cnt=0;cnt<OrdersTotal();cnt++)
    {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol()) 
      {            
             LastTicket=OrderTicket();
            if (OrderType()==OP_BUY) { LastType=OP_BUY; }
            if (OrderType()==OP_SELL) { LastType=OP_SELL; }
            LastClosePrice=OrderClosePrice();
            LastLots=OrderLots();
            if (LastType==OP_BUY) 
            {
                //Profit=Profit+(Ord(cnt,VAL_CLOSEPRICE)-Ord(cnt,VAL_OPENPRICE))*PipValue*Ord(cnt,VAL_LOTS);                
                if (OrderClosePrice()<OrderOpenPrice()) 
                    { Profit=Profit-(OrderOpenPrice()-OrderClosePrice())*OrderLots()/Point; }
                if (OrderClosePrice()>OrderOpenPrice()) 
                    { Profit=Profit+(OrderClosePrice()-OrderOpenPrice())*OrderLots()/Point; }
            }
            if (LastType==OP_SELL) 
            {
                //Profit=Profit+(Ord(cnt,VAL_OPENPRICE)-Ord(cnt,VAL_CLOSEPRICE))*PipValue*Ord(cnt,VAL_LOTS);
                if (OrderClosePrice()>OrderOpenPrice()) 
                    { Profit=Profit-(OrderClosePrice()-OrderOpenPrice())*OrderLots()/Point; }
                if (OrderClosePrice()<OrderOpenPrice()) 
                    { Profit=Profit+(OrderOpenPrice()-OrderClosePrice())*OrderLots()/Point; }
            }
            //Print(Symbol,":",Profit,",",LastLots);
      }
   }
   
    
    Profit=Profit*PipValue;
    text2="Profit: $"+DoubleToStr(Profit,2)+" +/-";

用comment可以显示text2

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值