乐于分享
好东西不私藏

重磅分享:聚宝盆 2.0 EA源码,均线信号触发首单 + 网格马丁格尔加仓 + 分组动态止盈!

重磅分享:聚宝盆 2.0 EA源码,均线信号触发首单 + 网格马丁格尔加仓 + 分组动态止盈!
周六了!
开始分享EA源码了,
今天来一个重磅的玩意,不过这是10年前的玩意了,聚宝盆EA,当时很火,因为那个时候马丁的EA刚出来,别看它是马丁,但是如果你用好了,效果还是不错的,类似于金麒麟这样的马丁EA,重点还是控制,
我先说说优点和缺点:
  • 多空隔离,逻辑清晰多 / 空使用独立魔术号,持仓统计、加仓、平仓完全分开,不会出现订单混乱,复盘和风控一目了然。

  • 入场有趋势过滤,非纯盲网格依靠大周期均线(默认 700 周期 SMMA)判定趋势,只顺着趋势开单加仓,相比无序逆势网格,单边行情下存活率更高。

  • 双层止盈 + 主动减仓,利润保护完善既有整体统一止盈,又有按盈利比例分批平仓,行情小幅回撤时能提前兑现利润,降低浮亏压力。

  • 仓位、层数双重硬限制限制最大订单数、最大持仓手数,从代码层面杜绝无限加仓、仓位爆拉,基础风控有底线。

缺点是:
  • 均线参数极度极端(700 周期 MA)700 周期平滑均线反应极度滞后,只能捕捉超长期大趋势,短线震荡、波段行情完全失效;行情反转后,信号会严重滞后。

  • 顺势网格本质缺陷:单边深度回调必深套顺着趋势一路加仓,一旦出现趋势反转 + 深度回调,同方向层层持仓会形成大额浮亏,虽有平仓规则,但无法彻底规避被套。

  • 分批平仓规则存在逻辑漏洞平仓优先级:先平盈利单、再平亏损单,相当于 “砍盈利、留亏损”,长期运行会出现 “赚小钱、扛大亏” 的资金曲线特征。

  • 锁仓规避不彻底仅 “有持仓则不开反向单”,但原有持仓被套后,行情快速反转依旧无法对冲风险,没有止损机制。

  • 无硬性止损(重大短板)整段代码没有任何止损(SL)逻辑,所有订单均不带止损,遇到黑天鹅、跳空、极速反向行情,会直接产生巨额亏损。

界面截图我就不截图了,因为源码太多了,而且可能还有人不会编译,不会编译或者出现编译错误的朋友,来找我直接拿源码:
下面是完整的源码:
#property copyright "狼人EA"#property link      ""#include <stderror.mqh>#include <stdlib.mqh>//===================================================================================================================================================extern string EAName             = "聚宝盆2.0";//===================================================================================================================================================extern int 多单魔术号        = 123456789;   extern int 空单魔术号       = 987654321;   extern string s1                 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";extern bool   显示图表信息       = false;   // 显示图表信息extern bool   显示图表时间          = false;  // 图表显示时间extern bool   平均价格线   = false;  // 画平均价格线extern bool   允许买卖          = false;  // 允许买卖extern bool   做多        = true;   // 允许购买extern bool   做空       = true;   // 允许销售 extern string s4                 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";extern string s5                 = ">>> pip值设置"extern bool   CheckNewBar        = true;   // 在新的K线extern int    最大下数量          = 30;     // 最大下数量extern double 加仓间距            = 20;   // 加仓间距extern double 加仓间距指数    = 1.0;    // 加仓间距指数extern int    止盈点数   = 8;     // 止盈点数extern string s6                 = ">>> 平仓顺序设置";extern double 止盈百分比      = 100;     // 收市百分比(10…50)//收市百分比extern double 第二止盈百分比 = 60;    // 关闭上一个订单的百分比 extern string s8                 = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";extern string s9                 = ">>> 计算盈利进出场顺序";extern double 初始仓位           = 0.02;    // 初始批量extern double 加仓振幅       = 0.02;    // 增加批次  extern double 加仓后的最大仓位             = 0.5;     // Maximum lot size最大批量extern bool   使用自动仓位开仓         = false;  // 使用自动收取%存款extern double 自动初始仓位百分比          = 0.5;    // 百分比-从资产净值计算批次大小extern double 自动加仓振幅百分比   = 0.3;    // 要添加的百分比extern string s10                = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>";extern string s11                = ">>> Enter opposite MA"extern int    iMA_Period         = 700;extern int    iMA_OpenDistance   = 60;//===================================================================================================================================================int i = 0;int TimePrev = 0;int vDigits;int OrderSended = 0;int TotalBuyOrders = 0, TotalSellOrders = 0;int Lpos, Lpos1, Cpos;double Spread;double mPipStep;double vPoint;double PriceTarget, AveragePrice, LastBuyPrice, LastSellPrice;double BuySummLot,SellSummLot,TotalProfitBuy,TotalProfitSell;double BLot, SLot;double Cprofit, Lprofit, Lprofit1, PrcCL;string LastOrderComment = "";string BComment, SComment;//===================================================================================================================================================//===================================================================================================================================================intinit(){  vPoint  = Point;  vDigits = Digits;  TimePrev = Time[0];  Spread = NormalizeDouble(MarketInfo(Symbol(), MODE_SPREAD),vDigits)*vPoint;  // 5 digit broker  int DcD = 1;  if((vDigits == 5)||(vDigits == 3)) DcD = 10;     加仓间距           *= DcD;  止盈点数  *= DcD;  iMA_OpenDistance  *= DcD;  if(显示图表信息) DrawInfo();  return(0);}//===================================================================================================================================================//===================================================================================================================================================intdeinit(){  ObjectDelete("CurrTime");  ObjectDelete("BuyZeroLevel");  ObjectDelete("BuyAveragePrice");  ObjectDelete("SellZeroLevel");  ObjectDelete("SellAveragePrice");  return(0);}//===================================================================================================================================================//===================================================================================================================================================intstart(){  // clock  if(显示图表时间) ShowCurrentTime();  // info  if(显示图表信息) DrawInfo();  // checking new bar  if(TimePrev == Time[0] && CheckNewBar == truereturn(0);     CheckOverlapping();    //-------------------------------------------------------------------------------------------------------------------------------------------------  // New buy orders  TotalBuyOrders = CountOfOrders(多单魔术号);  if(TotalBuyOrders > 0 && TotalBuyOrders < 最大下数量)  {    OrderSended = -1;    LastBuyPrice = FindLastOrderParameter(多单魔术号, "price");    if(LastBuyPrice - Ask >= GetPipstepForStep(TotalBuyOrders + 1) * vPoint)    {      BLot   = GetLotForStep(多单魔术号, TotalBuyOrders);      BComment = StringSubstr(LastOrderComment, 0, StringFind(LastOrderComment, "|"0)) + "|";      OrderSended = SendMarketOrder(OP_BUY, BLot, 00, 多单魔术号, BComment);    }  }  //-------------------------------------------------------------------------------------------------------------------------------------------------  // New sell orders  TotalSellOrders = CountOfOrders(空单魔术号);  if(TotalSellOrders > 0 && TotalSellOrders < 最大下数量)  {    OrderSended = -1;    LastSellPrice = FindLastOrderParameter(空单魔术号, "price");    if (Bid - LastSellPrice >= GetPipstepForStep(TotalSellOrders + 1) * vPoint)     {      SLot   = GetLotForStep(空单魔术号, TotalSellOrders);      SComment = StringSubstr(LastOrderComment, 0, StringFind(LastOrderComment, "|"0)) + "|";      OrderSended = SendMarketOrder(OP_SELL, SLot, 00, 空单魔术号, SComment);    }  }  //-------------------------------------------------------------------------------------------------------------------------------------------------  //Move Take Profit  CheckTakeProfit();  //-------------------------------------------------------------------------------------------------------------------------------------------------  //Check new bar...first orders of the series only according to new bars  if (TimePrev == Time[0]) return(0);     TimePrev = Time[0];  int TradeSignal = GetSignal();  // New buy series ...  if (TotalBuyOrders == 0 && 做多 && TradeSignal > 0 && (允许买卖 == true || TotalSellOrders == 0))    SendMarketOrder(OP_BUY, GetStartLot(), 止盈点数, 0, 多单魔术号, TimeCurrent() + "|");       // New sell series ...  if (TotalSellOrders == 0 && 做空 && TradeSignal < 0 && (允许买卖 == true || TotalBuyOrders == 0))    SendMarketOrder(OP_SELL, GetStartLot(), 止盈点数, 0, 空单魔术号, TimeCurrent() + "|");       return(0);}//===================================================================================================================================================//===================================================================================================================================================voidCheckTakeProfit(){  //BUY  TotalBuyOrders = CountOfOrders(多单魔术号);  PriceTarget = 0;  AveragePrice = 0;  if(TotalBuyOrders > 0  {    PriceTarget = FindFirstOrderParameter(多单魔术号, "price") + 止盈点数*vPoint;    AveragePrice = CalculateAveragePrice(多单魔术号);  }  for (i = 0; i < OrdersTotal(); i++)     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      if (OrderSymbol() == Symbol() && OrderMagicNumber() == 多单魔术号)        if (NormalizeDouble(OrderTakeProfit(),vDigits) != NormalizeDouble(PriceTarget,vDigits)) ModifyTakeProfit(PriceTarget);  if(平均价格线 == true)  {    if(AveragePrice == 0)    {      if(ObjectFind("BuyZeroLevel") != -1) ObjectDelete("BuyZeroLevel");      if(ObjectFind("BuyAveragePrice") != -1) ObjectDelete("BuyAveragePrice");    }    else    {      if(ObjectFind("BuyZeroLevel") == -1      {        ObjectCreate("BuyZeroLevel",OBJ_HLINE, 00, AveragePrice);        ObjectSet("BuyZeroLevel", OBJPROP_COLOR, Blue);        ObjectSet("BuyZeroLevel", OBJPROP_STYLE, DRAW_SECTION);      }      else ObjectSet("BuyZeroLevel", OBJPROP_PRICE1, AveragePrice);      if(ObjectFind("BuyAveragePrice") == -1      {        ObjectCreate("BuyAveragePrice",OBJ_HLINE, 00, AveragePrice + 止盈点数*vPoint);        ObjectSet("BuyAveragePrice", OBJPROP_COLOR, Blue);        ObjectSet("BuyAveragePrice", OBJPROP_STYLE, DRAW_LINE);      }      else ObjectSet("BuyAveragePrice", OBJPROP_PRICE1, AveragePrice + 止盈点数*vPoint);    }      }  //<_BUY  //SELL  PriceTarget = 0;  AveragePrice = 0;  TotalSellOrders = CountOfOrders(空单魔术号);  if(TotalSellOrders > 0  {    PriceTarget = FindFirstOrderParameter(空单魔术号, "price") - 止盈点数*vPoint;    AveragePrice = CalculateAveragePrice(空单魔术号);  }  for (i = 0; i < OrdersTotal(); i++)     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      if (OrderSymbol() == Symbol() && OrderMagicNumber() == 空单魔术号)        if (NormalizeDouble(OrderTakeProfit(),vDigits) != NormalizeDouble(PriceTarget,vDigits)) ModifyTakeProfit(PriceTarget);  if(平均价格线 == true)  {    if(AveragePrice == 0)    {      if(ObjectFind("SellZeroLevel") != -1) ObjectDelete("SellZeroLevel");      if(ObjectFind("SellAveragePrice") != -1) ObjectDelete("SellAveragePrice");    }    else    {      if(ObjectFind("SellZeroLevel") == -1      {        ObjectCreate("SellZeroLevel",OBJ_HLINE, 00, AveragePrice);        ObjectSet("SellZeroLevel", OBJPROP_COLOR, Red);        ObjectSet("SellZeroLevel", OBJPROP_STYLE, DRAW_SECTION);      }      else ObjectSet("SellZeroLevel", OBJPROP_PRICE1, AveragePrice);      if(ObjectFind("SellAveragePrice") == -1      {        ObjectCreate("SellAveragePrice",OBJ_HLINE, 00, AveragePrice - 止盈点数*vPoint);        ObjectSet("SellAveragePrice", OBJPROP_COLOR, Red);        ObjectSet("SellAveragePrice", OBJPROP_STYLE, DRAW_LINE);      }      else ObjectSet("SellAveragePrice", OBJPROP_PRICE1, AveragePrice - 止盈点数*vPoint);    }      }  //<_SELL}//===================================================================================================================================================//===================================================================================================================================================doubleCalculateAveragePrice(int mNumber){  double AveragePrice = 0;  double Count = 0;  for (int i = 0; i < OrdersTotal(); i++)    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)        if (OrderType() == OP_BUY  || OrderType() == OP_SELL)         {           AveragePrice += OrderOpenPrice() * OrderLots();           Count += OrderLots();        }  if(AveragePrice > 0 && Count > 0)    return( NormalizeDouble(AveragePrice / Count, vDigits));  else    return(0);}//===================================================================================================================================================//===================================================================================================================================================intGetSignal(){  int Signal = 0;  double iMA_Signal = iMA(Symbol(), 0, iMA_Period, 0, MODE_SMMA, PRICE_CLOSE, 0);  int Ma_Bid_Diff = MathAbs(iMA_Signal - Bid)/vPoint;  if(Ma_Bid_Diff > iMA_OpenDistance && Bid > iMA_Signal) Signal = -1;  if(Ma_Bid_Diff > iMA_OpenDistance && Bid < iMA_Signal) Signal = 1;  return(Signal);}//===================================================================================================================================================//===================================================================================================================================================intCountOfOrders(int mNumber){  int count = 0;  for (int i = 0; i < OrdersTotal(); i++)     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber))         if ((OrderType() == OP_SELL) || (OrderType() == OP_BUY))           count++;  return(count);}//===================================================================================================================================================//===================================================================================================================================================doubleGetLotForStep(int mNumber, int OrdCount){  double CurrLot = 0;  double LastOrderLot = FindLastOrderParameter(mNumber, "lot");  if(使用自动仓位开仓 == true)  {    if(LastOrderLot != 0) CurrLot = NormalizeDouble(LastOrderLot + NormalizeDouble(AccountEquity() * 加仓振幅/100002)*OrdCount, 2);  }  else  {    if(LastOrderLot != 0) CurrLot = NormalizeDouble(LastOrderLot + 加仓振幅*OrdCount, 2);  }  //   if(CurrLot > 加仓后的最大仓位) CurrLot = 加仓后的最大仓位;  if(CurrLot < 初始仓位) CurrLot = 初始仓位;  if(CurrLot == 0) CurrLot = 初始仓位;  return(CurrLot);}//===================================================================================================================================================//===================================================================================================================================================doubleGetStartLot(){  double FirstLot = 0;  if(使用自动仓位开仓 == true)  {    FirstLot = NormalizeDouble(AccountEquity() * 自动初始仓位百分比/100002);  }  else  {    FirstLot = 初始仓位;  }  if(FirstLot > 加仓后的最大仓位) FirstLot = 加仓后的最大仓位;  if(FirstLot < 初始仓位) FirstLot = 初始仓位;  return(FirstLot);}//===================================================================================================================================================//===================================================================================================================================================doubleGetPipstepForStep(int CurrStep){  double CurrPipstep = NormalizeDouble(加仓间距 * MathPow(加仓间距指数,CurrStep), 0);  return(CurrPipstep);}//===================================================================================================================================================//===================================================================================================================================================doubleFindFirstOrderParameter(int mNumber, string ParamName) {  int mOrderTicket = 0;  double mOrderPrice = 0;  double mOrderLot = 0;  double mOrderProfit = 0;  int PrevTicket = 0;  int CurrTicket = 0;  for (i = OrdersTotal() - 1; i >= 0; i--)     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))       if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)      {        CurrTicket = OrderTicket();        if (CurrTicket < PrevTicket || PrevTicket == 0)        {           PrevTicket = CurrTicket;          mOrderPrice = OrderOpenPrice();          mOrderTicket = OrderTicket();          mOrderLot = OrderLots();          mOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();        }      }  if(ParamName == "price"return(mOrderPrice);  else if(ParamName == "ticket"return(mOrderTicket);  else if(ParamName == "lot"return(mOrderLot);  else if(ParamName == "profit"return(mOrderProfit);}//===================================================================================================================================================//===================================================================================================================================================doubleFindLastOrderParameter(int mNumber, string ParamName) {  int mOrderTicket = 0;  double mOrderPrice = 0;  double mOrderLot = 0;  double mOrderProfit = 0;  int PrevTicket = 0;  int CurrTicket = 0;  for (i = OrdersTotal() - 1; i >= 0; i--)     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))       if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)       {        CurrTicket = OrderTicket();        if (CurrTicket > PrevTicket)         {          PrevTicket = CurrTicket;          mOrderPrice = OrderOpenPrice();          mOrderTicket = OrderTicket();          mOrderLot = OrderLots();          mOrderProfit = OrderProfit() + OrderSwap() + OrderCommission();          LastOrderComment = OrderComment();        }      }  if(ParamName == "price"return(mOrderPrice);  else if(ParamName == "ticket"return(mOrderTicket);  else if(ParamName == "lot"return(mOrderLot);  else if(ParamName == "profit"return(mOrderProfit);}//===================================================================================================================================================//===================================================================================================================================================doubleGetClosedProfit(int mNumber){  double ClosedProfit = 0;  for (i = OrdersHistoryTotal(); i > 0; i--)     if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))      if (OrderSymbol() == Symbol() && OrderMagicNumber() == mNumber)        if(StringSubstr(LastOrderComment, 0, StringFind(LastOrderComment, "|"0)) == StringSubstr(OrderComment(), 0, StringFind(OrderComment(), "|"0)))          ClosedProfit = ClosedProfit + OrderProfit();  return(ClosedProfit);}//===================================================================================================================================================//===================================================================================================================================================boolModifyTakeProfit(double takeprofit){  while(!IsStopped())  {    if(IsTradeContextBusy())    {      Sleep(3000);      continue;    }    if(!IsTradeAllowed())    {      return(False);    }    if(!OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(takeprofit,vDigits), 0, Yellow))    {      int Err = GetLastError();      Print("!!! Error(",Err,"): ",ErrorDescription(Err));      return(False);    }    else    {      break;    }  }  return(True);}//===================================================================================================================================================//===================================================================================================================================================intSendMarketOrder(int Type, double Lots, int TP, int SL, int Magic, string Cmnt, double OpenPrice = 0string mSymbol = ""){  double Price, Take, Stop;  int Ticket, Color, Err;   int ErrorCount = 0;  while(!IsStopped())  {    if(ErrorCount > 5return(0);    if(!IsConnected())    {      ErrorCount = ErrorCount + 1;      Print("No connection with server!");      Sleep(1000);    }    if(IsTradeContextBusy())    {      Sleep(3000);      continue;    }    switch(Type)    {      case OP_BUY:        if(mSymbol == "")          Price = NormalizeDouble(Ask, vDigits);        else          Price = NormalizeDouble(MarketInfo(mSymbol, MODE_ASK), vDigits);        Take = IIFd(TP == 00, NormalizeDouble( Price + TP * vPoint, vDigits));        Stop = IIFd(SL == 00, NormalizeDouble( Price - SL * vPoint, vDigits));        Color = Blue;        break;      case OP_SELL:        if(mSymbol == "")          Price = NormalizeDouble( Bid, vDigits);        else          Price = NormalizeDouble(MarketInfo(mSymbol, MODE_BID), vDigits);        Price = NormalizeDouble( Bid, Digits);        Take = IIFd(TP == 00, NormalizeDouble( Price - TP * vPoint, vDigits));        Stop = IIFd(SL == 00, NormalizeDouble( Price + SL * vPoint, vDigits));        Color = Red;        break;      default:        return(-1);    }    if(IsTradeAllowed())    {      if(mSymbol == "")        Ticket = OrderSend(Symbol(), Type, Lots, Price, 2*Spread, 00, Cmnt, Magic, 0, Color); // amended code   //        Ticket = OrderSend(Symbol(), Type, Lots, Price, 2*Spread, Stop, Take, Cmnt, Magic, 0, Color); // original code for this line      else        Ticket = OrderSend(mSymbol, Type, Lots, Price, 2*Spread, Stop, Take, Cmnt, Magic, 0, Color);      if(Ticket < 0)      {        Err = GetLastError();        if (Err == 4   || /* SERVER_BUSY */            Err == 129 || /* INVALID_PRICE */             Err == 135 || /* PRICE_CHANGED */             Err == 137 || /* BROKER_BUSY */             Err == 138 || /* REQUOTE */             Err == 146 || /* TRADE_CONTEXT_BUSY */            Err == 136 )  /* OFF_QUOTES */        {          Sleep(3000);          continue;        }        else        {          break;        }      }      break;    }    else    {      break;    }  }  return(Ticket);}//===================================================================================================================================================//===================================================================================================================================================doubleIIFd(bool condition, double ifTrue, double ifFalse) {  if (condition) return(ifTrue); else return(ifFalse);}//===================================================================================================================================================//===================================================================================================================================================voidDrawInfo(){  BuySummLot = 0; TotalProfitBuy = 0;  for(i=OrdersTotal();i>=0;i--)  {    if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && (OrderMagicNumber()==多单魔术号))     {      BuySummLot += OrderLots();       TotalProfitBuy += OrderProfit() + OrderCommission() + OrderSwap();    }  }  double ClosedBuyProfit = GetClosedProfit(多单魔术号);  SellSummLot = 0; TotalProfitSell = 0;  for(i=OrdersTotal();i>=0;i--)  {    if (OrderSelect(i,SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && (OrderMagicNumber()==空单魔术号))     {      SellSummLot += OrderLots();       TotalProfitSell += OrderProfit() + OrderCommission() + OrderSwap();    }  }  double ClosedSellProfit = GetClosedProfit(空单魔术号);  Comment(  "\n",  ">>> BUY  Orders: ",TotalBuyOrders," lots: ",BuySummLot," Profit: ",TotalProfitBuy,  "\n",">>> Profit Taken:",ClosedBuyProfit,"\n",  "\n",  ">>> SELL Orders: ",TotalSellOrders," lots: ",SellSummLot," Profit: ",TotalProfitSell,  "\n",">>> Profit taken :", ClosedSellProfit  );}//===================================================================================================================================================//===================================================================================================================================================voidShowCurrentTime(){  int min,sec;  min = Time[0] + Period()*60 - CurTime();  sec = min%60;  min = (min - min%60)/60;  if(ObjectFind("CurrTime") != 0)    ObjectCreate("CurrTime", OBJ_TEXT, 0, Time[0], Close[0]);  else    ObjectMove("CurrTime"0, Time[0], Close[0]);  ObjectSetText("CurrTime""                <" + min + ":" + sec, 14"Verdana", Black);}//===================================================================================================================================================//===================================================================================================================================================voidCheckOverlapping(){  //BUY--->  TotalBuyOrders = CountOfOrders(多单魔术号);  if (TotalBuyOrders >= 2  {    Lpos = 0; Cpos = 0; Lprofit = 0; Cprofit = 0;    Lpos = LidingProfitOrder(多单魔术号);    Cpos = CloseProfitOrder(多单魔术号);    if(Lprofit > 0 && Lprofit1 <= 0)    {      if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit)*100/Lprofit > 止盈百分比)       {        Lpos1 = 0;        CloseSelectOrder(多单魔术号);       }    }    else if(Lprofit > 0 && Lprofit1 > 0)    {      if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit)*100/(Lprofit + Lprofit1) > 第二止盈百分比) CloseSelectOrder(多单魔术号);     }  }   //<---BUY  //SELL--->  TotalSellOrders = CountOfOrders(空单魔术号);  if (TotalSellOrders >= 2  {    Lpos = 0; Cpos = 0; Lprofit = 0; Cprofit = 0;    Lpos = LidingProfitOrder(空单魔术号);    Cpos = CloseProfitOrder(空单魔术号);    if(Lprofit > 0 && Lprofit1 <= 0)    {      if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit)*100/Lprofit > 止盈百分比)       {        Lpos1 = 0;        CloseSelectOrder(空单魔术号);       }    }      if(Lprofit > 0 && Lprofit1 > 0)    {      if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit)*100/(Lprofit + Lprofit1) > 第二止盈百分比) CloseSelectOrder(空单魔术号);     }  }   //<---SELL}//======================================== Most profitable order =======================================intLidingProfitOrder(int mNumber) {   Lprofit1 = 0;   Lpos1 = 0;   int TotalOrders = CountOfOrders(mNumber);   double profit  = 0;   int    Pos     = 0;   for (i = 0; i < OrdersTotal(); i++)    {       if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))         {          if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber))          {             if (OrderType() == OP_SELL || OrderType() == OP_BUY)              {                 profit = OrderProfit();                Pos    = OrderTicket();                if (profit > 0 && profit > Lprofit) {                   // Previous value                   Lprofit1 = Lprofit;                   Lpos1    = Lpos;                   // Maximum value                   Lprofit = profit;                   Lpos    = Pos;                }             }          }       }      }       return (Lpos);//========================================  Least Profitable Order =======================================intCloseProfitOrder(int mNumber) {   double profit  = 0;   int    Pos     = 0;   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {       if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))  {          if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber)){             if (OrderType() == OP_SELL || OrderType() == OP_BUY) {                 profit = OrderProfit();                Pos    = OrderTicket();                if (profit < 0 && profit < Cprofit) {                   Cprofit = profit;                   Cpos    = Pos;                }             }          }       }      }       return (Cpos);}//==========================================  Closing Orders ===============================================intCloseSelectOrder(int mNumber){  int error =  0;  int error1 = 0;  int error2 = 0;  int Result = 0;//                       ----------------------  Last Order -----------------------                              while (error1 == 0  {          RefreshRates();            i = OrderSelect(Lpos, SELECT_BY_TICKET, MODE_TRADES);            if  (i != 1 ) {                Print ("Error! Not possible to select most profitable order . Operation cancelled.");                return (0);            }              if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber)) {               if (OrderType() == OP_BUY) {                  error1 =  (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Spread, Blue));                  if (error1 == 1) {                     Print ("Leading Order closed successfully");                      Sleep (500);                     } else {                     Print ("Error closing leading order, Repeat Operation. ");                                       }                     } //                        -----------------------------------------------------                              if (OrderType() == OP_SELL) {                  error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Spread, Red));                  if (error1 == 1) {                     Print ("Leading Order closed successfully");                      Sleep (500);                     } else {                     Print ("Error closing leading order, Repeat Operation. ");                                       }               }            }       }//                       ---------------------- Previous Last  -----------------------                            		      if(Lpos1 != 0)      {      while (error2 == 0) {            RefreshRates();            i = OrderSelect(Lpos1, SELECT_BY_TICKET, MODE_TRADES);            if  (i != 1 ) {                Print ("Error! Not possible to select previous most profitable order . Operation cancelled.");                return (0);            }              if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber)) {               if (OrderType() == OP_BUY) {                  error2 =  (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Spread, Blue));                  if (error2 == 1) {                     Print ("Previous leading order closed successfully");                     Sleep (500);                     } else {                     Print ("Error closing previous leading order, Repeat Operation. ");                                       }                     } //                        -----------------------------------------------------                              if (OrderType() == OP_SELL) {                  error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Spread, Red));                  if (error2 == 1) {                     Print ("Previous leading order closed successfully");                      Sleep (500);                     } else {                     Print ("Error closing previous leading order, Repeat Operation. ");                                       }               }            }       }      }//								----------- Selected (Least profitable order ) -----------      while (error == 0) {            RefreshRates();            int i = OrderSelect(Cpos, SELECT_BY_TICKET, MODE_TRADES);            if  (i != 1 ) {                Print ("Error! Not possible to select least profitable order. Operation cancelled");                return (0);            }                if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == mNumber)) {               if (OrderType() == OP_BUY) {                  error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Spread, Blue));                   if (error == 1 ) {                     Print ("Order closed successfully.");                      Sleep (500);                     } else {                     Print ("Error during Order Close. Repeat operation.  ");                                      }                }        //                             --------------------------------------------------                               if (OrderType() == OP_SELL) {                  error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Spread, Red));                  if (error == 1) {						Print ("Order closed successfully.");                      Sleep (500);                     } else {						  Print ("Error during Order Close. Repeat operation.  ");                                       }               }            }      }       Result = 1;  return (Result);    }