交易危机

 找回密码
 快捷注册(禁q号)

QQ登录

只需一步,快速开始

搜索
查看: 188|回复: 14

[其他] 几个非常好用的函数,编程必备

[复制链接]

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
发表于 2019-6-28 21:41 | 显示全部楼层 |阅读模式
  1. //获取最后一单 已平仓单子的信息
  2. double getLastHistoryOrder(int type, datetime &opentime, datetime &closetime, double &openprice,double &closeprice){   //获取最后一单已平仓单子的信息,Lots,OpenTime,CloseTime,OpenPrice,ClosePrice
  3.    opentime = 0;
  4.    closetime = 0;
  5.    openprice = 0;
  6.    closeprice = 0;
  7.    double lots = 0;
  8.    int t = OrdersHistoryTotal();
  9.    for(int i=0;i<t-1;i++)
  10.       {
  11.         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
  12.           {
  13.             if(OrderSymbol()==Symbol() && OrderType()==type)
  14.               {
  15.                 if(opentime < OrderOpenTime()){
  16.                   opentime = OrderOpenTime();
  17.                   closetime = OrderCloseTime();
  18.                   openprice = OrderOpenPrice();
  19.                   closeprice = OrderClosePrice();
  20.                   lots = OrderLots();
  21.                
  22.                 }
  23.               }
  24.           }
  25.       }
  26.     return(lots);
  27.    
  28. }

  29. //获取最后一单 开仓单子的信息
  30. double getLastOrder(int type, datetime &opentime,double &openprice){   //获取最后一单的信息,Lots,OpenTime,OpenPrice,
  31.      opentime = 0;
  32.      openprice = 0;
  33.      double lots;
  34.      int t=OrdersTotal();
  35.      for(int i=t-1;i>=0;i--)
  36.          {
  37.            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  38.              {
  39.                if(OrderSymbol()==Symbol() && OrderType() == type)
  40.                  {   
  41.                     if(opentime < OrderOpenTime()){
  42.                      opentime = OrderOpenTime();
  43.                      openprice = OrderOpenPrice();
  44.                      lots = OrderLots();
  45.                     }
  46.                  }
  47.              }
  48.          }  
  49.     return(lots);

  50. }
复制代码
装死

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-28 21:42 | 显示全部楼层
  1. //统计多单个数,总手数,最后一单开仓价,手数,开仓时间,魔术号
  2. double 统计多单(double &lastOrderOpenPrice,double &lots,double &lot,int &magic,datetime &lastOrderOpenTime)
  3.   {
  4.      int buydanshu=0;
  5.      lastOrderOpenPrice = 0.0;
  6.      lots = 0.0;
  7.      lot = 0.0;
  8.      magic = 0;
  9.      lastOrderOpenTime = 0;
  10.      for(int i=0;i<OrdersTotal();i++)
  11.       {
  12.         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  13.           {
  14.             if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
  15.               {
  16.                 buydanshu++;
  17.                 lots = lots + OrderLots();
  18.                 magic = OrderMagicNumber();
  19.                 if(lastOrderOpenTime < OrderOpenTime()){
  20.                   lastOrderOpenTime = OrderOpenTime();
  21.                   lastOrderOpenPrice = OrderOpenPrice();
  22.                   lot = OrderLots();
  23.                 }
  24.               }
  25.           }
  26.       }
  27.     return(buydanshu);
  28.   }



  29. //统计空单个数,总手数,最后一单开仓价,手数,开仓时间,魔术号
  30. double 统计空单(double &lastOrderOpenPrice,double &lots,double &lot,int &magic,datetime &lastOrderOpenTime)
  31.   {
  32.      int selldanshu=0;
  33.      lastOrderOpenPrice = 0.0;
  34.      lots = 0.0;
  35.      lot = 0;
  36.      magic = 0;
  37.      lastOrderOpenTime = 0;
  38.      for(int i=0;i<OrdersTotal();i++)
  39.       {
  40.         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  41.           {
  42.             if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
  43.               {
  44.                 selldanshu++;
  45.                 lots = lots + OrderLots();
  46.                 magic = OrderMagicNumber();
  47.                 if(lastOrderOpenTime < OrderOpenTime()){
  48.                    lastOrderOpenTime = OrderOpenTime();
  49.                    lastOrderOpenPrice = OrderOpenPrice();
  50.                    lot = OrderLots();
  51.                 }
  52.               }
  53.           }
  54.       }
  55.     return(selldanshu);
  56.   }
复制代码
装死

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-28 21:45 | 显示全部楼层
  1. bool 检测是否可以交易(){

  2.    if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
  3.      { Alert(Symbol()+" 智能交易没有开启,请按 CTRL + E 开启!"); Sleep(5*1000); return false;}
  4.    else
  5.      {
  6.       if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
  7.          {Alert(Symbol()+"允许智能交易没有打钩!",__FILE__); Sleep(5*1000); return false;}
  8.      }
  9.      
  10.   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
  11.     { Alert(Symbol()+"\n"+AccountInfoInteger(ACCOUNT_LOGIN)+" 的交易被禁止" +"\n"
  12.             +"可能原因是:投资者密码登录,无权进行交易");
  13.             Sleep(5*1000);
  14.             return false;
  15.     }
  16.    
  17.     return true;

  18. }


  19. //计算平均价格
  20. double 平均价格(int TYPE){

  21.      double 价格=0;
  22.      double lots = 0;
  23.      double 手续费 = 0;
  24.      int a = 0;
  25.      int t=OrdersTotal();
  26.      for(int i=t-1;i>=0;i--)
  27.          {
  28.            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  29.              {
  30.                if(OrderSymbol()==Symbol() && OrderType()==TYPE)
  31.                  {
  32.                    价格 = 价格 + OrderLots()*OrderOpenPrice();
  33.                    lots = lots + OrderLots();
  34.                    手续费 = (OrderSwap()+OrderCommission())/OrderLots()/MarketInfo(Symbol(),MODE_TICKVALUE);
  35.                    a++;
  36.                  }
  37.                  
  38.              }
  39.          }
  40.          if(a>0){
  41.                   if(TYPE == OP_BUY) {价格 = 价格/lots - 手续费*Point;}
  42.                   if(TYPE == OP_SELL) {价格 = 价格/lots + 手续费*Point;}
  43.                   手续费 = 0;
  44.                  价格 = StrToDouble(DoubleToStr(价格,Digits()));  //必须四舍五入
  45.            }

  46.     return(价格);

  47. }


  48. //关闭所有订单
  49.   void close(int type)
  50.   {
  51.     double buyop,buylots,lot;
  52.     datetime lastOrderOpenTime;
  53.     while(统计多单(buyop,buylots,lot,magic,lastOrderOpenTime)>0)
  54.      {
  55.         int t=OrdersTotal();
  56.         for(int i=t-1;i>=0;i--)
  57.          {
  58.            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
  59.              {
  60.                if(OrderSymbol()==Symbol() && OrderType()==type)
  61.                  {
  62.                    OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,clrNONE);
  63.                  }
  64.              }
  65.          }
  66.         Sleep(800);
  67.      }
  68.   }

复制代码
装死

0

主题

5593

积分

0

精华

高级操盘手

金钱
5593 美元
权重
0
发表于 2019-6-29 00:06 | 显示全部楼层
小猪大神能帮写个多均线多空排列预警指标吗?感谢

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-29 08:23 | 显示全部楼层
卡附 发表于 2019-6-29 00:06
小猪大神能帮写个多均线多空排列预警指标吗?感谢

说具体点,哥哥
装死

0

主题

5593

积分

0

精华

高级操盘手

金钱
5593 美元
权重
0
发表于 2019-6-29 09:45 | 显示全部楼层

就是3-5根均线形成多头或空头排列时自动在金死叉处画个箭头,主要想用在日线以上周期参考着判断下趋势。我自己试着写了一直报错,还不会编译箭头

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-29 11:17 | 显示全部楼层
卡附 发表于 2019-6-29 09:45
就是3-5根均线形成多头或空头排列时自动在金死叉处画个箭头,主要想用在日线以上周期参考着判断下趋势。 ...

这不就是均线交叉吗?
装死

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-29 11:19 | 显示全部楼层
卡附 发表于 2019-6-29 09:45
就是3-5根均线形成多头或空头排列时自动在金死叉处画个箭头,主要想用在日线以上周期参考着判断下趋势。 ...

在具体点   几日均线?   那几个均线交叉?
装死

0

主题

5593

积分

0

精华

高级操盘手

金钱
5593 美元
权重
0
发表于 2019-6-29 11:39 | 显示全部楼层
sanbuxiaozhu 发表于 2019-6-29 11:19
在具体点   几日均线?   那几个均线交叉?

5,10,30,60四条交叉。谢谢

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-30 18:37 | 显示全部楼层
卡附 发表于 2019-6-29 11:39
5,10,30,60四条交叉。谢谢
  1. //+------------------------------------------------------------------+
  2. //|                                                   多均线交叉.mq4 |
  3. //|                        Copyright 2018, MetaQuotes Software Corp. |
  4. //|                                             https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2018, MetaQuotes Software Corp."
  7. #property link      "https://www.mql5.com"
  8. #property version   "1.00"
  9. #property strict
  10. #property indicator_chart_window
  11. #property indicator_buffers 7
  12. #property indicator_plots   7

  13. extern int MA1    =    5;
  14. extern int MA2    =    10;
  15. extern int MA3    =    20;
  16. extern int MA4    =    30;
  17. extern int MA5    =    60;

  18. extern string 选择 = "默认选择最后两个均线交叉,标出箭头";
  19. extern string 选择1 = "如需其他均线交叉请修改其数值";
  20. extern ENUM_MA_METHOD method    =   MODE_SMA;
  21. datetime time1 = 0;
  22. int 箭头间隔 = 100,juli = 20;



  23. //--- plot ma1
  24. #property indicator_label1  "ma1"
  25. #property indicator_type1   DRAW_LINE
  26. #property indicator_color1  clrYellow
  27. #property indicator_style1  STYLE_SOLID
  28. #property indicator_width1  1
  29. //--- plot ma2
  30. #property indicator_label2  "ma2"
  31. #property indicator_type2   DRAW_LINE
  32. #property indicator_color2  clrPink
  33. #property indicator_style2  STYLE_SOLID
  34. #property indicator_width2  1
  35. //--- plot ma3
  36. #property indicator_label3  "ma3"
  37. #property indicator_type3   DRAW_LINE
  38. #property indicator_color3  clrRed
  39. #property indicator_style3  STYLE_SOLID
  40. #property indicator_width3  1
  41. //--- plot ma4
  42. #property indicator_label4  "ma4"
  43. #property indicator_type4   DRAW_LINE
  44. #property indicator_color4  clrDeepSkyBlue
  45. #property indicator_style4  STYLE_SOLID
  46. #property indicator_width4  1
  47. //--- plot ma5
  48. #property indicator_label5  "ma5"
  49. #property indicator_type5   DRAW_LINE
  50. #property indicator_color5  clrLightSeaGreen
  51. #property indicator_style5  STYLE_SOLID
  52. #property indicator_width5  1

  53. //--- indicator buffers
  54. double         ma1Buffer[];
  55. double         ma2Buffer[];
  56. double         ma3Buffer[];
  57. double         ma4Buffer[];
  58. double         ma5Buffer[];
  59. double         upBuffer[];
  60. double         downBuffer[];
  61. //+------------------------------------------------------------------+
  62. //| Custom indicator initialization function                         |
  63. //+------------------------------------------------------------------+
  64. int OnInit()
  65.   {
  66. //--- indicator buffers mapping
  67.    SetIndexBuffer(0,ma1Buffer);
  68.    SetIndexBuffer(1,ma2Buffer);
  69.    SetIndexBuffer(2,ma3Buffer);
  70.    SetIndexBuffer(3,ma4Buffer);
  71.    SetIndexBuffer(4,ma5Buffer);
  72.    SetIndexBuffer(5,upBuffer);
  73.    SetIndexBuffer(6,downBuffer);
  74.    
  75.    SetIndexStyle(5,DRAW_ARROW,0,3,clrMagenta);
  76.    SetIndexArrow(5,241);
  77.    SetIndexLabel(5,"up");
  78.    
  79.    SetIndexStyle(6,DRAW_ARROW,0,3,clrYellow);
  80.    SetIndexArrow(6,242);
  81.    SetIndexLabel(6,"down");
  82.    
  83.    if(Period() == 5){ 箭头间隔 = 15;juli = 20;}  //Period()返回当前图表的时间表  属于几分钟图  
  84.    if(Period() == 15){ 箭头间隔 = 25;juli =30;}
  85.    if(Period() == 30){ 箭头间隔 = 35;juli =40;}
  86.    if(Period() == 60){ 箭头间隔 = 66;juli =50;}
  87.    if(Period() == 240){ 箭头间隔 = 88;juli =66;}
  88.    if(Period() == 1440){ 箭头间隔 = 150;juli = 100;}
  89.    if(Period() == 10080){ 箭头间隔 = 250;juli = 120;}
  90.    if(Period() == 1){ 箭头间隔 = 10;juli =15;}
  91. //---
  92.    return(INIT_SUCCEEDED);
  93.   }
  94. //+------------------------------------------------------------------+
  95. //| Custom indicator iteration function                              |
  96. //+------------------------------------------------------------------+
  97. int OnCalculate(const int rates_total,
  98.                 const int prev_calculated,
  99.                 const datetime &time[],
  100.                 const double &open[],
  101.                 const double &high[],
  102.                 const double &low[],
  103.                 const double &close[],
  104.                 const long &tick_volume[],
  105.                 const long &volume[],
  106.                 const int &spread[])
  107.   {


  108.    int counted_bars=IndicatorCounted();
  109.    if (counted_bars<0) return(-1);
  110.    if (counted_bars>0) counted_bars--;
  111.    int limit=Bars-counted_bars;
  112.   
  113.       
  114.    for(int i=limit-3; i>=0; i--)//int i=0;i<5000;i++)
  115.      {
  116.    
  117.    ma1Buffer[i] = iMA(Symbol(),PERIOD_CURRENT,MA1,0,method,PRICE_CLOSE,i);  //最后一个参数表示第几个MA值
  118.    ma2Buffer[i] = iMA(Symbol(),PERIOD_CURRENT,MA2,0,method,PRICE_CLOSE,i);  
  119.    ma3Buffer[i] = iMA(Symbol(),PERIOD_CURRENT,MA3,0,method,PRICE_CLOSE,i);  
  120.    ma4Buffer[i] = iMA(Symbol(),PERIOD_CURRENT,MA4,0,method,PRICE_CLOSE,i);  
  121.    ma5Buffer[i] = iMA(Symbol(),PERIOD_CURRENT,MA5,0,method,PRICE_CLOSE,i);  
  122.    
  123.    if(ma4Buffer[i+2]<ma5Buffer[i+2] && ma4Buffer[i+1]>ma5Buffer[i+1]){
  124.       upBuffer[i] = Low[i] - 箭头间隔*Point;
  125.    
  126.    }
  127.    
  128.    if(ma4Buffer[i+2]>ma5Buffer[i+2] && ma4Buffer[i+1]<ma5Buffer[i+1]){
  129.       downBuffer[i] = High[i] + 箭头间隔*Point;
  130.    
  131.    }
  132.    
  133.    }

  134.    return(rates_total);
  135.   }
  136. //+------------------------------------------------------------------+
复制代码
装死

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-30 18:38 | 显示全部楼层
卡附 发表于 2019-6-29 11:39
5,10,30,60四条交叉。谢谢

编写不易,加个分老哥

评分

参与人数 1金钱 +80 收起 理由
卡附 + 80 非常感谢

查看全部评分

装死

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-30 18:47 | 显示全部楼层
卡附 发表于 2019-6-29 11:39
5,10,30,60四条交叉。谢谢

增加 箭头报警
  1.    if(ma4Buffer[i+2]<ma5Buffer[i+2] && ma4Buffer[i+1]>ma5Buffer[i+1]){
  2.       upBuffer[i] = Low[i] - 箭头间隔*Point;
  3.       
  4.       if(i == 0 && time1 != Time[0]){
  5.          Alert(Symbol()+"做多信号!");
  6.          time1 = Time[0];
  7.       }
  8.       
  9.    }
  10.    
  11.    if(ma4Buffer[i+2]>ma5Buffer[i+2] && ma4Buffer[i+1]<ma5Buffer[i+1]){
  12.       downBuffer[i] = High[i] + 箭头间隔*Point;
  13.       
  14.       if(i == 0 && time1 != Time[0]){
  15.          Alert(Symbol()+"做空信号!");
  16.          time1 = Time[0];
  17.       }
  18.    }
复制代码


装死

0

主题

5593

积分

0

精华

高级操盘手

金钱
5593 美元
权重
0
发表于 2019-6-30 18:57 | 显示全部楼层

求教如果想要多条均线交叉该怎么设置

118

主题

1万

积分

0

精华

操盘专家

金钱
17680 美元
权重
0
 楼主| 发表于 2019-6-30 19:13 | 显示全部楼层
卡附 发表于 2019-6-30 18:57
求教如果想要多条均线交叉该怎么设置


或者你意思是  10,30,60  
交叉是吧   

  那个大于那个,那个小于那个  自己写一下就行了
这么简单的逻辑问题,不用我教吧?
装死

0

主题

5593

积分

0

精华

高级操盘手

金钱
5593 美元
权重
0
发表于 2019-6-30 19:18 | 显示全部楼层
sanbuxiaozhu 发表于 2019-6-30 19:13
或者你意思是  10,30,60  
交叉是吧   

晚点再尝试改了,有问题再来请教,再次感谢
您需要登录后才可以回帖 登录 | 快捷注册(禁q号)

本版积分规则

QQ|黄金吧|黄金论坛|手机版|指标下载|非农|目录|交易危机

版权所有: ©2014-2019 fx3q.com Powered by Discuz! X3
浙ICP备: ICP14039028

浙公网安备 33011802001420号

风险提示:杠杆风险高,交易要谨慎 声明:坛友发言和回复均为个人观点,不代表论坛立场。
若有侵权请联系fx3q@qq.com删除

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