部分平仓源码
简介: “专家顾问(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);
}
//+------------------------------------------------------------------+