部分平仓源码
部分平仓源码
免费
  • 人气:5297

部分平仓源码


简介: “专家顾问(EA)”会监控所有或指定工具




“专家顾问(EA)”会监控所有或指定工具的未平仓头寸,


并在达到预设利润时执行部分平仓。您可指定特定的“魔法数字”(Magic Number),


或设为“-1”以覆盖所有头寸。


EA支持设置4个平仓级别,例如:


利润达50点时,平仓50%;

利润达100点时,再平仓30%;

利润达150点时,平仓10%;

利润达250点时,平仓剩余10%。

首次部分平仓后,EA会将仓位调整为“盈亏平衡”状态,并附加“NoLoss”盈利保护点。


例如,若“NoLoss”设为10点,当利润达到100点时,EA平仓50%,并将止损(SL)设为开仓价上方10点(适用于买入单)。

//+------------------------------------------------------------------+

//|                                              交易面板系统.mq4 |

//|                                 版权 © 2023-2025, AI编程zblog  |

//|                                         http://www.eawalk.com |

//+------------------------------------------------------------------+

#property copyright"Copyright © 2024, AI编程zblog"

#propertylink      "www.eawalk.com"

#property version  "1.0"

#property strict

#propertydescription "1. 专家顾问会跟踪所有或指定工具的未平仓头寸。"

#propertydescription "2. 当达到指定利润时,平掉部分仓位。"

#propertydescription "3. 在首次部分平仓时,将仓位转为盈亏平衡并附加 NoLoss 盈利点。"

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

enum tt 

{

   tr2=0,// 当前货币对

   tr1=1,// 所有货币对

};

input tt      交易范围       = 1;          // 交易范围选择:0为当前货币对,1为所有货币对

extern int    魔法数字      = -1;          // 魔法数字:-1 表示监控所有订单

extern int    平仓级别1     = 50;          // 平仓级别1(单位:点)

extern int    平仓级别2     = 100;         // 平仓级别2(单位:点)

extern int    平仓级别3     = 150;         // 平仓级别3(单位:点)

extern int    平仓级别4     = 250;         // 平仓级别4(单位:点)

extern int    平仓百分比1   = 50;          // 平仓百分比1(基于初始仓位)

extern int    平仓百分比2   = 30;          // 平仓百分比2(基于初始仓位)

extern int    平仓百分比3   = 10;          // 平仓百分比3(基于初始仓位)

extern int    平仓百分比4   = 10;          // 平仓百分比4(基于初始仓位)

extern int    无损利润点    = 0;           // 无损利润点:在首次平仓后转为盈亏平衡时的附加盈利点

extern int    滑点容差      = 3;           //滑点容差(单位:点)

sinput double 界面缩放比例  = 1.2;         // 界面缩放比例

input bool    截图保存      = true;        // 是否保存截图

input color   颜色1        = clrWhite;    // 颜色1

input color   颜色2        = clrAqua;     // 颜色2

input color   颜色3        = clrMagenta;  // 颜色3

input color   颜色4        = clrDarkOrange; // 颜色4

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

string AC,GVp;

int 无损利润,Magic,LevelClose[4];

intPercentClose[4];

boolShowOrder=true,SymbolAll=false,LANGUAGE;

color ColorN[4];

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

int OnInit()

{

  Comment("");

  AC=AccountCurrency();

  GVp="cm partial closing position ";

   if(IsTesting())GVp=GVp+" Testing";

  if(IsDemo())    GVp=GVp+" Demo";

  if(IsTesting()) GlobalVariablesDeleteAll(GVp);

  ColorN[0]=颜色1;

  ColorN[1]=颜色2;

  ColorN[2]=颜色3;

  ColorN[3]=颜色4;

  LevelClose[0]=平仓级别1;

  LevelClose[1]=平仓级别2;

   LevelClose[2]=平仓级别3;

  LevelClose[3]=平仓级别4;

  PercentClose[0]=平仓百分比1;

  PercentClose[1]=平仓百分比2;

  PercentClose[2]=平仓百分比3;

  PercentClose[3]=平仓百分比4;

  LANGUAGE=TerminalInfoString(TERMINAL_LANGUAGE)=="Russian";

   intY=20;

  SymbolAll=交易范围==1;

   Magic=魔法数字;

   无损利润=无损利润点;

  ButtonCreate(0,"cm PCP Symbol"  ,0,205,Y,200,20,CORNER_RIGHT_UPPER,SymbolAll?"所有货币对":Symbol(),"Arial",12,clrBlack,clrLightGray,clrNONE,SymbolAll,false,false,true,0,LANGUAGE?"选择对所有货币对操作还是仅对当前货币对操作":"The choice to work for all currencies or only for theone on which the Expert Advisor is installed");Y+=19;

  EditCreate(0,"cm PCP Magic_"     ,0,205,Y,101,20,"魔法数字"     ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"魔法数字(设为-1时监控所有订单)":"Magic (When settingthe value -1, the Expert Advisor sees all the magics)");Y+=19;

  EditCreate(0,"cm PCP CloseLevel_" ,0,205,Y,101,20,"平仓级别"            ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓级别":"Closing Levels");Y+=19;

  EditCreate(0,"cm PCP Percents_"  ,0,205,Y,101,20,"平仓百分比"                ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓百分比":"Closing percentage");Y+=19;

  EditCreate(0,"cm PCP NoLoss_"    ,0,205,Y,101,20,"无损利润点"      ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"转为盈亏平衡时的最小盈利点":"minimum profit when transferring to breakeven");Y=39;

  EditCreate(0,"cm PCP Magic"     ,0,105,Y,100,20,IntegerToString(Magic),"Arial",12,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"魔法数字(设为-1时监控所有订单)":"Magic (When setting the value -1, the Expert Advisorsees all the magics)");Y+=19;

  EditCreate(0,"cm PCPCloseLevel1",0,105,Y,26,20,IntegerToString(平仓级别1),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓级别(多个级别用/分隔)":"Closing Levels (Separate multiplelevels with /)");

  EditCreate(0,"cm PCP CloseLevel2",0,80,Y,26,20,IntegerToString(平仓级别2),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓级别(多个级别用/分隔)":"Closing Levels (Separatemultiple levels with /)");

  EditCreate(0,"cm PCP CloseLevel3",0,55,Y,26,20,IntegerToString(平仓级别3),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓级别(多个级别用/分隔)":"Closing Levels (Separatemultiple levels with /)");

  EditCreate(0,"cm PCP CloseLevel4",0,30,Y,25,20,IntegerToString(平仓级别4),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓级别(多个级别用/分隔)":"Closing Levels (Separatemultiple levels with /)");Y+=19;

  EditCreate(0,"cm PCP Percents1" ,0,105,Y,26,20,IntegerToString(平仓百分比1),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓百分比(多个级别用/分隔)":"Closing percentage(Separate multiple levels with /)");

  EditCreate(0,"cm PCP Percents2"  ,0,80,Y,26,20,IntegerToString(平仓百分比2),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓百分比(多个级别用/分隔)":"Closing percentage(Separate multiple levels with /)");

  EditCreate(0,"cm PCP Percents3"  ,0,55,Y,26,20,IntegerToString(平仓百分比3),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓百分比(多个级别用/分隔)":"Closing percentage(Separate multiple levels with /)");

   EditCreate(0,"cmPCP Percents4"  ,0, 30,Y,25,20,IntegerToString(平仓百分比4),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"平仓百分比(多个级别用/分隔)":"Closing percentage(Separate multiple levels with /)");Y+=19;

  EditCreate(0,"cm PCP NoLoss"    ,0,105,Y,100,20,IntegerToString(无损利润)    ,"Arial",12,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"转为盈亏平衡时的最小盈利点":"minimum profit when transferring tobreakeven");Y+=19;

  ButtonCreate(0,"cm PCPShowOrder",0,205,Y,200,20,CORNER_RIGHT_UPPER,"显示订单","Arial",12,clrBlack,clrLightGray,clrNONE,SymbolAll,false,false,true,0,LANGUAGE?"显示/隐藏订单表格":"Show/hide the ordertable");

  OnTick();

  return(0);

}

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

void OnDeinit(constint r)

{

  if(IsTesting()) GlobalVariablesDeleteAll(GVp);

  ObjectsDeleteAll(0,"cm PCP");

  return;

}

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

stringOrders[100][10];

string txt=NULL;

int N=0;

void OnTick()

{

   if (无损利润!=(int)StringToInteger(ObjectGetString(0,"cmPCP NoLoss",OBJPROP_TEXT)))

   {

     无损利润=(int)StringToInteger(ObjectGetString(0,"cm PCP NoLoss",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 无损利润 = ",无损利润,"n");

   }

   if(Magic!=(int)StringToInteger(ObjectGetString(0,"cm PCPMagic",OBJPROP_TEXT)))

   {

     Magic=(int)StringToInteger(ObjectGetString(0,"cm PCPMagic",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 魔法数字 = ",Magic,"n");

   }

   if(LevelClose[0]!=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel1",OBJPROP_TEXT)))

   {

     LevelClose[0]=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel1",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓级别 1 = ",LevelClose[0],"n");

   }

   if(LevelClose[1]!=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel2",OBJPROP_TEXT)))

   {

     LevelClose[1]=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel2",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓级别 2 = ",LevelClose[1],"n");

   }

   if(LevelClose[2]!=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel3",OBJPROP_TEXT)))

   {

     LevelClose[2]=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel3",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓级别 3 = ",LevelClose[2],"n");

   }

   if(LevelClose[3]!=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel4",OBJPROP_TEXT)))

   {

     LevelClose[3]=(int)StringToInteger(ObjectGetString(0,"cm PCPCloseLevel4",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓级别 4 = ",LevelClose[3],"n");

   }

   //---

   if(PercentClose[0]!=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents1",OBJPROP_TEXT)))

   {

     PercentClose[0]=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents1",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓百分比 1 = ",PercentClose[0],"%n");

   }

   if(PercentClose[1]!=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents2",OBJPROP_TEXT)))

   {

     PercentClose[1]=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents2",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓百分比 2 = ",PercentClose[1],"%n");

   }

   if(PercentClose[2]!=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents3",OBJPROP_TEXT)))

   {

     PercentClose[2]=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents3",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓百分比 3 = ",PercentClose[2],"%n");

   }

   if(PercentClose[3]!=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents4",OBJPROP_TEXT)))

   {

     PercentClose[3]=(int)StringToInteger(ObjectGetString(0,"cm PCPPercents4",OBJPROP_TEXT));

     txt=StringConcatenate(txt,LANGUAGE?"已修改":"Changed"," 平仓百分比 4 = ",PercentClose[3],"%n");

   }

   //---

   if(ShowOrder != ObjectGetInteger(0,"cm PCP ShowOrder",OBJPROP_STATE))

   {

     ShowOrder = ObjectGetInteger(0,"cm PCPShowOrder",OBJPROP_STATE);

     if(!ShowOrder) ObjectsDeleteAll(0,"cm PCP srt");

   }

   if(SymbolAll != ObjectGetInteger(0,"cm PCP Symbol",OBJPROP_STATE))

   {

     SymbolAll = ObjectGetInteger(0,"cm PCP Symbol",OBJPROP_STATE);

     ObjectSetString(0,"cm PCPSymbol",OBJPROP_TEXT,SymbolAll?"所有货币对":Symbol());

   }

   doublePOINT,BID,ASK,Profit,OOP,OSL,SL,LotsClose;

   inti,DIGITS,ParentTicket=0;

   intNO=0;

   doubleOL;

   boolSS=false;

   intn=0;

  for(i=OrdersTotal()-1; i>=0; i--)

   {

     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

     {

        if(OrderMagicNumber()==Magic || Magic==-1)

        {

           string OrdSym=OrderSymbol();

           if(OrdSym==Symbol() || SymbolAll)

           {

              double TekLot=OrderLots();

              OL=TekLot;

              double STOPLEVEL=MarketInfo(OrdSym,MODE_STOPLEVEL);

             DIGITS=(int)MarketInfo(OrdSym,MODE_DIGITS);

              POINT=MarketInfo(OrdSym,MODE_POINT);

             BID=NormalizeDouble(MarketInfo(OrdSym,MODE_BID),DIGITS);

              ASK=NormalizeDouble(MarketInfo(OrdSym,MODE_ASK),DIGITS);

              OOP =NormalizeDouble(OrderOpenPrice(),DIGITS);

              OSL =NormalizeDouble(OrderStopLoss(),DIGITS);

              Profit =OrderProfit()+OrderCommission()+OrderSwap();

              int Ticket=OrderTicket();

             ParentTicket=LastPositionTicket(OrderComment());

              NO=0;

              if(ParentTicket!=0)

              {

                 if(GlobalVariableCheck(StringConcatenate(GVp,ParentTicket,OrdSym,"Num")))

                 {

                   NO=((int)GlobalVariableGet(StringConcatenate(GVp,ParentTicket,OrdSym,"Num")))+1;

                 }

                 if(GlobalVariableCheck(StringConcatenate(GVp,ParentTicket,OrdSym,"Lots")))

                 {

                   OL=GlobalVariableGet(StringConcatenate(GVp,ParentTicket,OrdSym,"Lots"));

                 }

              }

              GlobalVariableSet(StringConcatenate(GVp,Ticket,OrdSym,"Num"),NO);

             GlobalVariableSet(StringConcatenate(GVp,Ticket,OrdSym,"Lots"),OL);

              if(NO<0) NO=0;

              if(NO>=ArraySize(LevelClose))NO=ArraySize(LevelClose)-1;

              RefreshRates();

              if(OrderType()<2)

              {

                Orders[n][0]=IntegerToString(Ticket);

                 Orders[n][1]=OrdSym;

                Orders[n][3]=StringConcatenate(DoubleToString(OL,2)," /",DoubleToString(TekLot,2));

                 if (OL!=TekLot)Orders[n][8]=IntegerToString(NO); else Orders[n][8]="";

                Orders[n][6]=StringConcatenate(DoubleToString(Profit,2),AC);

                 Orders[n][7]=OrderComment();

                Orders[n][9]=IntegerToString(OrderMagicNumber());

              }

              if(OrderType()==OP_BUY)

              {

                 Orders[n][2]="买入";

                 if (OSL>=OOP)Orders[n][2]=Orders[n][2]+" 无损";

                Orders[n][4]=StringConcatenate(NO," - ",DoubleToString(PercentClose[NO],0),"%");

                Orders[n][5]=StringConcatenate(DoubleToString((BID-OOP)/POINT,0)," (",IntegerToString(LevelClose[NO]),")");

                 n++;

                if(NormalizeDouble(BID-OOP,DIGITS)>=NormalizeDouble(POINT*LevelClose[0],DIGITS))

                 {

                   SL=NormalizeDouble(OOP+无损利润*POINT,DIGITS);

                    if (OSL!=SL&& BID>SL+STOPLEVEL*POINT)

                    {

                       if(!OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,clrNONE)) Print("订单修改错误",(GetLastError()));

                       elsetxt=StringConcatenate(txt,"无损保护 ",Ticket," ",OrdSym," 买入 ",DoubleToString(OSL,DIGITS)," ->",DoubleToString(SL,DIGITS),"n");

                    }

                 }

                if(NormalizeDouble(BID-OOP,DIGITS)>=NormalizeDouble(POINT*LevelClose[NO],DIGITS))

                 {

                   LotsClose=CheckVolumeValue(PercentClose[NO]/100.0*OL,OrdSym);

                   if(LotsClose>0)

                    {

                      LotsClose=MathMin(LotsClose,TekLot);

                      if(!OrderClose(Ticket,LotsClose,NormalizeDouble(BID,DIGITS),滑点容差,CLR_NONE))

                       {

                         Print("平仓错误 ",GetLastError());

                       }

                      else 

                       {

                         SS=true;

                         txt=StringConcatenate(txt,"平仓 ",Ticket,"",OrdSym," 买入",DoubleToString(LotsClose,2)," (",DoubleToString(OL,2),")",NO," 级别=",IntegerToString(LevelClose[NO]),"n");

                       }

                    }

                 }

              }

              if(OrderType()==OP_SELL)

              {

                 Orders[n][2]="卖出";

                 if (OSL!=0 &&OSL<=OOP) Orders[n][2]=Orders[n][2]+" 无损";

                Orders[n][4]=StringConcatenate(NO," -",DoubleToString(PercentClose[NO],0),"%");

                Orders[n][5]=StringConcatenate(DoubleToString((OOP-ASK)/POINT,0)," (",IntegerToString(LevelClose[NO]),")");

                 n++;

                if(NormalizeDouble(OOP-ASK,DIGITS)>=NormalizeDouble(POINT*LevelClose[0],DIGITS))

                 {

                   SL=NormalizeDouble(OOP-无损利润*POINT,DIGITS);

                    if (OSL!=SL&& ASK<SL-STOPLEVEL*POINT)

                    {

                       if(!OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,clrNONE)) Print("订单修改错误",(GetLastError()));

                       elsetxt=StringConcatenate(txt,"无损保护 ",Ticket," ",OrdSym," 卖出 ",DoubleToString(OSL,DIGITS)," ->",DoubleToString(SL,DIGITS),"n");

                    }

                 }

                if(NormalizeDouble(OOP-ASK,DIGITS)>=NormalizeDouble(POINT*LevelClose[NO],DIGITS))

                 {

                   LotsClose=CheckVolumeValue(PercentClose[NO]/100.0*OL,OrdSym);

                   if(LotsClose>0)

                    {

                      LotsClose=MathMin(LotsClose,TekLot);

                      if(!OrderClose(Ticket,LotsClose,NormalizeDouble(ASK,DIGITS),滑点容差,CLR_NONE))

                       {

                         Print("平仓错误 ",GetLastError());

                       }

                      else 

                       {

                         SS=true;

                         txt=StringConcatenate(txt,"平仓 ",Ticket,"",OrdSym," 卖出",DoubleToString(LotsClose,2)," (",DoubleToString(OL,2),")",NO," 级别=",IntegerToString(LevelClose[NO]),"n");

                       }

                    }

                 }

              }

           }

        }

     }

   }

  if(IsTesting() && n==0)

   {

     if(OrderSend(Symbol(),OP_BUY,CheckVolumeValue(1.0),NormalizeDouble(Ask,Digits),0,0,0,NULL,0,0)==-1)Print("错误",GetLastError());

     if (OrderSend(Symbol(),OP_SELL,CheckVolumeValue(1.0),NormalizeDouble(Bid,Digits),0,0,0,NULL,0,0)==-1)Print("错误",GetLastError());

   }

   if(ShowOrder)

   {

     int X=0,Y=20;

     for(i=0; i<MathMax(n,N); i++)

     {

        X=200;

        for(int j=0; j<7; j++) 

        {

           if (i>=n)

           {

             ObjectDelete(0,StringConcatenate("cm PCP srt",i,"",j));

           }

           else

           {

              int y=100;

              color colort=clrWhite;

              switch(j) 

              { 

                 case 0: y=100;break; 

                 case 1: y=80;break; 

                 case 2: y=50; if(StringFind(Orders[i][2],"无损")!=-1) colort=clrLime; break; 

                 case 3: y=100; if(Orders[i][8]!="") colort=ColorN[StrToInteger(Orders[i][8])];break; 

                 case 4: y=50;break; 

                 case 5: y=100; if(StringFind(Orders[i][5],"-")==-1)colort=clrLime; break;

                 case 6: y=100; if(StringFind(Orders[i][6],"-")==-1)colort=clrLime; break; 

                 case 7: y=120;break; 

                 case 8: y=25;break; 

                 case 9: y=25;break; 

              } 

             EditCreate(0,StringConcatenate("cm PCP srt",i,"",j),0,X,Y,y,15,Orders[i][j],"Arial",10,ALIGN_CENTER,true,CORNER_LEFT_UPPER,

             clrBlack,colort,clrGray,false,false,true,0);

              X+=y-1;

           }

        }

        Y+=14;

     }

     N=n;

     Comment(txt);

   }

   //+------------------------------------------------------------------+

  //|                                                               |

  //+------------------------------------------------------------------+

   

   if (截图保存 &&SS) 

   {

     #ifdef __MQL4__

     int TekHour = Hour();

     int Minute  = Minute();

     int Seconds = Seconds();

     

     #endif

   

     #ifdef __MQL5__

     MqlDateTime tm;

     TimeCurrent(tm);

     int TekHour = tm.hour;

     int Minute  = tm.min;

     int Seconds = tm.sec;

     #endif

     string ScreenShotName=StringConcatenate("cmPCP","//",TimeToString(TimeCurrent(),TIME_DATE)," ");

    ScreenShotName=StringConcatenate(ScreenShotName,TekHour<10?"0":"",IntegerToString(TekHour),"-",Minute<10?"0":"",IntegerToString(Minute),"-",Seconds<10?"0":"",IntegerToString(Seconds),".gif");

     int WIDTH=1500;

     int HEIGHT=500;

     ChartScreenShot(0,ScreenShotName,WIDTH,HEIGHT,ALIGN_RIGHT);

   }

}

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

intLastPositionTicket(string aComment)

{

   inttPos1=StringFind(aComment,"from");

  if(tPos1>=0)

   {

     int tPos2=StringFind(aComment,"#");

     if(tPos2>tPos1)

     {

       return(StrToInteger(StringSubstr(aComment,tPos2+1,StringLen(aComment)-tPos2-1)));

     }

   }

  return(0);

}

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

doubleCheckVolumeValue(double volume, string Sim=NULL)

{

   doublemin_volume=SymbolInfoDouble(Sim,SYMBOL_VOLUME_MIN);

  if(volume<min_volume) return(min_volume);

   doublemax_volume=SymbolInfoDouble(Sim,SYMBOL_VOLUME_MAX);

  if(volume>max_volume) return(max_volume);

   doublevolume_step=SymbolInfoDouble(Sim,SYMBOL_VOLUME_STEP);

   intratio=(int)MathRound(volume/volume_step);

  if(MathAbs(ratio*volume_step-volume)>0.0000001)return(ratio*volume_step);

  return(volume);

}

//+------------------------------------------------------------------+

//|                                                               |

//+------------------------------------------------------------------+

boolEditCreate(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=10,            // 字体大小 

               const ENUM_ALIGN_MODE align=ALIGN_CENTER,       // 对齐方式 

               const bool            read_only=false,          // 是否可编辑 

               const ENUM_BASE_CORNERcorner=CORNER_LEFT_UPPER, // 图表角落绑定 

               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,// 鼠标点击优先级 

               const string          podskazka="")               

  { 

  if(ObjectFind(chart_ID,name)==0)

   {

     ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

     ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 

     ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 

   }

   else

   {

     if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0))return(false); 

     ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(x*界面缩放比例)); 

     ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(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); 

     ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,podskazka);

   }

  return(true); 

  } 

//+------------------------------------------------------------------+ 

boolButtonCreate(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 ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // 图表角落绑定 

                 const string           text="按钮",            // 文本 

                 const string           font="Arial",            // 字体 

                 const int              font_size=10,            // 字体大小 

                 const color            clr=clrBlack,            // 文字颜色 

                 const color            back_clr=C'236,233,216',  // 背景颜色 

                 const color            border_clr=clrNONE,      // 边框颜色 

                 const bool             state=false,             // 是否按下 

                 const bool             back=false,              // 是否在后台 

                 const bool             selection=false,         // 是否可选中移动 

                 const bool             hidden=true,             // 是否隐藏在对象列表中 

                 const long             z_order=0,// 鼠标点击优先级 

                 const string          podskazka="")               

  { 

  if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))return(false); 

  ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(x*界面缩放比例)); 

  ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(y*界面缩放比例)); 

  ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*界面缩放比例)); 

  ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*界面缩放比例)); 

  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); 

  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_STATE,state); 

  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); 

  ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,podskazka);

  return(true); 

  } 

//+------------------------------------------------------------------+ 

 SHAPE  * MERGEFORMAT

 SHAPE  * MERGEFORMAT

222.png