面板分享DiggerGo_Two源代码
面板分享DiggerGo_Two源代码
免费
  • 人气:5164

‌面板分享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();

         }

      }

   }     

//-------------------------------------------------------------------// 

photo_2025-03-14_14-57-30.jpg