//+------------------------------------------------------------------+
//| M5EA 区间突破.mq5 |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "宇桐工作室@大树My05613828"
#property link "https://www.eahub.cn/space-uid-8564.html"
#property version "1.0"
// --- 引入封装好的交易类
#include <M5/交易类.mqh>
交易类 交易; //---声明类对象
//--- 声明属性面板参数
input double order_lot = 0.01;
input double next_point = 100;
input long magic_number = 12365;
input double close_tp_point = 500;
input double close_sl_point = 500;
input int cnts = 60;
double close_v[];
double ref_v[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//--- 声明限定平台吗
// 交易.授权服务器("Doo");
ArraySetAsSeries(close_v,true);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//--- 统计持仓信息 多空持仓单的最高价最低价 多单数空单数
int long_orders = 交易.持仓单数统计(Symbol(),magic_number,POSITION_TYPE_BUY);
int short_orders = 交易.持仓单数统计(Symbol(),magic_number,POSITION_TYPE_SELL);
double position_high = 交易.持仓最高价(Symbol(),magic_number,POSITION_TYPE_BUY);
double position_low = 交易.持仓最低价(Symbol(),magic_number,POSITION_TYPE_SELL);
//--- 长时间跑出不出来 果断止损出局
if(long_orders+short_orders>10)
亏损净持仓均价平单(Symbol(),magic_number,close_sl_point);
//--- 持仓均价平单出厂
交易.净持仓均价平单(Symbol(),magic_number,close_tp_point);
int cnt = cnts;
if(cnt<20)
cnt = 20;
//---注意不能从0开始
///--- 统计设定根数 的区间收盘价
CopyClose(Symbol(),PERIOD_CURRENT,1,cnts,close_v);
//--- 升序排序
ArraySort(close_v);
//--- 去除毛刺 过滤 最低最高的8个
ArrayCopy(ref_v,close_v,0,8,cnts-8);
//---获取数组最高价的下标
int high_shift = ArrayMaximum(ref_v);
int low_shift = ArrayMinimum(ref_v);
double high = ref_v[high_shift];
double low = ref_v[low_shift];
//---区间数组最高价 最低级突破下单
bool open_long = long_orders==0 && 交易.K线穿越某值(Symbol(),PERIOD_CURRENT,1,3,0,high,high);
bool open_short = short_orders==0 && 交易.K线穿越某值(Symbol(),PERIOD_CURRENT,2,3,0,low,low);
//--- 加单 方向检测 上下区间反复尝试 知道走出单边行情 顺势永远多一单
bool next_long = long_orders>0 && long_orders<=short_orders&&交易.向上加单点值(Symbol(),position_high,交易.买价(),next_point);
bool next_short = short_orders>0 && short_orders<=long_orders&&交易.向下加单点值(Symbol(),position_low,交易.卖价(),next_point);
if(next_long&&交易.单位时间1(5))
交易.做多(Symbol(),order_lot,0,0,magic_number,"buy_next");
if(next_short&&交易.单位时间2(5))
交易.做空(Symbol(),order_lot,0,0,magic_number,"sell_next");
if(open_long)
交易.做多(Symbol(),order_lot,0,0,magic_number,"buy_first");
if(open_short)
交易.做空(Symbol(),order_lot,0,0,magic_number,"sell_first");
交易.持仓信息统计(Symbol(),magic_number,110);
交易.左上角文字("区间high "+(string)high,"区间low "+(string)low,"多单high "+(string)position_high,"空单low "+(string)position_low);
}
//+------------------------------------------------------------------+
bool 亏损净持仓均价平单(string symbol,long magic,double 设置平单点数)
{
bool chk=false;
if(设置平单点数>0)
{
double 多均价=交易.持仓均价(symbol,magic,POSITION_TYPE_BUY);
double 空均价=交易.持仓均价(symbol,magic,POSITION_TYPE_SELL);
double 多总仓位=交易.持仓仓位统计(symbol,magic,POSITION_TYPE_BUY);
double 空总仓位=交易.持仓仓位统计(symbol,magic,POSITION_TYPE_SELL);
double 浮亏均价=0;
if(多总仓位-空总仓位!=0)
浮亏均价=(多均价*多总仓位-空均价*空总仓位)/(多总仓位-空总仓位);
if(浮亏均价>0&&多总仓位>空总仓位&&交易.卖价(symbol)<浮亏均价-设置平单点数*交易.点值(symbol))
{
交易.平单(symbol,magic);
chk=true;
}
if(浮亏均价>0&&空总仓位>多总仓位&&交易.买价(symbol)>浮亏均价+设置平单点数*交易.点值(symbol))
{
交易.平单(symbol,magic);
chk=true;
}
}
return chk;
}
//+------------------------------------------------------------------+
用到的包已开源 可到公众号下载
|