|
#property copyright "MA_Envelopes_Gold_M1"
#property link ""
#property version "1.00"
#property strict
//--- 输入参数
input string Strategy_Setups = "===策略设置==="; //策略设置
input int FastMAPeriod = 2; //快速MA周期
input int SlowMAPeriod = 220; //慢速MA周期
input double EnvDeviation1 = 1.0; //包络线偏差1 (%)
input double EnvDeviation2 = 0.7; //包络线偏差2 (%)
input double EnvDeviation3 = 0.3; //包络线偏差3 (%)
input string Risk_Management = "===风险管理==="; //风险管理
input double Lots = 0.1; //交易手数
input int StopLoss = 50; //止损点数(0=无止损)
input int TakeProfit = 100; //止盈点数(0=无止盈)
input int TrailingStop = 30; //追踪止损点数(0=无追踪)
input int Slippage = 3; //允许滑点
input string Trade_Time = "===交易时间设置==="; //交易时间设置
input bool UseTimeFilter = false; //使用时间过滤
input int StartHour = 0; //开始交易小时(0-23)
input int EndHour = 23; //结束交易小时(0-23)
input string Other_Settings = "===其他设置==="; //其他设置
input int MagicNumber = 20250827; //魔术码(唯一标识)
input bool EnableSound = true; //启用声音提示
//--- 全局变量
double point; //点值
double pipValue; //点值价值
//+------------------------------------------------------------------+
//| EA初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 计算点值和点值价值
point = Point;
if(Digits == 3 || Digits == 5)
point *= 10;
pipValue = point * (1 / Point) * MarketInfo(Symbol(), MODE_TICKVALUE);
//--- 验证参数
if(FastMAPeriod <= 0 || SlowMAPeriod <= 0)
{
Print("错误: MA周期必须大于0");
return(INIT_PARAMETERS_INCORRECT);
}
if(EnvDeviation1 <= 0 || EnvDeviation2 <= 0 || EnvDeviation3 <= 0)
{
Print("错误: 包络线偏差必须大于0");
return(INIT_PARAMETERS_INCORRECT);
}
Print("EA初始化完成: 黄金1分钟MA包络线通道突破策略");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| EA反初始化函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| EA执行函数 |
//+------------------------------------------------------------------+
int OnTick()
{
//--- 检查交易时间
if(UseTimeFilter && !IsTradeTime())
return(0);
//--- 检查最小柱数
if(Bars < 100)
{
Print("柱数太少,无法进行分析");
return(0);
}
//--- 获取指标值
double fastMA0 = iMA(NULL, PERIOD_M1, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
double fastMA1 = iMA(NULL, PERIOD_M1, FastMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);
double slowMA0 = iMA(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
// 获取不同偏差的包络线值
double env1Upper0 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation1, MODE_UPPER, 0);
double env1Lower0 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation1, MODE_LOWER, 0);
double env1Upper1 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation1, MODE_UPPER, 1);
double env1Lower1 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation1, MODE_LOWER, 1);
double env2Upper0 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation2, MODE_UPPER, 0);
double env2Lower0 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation2, MODE_LOWER, 0);
double env2Upper1 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation2, MODE_UPPER, 1);
double env2Lower1 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation2, MODE_LOWER, 1);
double env3Upper0 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation3, MODE_UPPER, 0);
double env3Lower0 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation3, MODE_LOWER, 0);
double env3Upper1 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation3, MODE_UPPER, 1);
double env3Lower1 = iEnvelopes(NULL, PERIOD_M1, SlowMAPeriod, 0, MODE_EMA, 0, PRICE_CLOSE, EnvDeviation3, MODE_LOWER, 1);
//--- 生成交易信号
bool buySignal = false;
bool sellSignal = false;
// 买入信号条件
if((fastMA0 > env1Lower0 && fastMA1 < env1Lower1) || // 上穿1%偏差下轨
(fastMA0 > env2Lower0 && fastMA1 < env2Lower1) || // 上穿0.7%偏差下轨
(fastMA0 > slowMA0 && fastMA1 < slowMA0) || // MA金叉
(fastMA0 > env3Upper0 && fastMA1 < env3Upper1) || // 上穿0.3%偏差上轨
(fastMA0 > env2Upper0 && fastMA1 < env2Upper1)) // 上穿0.7%偏差上轨
{
buySignal = true;
}
// 卖出信号条件
if((fastMA0 < env1Upper0 && fastMA1 > env1Upper1) || // 下穿1%偏差上轨
(fastMA0 < env2Upper0 && fastMA1 > env2Upper1) || // 下穿0.7%偏差上轨
(fastMA0 < slowMA0 && fastMA1 > slowMA0) || // MA死叉
(fastMA0 < env3Lower0 && fastMA1 > env3Lower1) || // 下穿0.3%偏差下轨
(fastMA0 < env2Lower0 && fastMA1 > env2Lower1)) // 下穿0.7%偏差下轨
{
sellSignal = true;
}
//--- 检查现有持仓
bool buyOpen = false;
bool sellOpen = false;
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if(OrderType() == OP_BUY)
buyOpen = true;
else if(OrderType() == OP_SELL)
sellOpen = true;
}
}
}
//--- 执行交易逻辑
if(buySignal && !buyOpen)
{
CloseAllSellOrders();
OpenBuy();
}
else if(sellSignal && !sellOpen)
{
CloseAllBuyOrders();
OpenSell();
}
//--- 追踪止损
if(TrailingStop > 0)
TrailingStopManagement();
return(0);
}
//+------------------------------------------------------------------+
//| 是否在交易时间内 |
//+------------------------------------------------------------------+
bool IsTradeTime()
{
datetime now = TimeCurrent();
int hour = TimeHour(now);
if(StartHour <= EndHour)
{
if(hour >= StartHour && hour < EndHour)
return(true);
}
else
{
if(hour >= StartHour || hour < EndHour)
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
//| 开立买单 |
//+------------------------------------------------------------------+
void OpenBuy()
{
double sl = 0, tp = 0;
if(StopLoss > 0)
sl = Ask - StopLoss * point;
if(TakeProfit > 0)
tp = Ask + TakeProfit * point;
int ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, sl, tp,
"MA_Envelopes_Buy", MagicNumber, 0, clrGreen);
if(ticket < 0)
Print("开立买单失败,错误代码: ", GetLastError());
else if(EnableSound)
Alert("黄金MA包络线策略开立买单");
}
|
|