2评论

0收藏

求组谁能帮我把代码完善一下啊,谢谢

avatar 山沟里的葫芦娃 | 193 人阅读 | 2 人评论 | 2025-02-02

悬赏任务 10金币
我有个MT4 EA专门应对黄金品种的, 对冲逻辑如下:1.出现多单信号开仓做多,首单0.02,出现浮亏,则利用逆势间隔加仓,逆势倍数加仓,(首单0.02,间隔200点加仓,倍数1.3 开单0.03,行情延续下跌,继续加仓0.04,然后多单没有盈利,均持仓0.09单,这个时候出现反向信号空头,则利用空单信号来对冲多单持仓单量总数2倍加仓,然后综合多空持仓单一起均价止盈离场,疑问,如果这个时候又出现反向信号多单,我如何来详细做对冲前面的多空持仓单,而且减少风险的情况下,应该怎么操作,或者怎么开单对冲来达到综合均价止盈几美金离场,注意,有对冲肯定不能用止损功能,只能多空均价止盈几美金,小盈利离场1.多单信号首单浮亏加仓:当多单信号出现且首单浮亏时,按照设定的手数倍数进行加仓。示例:开仓做多,首单0.02,出现浮亏,则利用逆势间隔加仓,逆势倍数加仓,比如:(首单0.02,间隔200点加仓,倍数1.3 开单0.03,行情延续下跌,继续加仓0.04,正常止盈是根据参数设定的单逆势加仓均价止盈点数止盈,2.如果首单没有出现逆势加仓的情况下,则根据参数设定的单独止盈点数400小点止盈离场,3.示例:开仓做多,首单0.02,出现浮亏,则利用逆势间隔加仓,逆势倍数加仓,比如:(首单0.02,间隔200点加仓,倍数1.3 开单0.03,行情延续下跌,继续加仓0.04,然后多单没有盈利,此时多单持仓为0.09单,此时出现反向信号空头,则利用空单信号来对冲多单持仓单量总数2倍加仓,然后综合多空持仓单一起均价止盈几美金小盈利离场,疑问,如果这个时候又出现反向信号多单,我如何来详细做对冲前面的多空持仓单,而且减少风险的情况下,应该怎么操作,或者怎么开单对冲来达到综合均价止盈几美金离场,注意,有对冲肯定不能用止损功能,只能多空均价止盈几美金,小盈利离场空单反之。。。请根据我的要求给我MT4 EA 源代码增加对冲功能,在参数面板中增加对冲倍数,对冲均价几美金离场参数,代码中别的参数,开仓功能,不要动,保持原先的,只给我代码中增加我提出的需求,并给我修复后完整的代码----------------------------------------------------------------------------------------------------------------
主要调整点多单信号首单浮亏加仓:当多单信号出现且首单浮亏时,按照设定的手数倍数进行加仓。空单信号首单浮亏加仓:当空单信号出现且首单浮亏时,按照设定的手数倍数进行加仓。反向信号对冲:当多单持仓浮亏且出现空单信号时,加倍对冲多单持仓。当空单持仓浮亏且出现多单信号时,加倍对冲空单持仓。多空持仓单持平盈亏均价止盈:当多单和空单的均价差小于设定值时,平仓所有多单和空单1.比如空单信号首单出现浮亏,加仓,加仓,加仓,这个时候出现反向信号多单,那么空单停止加仓,下面就得用多单信号的开仓来对冲之前空单的浮亏持仓单,最后综合多空均价止盈,,,,2.比如多单信号首单出现浮亏,加仓,加仓,加仓,这个时候出现反向信号空单,那么多单停止加仓,下面就得用空单信号的开仓来对冲之前多单的浮亏持仓单,最后综合多空均价止盈,,,,请帮我在下面MT4 EA源代码中增加对冲功能如下逻辑:多单信号首单浮亏加仓:当多单信号出现且首单浮亏时,按照设定的手数倍数进行加仓。空单信号首单浮亏加仓:当空单信号出现且首单浮亏时,按照设定的手数倍数进行加仓。反向信号对冲:当多单持仓浮亏且出现空单信号时,加倍对冲多单持仓。当空单持仓浮亏且出现多单信号时,加倍对冲空单持仓。多空持仓单持平盈亏均价止盈:当多单和空单的均价差小于设定值时,平仓所有多单和空单逆势加仓,间隔加仓,出现反向信号停止加仓,然后用反向信号的单子加倍开单对冲浮亏持仓单,比如下单手数0.02,加仓0.03,加仓0.04,那么反向信号出现就是0.09-然后顺势间隔加仓上去 ,设置对冲均价止盈几美金离场,单边逆势加仓,还是采取单边加仓的均价止盈离场,还有就是一个单子,没出现浮亏加仓的情况下,是单独盈利400点出场的
-----------------------------------------------------------------------------------
一下是代码:


#property copyright ""#property link      ""#property version   "1.00"#property strictstring 使用期限=""; //不填写则不限制,格式:2018.04.08 00:00string 账号限制="";  //不填写则不限制,填写授权数字账号,|间隔,如:8888|9999|666enum MYPERIOD{当前=PERIOD_CURRENT,M1=PERIOD_M1,M5=PERIOD_M5,M15=PERIOD_M15,M30=PERIOD_M30,H1=PERIOD_H1,H4=PERIOD_H4,D1=PERIOD_D1,W1=PERIOD_W1,MN1=PERIOD_MN1};input MYPERIOD 时间周期=当前;enum MY_OP2{BUY=OP_BUY,SELL=OP_SELL}; input string __A_指标名称="";input int __做空箭头颜色序号=0;input double __手数=0.1;input int __止盈点数=200;input int __做多箭头颜色序号=1;input int __亏损加仓间隔点数=100;input double __手数倍数=2;input int __最大加仓几单=5;input int __均价止盈点数=100;input int 最大允许滑点=900;#define _tn_int int#define _m_int int#define _p_int intinput _m_int _订单识别码=0;_m_int _内码=0;input string 订单注释="";_m_int 子识别码=0;_m_int 订单识别码=0;_m_int 备份_分组码=0;_m_int 备份_指定码=0;int 强制判断识别码=0;int 分组循环中=0;int 指令执行了操盘=0;_m_int 订单_R_识别码=0;_m_int 备份_R_分组码=0;_m_int 备份_R_指定码=0;int _点系数=1;double _132间隔分钟=10;double _其它间隔分钟=0.5;_tn_int _mPubTsIns[1000]={};int _mPubTsInc=0;_tn_int _mPubTsExs[1000]={};int _mPubTsExc=0;_tn_int _mPubTs2Ins[1000]={};_tn_int _mPubTs2Exs[1000]={};_tn_int _mPubTn0=0;#define MYARC 20#define MYPC 300_p_int _mPubi[MYPC];double _mPubv[MYPC];datetime _mPubTime[MYPC];double _mPubFs[MYARC][MYPC]={};_p_int _mPubIs[MYARC][MYPC]={};int _mPubIsc[MYARC]={};int _mPubFsc[MYARC]={};#define MYARR_DC 1#define MYARR_IC 1int mArrDc[MYARR_DC];_p_int mArrIs[MYARR_IC][300];int mArrIc[MYARR_IC];int §=0;_m_int gGa=0;_m_int gGb=0;_m_int gGa_bak=0;_m_int gGb_bak=0;string sym="";int period=0;string mPreCap="";string mPreCapP=""; //此类变量会在修改参数后也删除重置string mPreCapNoDel="";//此类变量如果是挂ea,则永不清除;若是回测,则清除string _mInitCap_LoadTime="";string _mCap_TimePos1=""; //时间标注点int OnInit() {   string hd=MQLInfoString(MQL_PROGRAM_NAME);   mPreCap=hd+"_"+string(_订单识别码)+"_"+Symbol()+"_"; if (IsTesting()) mPreCap+="test_";   if (StringLen(mPreCap)>26) mPreCap=StringSubstr(mPreCap,StringLen(mPreCap)-26);   mPreCapNoDel=hd+"_"+string(_订单识别码)+"*_"+Symbol()+"_"; if (IsTesting()) mPreCapNoDel+="test_";   if (StringLen(mPreCapNoDel)>26) mPreCapNoDel=StringSubstr(mPreCapNoDel,StringLen(mPreCapNoDel)-26);      if (IsTesting()) {      myObjectDeleteByPreCap(mPreCap);      myDeleteGlobalVariableByPre(mPreCap);      myObjectDeleteByPreCap(mPreCapNoDel);      myDeleteGlobalVariableByPre(mPreCapNoDel);   }      mPreCapP=mPreCap+"#_";         _mInitCap_LoadTime=mPreCap+"_pub_loadtime";   if (myGlobalVDateTimeCheck(_mInitCap_LoadTime)==false) myGlobalVDateTimeSet(_mInitCap_LoadTime,TimeCurrent());   _mCap_TimePos1=mPreCap+"_pub_tmpos1";   if (myGlobalVDateTimeCheck(_mCap_TimePos1)==false) myGlobalVDateTimeSet(_mCap_TimePos1,TimeCurrent());   //显性复位      for (int i=0;i<MYPC;++i) {      _mPubi=0;      _mPubv=0;      _mPubTime=0;   }   for (int i=0;i<MYARC;++i) {      for (int j=0;j<MYPC;++j) {         _mPubFs[j]=0;         _mPubIs[j]=0;      }      _mPubIsc=0;      _mPubFsc=0;   }      ArrayInitialize(mArrDc,-1);   ArrayInitialize(mArrIc,-1);         if (__A_指标名称=="") { Alert("未输入自定义指标名称,ea中止执行。"); ExpertRemove(); }   _内码=_订单识别码; if (_内码==0) _内码=444;   订单识别码=_内码;   订单_R_识别码=_内码;      if (_内码<-9999 || _内码>9999) { static datetime tm0=0; if (TimeCurrent()-tm0>10) { tm0=TimeCurrent(); Alert("~~~此ea订单识别码不能超过4位数字"); } return 0; }   return(INIT_SUCCEEDED);}void OnDeinit(const int reason) {   //if (IsTesting()==false) myObjectDeleteByPreCap(mPreCap);  //切换周期不能删除,否则按钮状态会改变   if (reason==REASON_REMOVE || reason==REASON_CHARTCLOSE) {      if (IsTesting()==false) {         myObjectDeleteByPreCap(mPreCap);         bool ok=true;         if (ok) myDeleteGlobalVariableByPre(mPreCap);      }   }   else if (reason==REASON_PARAMETERS) {      myObjectDeleteByPreCap(mPreCapP);      myDeleteGlobalVariableByPre(mPreCapP);   }}void OnTick() {   if (myTimeLimit(使用期限)==false) return;   if (myAccountNumCheck()==false) return;   if (_订单识别码==444 || _订单识别码==-444) { Alert("~~~~~~自定识别码不能设置为444和-444这两个数字"); ExpertRemove(); return; }    int _tmp_w_break=0;   if (_内码<-9999 || _内码>9999) { static datetime tm0=0; if (TimeCurrent()-tm0>10) { tm0=TimeCurrent(); Alert("~~~此ea订单识别码不能超过4位数字"); } return; }   int _or=0;   §=0; gGa=0; _mPubTsInc=_mPubTsExc=-1;   period=时间周期; if (period==0) period=Period();   sym=Symbol();   if (时间周期!=Period() && iOpen(sym,时间周期,0)==0.00004751) Print("~~~a");   int _ok0=-1;   if (_ok0==-1) {      int _ok1=-1;      if (_ok1==-1) {         int _ok2=myFun8_1();         _ok1=_ok2;      }      //r/ _ok0=_ok1;   }   if (_ok0==-1) {      int _ok3=myFun8_2();      //r/ _ok0=_ok3;      if (_ok3==1) {      }   }   if (_ok0==-1) {      int _ok4=myFun18_1();      //r/ _ok0=_ok4;      if (_ok4==1) { myFun139_1(); }   }   if (_ok0==-1) {      int _ok5=myFun18_2();      //r/ _ok0=_ok5;      if (_ok5==1) { myFun139_2(); }   }   if (_ok0==-1) {      int _ok6=myFun8_3();      //r/ _ok0=_ok6;      if (_ok6==1) { myFun98_1(); }   }   if (_ok0==-1) {      int _ok7=myFun8_4();      _ok0=_ok7;      if (_ok7==1) { myFun24_1(); }   }}int mMaxX=0;int mMaxY=0;datetime myGlobalVDateTimeGet(string vcap) {   string hcap=vcap+"__h";   string lcap=vcap+"__l";   double h=GlobalVariableGet(hcap);   double l=GlobalVariableGet(lcap);   double r=h*1000000+l;   return (datetime)r;}void myGlobalVDateTimeSet(string vcap,datetime t) {   string hcap=vcap+"__h";   string lcap=vcap+"__l";   double f=(double)t;   double h=int(f/1000000);   double l=int(f)%1000000;   GlobalVariableSet(hcap,h);   GlobalVariableSet(lcap,l);}bool myGlobalVDateTimeCheck(string vcap) {   return GlobalVariableCheck(vcap+"__h");}bool myIsOpenByThisEA(_m_int om) {  if (订单识别码==0 && 强制判断识别码==0)  return true;  if (_订单识别码==0 && 强制判断识别码==0)  return true; //用户接口参数直接设置为0表示忽略识别码(判断的是“_订单识别码”,而非“订单识别码”,因此不影响区分手工单)  if (分组循环中==1) return om==订单识别码;   return om==订单识别码;}bool myIsOpenByThisEA2(_m_int om,int incSub) {  if (订单识别码==0 && 强制判断识别码==0)  return true;   if (_订单识别码==0 && 强制判断识别码==0)  return true; //用户接口参数直接设置为0表示忽略识别码(判断的是“_订单识别码”,而非“订单识别码”,因此不影响区分手工单)  if (分组循环中==1) return om==订单识别码;   if (订单识别码==0) return om==订单识别码 || (incSub && int(om/100000)==444); //避免将其它ea的小于100000的识别码误认为是手工单   return om==订单识别码 || (incSub && int(om/100000)==订单识别码);}void myCreateLabel(string str="mylabel",string ID="def_la1",long chartid=0,int xdis=20,int ydis=20,int fontsize=12,color clr=clrRed,int corner=CORNER_LEFT_UPPER) {    ObjectCreate(chartid,ID,OBJ_LABEL,0,0,0);    ObjectSetInteger(chartid,ID,OBJPROP_XDISTANCE,xdis);    ObjectSetInteger(chartid,ID,OBJPROP_YDISTANCE,ydis);    ObjectSetString(chartid,ID,OBJPROP_FONT,"Trebuchet MS");    ObjectSetInteger(chartid,ID,OBJPROP_FONTSIZE,fontsize);    ObjectSetInteger(chartid,ID,OBJPROP_CORNER,corner);    ObjectSetInteger(chartid,ID,OBJPROP_SELECTABLE,true);    ObjectSetString(chartid,ID,OBJPROP_TOOLTIP,"\n");    ObjectSetString(chartid,ID,OBJPROP_TEXT,str);   ObjectSetInteger(chartid,ID,OBJPROP_COLOR,clr);}double myLotsValid(string sym0,double lots,bool returnMin=false) {   double step=MarketInfo(sym0,MODE_LOTSTEP);   if (step<0.000001) { Alert("品种【",sym0,"】数据读取失败,请检查此品种是否存在。若有后缀,请包含后缀。");  return lots; }   int v=(int)MathRound(lots/step); lots=v*step;   double min=MarketInfo(sym0,MODE_MINLOT);   double max=MarketInfo(sym0,MODE_MAXLOT);   if (lots<min) {      if (returnMin) return min;      Alert("手数太小,不符合平台要求"); lots=-1;   }   if (lots>max) lots=max;   return lots;}double myLotsBs(string sym0,double lots0,double bs) {   double lots=lots0*bs; double l0=lots; lots=myLotsValid(sym0,lots,true);    if (MathAbs(lots0-l0)<0.00001) {      if (bs>1.000001) { lots+=MarketInfo(sym0,MODE_LOTSTEP); lots=myLotsValid(sym0,lots,true); }      else if (bs<1-0.000001) { lots-=MarketInfo(sym0,MODE_LOTSTEP); lots=myLotsValid(sym0,lots,true); }   }   return lots;}string 时间限制_时间前缀="使用期限:";string 时间限制_时间后缀="";string 时间过期_时间前缀="~~~~~~~已过使用期限:";string 时间过期_时间后缀="";bool myTimeLimit(string timestr) {   if (timestr=="") return true;   datetime t=StringToTime(timestr);   if (TimeCurrent()<t) {      myCreateLabel(时间限制_时间前缀+timestr+时间限制_时间后缀,mPreCap+"myTimeLimit",0,20,20,10,255,CORNER_LEFT_LOWER);      return true;   }   else {      myCreateLabel(时间过期_时间前缀+timestr+时间过期_时间后缀,mPreCap+"myTimeLimit",0,20,20,10,255,CORNER_LEFT_LOWER);      return false;   }}bool myAccountNumCheck() {   if (账号限制=="") return true;      ushort u_sep=StringGetCharacter("|",0);   string ss[1000]; int c=StringSplit(账号限制,u_sep,ss);   if (c>=1000) Alert("授权列表数量太大");      string s=string(AccountNumber());   for (int i=0;i<c;++i) if (s==ss) return true;        myCreateLabel("非授权账户账号:"+s,mPreCap+"onlyuser2");    return false; }void myDeleteGlobalVariableByPre(string pre) {   int len=StringLen(pre);   for (int i=GlobalVariablesTotal()-1;i>=0;--i) {      string cap=GlobalVariableName(i);      if (StringSubstr(cap,0,len)==pre)   GlobalVariableDel(cap);   }}void myObjectDeleteByPreCap(string PreCap) {//删除指定名称前缀的对象   int len=StringLen(PreCap);   for (int i=ObjectsTotal()-1;i>=0;--i) {      string cap=ObjectName(i);      if (StringSubstr(cap,0,len)==PreCap)         ObjectDelete(cap);   }}string myPeriodStr(int p0) {   int pid=0; if (p0==0) p0=Period();   string pstr;   switch (p0) {      case 1: pid=0; pstr="M1"; break;      case 5: pid=1; pstr="M5"; break;      case 15: pid=2; pstr="M15"; break;      case 30: pid=3; pstr="M30"; break;      case 60: pid=4; pstr="H1"; break;      case 240: pid=5; pstr="H4"; break;      case 1440: pid=6; pstr="D1"; break;      case 10080: pid=7; pstr="W1"; break;      case 43200: pid=8; pstr="MN"; break;      default: pstr=string(p0);   }   return pstr;}bool myOrderOks(_tn_int tn) {   if (_mPubTsExc>0) { for (int i=0;i<_mPubTsExc;++i) { if (_mPubTsExs==tn) return false; }  }   if (_mPubTsInc>=0){       int i=0; for (;i<_mPubTsInc;++i) { if (_mPubTsIns==tn) break; }       if (i>=_mPubTsInc) return false;     }   return true;}bool myFun8_1() {   return true;}bool myFun8_2() {   return true;}bool myFun18_1() {   double a=double(iCustom(sym,period,__A_指标名称,__做空箭头颜色序号,1+§));   int c=0;   double b=double(0.1);   c+=a>b;   b=99999999;   c+=a<b;   if (c==2) return true;   return false;}_p_int myFun139_1() {   指令执行了操盘=0;   _m_int magic=订单识别码;   int slip=最大允许滑点;   string comm=订单注释;   double pnt=MarketInfo(sym,MODE_POINT);   int type=1;    double lots=myLotsValid(sym,double(__手数),true);   double sl=double(0*_点系数);   double tp=double(int(__止盈点数)*_点系数);   datetime tm0=iTime(sym,period,0);   for(int pos=OrdersTotal()-1;pos>=0;pos--)           {      if (OrderSelect(pos,SELECT_BY_POS)==false) continue;      if (magic!=444 && myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;      if (sym!="" && OrderSymbol()!=sym) continue;      if (OrderOpenTime()>=tm0) return 0; //一根K线只建仓一单      if (OrderType()==type) return 0; //一个方向只持仓一单   }   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)           {    if (OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==false) continue;    if (magic!=444 && myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;    if (sym!="" && OrderSymbol()!=sym) continue;    if (OrderOpenTime()>=tm0) return 0; //一根K线只建仓一单    if (OrderCloseTime()<tm0) break;   }_tn_int t2=0;   for (int w=0;w<4;++w) { if (w>0) { Sleep(3000); Alert("~~~m=",magic,"~~~slip=",slip,"~~~~~建仓重试",w); RefreshRates(); }    double op2=0;   if (type==OP_BUY) op2=MarketInfo(sym,MODE_ASK);   else if (type==OP_SELL) op2=MarketInfo(sym,MODE_BID);   else return 0;   t2=OrderSend(sym,type,lots,op2,slip,0,0,comm,magic);   if (t2>0 && w>0) Alert("~~~~重试建仓成功");   if (t2<=0) {      int err=GetLastError();      if (err==134) { Alert("~~~~~~~~~~保证金不足,建仓手数无效:",lots); Sleep(3000); return 0; }      else if (err>=135 && err<=138) { Alert("~~m=",magic,"~~~网速慢或平台服务器卡~~~~~建仓失败:",err); continue; }      else Alert("~~m=",magic,"~~~~~~~~建仓失败:",err);      Sleep(3000); break;    }   else {      if ((sl>pnt || tp>pnt) && OrderSelect(t2,SELECT_BY_TICKET)) {         if (type==OP_BUY) {            if (sl>0.001) sl=OrderOpenPrice()-sl*MarketInfo(sym,MODE_POINT);            if (tp>0.001) tp=OrderOpenPrice()+tp*MarketInfo(sym,MODE_POINT);         }         else if (type==OP_SELL) {            if (sl>0.001) sl=OrderOpenPrice()+sl*MarketInfo(sym,MODE_POINT);            if (tp>0.001) tp=OrderOpenPrice()-tp*MarketInfo(sym,MODE_POINT);         }         if (OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==false)            Print("~~~~~~~~~设置止盈止损失败:",GetLastError());      }   }   if (t2>0) { 指令执行了操盘=1; break; }}      return t2;}bool myFun18_2() {   double a=double(iCustom(sym,period,__A_指标名称,__做多箭头颜色序号,1+§));   int c=0;   double b=double(0.1);   c+=a>b;   b=99999999;   c+=a<b;   if (c==2) return true;   return false;}_p_int myFun139_2() {   指令执行了操盘=0;   _m_int magic=订单识别码;   int slip=最大允许滑点;   string comm=订单注释;   double pnt=MarketInfo(sym,MODE_POINT);   int type=0;    double lots=myLotsValid(sym,double(__手数),true);   double sl=double(0*_点系数);   double tp=double(int(__止盈点数)*_点系数);   datetime tm0=iTime(sym,period,0);   for(int pos=OrdersTotal()-1;pos>=0;pos--)           {      if (OrderSelect(pos,SELECT_BY_POS)==false) continue;      if (magic!=444 && myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;      if (sym!="" && OrderSymbol()!=sym) continue;      if (OrderOpenTime()>=tm0) return 0; //一根K线只建仓一单      if (OrderType()==type) return 0; //一个方向只持仓一单   }   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)           {    if (OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==false) continue;    if (magic!=444 && myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;    if (sym!="" && OrderSymbol()!=sym) continue;    if (OrderOpenTime()>=tm0) return 0; //一根K线只建仓一单    if (OrderCloseTime()<tm0) break;   }_tn_int t2=0;   for (int w=0;w<4;++w) { if (w>0) { Sleep(3000); Alert("~~~m=",magic,"~~~slip=",slip,"~~~~~建仓重试",w); RefreshRates(); }    double op2=0;   if (type==OP_BUY) op2=MarketInfo(sym,MODE_ASK);   else if (type==OP_SELL) op2=MarketInfo(sym,MODE_BID);   else return 0;   t2=OrderSend(sym,type,lots,op2,slip,0,0,comm,magic);   if (t2>0 && w>0) Alert("~~~~重试建仓成功");   if (t2<=0) {      int err=GetLastError();      if (err==134) { Alert("~~~~~~~~~~保证金不足,建仓手数无效:",lots); Sleep(3000); return 0; }      else if (err>=135 && err<=138) { Alert("~~m=",magic,"~~~网速慢或平台服务器卡~~~~~建仓失败:",err); continue; }      else Alert("~~m=",magic,"~~~~~~~~建仓失败:",err);      Sleep(3000); break;    }   else {      if ((sl>pnt || tp>pnt) && OrderSelect(t2,SELECT_BY_TICKET)) {         if (type==OP_BUY) {            if (sl>0.001) sl=OrderOpenPrice()-sl*MarketInfo(sym,MODE_POINT);            if (tp>0.001) tp=OrderOpenPrice()+tp*MarketInfo(sym,MODE_POINT);         }         else if (type==OP_SELL) {            if (sl>0.001) sl=OrderOpenPrice()+sl*MarketInfo(sym,MODE_POINT);            if (tp>0.001) tp=OrderOpenPrice()-tp*MarketInfo(sym,MODE_POINT);         }         if (OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0)==false)            Print("~~~~~~~~~设置止盈止损失败:",GetLastError());      }   }   if (t2>0) { 指令执行了操盘=1; break; }}      return t2;}bool myFun8_3() {   return true;}_p_int myFun98_1() {   指令执行了操盘=0;   _m_int magic=订单识别码;   int slip=最大允许滑点;   string comm=订单注释;   double pnt=MarketInfo(sym,MODE_POINT);   int typ=0; string st="亏损加仓"; if (typ==1) st="盈利加仓";   double jg=double(int(__亏损加仓间隔点数));   double bs=double(double(__手数倍数));   int maxc=int(int(__最大加仓几单));   bool oneKone=0;   int slt=0; double sl=double(0);   int tpt=0; double tp=double(0);   {  //读取首单   double op00[2]={0,0}; _tn_int tn00[2]={0,0};   for(int pos=OrdersTotal()-1;pos>=0;pos--)           {      if (OrderSelect(pos,SELECT_BY_POS)==false) continue;      if (magic!=444 && myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;      if (sym!="" && OrderSymbol()!=sym) continue;      int t=OrderType();      if (t!=OP_BUY && t!=OP_SELL) continue;      if (tn00[t]==0 || OrderTicket()<tn00[t]) { op00[t]=OrderOpenPrice(); tn00[t]=OrderTicket(); }   }   //读取持仓数据   double op[2]={0,0},ls[2]={0,0}; int kc[2]={0,0},addc[2]={0,0};   datetime tm0=iTime(sym,period,0);   for(int pos=OrdersTotal()-1;pos>=0;pos--)           {      if (OrderSelect(pos,SELECT_BY_POS)==false) continue;      if (magic!=444 && myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;      if (sym!="" && OrderSymbol()!=sym) continue;      int t=OrderType();      if (t!=OP_BUY && t!=OP_SELL) continue;      if (t==OP_BUY) {         if (typ==0 && (op[t]<pnt || OrderOpenPrice()<op[t])) { op[t]=OrderOpenPrice(); ls[t]=OrderLots(); } //亏损加仓,搜索价格最低的buy单         else if (typ==1 && (op[t]<pnt || OrderOpenPrice()>op[t])) { op[t]=OrderOpenPrice(); ls[t]=OrderLots(); } //盈利加仓         if (typ==0 && op00[t]-OrderOpenPrice()>=pnt) addc[t]+=1;         else if (typ==1 && OrderOpenPrice()-op00[t]>=pnt) addc[t]+=1;      }      else {         if (typ==0 && (op[t]<pnt || OrderOpenPrice()>op[t])) { op[t]=OrderOpenPrice(); ls[t]=OrderLots(); }          else if (typ==1 && (op[t]<pnt || OrderOpenPrice()<op[t])) { op[t]=OrderOpenPrice(); ls[t]=OrderLots(); }          if (typ==0 && OrderOpenPrice()-op00[t]>=pnt) addc[t]+=1;         else if (typ==1 && op00[t]-OrderOpenPrice()>=pnt) addc[t]+=1;      }      if (OrderOpenTime()>=tm0) kc[t]+=1;   }      //加仓   int z=0;   if (op[z]>pnt && (oneKone==false || kc[z]==0) && addc[z]<maxc) { int type=OP_BUY; double op0=op[z]; double ls0=ls[z];       double op2=MarketInfo(sym,MODE_ASK);       if ((typ==0 && op0-op2>=jg*pnt) || (typ==1 && op2-op0>=jg*pnt)) {         double lots=myLotsBs(sym,ls0,bs);         if (slt==0 && sl>0.001) sl=op2-sl*pnt;         if (tpt==0 && tp>0.001) tp=op2+tp*pnt;         static datetime errtm1=0,errtm2=0; datetime cur=TimeCurrent();          if (cur-errtm1>60*_132间隔分钟 && cur-errtm2>60*_其它间隔分钟) {            Print("~~~~~~~~~~~",st);            _tn_int tn=OrderSend(sym,type,lots,op2,slip,sl,tp,st+"_"+comm,magic);            if (tn<=0) { int err=GetLastError();               if (err==132) { errtm1=TimeCurrent(); Print("~~~~~~~本品种市场未开市"); }               else { errtm2=TimeCurrent(); Print("~~~~~~~~~~buy加仓错误:",err,",lots=",lots); }            }            else 指令执行了操盘=1;         }      }   }      z=1;   if (op[z]>pnt && (oneKone==false || kc[z]==0) && addc[z]<maxc) { int type=OP_SELL; double op0=op[z]; double ls0=ls[z];      double op2=MarketInfo(sym,MODE_BID);       if ((typ==0 && op2-op0>=jg*pnt) || (typ==1 && op0-op2>=jg*pnt)) {         double lots=myLotsBs(sym,ls0,bs);         if (slt==0 && sl>0.001) sl=op2+sl*pnt;         if (tpt==0 && tp>0.001) tp=op2-tp*pnt;         static datetime errtm1=0,errtm2=0; datetime cur=TimeCurrent();          if (cur-errtm1>60*_132间隔分钟 && cur-errtm2>60*_其它间隔分钟) {            Print("~~~~~~~~~~~",st);            _tn_int tn=OrderSend(sym,type,lots,op2,slip,sl,tp,st+"_"+comm,magic);            if (tn<=0) { int err=GetLastError();               if (err==132) { errtm1=TimeCurrent(); Print("~~~~~~~本品种市场未开市"); }               else { errtm2=TimeCurrent(); Print("~~~~~~~~~~sell加仓错误:",err,",lots=",lots); }            }            else 指令执行了操盘=1;         }      }   }}   return 0;}bool myFun8_4() {   return true;}_p_int myFun24_1() {   指令执行了操盘=0;   int slip=最大允许滑点;   string comm=订单注释;   double pnt=MarketInfo(sym,MODE_POINT);   int digit=(int)MarketInfo(sym,MODE_DIGITS);   double tpp=double(int(__均价止盈点数));   int minc=2;   int canBig=0;   //if (tpp<pnt) return 0; {  double op[2]={0,0},ls[2]={0,0}; int oc[2]={0,0};   for(int pos=OrdersTotal()-1;pos>=0;pos--)           {      if (OrderSelect(pos,SELECT_BY_POS)==false) continue;      if (myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;      if (sym!="" && OrderSymbol()!=sym) continue;      int t=OrderType();      if (t!=OP_BUY && t!=OP_SELL) continue;      if (myOrderOks(OrderTicket())==false) continue;      op[t]+=OrderOpenPrice()*OrderLots(); ls[t]+=OrderLots(); oc[t]+=1;   }   for (int i=0;i<2;++i) {      if (oc==0) continue;      op/=ls; op=NormalizeDouble(op,digit);   }   //修改止盈价   int z=0;   if (oc[z]>0 && oc[z]>=minc) { int type=OP_BUY; double tpaver=op[z]+tpp*pnt;      for(int pos=OrdersTotal()-1;pos>=0;pos--) {         if (OrderSelect(pos,SELECT_BY_POS)==false) continue;         if (myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;         if (sym!="" && OrderSymbol()!=sym) continue;         if (OrderType()!=type) continue;         if (myOrderOks(OrderTicket())==false) continue;         if (MathAbs(OrderTakeProfit()-tpaver)<pnt) continue;         if (canBig==false && OrderTakeProfit()>pnt && tpaver>OrderTakeProfit()) continue;         if (OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tpaver,OrderExpiration())==false)             Print("buy止盈修改失败#",OrderTicket(),",",OrderSymbol(),",",GetLastError());         else 指令执行了操盘=1;      }   }   z=1;   if (oc[z]>0 && oc[z]>=minc) { int type=OP_SELL; double tpaver=op[z]-tpp*pnt;      for(int pos=OrdersTotal()-1;pos>=0;pos--) {         if (OrderSelect(pos,SELECT_BY_POS)==false) continue;         if (myIsOpenByThisEA2(OrderMagicNumber(),1)==false) continue;         if (sym!="" && OrderSymbol()!=sym) continue;         if (OrderType()!=type) continue;         if (myOrderOks(OrderTicket())==false) continue;         if (MathAbs(OrderTakeProfit()-tpaver)<pnt) continue;         if (canBig==false && OrderTakeProfit()>pnt && tpaver<OrderTakeProfit()) continue;         if (OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tpaver,OrderExpiration())==false)             Print("sell止盈修改失败#",OrderTicket(),",",OrderSymbol(),",",GetLastError());         else 指令执行了操盘=1;      }   }}      return 0;}

""
还没有人打赏,支持一下

评论|共 2 个

简单爱_4721

发表于 2025-2-2 22:08:08 | 显示全部楼层

此帖仅作者可见

随势

发表于 2025-2-2 22:10:19 | 显示全部楼层

此帖仅作者可见

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则