设为首页 收藏本站 切换语言

MT4 EA编程 模块化函数

| 发表于 2022-12-6 15:11:28 | 显示全部楼层 |复制链接
  1. . 全平仓函数
  2. 2.设置按钮  给按钮添加功能的函数
  3. //---------------------初始化函数  创建按钮
  4. int OnInit()
  5.   {
  6. //---Print("EA需求请联系QQ601681702");
  7.       Print("价格童叟无欺");
  8.    ObjectCreate(0,"BUY",OBJ_BUTTON,0,0,0);
  9.    ObjectSetInteger(0,"BUY",OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-100);
  10.    ObjectSetInteger(0,"BUY",OBJPROP_YDISTANCE,50);
  11.    ObjectSetString(0,"BUY",OBJPROP_TEXT,"Buy");
  12.    ObjectCreate(0,"SELL",OBJ_BUTTON,0,0,0);
  13.    ObjectSetInteger(0,"SELL",OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)-100);
  14.    ObjectSetInteger(0,"SELL",OBJPROP_YDISTANCE,80);
  15.    ObjectSetString(0,"SELL",OBJPROP_TEXT,"Sell");
  16. //---
  17.    ObjectSetInteger(0,"BUY",OBJPROP_XDISTANCE,X_SIZE);
  18.    ObjectSetInteger(0,"BUY",OBJPROP_YDISTANCE,Y_SIZE);
  19.    ObjectSetInteger(0,"SELL",OBJPROP_XDISTANCE,X_SIZE);
  20.    ObjectSetInteger(0,"SELL",OBJPROP_YDISTANCE,Y_SIZE+30);
  21.    return(0);
  22.   }
  23. //----给图表上的元素添加功能-------------------------------------------
  24.       void OnChartEvent(const int id,
  25.                   const long &lparam,     //长整形的参数
  26.                   const double &dparam,   //double类型的参数
  27.                   const string &sparam)   //字符串类型的参数
  28.   {
  29. //--- Check the event by pressing a mouse button
  30.    double ticket1=0;
  31.      //--- If you click on the object with the name buttonID 点一下BUY按钮就会对当前货币现价买入,
  32.    if(id==CHARTEVENT_OBJECT_CLICK&&sparam=="BUY"&&ObjectGetInteger(0,"BUY",OBJPROP_STATE))
  33.      {
  34.          //--- State of the button - pressed or not
  35.          bool selected1=ObjectGetInteger(0,"BUY",OBJPROP_STATE);
  36.          //--- log a debug message
  37.          Print("BUY Button pressed = ",selected1);
  38.           ticket1=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,NormalizeDouble(Ask-StopLoss1*Point,Digits),
  39.             0,"My EA",Magic,0,Red);//NormalizeDouble(Ask+TakeProfit1*Point,Digits)
  40.           ObjectSetInteger(0,"BUY",OBJPROP_STATE,0);
  41.      }
  42.     if(id==CHARTEVENT_OBJECT_CLICK&&sparam=="SELL"&&ObjectGetInteger(0,"SELL",OBJPROP_STATE))
  43.      {
  44.          //--- State of the button - pressed or not
  45.          bool selected2=ObjectGetInteger(0,"SELL",OBJPROP_STATE);
  46.          //--- log a debug message
  47.          Print("SELL Button pressed = ",selected2);
  48.           ticket1=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3,NormalizeDouble(Bid+StopLoss1*Point,Digits),
  49.             0,"My EA",Magic,0,Green);//NormalizeDouble(Ask+TakeProfit1*Point,Digits)
  50.           ObjectSetInteger(0,"SELL",OBJPROP_STATE,0);
  51.      }
  52.    }  
  53. 3. 计算服务器和GMT时间平移
  54. //+------------------------------------------------------------------+
  55. //|                                      计算服务器和GMT时间平移.mq4 |
  56. //|                                  Copyright 2013 By Xiyu QQ:19646 |
  57. //|                                                    www.520FX.com |
  58. //+------------------------------------------------------------------+
  59. #property copyright "Copyright 2013 By Xiyu QQ:19646"
  60. #property link      "www.520FX.com"
  61. //+------------------------------------------------------------------+
  62. //| script program start function                                    |
  63. //+------------------------------------------------------------------+
  64. int start()
  65.   {
  66.    iGMTDifference();
  67.    return(0);
  68.   }
  69. //+------------------------------------------------------------------+
  70. /*
  71. 函    数
  72. 输出参量:
  73. 输出参数:
  74. 算    法:
  75. */
  76. double iGMTDifference()
  77.   {
  78.     int GMT=StrToDouble(iWorldTime(0,0)); //获得格林威治时间
  79.     int ServerTime=StrToDouble(TimeToStr(TimeCurrent(),TIME_MINUTES)); //获得MT4服务器时间
  80.     iDisplayInfo("Author", "作者:熙羽 520FX",1,10,15,8,"Times New Roman",SlateGray);
  81.     iDisplayInfo("wing",CharToStr(175),1,20,25,30,"Wingdings", Gold);
  82.     Alert("历史数据中心平移时差为: "+(ServerTime-GMT));
  83.   }
  84. /*
  85. 函    数:计算当地时间
  86. 输入参数:int myTimeZone 本地时区 string myLocalSummerTime 夏令时
  87. 输出参数:指定时区时间,格式:hh:mm:ss
  88. 算    法:获取本地计算机时间,北京时间,计算GMT时间
  89.           根据夏令时调整
  90. */
  91. string iWorldTime(int myTimeZone, string myLocalSummerTime)
  92.    {
  93.       string myTime; //函数返回参数
  94.       //计算夏令时起止
  95.       int mySummerStartTime = StrToTime(StringSubstr(myLocalSummerTime, 0, 16));
  96.       int mySummerEndTime = StrToTime(StringSubstr(myLocalSummerTime, 17, 16));
  97.       //
  98.       string myHH,myMM,mySS;
  99.       int GMT = TimeHour(Time[0])-2; //计算GMT时间
  100.       int myLocalTime = GMT+myTimeZone;
  101.       if (myLocalTime < 0) myLocalTime = myLocalTime+24;
  102.       if (myLocalTime >= 24) myLocalTime = myLocalTime-24;
  103.       myHH = DoubleToStr(myLocalTime,0);
  104.       if (StringLen(myHH) == 1) myHH = "0"+myHH;
  105.       myMM = DoubleToStr(TimeMinute(TimeLocal()),0);
  106.       if (StringLen(myMM) == 1) myMM = "0"+myMM;
  107.       mySS = DoubleToStr(TimeSeconds(TimeLocal()),0);
  108.       if (StringLen(mySS) == 1) mySS = "0"+mySS;
  109.       myTime = myHH+":"+myMM;
  110.       if (StrToTime(myTime) > mySummerStartTime && StrToTime(myTime) < mySummerEndTime)
  111.          {
  112.             myHH = DoubleToStr(StrToDouble(myHH)+1,0);
  113.             if (StringLen(myHH) == 1) myHH = "0"+myHH;
  114.             myTime = myHH+":"+myMM+"*";
  115.          }
  116.       return (myTime);
  117.    }
  118. /*
  119. 4.函    数:在屏幕上显示文字标签
  120. 输入参数:标签名称 文本内容 文本显示角 标签X位置坐标 标签Y位置坐标 文本字号 文本字体 文本颜色
  121. 输出参数:
  122. 算    法:
  123. */
  124. void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
  125.    {
  126.       if (Corner == -1) return(0);
  127.       ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
  128.       ObjectSetText(LableName, LableDoc, DocSize, DocStyle,DocColor);
  129.       ObjectSet(LableName, OBJPROP_CORNER, Corner);
  130.       ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
  131.       ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
  132.    }
  133. 5. 获取最近的订单
  134. //---get the last order's open price.   the order latest, the cnt bigger.
  135. if (LastPrice==0)
  136.    {
  137.       for(cnt=0;cnt<OrdersTotal();cnt++)
  138.       {   
  139.         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);//  cnt=1 corresponding the first order,cnt=2 corresponding the second order,
  140.          mode=OrderType();   
  141.          if (OrderSymbol()==Symbol())
  142.          {
  143.             LastPrice=OrderOpenPrice();
  144.             if (mode==OP_BUY) { myOrderType=2; }
  145.             if (mode==OP_SELL) { myOrderType=1;    }
  146.          }
  147.       }
  148.    }
  149. 6. 马丁模块,
  150. //--- 如果之前开的是卖单(myOrderType==1),允许继续开单,且当前订单比之前订单的开单价高了Pips*Point个点,那么继续做空mylotsi,
  151. //---通过continueOpening控制开单的总量,Pips是马丁间隔
  152.       if (myOrderType==1 && ContinueOpening)
  153.       {   
  154.          if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1)
  155.          {        
  156.             SellPrice=Bid;               
  157.             LastPrice=0;
  158.             //  如果TakeProfit!=0,则将tp定义为bid-takeProfit
  159.             if (TakeProfit==0) { tp=0; }
  160.             else { tp=SellPrice-TakeProfit*Point; }   
  161.             if (InitialStop==0) { sl=0; }
  162.             else { sl=SellPrice+InitialStop*Point;  }
  163.             if (OpenOrders!=0)
  164.             {
  165.                   mylotsi=lotsi;            
  166.                   for(cnt=1;cnt<=OpenOrders;cnt++)
  167.                   {
  168.                      // 如果允许的总订单数大于12,则下一次开仓量是前一次的1.5倍
  169.                      if (MaxTrades>12) { mylotsi=NormalizeDouble(mylotsi*1.5,2); }
  170.                      // 如果允许开的总订单数小于等于12,则下一次开单量是前一次的两倍
  171.                      else { mylotsi=NormalizeDouble(mylotsi*2,2); }
  172.                   }
  173.             } else { mylotsi=lotsi; }
  174.             if (mylotsi>100) { mylotsi=100; }
  175.             OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,sl,tp,NULL,0,0,Red);                        
  176.             return(0);
  177.          }
  178.       }
  179.       if (myOrderType==2 && ContinueOpening)
  180.       {
  181.          if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1)
  182.          {        
  183.             BuyPrice=Ask;
  184.             LastPrice=0;
  185.             if (TakeProfit==0) { tp=0; }
  186.             else { tp=BuyPrice+TakeProfit*Point; }   
  187.             if (InitialStop==0)  { sl=0; }
  188.             else { sl=BuyPrice-InitialStop*Point; }
  189.             if (OpenOrders!=0) {
  190.                mylotsi=lotsi;            
  191.                for(cnt=1;cnt<=OpenOrders;cnt++)
  192.                {
  193.                   if (MaxTrades>12) { mylotsi=NormalizeDouble(mylotsi*1.5,2); }
  194.                   else { mylotsi=NormalizeDouble(mylotsi*2,2); }
  195.                }
  196.             } else { mylotsi=lotsi; }
  197.             if (mylotsi>100) { mylotsi=100; }
  198.             OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,sl,tp,NULL,0,0,Blue);           
  199.             return(0);
  200.          }
  201.       }   
  202. 7. profit 计算模块
  203.     //赋值给变量profit,盈利计算模块
  204.     for(cnt=0;cnt<OrdersTotal();cnt++)
  205.     {
  206.       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  207.       if (OrderSymbol()==Symbol())
  208.       {            
  209.              LastTicket=OrderTicket();
  210.             if (OrderType()==OP_BUY) { LastType=OP_BUY; }
  211.             if (OrderType()==OP_SELL) { LastType=OP_SELL; }
  212.             LastClosePrice=OrderClosePrice();
  213.             LastLots=OrderLots();
  214.             if (LastType==OP_BUY)
  215.             {
  216.                 //Profit=Profit+(Ord(cnt,VAL_CLOSEPRICE)-Ord(cnt,VAL_OPENPRICE))*PipValue*Ord(cnt,VAL_LOTS);               
  217.                 if (OrderClosePrice()<OrderOpenPrice())
  218.                     { Profit=Profit-(OrderOpenPrice()-OrderClosePrice())*OrderLots()/Point; }
  219.                 if (OrderClosePrice()>OrderOpenPrice())
  220.                     { Profit=Profit+(OrderClosePrice()-OrderOpenPrice())*OrderLots()/Point; }
  221.             }
  222.             if (LastType==OP_SELL)
  223.             {
  224.                 //Profit=Profit+(Ord(cnt,VAL_OPENPRICE)-Ord(cnt,VAL_CLOSEPRICE))*PipValue*Ord(cnt,VAL_LOTS);
  225.                 if (OrderClosePrice()>OrderOpenPrice())
  226.                     { Profit=Profit-(OrderClosePrice()-OrderOpenPrice())*OrderLots()/Point; }
  227.                 if (OrderClosePrice()<OrderOpenPrice())
  228.                     { Profit=Profit+(OrderOpenPrice()-OrderClosePrice())*OrderLots()/Point; }
  229.             }
  230.             //Print(Symbol,":",Profit,",",LastLots);
  231.       }
  232.    }
  233.     Profit=Profit*PipValue;
  234.     text2="Profit: $"+DoubleToStr(Profit,2)+" +/-";
  235. 用comment可以显示text2
复制代码
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论7

daerwushen
DD
| 发表于 2022-12-6 21:18:15 | 显示全部楼层
模块化函数
举报

点赞 评论 使用道具

dongxu64
DDD
| 发表于 2022-12-8 15:14:40 | 显示全部楼层
学搭积木
举报

点赞 评论 使用道具

daerwushen
DD
| 发表于 2022-12-28 21:19:57 | 显示全部楼层
全平仓函数
举报

点赞 评论 使用道具

小春哥
未及格
| 发表于 2023-2-9 15:31:47 | 显示全部楼层
谢谢大佬分享
举报

点赞 评论 使用道具

ken138888
B
| 发表于 2023-2-9 20:35:57 | 显示全部楼层
慢慢看慢慢学
举报

点赞 评论 使用道具

hjw888.
D
| 发表于 2023-7-13 14:13:42 | 显示全部楼层
很有用学到了
举报

点赞 评论 使用道具

ken138888
B
| 发表于 2023-7-14 13:27:07 | 显示全部楼层
什么时候出个mq5
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)