MT4-判断趋势是否成立的指标

本文介绍了一种基于MetaQuotes软件实现的交易趋势判断算法。该算法通过分析特定数量的K线与其移动平均线的位置关系来判断市场趋势是否成立。具体而言,算法检查在最近一段时间内是否有足够数量的K线位于移动平均线上方或下方,并且最远的一根K线开盘价与最近一根K线收盘价之间的差价是否超过设定阈值。


#property copyright "Copyright ?2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
//>=16根线在平均线上/下,并且最远的一个K线开盘价格与当前收盘价差价>20点
extern int MA_Period=20;
extern int MA_Mode=0;
extern int JC=20;
extern int Kxsl=16; //K线数量

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
 

if(CheckTrend()==1)
Print("趋势成立");
  
   //Print("pjjg="+pjjg);
   return (0);

  }
  // 返回1趋势成立,0不成立
  int CheckTrend()
  {
 
  int upcount=0; //在平均线以上的K线数量
  int downcount=0;//在平均线以下的K线数量

                                      
                              


   int    counted_bars=IndicatorCounted();  
   if(counted_bars<0) return (-1);
  
   double pjjg=iMA(NULL,0,MA_Period,0,MA_Mode,PRICE_CLOSE,1);  //从最近已经完成的K线计算的平均价
   double iClosesum=0;
   for(int i=0;i<MA_Period;i++)
   {
      //iClosesum=iClosesum+iClose(NULL,0,i+1);
      iClosesum=iClose(NULL,0,i+1);
      if(iClosesum>pjjg)
      {
      upcount++;
      }
      else if(iClosesum<pjjg)
     
      downcount++;
     
   }
  
   double kpj=iOpen(NULL,0,MA_Period);//取最远的那根K线的开盘价
   double spj=iClose(NULL,0,1);//取最近K线的收盘价
  
   if(upcount>=Kxsl)
   {
   if(MathAbs(kpj-spj)>JC )
   {
   return (1);
   }
  
   }
   return (0);
  
  }
//+------------------------------------------------------------------+ 

//由松鼠 Quant.Ai 生成,来源: ai.kanpan789.com //------------------------------------------------------------------------// 简称: MultiIndicatorStrategy// 名称: 多指标综合交易策略// 类别: 公式应用// 类型: 内建应用// 输出:// 策略说明:基于21日均线的趋势判断、RSI超买超卖信号、威廉指标和移动平均组合信号、价格突破买进价/加码价条件// 限制有持仓时不开同向仓位//------------------------------------------------------------------------Params Numeric ma_period_short(5); // 短周期均线 Numeric ma_period_mid(10); // 中周期均线 Numeric ma_period_long(20); // 长周期均线 Numeric ma_period_21(21); // 21日均线 Numeric rsi_period(6); // RSI周期 Numeric hhv_period(21); // 威廉指标周期 Numeric hhv_short(6); // 短周期威廉指标 Numeric max_add_times(3); // 最大加码次数Vars Series ma5; // 5日均线 Series ma10; // 10日均线 Series ma20; // 20日均线 Series ma21; // 21日均线 Series var1; // 威廉指标VAR1 Series var2; // 威廉指标VAR2 Series var3; // 威廉指标VAR3 Series rsi; // RSI指标 Series buy_price; // 买进价 Series add_price; // 加码价 Numeric minpoint; // 最小价格变动单位Series lc;Series price_change;Series gain;Series loss;Series ma6;Series ma8;Series ma18;Series var3_ma6;Series strong_buy_signal;Series add_position_signal;Series exit_signal;Series jiacang(0);Events OnBar(ArrayRef indexs) { // 计算最小价格变动单位 minpoint = Minmove * PriceScale; // 计算移动平均线 ma5 = Average(Close, ma_period_short); ma10 = Average(Close, ma_period_mid); ma20 = Average(Close, ma_period_long); ma21 = Average(Close, ma_period_21); // 计算威廉指标 VAR1, VAR2 var1 = 100 - (90 * (Highest(High, hhv_period) - Close) / (Highest(High, hhv_period) - Lowest(Low, hhv_period))); var2 = var1; // 原公式中VAR2与VAR1相同 // 计算VAR3 var3 = Average(100 - (100 * (Highest(High, hhv_short) - Close) / (Highest(High, hhv_short) - Lowest(Low, hhv_short))), 34); // 计算RSI指标 lc = Close[1]; // 前一日收盘价 price_change = Close - lc; gain = Max(price_change, 0); loss = Abs(Min(price_change, 0)); rsi = 100 - (100 / (1 + (Average(gain, rsi_period) / (Average(loss, rsi_period))))); // 计算买进价和加码价 ma6 = Average(Close, 6); ma18 = Average(Close, 18); buy_price = ((Close - ma6[1]) / 6 + ma6) * 1.004; add_price = ((Close - ma18[1]) / 18 + ma18) * 1.004; // 交易信号逻辑 // 信号1: 价格在21日均线之上且收盘>=开盘 (多头趋势) Bool trend_signal = (Close >= ma21) And (Close >= Open); // 信号2: VAR2上穿VAR3的6日均线 (威廉指标金叉) var3_ma6 = Average(var3, 6); Bool cross_signal = (var2[1] <= var3_ma6[1]) And (var2 > var3_ma6); // 信号3: RSI超买信号 (84下穿RSI) Bool rsi_signal = (rsi[1] >= 84) And (rsi < 84); // 信号4: 价格突破买进价条件 Bool buy_condition = (Close > buy_price) And (buy_price > buy_price[1]); // 信号5: 价格突破加码价条件 Bool add_condition = (Close > add_price) And (add_price > add_price[1]); // 综合交易决策 strong_buy_signal = (trend_signal And cross_signal) Or buy_condition; add_position_signal = add_condition ; exit_signal = rsi_signal; // RSI超买时考虑退出Commentary(“MarketPosition”+text(MarketPosition)); // 执行交易 If (strong_buy_signal[1]) { // 检查当前持仓状态,避免在有同向持仓时重复开仓 If (MarketPosition == 0) { // 开多仓 Buy(1, Open); Commentary(“买入开仓: 价格” + Text(Open) + “, 趋势+指标信号”); jiacang=0; } Else { // 已有同向持仓,记录但不执行开仓 Commentary(“已有” + Text(MarketPosition) + “手多单持仓,跳过开仓信号”); } } If (add_position_signal[1] And MarketPosition > 0) { // 加码条件满足且已有持仓 // 限制加码次数,避免过度加仓 If (jiacang <= max_add_times) { Buy(1, Open); jiacang=jiacang+1; Commentary(“加码买入: 价格” + Text(Open) + “, 当前持仓” + Text(MarketPosition + 1) + “手”); } Else { Commentary(“已达到最大加码次数” + Text(max_add_times) + “次,跳过加码”); } } If (exit_signal[1] and MarketPosition>0) { // RSI超买信号,平多仓 Sell(0, Open); jiacang=0; Commentary(“RSI超买平仓: 价格” + Text(Open) + “, RSI:” + Text(rsi)); } }//------------------------------------------------------------------------// 编译版本 GS2014.10.25把以上策略写成专业的黄金MT4EA
最新发布
11-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值