#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
input double StopLoss=2.5; // 止损
input int TakeProfit=10; // 获利
input int MA5_Period=5; // 移动平均周期
input int MA20_Period=20; // 移动平均周期
input int EA_Magic=12345; // EA 幻数
input double Lot= 1; // 交易手数
//--- 其他参数
int ma5Handle; // 我们移动平均指标的句柄
int ma20Handle; // 我们移动平均指标的句柄
double maVal[]; // 保存每个柱移动平均值的动态数组
double p_close; // 保存一个柱收盘价的变量
bool ArraySetAsSeries(double maVal, bool true);
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(60);
//--- 得到移动平均指标的句柄
ma5Handle=iMA(_Symbol,_Period,MA5_Period,0,MODE_SMA,PRICE_CLOSE);
ma20Handle=iMA(_Symbol,_Period,MA20_Period,0,MODE_SMA,PRICE_CLOSE);
//--- 如果句柄返回了无效句柄
if( ma5Handle<0 ||ma20Handle<0)
{
Alert("创建指标句柄出错 - 错误: ",GetLastError(),"!!");
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
bool IndicatorRelease( int maHandle );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Bars(_Symbol,_Period)<60) // 如果总柱数少于60
{
Alert("我们只有不到60个柱, EA 将要退出!!");
return;
}
static datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
if(copied>0) // 数据已经被成功复制
{
if(Old_Time!=New_Time[0]) // 如果旧的时间不等于新柱的时间
{
IsNewBar=true; // 如果不是第一次调用,新柱已经出现
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("我们在此时有了新柱 ",New_Time[0]," 旧的时间是 ",Old_Time);
Old_Time=New_Time[0]; // 保存柱时间
}
}
else
{
Alert("复制历史时间数据出错, 错误 =",GetLastError());
ResetLastError();
return;
}
//--- EA 应该在有新柱的时候只检查新的交易
if(IsNewBar==false)
{
return;
}
struct MqlTick
{
datetime time; // 上次更新价格的时间
double bid; // 当前卖价
double ask; // 当前买价
double last; // 上次交易价格(最后价格)
ulong volume; // 当前最后价格的交易量
};
struct MqlTradeRequest
{
ENUM_TRADE_REQUEST_ACTIONS action; // 交易操作类型
ulong magic; // “EA 交易”ID(幻数)
ulong order; // 订单号
string symbol; // 交易品种
double volume; // 以手数表示的交易的请求交易量
double price; // 价格
double stoplimit; // 订单的止损限价水平
double sl; // 订单的止损水平
double tp; // 订单的获利水平
ulong deviation; // 相对于请求价格的最大可能偏移
ENUM_ORDER_TYPE type; // 订单类型
ENUM_ORDER_TYPE_FILLING type_filling; // 订单执行类型
ENUM_ORDER_TYPE_TIME type_time; // 订单执行时间
datetime expiration; // 订单到期时间(针对 ORDER_TIME_SPECIFIED 类型的订单)
string comment; // 订单注释
};
struct MqlTradeResult
{
uint retcode; // 操作返回代码
ulong deal; // 交易订单号,如果已执行的话
ulong order; // 订单号,如果已下达的话
double volume; // 交易量,由经纪人批准
double price; // 交易价格,由经纪人批准
double bid; // 当前卖价
double ask; // 当前买价
string comment; // 经纪人对操作的注释(默认情况下此处填写操作说明)
};
struct MqlRates
{
datetime time; // 时间周期开始时间
double open; // 开盘价
double high; // 时间周期内的最高价
double low; // 时间周期内的最低价
double close; // 收盘价
long tick_volume; // 交易量
int spread; // 点差
long real_volume; // 实际交易量
};
//--- 取得最新三个柱的详细信息
if(CopyRates(_Symbol,_Period,0,276,mrate)<0)
{
Alert("复制报价/历史数据出错 - 错误:",GetLastError(),"!!");
return;
}
}
MqlTick latest_price; // 将用于取得最近/最新报价
MqlTradeRequest mrequest; // 将用于发送我们的交易请求
MqlTradeResult mresult; // 将用于取得我们的交易结果
MqlRates mrate[]; // 将用于保存每个柱的价格,交易量和差价
int CopyRates(
string _symbol, // 交易品种名称
int _Period, // 时间周期
int 0, // 起始位置
int 276, // 要复制的数据计数
MqlRates mrate[] // 要复制的目标数组
);
bool ArraySetAsSeries(double mrate, bool true);
|