面板分享DiggerGo_Two源代码
简介: ① 小编建议:→ 免责声明:本EA未经测
①小编建议:
→ 免责声明:本EA未经测试,请自行通过回测或实盘测试验证其效果。
本网站不对因使用本EA造成的任何损失承担责任,据此入市,风险自担!
→ EA测试流程建议:
1. 历史回测:通过历史数据简单验证EA策略的可行性,
初步确定适用的交易品种和时间周期,筛选出1-2款符合需求的EA及其参数。
2. 模拟盘测试:在模拟账户上运行一段时间,观察实际表现。
3. 实盘应用:确认稳定盈利后,再投入真实账户交易。
②小编说说:
→ EA的本质:EA是将交易策略程序化,由电脑自动执行的工具。
它并非洪水猛兽,也不是躺赚的神器,而是一种辅助手段。从博弈论角度看,
市场是零和游戏,你的盈利来自他人的亏损,反之亦然。
如果存在一种“人人皆赚”的策略,谁来承担亏损?若无人亏损,你的利润又从何而来?
→ 个性化选择:不同性格的人使用同一款EA,因参数设置不同,
效果也会有差异。建议根据自身性格,挑选合适的EA或EA组合,并调整参数与之磨合。找到契合点后,盈利自然水到渠成。
→ 使用建议:
根据个人交易风格选择EA,适合自己的才是最好的。
可以尝试组合多款策略不同的EA,根据交易理念和经验设置参数。
让每款EA交易多个品种,并在每个品种上控制微小风险,以分散风险、提升收益,实现长期稳定盈利。
//+------------------------------------------------------------------+
//| 交易面板系统.mq4 |
//| 版权 © 2023-2025, AI编程zblog |
//| http://www.eawalk.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024,eawalk.com"
#property link "http://www.eawalk.com"
string ver = "篮子 1.1"; // 交易面板系统.mq4
#property version "1.1"
#property strict
#property description "账户管理顾问。显示当前账户正在交易的工具对。"
#property description "显示每个工具对在特定时间内的盈利情况。帮助在多个打开的窗口之间切换。"
#property description "账户管理顾问。显示当前账户正在交易的工具对。"
#ifdef __MQL5__
MqlTick tick;
MqlTradeRequest request;
MqlTradeResult result;
MqlTradeCheckResult check;
ENUM_ORDER_TYPE_FILLINGFillingMode=ORDER_FILLING_RETURN;
#endif
//+------------------------------------------------------------------+
input color 背景颜色 = clrIvory; // 背景颜色
input double 窗口宽度比例 = 1.2; // 窗口宽度比例
input double 窗口高度比例 = 1.0; // 窗口高度比例
input color 盈利颜色 = clrLime; // 盈利颜色
input color 亏损颜色 = clrPink; // 亏损颜色
input bool 发送邮件通知 = true; // 发送邮件通知
input int 重新开启 = false; // 重新开启
input double 自动平仓 = 0.0; // 自动平仓
int orders=0,AN,Y=0,X=0,dY=0,dX=0,n=0;
bool LANGUAGE=false;
double tOrders[100][3];
double History[100][6];
string NameAccount,Symbl[100];
double ProfitAll[7];
//+------------------------------------------------------------------+
void OnTimer(){ OnTick();}
void OnTick()
{
//-----------------------------------------------------------------------//
// //
// //
// 仓位控制 //
// //
// //
//-----------------------------------------------------------------------//
ArrayInitialize(tOrders,0);
double Profit=0,ProfitALL=0;
int OT=0,i,j;
string Symb;
#ifdef __MQL4__//---------------------------- MT4---------------------------------------------------
for (i=OrdersTotal()-1; i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
Symb = OrderSymbol();
Profit=OrderProfit()+OrderSwap()+OrderCommission();
if (OrderType()==OP_BUY)OT=1; else OT=-1;
#endif
#ifdef __MQL5__//--------------------------- MT5---------------------------------------------------
for(i=PositionsTotal()-1;i>=0; i--)
{
Symb=PositionGetSymbol(i);
Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)+GetPositionCommission()*2;
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) OT=1; else OT=-1;
#endif
//-------------------------------------------------------------------
ProfitALL+=Profit;
j=Insrt(Symb);
if (n<j) n=j;
tOrders[j][0]+=Profit;//[0] 该工具的总盈利
if (OT>0)tOrders[j][1]++;// [1] 买入订单数
if (OT<0)tOrders[j][2]++;// [2] 卖出订单数
}
//----------------------------------------------------------------------------------//
// //
// 根据总盈利关闭仓位 //
// //
//----------------------------------------------------------------------------------//
if (自动平仓!=0 && ProfitALL!=0 && ProfitALL>=自动平仓)
{
if (发送邮件通知) SendMail(IntegerToString(AN)," 篮子关闭所有仓位");
CloseAll();
}
//----------------------------------------------------------------------------------//
// //
// 显示各工具的盈利表格 //
// //
//----------------------------------------------------------------------------------//
string name,SN;
Y=25;
int DY=19;
for(j=0;j<=n;j++)//所有有开仓的工具
{
SN=IntegerToString(j);
name=StrCon("cmInsrt",SN);X=0;
EditCreate(0,name,0,X,Y+DY*j,100,20,Symbl[j],"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,clrWhite);//工具名称
name=StrCon(name,"Profit");X+=105;
EditCreate(0,name,0,X,Y+DY*j,70,20,DoubleToString(tOrders[j][0],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,//工具盈利
tOrders[j][0]>0?盈利颜色:tOrders[j][0]<0?亏损颜色:clrWhite);
name=StrCon("cmOrdersB ",SN);X+=75;
EditCreate(0,name,0,X,Y+DY*j,30,20,DoubleToString(tOrders[j][1],0),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,clrWhite);
name=StrCon("cmOrdersS ",SN);X+=29;
EditCreate(0,name,0,X,Y+DY*j,30,20,DoubleToString(tOrders[j][2],0),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,clrWhite);
for(i=0;i<6;i++)//按天、周、月统计盈利
{
EditCreate(0,StrCon("cmHP"+IntegerToString(i)+IntegerToString(j)),0,X+35+75*i,Y+DY*j,70,20,DoubleToString(History[j][i],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,
History[j][i]>0?盈利颜色:History[j][i]<0?亏损颜色:clrWhite);
}
}
//----------------------------------------------------------------------------------//
// //
// 下方总计标题 //
// //
//----------------------------------------------------------------------------------//
X=0;
EditCreate(0,"cmALL",0,X,Y+5+DY*j,100,20,"©https://eawalk.com","Arial",8,ALIGN_CENTER,false,CORNER_LEFT_UPPER,clrGray,clrWhite);X+=105;
EditCreate(0,"cmProfitALL",0,X,Y+5+DY*j,70,20,DoubleToString(ProfitALL,2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,ProfitALL>0?盈利颜色:ProfitALL<0?亏损颜色:clrWhite);
//EditCreate(0,"cmHistoryALL",0,X+130,Y+5+DY*j,70,20,DoubleToString(HistoryALL,2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);
X+=104;
for(i=0;i<6;i++)//按天、周、月统计总盈利
{
EditCreate(0,"cmProfitAll"+IntegerToString(i),0,X+35+75*i,Y+5+DY*j,70,20,DoubleToString(ProfitAll[i],2),
"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,ProfitAll[i]>0?盈利颜色:ProfitAll[i]<0?亏损颜色:clrWhite);
}
if (orders!=OrdersTotal())History();
orders=OrdersTotal();
}
//+------------------------------------------------------------------+
int Insrt(string Sym)
{
int j=0;
for(j=0;j<100;j++)
{
if (Sym==Symbl[j] || Symbl[j]==NULL)break;
}
if (j>99) j=99;
Symbl[j]=Sym;
return(j);
}
//+------------------------------------------------------------------+
bool EditCreate(const long chart_ID=0, // 图表ID
const string name="编辑框", // 对象名称
const int sub_window=0, // 子窗口编号
const int x=0, // X轴坐标
const int y=0, // Y轴坐标
const int width=50, // 宽度
const int height=18, // 高度
const string text="文本", // 文本
const string font="Arial", //字体
const int font_size=8, // 字体大小
const ENUM_ALIGN_MODE align=ALIGN_RIGHT, // 对齐方式
const bool read_only=true, // 是否只读
const ENUM_BASE_CORNER corner=CORNER_RIGHT_LOWER, // 图表角落绑定
const color clr=clrBlack, // 文字颜色
const color back_clr=clrWhite, // 背景颜色
const color border_clr=clrNONE, // 边框颜色
const bool back=false, // 是否在后台
const bool selection=false, // 是否可选中移动
const bool hidden=true, // 是否隐藏在对象列表中
const long z_order=0) // 鼠标点击优先级
{
ResetLastError();
if(ObjectFind(chart_ID,name)!=-1) ObjectDelete(chart_ID,name);
if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))
{
Print(__FUNCTION__,
": 无法创建对象 ",name,"! 错误代码 = ",GetLastError());
return(false);
}
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*窗口高度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*窗口高度比例));
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align);
ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
return(true);
}
//+------------------------------------------------------------------+
bool ButtonCreate(const long chart_ID=0, // 图表ID
const string name="按钮", // 按钮名称
const int sub_window=0, // 子窗口编号
const long x=0, // X轴坐标
const long y=0, // Y轴坐标
const int width=50, //按钮宽度
const int height=18, // 按钮高度
const string text="按钮", // 文本
const string font="Arial", // 字体
const int font_size=10, // 字体大小
const color clr=clrRed, // 文字颜色
const color clrfon=clrBlack, // 背景颜色
const color border_clr=clrNONE, // 边框颜色
const bool state=false,
const ENUM_BASE_CORNER CORNER=CORNER_RIGHT_LOWER)
{
if(ObjectFind(chart_ID,name)==-1)
{
ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*窗口高度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1);
}
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clrfon);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*窗口高度比例));
return(true);
}
//----------------------
bool RectLabelCreate(const long chart_ID=0, // 图表ID
const string name="矩形标签", // 标签名称
const int sub_window=0, // 子窗口编号
const long x=0, // X轴坐标
const long y=0, // Y轴坐标
const int width=50, // 宽度
const int height=18, // 高度
const color back_clr=clrNONE, // 背景颜色
const color clr=clrNONE, // 平面边框颜色
const ENUM_LINE_STYLE style=STYLE_SOLID, // 平面边框样式
const int line_width=1, // 平面边框粗细
const bool back=false, // 是否在后台
const bool selection=false, // 是否可选中移动
const bool hidden=true, // 是否隐藏在对象列表中
const long z_order=0,
const int CORNER=CORNER_LEFT_LOWER)
{
ResetLastError();
if(ObjectFind(chart_ID,name)==-1)
{
ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);
}
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*窗口高度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*窗口高度比例));
return(true);
}
//--------------------------------------------------------------------
bool LabelCreate(const long chart_ID=0, // 图表ID
const string name="标签", // 标签名称
const int sub_window=0, // 子窗口编号
const int x=0, // X轴坐标
const int y=0, // Y轴坐标
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // 图表角落绑定
const string text="标签", // 文本
const string font="Arial", // 字体
const int font_size=10, // 字体大小
const color clr=clrBlack, // 颜色
const double angle=0.0, // 文本倾斜角度
const ENUM_ANCHOR_POINT anchor=ANCHOR_RIGHT_UPPER,// 锚点方式
const bool back=false, // 是否在后台
const bool selection=false, // 是否可选中移动
const bool hidden=true, // 是否隐藏在对象列表中
const long z_order=0) // 鼠标点击优先级
{
ResetLastError();
if(ObjectFind(chart_ID,name)==-1)
{
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
return(false);
}
}
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*窗口宽度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*窗口高度比例));
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
return(true);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0);
EventKillTimer();
}
//-------------------------------------------------------------------
bool Liz()
{
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)!=ACCOUNT_TRADE_MODE_REAL)return(true);
if (AN==0) return(true);
if (StringFind(NameAccount,"Хлыстов ВладимирСтепанович")!=-1) return(true);
if (StringFind(NameAccount,"Владимир СтепановичХлыстов")!=-1) return(true);
return(false);
}
//+------------------------------------------------------------------+
void History()
{
double Profit=0;
datetime OCT;
ulong Ticket;
int i,j;
string Symb;
ArrayInitialize(ProfitAll,0);
ArrayInitialize(History,0);
#ifdef __MQL4__ //----------------------------MT4 ---------------------------------------------------
for (i=OrdersHistoryTotal()-1;i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if (OrderType()!=OP_BUY&& OrderType()!=OP_SELL) continue;
Ticket = OrderTicket();
Symb =OrderSymbol();
Profit=OrderProfit()+OrderSwap()+OrderCommission();
OCT = OrderCloseTime();
Profit =OrderProfit()+OrderSwap()+OrderCommission();
#endif
#ifdef __MQL5__//--------------------------- MT5---------------------------------------------------
ulong order_ticket; // 订单票号,由其产生的交易
long deal_type ; // 交易操作类型
long position_ID; // 仓位标识符
datetime from_date=0; // 从一开始
datetime to_date=TimeCurrent();//到当前时刻
HistorySelect(from_date,to_date);
intdeals=HistoryDealsTotal();
for(i=0;i<deals;i++)
{
Ticket= HistoryDealGetTicket(i);
order_ticket= HistoryDealGetInteger(Ticket,DEAL_ORDER);
deal_type= HistoryDealGetInteger(Ticket,DEAL_TYPE);
Symb= HistoryDealGetString(Ticket,DEAL_SYMBOL);
position_ID= HistoryDealGetInteger(Ticket,DEAL_POSITION_ID);
if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL) continue;
Profit=HistoryDealGetDouble(Ticket,DEAL_PROFIT)+HistoryDealGetDouble(Ticket,DEAL_COMMISSION)+HistoryDealGetDouble(Ticket,DEAL_SWAP);
OCT=(datetime)HistoryDealGetInteger(Ticket,DEAL_TIME);
#endif
if (OCT==0) continue;
if(Profit==0) continue;
j=Insrt(Symb);
if (n<j) n=j;
if(OCT>=iTime(NULL,PERIOD_D1,0)) {History[j][0]+=Profit;ProfitAll[0]+=Profit;}//今天
else
{
if(OCT>=iTime(NULL,PERIOD_D1,1)) {History[j][1]+=Profit;ProfitAll[1]+=Profit;}//昨天
else
{
if (OCT>=iTime(NULL,PERIOD_D1,2)) {History[j][2]+=Profit;ProfitAll[2]+=Profit;}//前天
}
}
if(OCT>=iTime(NULL,PERIOD_W1,0)) {History[j][3]+=Profit;ProfitAll[3]+=Profit;}//本周
if(OCT>=iTime(NULL,PERIOD_MN1,0)) {History[j][4]+=Profit;ProfitAll[4]+=Profit;}//本月
History[j][5]+=Profit;ProfitAll[5]+=Profit; // [5] 该工具累计盈利
}
}
//+------------------------------------------------------------------+
#ifdef __MQL5__
double GetPositionCommission(void)
{
doubleCommission=::PositionGetDouble(POSITION_COMMISSION);
if(Commission==0)
{
ulongTicket=GetPositionDealIn();
if(Ticket>0)
{
const doubleLotsIn=::HistoryDealGetDouble(Ticket,DEAL_VOLUME);
if(LotsIn>0)
Commission=::HistoryDealGetDouble(Ticket,DEAL_COMMISSION)*::PositionGetDouble(POSITION_VOLUME)/LotsIn;
}
}
return(Commission);
}
//--------------------------------------------------------------------
ulong GetPositionDealIn(const ulongHistoryTicket=0)
{
ulong Ticket=0;
if((HistoryTicket==0) ? ::HistorySelectByPosition(::PositionGetInteger(POSITION_TICKET)): ::HistorySelectByPosition(HistoryTicket))
{
const intTotal=::HistoryDealsTotal();
for(int i=0; i<Total;i++)
{
const ulongTicketDeal=::HistoryDealGetTicket(i);
if(TicketDeal>0)
if((ENUM_DEAL_ENTRY)::HistoryDealGetInteger(TicketDeal,DEAL_ENTRY)==DEAL_ENTRY_IN)
{
Ticket=TicketDeal;
break;
}
}
}
return(Ticket);
}
//+------------------------------------------------------------------+
#endif
string StrCon(string t1=NULL,stringt2=NULL,string t3=NULL,string t4=NULL,string t5=NULL,string t6=NULL,stringt7=NULL,string t8=NULL,string t9=NULL,string t10=NULL,string t11=NULL)
{
string str;
#ifdef __MQL4__str=StringConcatenate(#endif
#ifdef __MQL5__StringConcatenate(str,#endif t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11);
return(str);
}
//+------------------------------------------------------------------+
string AC;
int OnInit()
{
AN=(int)AccountInfoInteger(ACCOUNT_LOGIN);
NameAccount=AccountInfoString(ACCOUNT_NAME);
AC = ""+AccountInfoString(ACCOUNT_CURRENCY);
History();
EventSetTimer(1);
LANGUAGE=TerminalInfoString(TERMINAL_LANGUAGE)=="Russian";
ChartSetInteger(0,CHART_COLOR_FOREGROUND,背景颜色);//轴、刻度和OHLC行的颜色
ChartSetInteger(0,CHART_COLOR_BACKGROUND,背景颜色);
ChartSetInteger(0,CHART_FOREGROUND,false);//价格图表置于前台
ChartSetInteger(0,CHART_SHOW_GRID,false);
ChartSetInteger(0,CHART_BRING_TO_TOP,true);
ChartSetInteger(0,CHART_SHOW_ASK_LINE,false);
ChartSetInteger(0,CHART_SHOW_BID_LINE,false);
ChartSetInteger(0,CHART_SHOW_OHLC,false);//左上角显示OHLC值
ChartSetInteger(0,CHART_SHOW_LAST_LINE,false);
ChartSetInteger(0,CHART_SHOW_GRID,false);
ChartSetInteger(0,CHART_SHOW_VOLUMES,false);
ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,false);
ChartSetInteger(0,CHART_CONTEXT_MENU,false);//启用/禁用右键上下文菜单
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,false);//十字线
ChartSetInteger(0,CHART_MOUSE_SCROLL,false);//鼠标左键水平滚动图表
ChartSetInteger(0,CHART_SHOW_ONE_CLICK,false);
#ifdef __MQL5__
ChartSetInteger(0,CHART_SHOW,false);//价格图表绘制标志
FillingMode=ORDER_FILLING_RETURN;// 该模式用于市场订单
intFILLING_MODE=(int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
if ((SYMBOL_FILLING_IOC &FILLING_MODE)==SYMBOL_FILLING_IOC) FillingMode=ORDER_FILLING_IOC;// 全部或部分
if ((SYMBOL_FILLING_FOK &FILLING_MODE)==SYMBOL_FILLING_FOK) FillingMode=ORDER_FILLING_FOK;//必须完全按指定数量执行
#endif
ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,背景颜色);
ChartSetInteger(0,CHART_COLOR_CHART_DOWN,背景颜色);
ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,背景颜色);
ChartSetInteger(0,CHART_COLOR_CHART_UP,背景颜色);
ChartSetInteger(0,CHART_COLOR_CHART_LINE,背景颜色);
ChartSetInteger(0,CHART_COLOR_STOP_LEVEL,背景颜色);
ChartSetInteger(0,CHART_COLOR_LAST,背景颜色);
ChartSetInteger(0,CHART_SHOW_TRADE_LEVELS,背景颜色);
ChartSetInteger(0,CHART_DRAG_TRADE_LEVELS,false);
ChartSetInteger(0,CHART_SHOW_DATE_SCALE,false);
ChartSetInteger(0,CHART_SHOW_PRICE_SCALE,false);
ChartSetInteger(0,CHART_COLOR_VOLUME,背景颜色);
ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,100);
X=0;Y=0;
EditCreate(0,"cm_1",0,X,Y,100,20,ver,"ARIALBLACK",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);
X+=105;
EditCreate(0,"cm _2",0,X,Y,70,20,"盈利","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75;
EditCreate(0,"cm_b",0,X,Y,30,20,"买入","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=29;
EditCreate(0,"cm_s",0,X,Y,30,20,"卖出","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=35;
EditCreate(0,"cm_3",0,X,Y,70,20,"今天","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75;
EditCreate(0,"cm_4",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,1),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75;
EditCreate(0,"cm_5",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,2),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75;
EditCreate(0,"cm_6",0,X,Y,70,20,"本周","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75;
EditCreate(0,"cm_7",0,X,Y,70,20,"本月","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75;
EditCreate(0,"cm_8",0,X,Y,70,20,"总计","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);
ChartSetInteger(0,CHART_BRING_TO_TOP,true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int Slippage = 1000;
#ifdef __MQL4__
bool CloseAll(string Symbol1="ALL")
{
bool error=true;
int j,err,nn=0,OT;
string Symb;
double Profit=0,OOP;
while(!IsStopped())
{
for (j = OrdersTotal()-1;j >= 0; j--)
{
if(OrderSelect(j, SELECT_BY_POS))
{
Symb= OrderSymbol();
if(Symb == Symbol1 || Symbol1=="ALL")
{
OT = OrderType();
OOP=OrderOpenPrice();
Profit=OrderProfit()+OrderSwap()+OrderCommission();
if (OT>1)
{
error=OrderDelete(OrderTicket());
}
if (OT==OP_BUY)
{
error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symb,MODE_BID),(int)MarketInfo(Symb,MODE_DIGITS)),Slippage,Blue);
}
if (OT==OP_SELL)
{
error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symb,MODE_ASK),(int)MarketInfo(Symb,MODE_DIGITS)),Slippage,Red);
}
if (!error)
{
err = GetLastError();
if (err<2) continue;
if (err==129)
{
Sleep(5000);
RefreshRates();
continue;
}
if (err==146)
{
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
}
}
}
}
int k=0;
for (j = 0; j <OrdersTotal(); j++)
{
if(OrderSelect(j, SELECT_BY_POS))
{
Symb= OrderSymbol();
if(Symb == Symbol1 || Symbol1=="ALL")
{
k++;
}
}
}
if (k==0) break;
nn++;
if (nn>10){/*ALERT(StringConcatenate(Symb,LANGUAGE?" 未能关闭所有交易,仍剩余 ":"未能关闭所有交易,仍剩余",k));*/return(false);}
Sleep(1000);
RefreshRates();
}
ObjectsDeleteAll(0,"cm");
OnInit();
return(true);
}
#endif
//--------------------------------------------------------------------
#ifdef __MQL5__
bool CloseAll(string Symbol1="ALL")
{
bool error=true;
int i,err,nn=0;
long OT;
string Symb;
int k=0;
double Profit=0;
while(!IsStopped())
{
k=0;
for (i =PositionsTotal()-1; i >= 0; i--)
{
Symb=PositionGetSymbol(i);
if (Symb !=Symbol1 && Symbol1!="ALL") continue;
Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)+GetPositionCommission()*2;
OT =PositionGetInteger(POSITION_TYPE);
ZeroMemory(request);
ZeroMemory(result);
request.deviation = Slippage;
request.volume=PositionGetDouble(POSITION_VOLUME);
request.position = PositionGetInteger(POSITION_TICKET);
request.action=TRADE_ACTION_DEAL;
request.comment="";
request.type_filling = FillingMode;
request.symbol= Symb;
request.magic = PositionGetInteger(POSITION_MAGIC);
k++;
if(OT==POSITION_TYPE_BUY)
{
request.price=SymbolInfoDouble(Symb,SYMBOL_BID);
request.type=ORDER_TYPE_SELL;
}
if(OT==POSITION_TYPE_SELL)
{
request.price=SymbolInfoDouble(Symb,SYMBOL_ASK);
request.type=ORDER_TYPE_BUY;
}
if(!OrderSend(request,result))
{
err= GetLastError();
if(err<2) continue;
Print("错误 ",err," 关闭订单编号 ",request.position," ",TimeToString(TimeCurrent(),TIME_SECONDS));
}
}
if (k==0) break;
nn++;
if (nn>10)return(false);
Sleep(1000);
}
return(true);
}
#endif
//--------------------------------------------------------------------
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &name)
{
int i,j,ret=IDYES;
long ch,prevChart=0;
if(id==CHARTEVENT_OBJECT_CLICK)
{
string txt,Symb=NULL;
if(StringFind(name,"cm Insrt")!=-1)
{
i=StringFind(name,"Profit");
if (i==-1)//点击了货币对名称按钮
{
Symb=ObjectGetString(0,name,OBJPROP_TEXT);
i=-1;
while(i<100)// 我们肯定不会有超过100个打开的图表
{
ch=ChartNext(prevChart);
if (ch==ChartID()) {prevChart=ch;continue;}//跳过当前图表
if(ch<0) break; // 到达图表列表末尾
prevChart=ch;// 记住当前图表的ID以供ChartNext()使用
if (ChartSymbol(ch)==Symb)
{
ChartSetInteger(ch,CHART_BRING_TO_TOP,true);
if(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)<ChartGetInteger(ch,CHART_WIDTH_IN_PIXELS))ChartSetInteger(0 ,CHART_BRING_TO_TOP,true);
break;
}
i++;
}
}
else
{
txt=StringSubstr(name,8,i-8);
j=(int)StringToInteger(txt);
Symb=Symbl[j];
txt=ObjectGetString(0,name,OBJPROP_TEXT);
if(Symb!=NULL)
{
txt=StrCon(LANGUAGE?"关闭所有仓位":"关闭所有仓位 ",Symb," ",txt,AC);
ret=MessageBox(StrCon(LANGUAGE?"您真的要关闭 ":"您确定要关闭 ",Symb," 吗?"),txt,MB_YESNO|MB_TOPMOST);
if (ret==IDYES)
{
CloseAll(Symb);
}
}
}
}
if (name=="cmProfitALL")
{
txt=StrCon(LANGUAGE?"关闭账户所有仓位":"关闭账户所有仓位 ",DoubleToString(AccountInfoDouble(ACCOUNT_PROFIT),2),AC);
ret=MessageBox((LANGUAGE?"您真的要全部关闭吗?":"您确定要全部关闭吗?"),txt,MB_YESNO|MB_TOPMOST);
if(ret==IDYES)
{
CloseAll();
}
}
}
}
//-------------------------------------------------------------------//