简介

MetaTrader 5 客户端容许摞合处置多个事务。 EA 买卖。这很简略 – 只需翻开几张扮演角色,那时的将 EA 这些买卖附在他们缺席人。。万一每个 EA 通信量和静止分类的同卵的买卖 EA 职业孤独任务,这将是无可比拟的(运用两样的买卖分类) EA 买卖中缺席同一的成绩。。

一号,它容许 EA 买卖与考验机能和Optimizati四脚着地的。。仓库栈设置学期能够打开所安排的WA的浆糊。。万一稍许的 EA 通信量运用同卵的分类,它们会彼此交流。

其次件更要紧的事实是容许 EA 该买卖由于 EA 在买卖中家具的买卖战略运用两样的本钱明智地使用。顶点 – 可以监控整个 EA 事务的算是,召唤时亲近的 EA 买卖。

1. 承载力计算的普通规律

在修建仓库栈时,你可以把它传送给 OrderSend() 行使职责的 MqlTradeRequest 在作文中详述幻数的值,记分用神奇的数字。实施定货单时,该买卖也跺脚了一个人神奇的定货单音量。。而且,历史记载射中靶子买卖剖析,敝可以看一眼差额。 EA 由事务安排的事务。

总获名次的计算方法相当简略。:插图画家说起,万一你够支付 手工通信量,那时的静止人买 手,再典型的 手,则总持仓量将值得的 +-=+ 手。让敝补充物够支付量,减去销售量,就欢迎总持仓量。

在总持仓量值得的 0 开端计算是奇异的要紧的。。一号个亦最清楚的的时期点是开一个人存款。。换句话说,你可以用它 HistorySelect() 行使职责询问存款的自己的事物事务历史记载,行使职责的一号个限制因素值得的行使职责的一号个限制因素。 0(最不克不及够的时期),其次个限制因素的值是 TimeCurrun()(维修服务的最新已知时期):

HistorySelect(0,TimeCurrent()); // 瞄准史料

纷纷,从头到尾遍历整个历史,每个事务具有详述的幻数,补充物够支付财富,减去销售量。这亦一个人清算条件。,但在实践中,买卖的历史能够奇异的大。。这能够会产生主修的产生影响。 EA 买卖的快速,尤其地在考验和使尽可能有效具有某个时代特征的,同一你就不克不及现实运用它了 EA 买卖。敝需求找出ToTa的买卖历史射中靶子顶点时辰。。

以此,敝理所自然先看整体的个历史,找出总额。 P的净思索量值得的零的顶点一分钟。。找到这时期点接近末期的,敝把它保全在一个人变量(正规军回忆时期)。接近末期的,EA 事务将从做蜜饯的时期开端记载事务历史记载。。一个人更好地的receive 接收是将该时期点做蜜饯在CLI的全程变量中。,而缺陷 EA 买卖的变量,由于在后一种影响下,零件 EA 事务销毁变量。。

在此类影响下,固然 EA 买卖已开端,您还需求瞄准所需的最小历史记载。,缺陷整个买卖的历史记载。很多 EA 买卖可以在异体同形的分类上买卖。,因而敝将与自己的事物 EA 事务共享这全程变量(计入最新的零栈)。。

让敝离去题目,思索客户端全程变量的运用,这容许各自的 EA 通信量运用同卵的分类(能够具有两样的限制因素),制止 EA 由事务的两样先例安排的著名的人物的反复。

2. 运用客户端的全程变量

MQL5 语言文字有 MQL5InfoString() 行使职责,容许进入 mql5 顺序的两样交流。

获取关系名声的交流,运用 MQL5_PROGRAM_NAME 检验人转会此行使职责。:

MQL5InfoString(MQL5_PROGRAM_NAME); // EA 名

于是,敝有一个人 EA 作为全程变量著名的人物创办的通信量著名的人物。一个人 EA 买卖能够关涉各自的买卖分类。;这辱骂敝需求添加买卖分类的著名的人物(买卖)。。各自的 EA 事务可以处置异体同形典型的事务。,不过时期陷害两样(两样的设置),瞄准这些影响,敝需求运用幻数。于是,敝也补充物了使中邪数。

插图画家说起,万一 EA 买卖有一个人回忆在变量 Magic_N 其射中靶子神奇数,敝将它添加到全程变量的著名的人物。。

自己的事物全程变量的著名的人物列举如下:

gvp=MQL5InfoString(MQL5_PROGRAM_NAME)+"_"+_Symbol+"_"+IntegerToString(Magic_N)+"_"; // EA著名的人物和商号 
                                                                            // 它的神奇数

内幕的 GVP(全程变量前缀)是在公共VaR中供述的字母串变量。。

据我看来弄清这术语,以制止全程变量的涂污。,由于他们在节目中运用(全程变量在自己的事物FU金中都可见),而行使职责的关心的变量仅在向内的功用部可见)。

但这边是,敝的地步两样。 – 术语全程变量指的是客户端的全程变量(SP)。,经过 GlobalVariable…() 行使职责的运用。议论节目中运用的全程变量时,敝将运用公共变量这词。。关心的变量是指一个人关心的变量。。

全程变量奇异的效用,由于他们在 EA 设定初值事务(EA) 买卖、客户端和数纸机重启)接近末期的依然做蜜饯它们的值,不过在考验时尚中,理所自然卸下自己的事物变量(或在使尽可能有效列队行进中截先前的传送)。在现实经营中理所自然运用的全程变量是分配符。;考验列队行进中安排的全程变量理所自然在考验后截。。不过你不理所自然修正或截 EA 事务安排的全程变量。

运用 AccountInfoInteger() 功用与运用 ACCOUNT_TRADE_MODE 检验人转会行使职责,你可以区别如今时的的时尚:考验顺序、演示或现实存款。

让敝给全程变量添加一个人前缀:”d” – 运用演示解释,”r” – 运用现实存款,”t” – 在战略考验顺序中任务:

gvp=MQL5InfoString(MQL5_PROGRAM_NAME)+"_"+_Symbol+"_"+IntegerToString(Magic_N)+"_"; // EA 姓名和商号
                                                                            // 和 EA 的幻数
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_DEMO))
  {
   gvp=gvp+"d_"; // 演示存款
  }
if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
  {
   gvp=gvp+"r_"; // 现实
  }
if(MQL5InfoInteger(MQL5_TESTING))
  {
   gvp=gvp+"t_"; // 考验
  } 

功用理所自然因为 EA 买卖的 OnInit() 行使职责转会。

如前一篇文字中提到的,在考验具有某个时代特征的理所自然截全程变量,换句话说,敝需求在 EA 买卖的 OnDeinit() 行使职责添加截全程变量的行使职责:

void fDeleteGV()
  {
   if(MQL5InfoInteger(MQL5_TESTING)) // 考验时尚
     {
      for(int i=GlobalVariablesTotal()-1;i>=0;i--) // 反省自己的事物全程变量 (从后到前)
        {
         if(StringFind(GlobalVariableName(i),gvp,0)==0) // 搜索详述的前缀
           {
            GlobalVariableDel(GlobalVariableName(i)); // 截变量
           }
        }
     }
  }

眼前是不克不及够的。 MetaTrader 5 向内的挂考验,那缺陷抵押的 OnDeinit() 行使职责的实施,但不远的将来能够会产生。敝不知情敝能否会在挂战略考验PRO接近末期的实施 OnDeinit() 行使职责,因而敝在 EA 当事务开端运转时,全程变量被截。 – 在 OnInit() 向内的功用。

敝欢迎了它 OnInit() 和 OnDeinit() 行使职责的以下信号:

intOnInit()
  {
   fCreateGVP(); // 安排客户航空站全程变量名的前缀
   fDeleteGV();  // 当考验时,截全程变量
   return(0);
  }

voidOnDeinit(constint 争辩)
  {
   fDeleteGV();  // 当考验时,截全程变量
  }

敝还可以经过安排行使职责来理想化的事物全程变量的运用。 GlobalVariableSet(gvp+…)。

设置全程变量值的行使职责:

void fGVS(string aName,double 雪崩)
  {
   GlobalVariableSet(gvp+aName,雪崩);
  }

获取全程变量值的行使职责:

double fGVG(string 阿纳姆)
  {
   return(GlobalVariableGet(gvp+阿纳姆));
  }

截全程变量的行使职责:

void fGVD(string 阿纳姆)
  {
   GlobalVariableDel(gvp+阿纳姆);
  }

敝议论了全程变量。,但这还缺陷整个。。

敝需求为买卖封爵全程变量的能够性。,并在存款和战略考验顺序中开价两样的经营。。这些全程变量的著名的人物不应依赖于这些著名的人物。 EA 买卖的著名的人物和用魔法变出数。

让敝为全程变量前缀供述另一个人变量。,命名为 “Commom_gvp”。纷纷,运用存款时,其值为 “COMMON”,运用战略考验顺序时,其值与变量 gvp 异体同形的(在战略重行开端先于或接近末期的截变量)。

顶点,预备全程变量前缀的行使职责具有以下整队:

void fCreateGVP()
  {
   gvp=MQL5InfoString(MQL5_PROGRAM_NAME)+"_"+_Symbol+"_"+IntegerToString(Magic_N)+"_";
   Commom_gvp="COMMOM_"; // 自己的事物 EA 公共变量前缀
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_DEMO)
     {
      gvp=gvp+"d_";
     }
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      gvp=gvp+"r_";
     }
   if(MQL5InfoInteger(MQL5_TESTING))
     {
      gvp=gvp+"t_";
      Commom_gvp=gvp; // 用于考验, 变量有同一的前缀 
                      // 考验后将截考验
     }
  }

某些人能够以为全程变量的前缀除非e。 – 演示与现实存款的零件,考验时期 “t” 前缀,固然它可以被添加来代表敝 EA 在战略考验顺序中任务的事务的标点。 “t” 来博得。但我要同一做。敝不知情不远的将来和剖析 EA 这项任务需求做什么。

贮存并不相似的他们说的这么令人悲哀或忧伤的事物。。

上述的功用辱骂客户端处置存款。,他们的任务缺席互换。取缔进入 EA 在买卖列队行进中变化账户名称。自然,万一需求,您可以经过向大局VA的著名的人物添加存款来处理此成绩。。

另一件奇异的要紧的事实!全程变量著名的人物的上胶料不得超越 63 个刻。于是,别向你屈从 EA 标记太长了。。

敝早已完毕了全程变量的议论。,如今是时分深思这篇文字的题目了。:用详述的幻数计算仓库栈充其量的。

3. 持产水量计算

率先,让敝运用它 GlobalVariableCheck() 行使职责反省能否有一个人全程变量输入顶点一个人零持仓量时期的相互关系交流(为了简略起见,万一缺席已设立的获名次,敝相同的的全无的。

万一有同一的变量 – 让敝因为回忆在VARI射中靶子时期开端瞄准事务历史。,若非敝将瞄准整个历史记载:

if(GlobalVariableCheck(Commom_gvp+sSymbol+"_HistStTm")) // 做蜜饯仓库栈 "零" 时期时期
  {
   pLoadHistoryFrom=(datetime)GlobalVariableGet(Commom_gvp+pSymbol+"_HistStTm"); // 设定初值时期设置 
                                                                             // 只选择所需的史料
  }
else
 {
   GlobalVariableSet(Commom_gvp+sSymbol+"_HistStTm",0);
 }
if(!HistorySelect(sLoadHistoryFrom,TimeCurrent())) // 装填和约历史的召唤把正式送入精神病院
  { 
   return(假)
  } 

接下来,敝构成释义了买卖分类的总净获名次。:

double CurrentVolume=fSymbolLots(pSymbol);

运用 fSymbolLots() 保全资格的行使职责决议。

有几种方法可以博得仓库栈。:比如,它可以被运用。 PositionSelect() 行使职责完毕。万一行使职责与应有的数量相符表 false,这辱骂缺席获名次(思索量值得的零)。。万一行使职责与应有的数量相符表 true,可以运用 PositionGetDouble() 功用与 POSITION_VOLUME 保全资格检验人。运用 PositionGetInteger() 功用与 POSITION_TYPE 检验人决议获名次(补进或典型的)。长筒仓,行使职责与应有的数量相符表积极价值,短仓,行使职责与应有的数量相符表消极性。

整体的行使职责看起来好像列举如下:

double fSymbolLots(string 不对等的的)
  {
   if(PositionSelect(证章),1000)) // 打杂选择成, 因而它在
     {
      switch(PositionGetInteger(POSITION_TYPE)) // 基本原则定位与应有的数量相符表正负
        {
         casePOSITION_TYPE_BUY:
            return(NormalizeDouble(PositionGetDouble(POSITION_VOLUME),2));
            break;
         casePOSITION_TYPE_SELL:
            return(NormalizeDouble(-PositionGetDouble(POSITION_VOLUME),2));
            break;
        }
     }
   else
     {
      return(0);
     }
  }

而且,您可以经过遍历自己的事物态度来决议买卖分类的总持仓量,打杂的音量因为 PositionsTotal() 行使职责决议。接近末期的,运用 PositionGetSymbol() 功用寻觅召唤的买卖分类,独自运用 PositionGetDouble() 功用与 POSITION_VOLUME 检验人和 PositionGetInteger() 功用与 POSITION_TYPE 检验人决议获名次的音量和定位。。

在这窥测中,预备即时的行使职责具有以下整队: 

double fSymbolLots(string 不对等的的)
  {
   double TmpLots=0;
   for(int i=0;i<PositionsTotal();i++) // 遍历自己的事物获名次
     {
      if(PositionGetSymbol(i)==不对等的的) // 敝一下子看到思索详述的买卖。
        {
         TmpLots=PositionGetDouble(POSITION_VOLUME);
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            TmpLots*=-1; // 由于保全典型的跺脚          }
         break;
        }
     }
   TmpLots=NormalizeDouble(TmpLots,2);
   return(TmpLots);
  }

决议如今时的获名次后,敝将从尾遍历事务历史。,直到总持仓量值得的如今时的持仓量。

运用 HistoryDealsTotal() 行使职责决议事务的安定历史上胶料。,运用 HistoryDealGetTicket() 行使职责决议每个事务的文档。,运用 HistoryDealGetInteger() 行使职责(DEAL_TYPE 检验人表现事务典型和 HistoryDealGetDouble()(DEAL_VOLUME 检验人表现事务量以滴下TAC。:

double Sum=0; 
int FromI=0;
int FromTicket=0;
for(int i=HistoryDealsTotal()-1;i>=0;i--) // 从火线遍历自己的事物和约 
  {
   ulong ticket=HistoryDealGetTicket(i); // 博得和约的双数
   if(票)!=0)
     {
      switch(HistoryDealGetInteger(票),DEAL_TYPE)) // 基本原则CO的定位补充物或增加获名次
        {
         caseDEAL_TYPE_BUY:
            Sum+=HistoryDealGetDouble(票),DEAL_VOLUME);
            Sum=NormalizeDouble(和),2);
            break;
         caseDEAL_TYPE_SELL:
            Sum-=HistoryDealGetDouble(票),DEAL_VOLUME);
            Sum=NormalizeDouble(和),2);
            break;
        }
      if(CurrentVolume==Sum) // 自己的事物和约都被扫描过了。
        {
         sLoadHistoryFrom=HistoryDealGetInteger(票),DEAL_TIME); // 做蜜饯仓库栈 "零" 时期时期
         GlobalVariableSet(Commom_gvp+不对等的的+"_HistStTm",sLoadHistoryFrom);
         FromI=i; // 做蜜饯调
         break;
        }
     }
  }

当敝找到这点,敝将时期回忆到将在以后的瞄准买卖历史记载时运用的全程变量(历史记载射中靶子买卖调回忆在 FromI 在变量中)。

在调中 FromI 买卖前,买卖分类的总持仓量值得的零。

如今,敝因为 FromI 走到历史记载的止境,并与应有的数量相符计入详述使中邪n的事务量。:

staticdouble sVolume=0;
staticulong sLastTicket=0;
for(int i=FromI;i<HistoryDealsTotal();i++) // 从一号和约到顶点
  {
   ulong ticket=HistoryDealGetTicket(i);   // 以和约的双数为准
   if(票)!=0)
     {
      if(HistoryDealGetString(票),DEAL_SYMBOL)==不对等的的) // 详述买卖分类
        {
         long PosMagic=HistoryDealGetInteger(票),DEAL_MAGIC);
         if(PosMagic==aMagic || aMagic==-1) // 详述认出号
           {
            switch(HistoryDealGetInteger(票),DEAL_TYPE)) // 增减持仓获名次 
                                                       // 基本原则和约的典型
              {
               caseDEAL_TYPE_BUY:
                  sVolume+=HistoryDealGetDouble(票),DEAL_VOLUME);
                  sLastTicket=ticket;
                  break;
               caseDEAL_TYPE_SELL:
                  sVolume-=HistoryDealGetDouble(票),DEAL_VOLUME);
                  sLastTicket=ticket;
                  break;
              }
           }
        }
     }
  } 

朝反方向完毕后,敝将基本原则详述的幻数博得如今时的获名次。,详述的幻数的顶点一个人事务文档将被回忆。 sLastTicket 变量中,实施买卖后,输入详述幻数的总持仓量将值得的 sVolume。功用初步任务的完毕。

sLoadHistoryFrom、sLastTicket 和 sVolume 变量被供述为动态变量(它们在TH接近末期的回忆它们的值)。,这些行使职责将在他日转会行使职责时运用。。

敝有时期(买卖历史的起始点)、买卖单证、实施买卖后的总持仓量将具有如今时的值。

由于零点思索时期,十足遍历从如今时的时期到做蜜饯时期的时期,并终止买卖量汇总,做蜜饯持仓量和顶点一笔买卖的单证。

于是,EA 买卖的总持仓量的计算是对顶点几笔买卖的处置:

if(!HistorySelect(sLoadHistoryFrom,TimeCurrent())) // 询问到如今时的时期的和约历史
  {
   return(假)
  }
for(int i=HistoryDealsTotal()-1;i>=0;i--) // 从完毕到前朝反方向
  {
   ulong ticket=HistoryDealGetTicket(i); // 取一个人数字
   if(票)!=0)
     {
      if(票)==sLastTicket) // 敝找到了计算好的和约。, 做蜜饯二人对抗赛数字并终止朝反方向
        {
         sLastTicket=HistoryDealGetTicket(HistoryDealsTotal()-1);
         break;
        }
      switch(HistoryDealGetInteger(票),DEAL_TYPE)) // 基本原则和约的典型增减持仓获名次      
        {
         caseDEAL_TYPE_BUY:
            sVolume+=HistoryDealGetDouble(票),DEAL_VOLUME);
            break;
         caseDEAL_TYPE_SELL:
            sVolume-=HistoryDealGetDouble(票),DEAL_VOLUME);
            break;
        }
     }
  }

行使职责的算法可以表现列举如下:

整体的的行使职责:

bool fGetPositionVolume(string 不对等的的,int aMagic,double aVolume)
  {
   staticbool FirstStart=false;
   staticdouble sVolume=0;
   staticulong sLastTicket=0;
   staticdatetime sLoadHistoryFrom=0;
   // 当 EA 开端时,行使职责的最早的实施
   if(!FirstStart)
     {
      if(GlobalVariableCheck(Commom_gvp+不对等的的+"_HistStTm"))
        {
         sLoadHistoryFrom=(datetime)GlobalVariableGet(Commom_gvp+不对等的的+"_HistStTm");
        }
      else
        {
         GlobalVariableSet(Commom_gvp+不对等的的+"_HistStTm",0);
        }
      if(!HistorySelect(sLoadHistoryFrom,TimeCurrent())) // 万一报答不成, 
                                                      // 敝将反复下闪光灯下摄成的照片的价钱
        {
         return(假)
        }
      double CurrentVolume=fSymbolLots(不对等的的); // 总保全资格
      double Sum=0;
      int FromI=0;
      int FromTicket=0;
      // 搜索零点的顶点时期
      for(int i=HistoryDealsTotal()-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(票)!=0)
           {
            switch(HistoryDealGetInteger(票),DEAL_TYPE))
              {
               caseDEAL_TYPE_BUY:
                  Sum+=HistoryDealGetDouble(票),DEAL_VOLUME);
                  Sum=NormalizeDouble(和),2);
                  break;
               caseDEAL_TYPE_SELL:
                  Sum-=HistoryDealGetDouble(票),DEAL_VOLUME);
                  Sum=NormalizeDouble(和),2);
                  break;
              }
            if(CurrentVolume==Sum)
              {
               sLoadHistoryFrom=HistoryDealGetInteger(票),DEAL_TIME);
               GlobalVariableSet(Commom_gvp+不对等的的+"_HistStTm",sLoadHistoryFrom);
               FromI=i;
               break;
              }
           }
        }
      // 计算详述的认识号和转位的获名次
      for(int i=FromI;i<HistoryDealsTotal();i++)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(票)!=0)
           {
            if(HistoryDealGetString(票),DEAL_SYMBOL)==不对等的的)
              {
               long PosMagic=HistoryDealGetInteger(票),DEAL_MAGIC);
               if(PosMagic==aMagic || aMagic==-1)
                 {
                  switch(HistoryDealGetInteger(票),DEAL_TYPE))
                    {
                     caseDEAL_TYPE_BUY:
                        sVolume+=HistoryDealGetDouble(票),DEAL_VOLUME);
                        sLastTicket=ticket;
                        break;
                     caseDEAL_TYPE_SELL:
                        sVolume-=HistoryDealGetDouble(票),DEAL_VOLUME);
                        sLastTicket=ticket;
                        break;
                    }
                 }
              }
           }
        }
      FirstStart=true;
     }

   // 重行计算和约的思索量 (详述买卖分类和认识号)
   // , 零保全时期后
   if(!HistorySelect(sLoadHistoryFrom,TimeCurrent()))
     {
      return(假)
     }
   for(int i=HistoryDealsTotal()-1;i>=0;i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      if(票)!=0)
        {
         if(票)==sLastTicket)
           {
            sLastTicket=HistoryDealGetTicket(HistoryDealsTotal()-1);
            break;
           }
         switch(HistoryDealGetInteger(票),DEAL_TYPE))
           {
            caseDEAL_TYPE_BUY:
               sVolume+=HistoryDealGetDouble(票),DEAL_VOLUME);
               break;
            caseDEAL_TYPE_SELL:
               sVolume-=HistoryDealGetDouble(票),DEAL_VOLUME);
               break;
           }
        }
     }
   aVolume=NormalizeDouble(sVolume,2);;
   return(真)
  }

事务阶级和用魔法变出数被传送回R的行使职责。。万一成,与应有的数量相符表 true,若非与应有的数量相符表 false。

成时,它将询问的音量与应有的数量相符表到传送给行使职责的变量。 aVolume。在行使职责中供述的动态变量不容许运用这具有两样限制因素(买卖分类和幻数)的行使职责。

在 MQL4 中,可以运用两样的著名的人物安排此行使职责的正本。,那时的繁殖另一对买卖分类用魔法变出麻痹。,或变量 FirstStart、sVolume、sLastTicket、sLoadHistoryFrom 供述是公共变量 – 关于每一对通信量分类-用魔法变出数字,并把它们传送给行使职责来处理这成绩。

在 MQL5 中,它也可以以同一的方法博得。,不过 MQL5 有一个人更近便的的标点 – 类,在这种关心,这门课的运用很有理。。教室时期的运用,敝理所自然为每一对事务安排每个类的先例-MAG。,从科学实验中提取的价值将回忆在每个类先例中。。

让敝供述 PositionVolume 类。在向内的功用供述为动态变量的自己的事物变量,每将被颁布发表为 人事栏(人事栏),要不是 Volume 变量外,敝将不会距它 EA 通信量导演运用它们。不过,孤独地在实施计算功用接近末期的,敝才需求它。。敝还颁布发表 Symbol 和 Magic 变量 – 将它们传送给行使职责是不克不及够的。,孤独地一次设定初值类先例。

类具有两个协同的行使职责:设定初值行使职责和用于持产水量计算的行使职责,连同一个人用于决议总持仓量的公有行使职责:

class PositionVolume
  {
private:
   string            pSymbol;
   int               pMagic;
   bool              pFirstStart;
   ulong             pLastTicket;
   double            pVolume;
   datetime         pLoadHistoryFrom;
   double            SymbolLots();
public:
   void Init(string 不对等的的,int 阿莫伊)
     {
      pSymbol=不对等的的;
      pMagic=aMagic;
      pFirstStart=false;
      pLastTicket=0;
      pVolume=0;
     }
   bool              GetVolume(double  &aVolume);
  }; 
bool PositionVolume::GetVolume(double  &aVolume)
  {
   if(!pFirstStart)
     {
      if(GlobalVariableCheck(Commom_gvp+pSymbol+"_HistStTm"))
        {
         pLoadHistoryFrom=(datetime)GlobalVariableGet(Commom_gvp+pSymbol+"_HistStTm");
        }
      else
        {
         GlobalVariableSet(Commom_gvp+pSymbol+"_HistStTm",0);
        }
      if(!HistorySelect(pLoadHistoryFrom,TimeCurrent()))
        {
         return(假)
        }
      double CurrentVolume=fSymbolLots(pSymbol);
      double Sum=0;
      int FromI=0;
      int FromTicket=0;
      for(int i=HistoryDealsTotal()-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(票)!=0)
           {
            switch(HistoryDealGetInteger(票),DEAL_TYPE))
              {
               caseDEAL_TYPE_BUY:
                  Sum+=HistoryDealGetDouble(票),DEAL_VOLUME);
                  Sum=NormalizeDouble(和),2);
                  break;
               caseDEAL_TYPE_SELL:
                  Sum-=HistoryDealGetDouble(票),DEAL_VOLUME);
                  Sum=NormalizeDouble(和),2);
                  break;
              }
            if(CurrentVolume==Sum)
              {
               pLoadHistoryFrom=HistoryDealGetInteger(票),DEAL_TIME);
               GlobalVariableSet(Commom_gvp+pSymbol+"_HistStTm",pLoadHistoryFrom);
               FromI=i;
               break;
              }
           }
        }
      for(int i=FromI;i<HistoryDealsTotal();i++)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(票)!=0)
           {
            if(HistoryDealGetString(票),DEAL_SYMBOL)==pSymbol)
              {
               long PosMagic=HistoryDealGetInteger(票),DEAL_MAGIC);
               if(PosMagic==pMagic || pMagic==-1)
                 {
                  switch(HistoryDealGetInteger(票),DEAL_TYPE))
                    {
                     caseDEAL_TYPE_BUY:
                        pVolume+=HistoryDealGetDouble(票),DEAL_VOLUME);
                        pLastTicket=ticket;
                        break;
                     caseDEAL_TYPE_SELL:
                        pVolume-=HistoryDealGetDouble(票),DEAL_VOLUME);
                        pLastTicket=ticket;
                        break;
                    }
                 }
              }
           }
        }
      pFirstStart=true;
     }
   if(!HistorySelect(pLoadHistoryFrom,TimeCurrent()))
     {
      return(假)
     }
   for(int i=HistoryDealsTotal()-1;i>=0;i--)
     {
      ulong ticket=HistoryDealGetTicket(i);
      if(票)!=0)
        {
         if(票)==pLastTicket)
           {
            break;
           }
         if(HistoryDealGetString(票),DEAL_SYMBOL)==pSymbol)
           {
            long PosMagic=HistoryDealGetInteger(票),DEAL_MAGIC);
            if(PosMagic==pMagic || pMagic==-1)
              {
               switch(HistoryDealGetInteger(票),DEAL_TYPE))
                 {
                  caseDEAL_TYPE_BUY:
                     pVolume+=HistoryDealGetDouble(票),DEAL_VOLUME);
                     break;
                  caseDEAL_TYPE_SELL:
                     pVolume-=HistoryDealGetDouble(票),DEAL_VOLUME);
                     break;
                 }
              }
           }
        }
     }
   if(HistoryDealsTotal()>0)
     {
      pLastTicket=HistoryDealGetTicket(HistoryDealsTotal()-1);
     }
   pVolume=NormalizeDouble(pVolume,2);
   aVolume=pVolume;
   return(真)
  }
double PositionVolume::SymbolLots()
  {
   double TmpLots=0;
   for(int i=0;i<PositionsTotal();i++)
     {
      if(PositionGetSymbol(i)==pSymbol)
        {
         TmpLots=PositionGetDouble(POSITION_VOLUME);
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            TmpLots*=-1;
           }
         break;
        }
     }
   TmpLots=NormalizeDouble(TmpLots,2);
   return(TmpLots);
  }

关于每一对买卖分类——运用同一一个人神奇的数字,理所自然安排类先例:

PositionVolume PosVol11;
PositionVolume PosVol12;
PositionVolume PosVol21;
PositionVolume PosVol22;

它理所自然在 EA 买卖的 OnInit() 行使职责设定初值,比如:

(Symbol_1,Magic_1); 
(Symbol_1,Magic_2);
(Symbol_2,Magic_1); 
(Symbol_2,Magic_2);   

接近末期的,您可以基本原则详述的买卖典型和M博得您的思索量。。让敝转会通信的的类先例 GetVolume 行使职责。

万一成,它与应有的数量相符表 true,并将一个人值作为限制因素作业给行使职责,经过援用传送的变量。:

double Vol11;
double Vol12;
double Vol21;
double Vol22;
(Vol11);
(Vol12);
(Vol21);
(Vol22);

到这边,不妨说早已完毕了。,不过右边有一个人把持考验。

4. 把持考验

考验行使职责的任务,敝运用一个人同时处置4获名次。 EA 买卖:

  1. 运用圆 14 、EURUSD、幻数 1 的 RSI 按生活指数调整;
  2. 运用圆 21 、EURUSD、幻数 2 的 RSI 按生活指数调整;
  3. 运用圆 14 、GBPUSD、幻数 1 的 RSI 按生活指数调整;
  4. 运用圆 21 、GBPUSD、幻数 2 的 RSI 按生活指数调整;

幻数为 1 的 EA 买卖终止 手工通信量,幻数为 2 的 EA 买卖终止 手工通信量。

在买卖的实施中,事务的卷被添加到 EA 买卖的变量,买卖前后,运用上述的行使职责决议每个获名次的音量。 

万一在持产水量计算时出错,那时的行使职责大发牢骚音讯。

在本文的辩驳中可以找到。 EA 通信量信号(名声):)。

总结

EA 买卖需求很多功用,理所自然以在自己的事物阶段都近便的运用的方法家具这些行使职责。这些行使职责理所自然以最好的方法运用计算资源。。

所打算的计算仓库栈获名次的方法心甘情愿的T:启动时,它只瞄准所需的最小事务历史。。在任务时,它运用顶点的各自的事务来重行计算如今时的获名次。。

发表评论

电子邮件地址不会被公开。 必填项已用*标注