LoginSignup
20
27

More than 5 years have passed since last update.

一ヶ月で1000の元金を20倍以上にしたEAを公開します。

Last updated at Posted at 2015-10-22

一ヶ月で1000円の元金を20倍以上にしたEAを公開します。
(制限:xm.comのミクロ口座でしか使えません^^、口座ロックされますので、使用しないでね。^^)

過去のシグナル配信で使用したことがあります。下記のリンクもご参照ください。
https://www.mql5.com/ja/signals/122213

最近の手動のトレード結果です。

====================================
使える通貨ペア:
====================================
XXX口座⇒YYYXXXmicro
(1)例:JPYミクロ口座⇒使える通貨ペア(USDJPYmiroが一番勝ちやすいです)
(2)例:USDミクロ口座⇒使える通貨ペア(EURUSDmicro,GBPUSDmicro,AUDUSDmicro)
(3)例:GBPミクロ口座⇒使える通貨ペア(EURGBPmicro Only)
※一番勝ちやすい口座はJPYミクロ口座です。
====================================

//+------------------------------------------------------------------+
//|                                                $10ScalPerPro.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "Copyright 2015, $10ScalPerPro AIMORI U"
#property link      ""
#property version   "5.2"
#property strict

//------------------------------------------
//---License判断
//------------------------------------------
//---最大持单数量
#define MAX 190
//---测试模式?
bool IsDebug=false;
//---用户自定义?
bool IsCustmize=false;
//---License信息
#define ISSUPERUSER true  //超级用户不检查账户ID和名字
#define ACCOUNTID 0       //不是超级用户,则检查ID  (ID和名字都不符合则包账户不合法)
#define ACCOUNTNAME ""    //不是超级用户,则检查名字(ID和名字都不符合则包账户不合法)
#define YEAR   9999
#define MONTH  12
#define DAY    31
#define XM "Trading Point Of Financial Instruments Ltd"
bool   IsUser=true;//判断用户是否是合法用户,默认合法然后通过不合法的判断基准将其变为不合法
//+------------------------------------------------------------------+

//------------------------------------------
//---Custmize限制:
//---true: 可以在Demo账户中运行,可以是XM以外的外汇公司
//---false:不可以在Demo账户中运行,不可以是XM意外的公司
//------------------------------------------
double UserDefineLots= 0.01;
int UserStopLossPoint=100;
int UserTakeProfitPoint=100;

//------------------------------------------
//---赚取交易量策略参数设置
//------------------------------------------
bool IsP2TEA=false;
double EA_Blance=35.0;
double EA_GtUse20EA=3.0;
double EA_GtUseP2T=5.0;
double EA_P2TLots=0.5;
int EA_HoldTime=300;//EA_HoldTime(second)
//------------------------------------------

//------------------------------------------
//---自动平仓参数设置
//------------------------------------------
//--- input parameters
//指定0以外的时候检查
//input int      EA_MagicNumber=7777;
//指定0以外的时候检查
double   EA_TakeProfit=0.01;
//指定0以外的时候检查 
double   EA_Lots=0.01;
//指定0以外的时候检查
double   EA_TakeProfit_2=0.02;
//指定0以外的时候检查 
double   EA_Lots_2=0.02;
//指定“”以外的时候检查     
string   EA_Symbol=Symbol();

//+------------------------------------------------------------------+
//---买卖区间参数设置 0.01
#define SELL_RANGE_DOWN_PARAM 55
#define SELL_RANGE_UP_PARAM   95
#define BUY_RANGE_UP_PARAM    45
#define BUY_RANGE_DOWN_PARAM   5
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//---买卖区间参数设置0.02
#define SELL_RANGE_DOWN_PARAM_2 79  //0.00075
#define SELL_RANGE_UP_PARAM_2   99  //0.00099
#define BUY_RANGE_UP_PARAM_2    20  //0.00024
#define BUY_RANGE_DOWN_PARAM_2   5  //0.00005
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//---EA外部参数设置
extern int magic=7777;
extern int SellOrBuyControl= 0;//0:Long or Short,1:OnlyLong,2:onlyShort
extern int MyMaxPositions= 100;//MaxPositions(Max:190,Default:150)
                               //extern int MyTradeCountSleep=5;
extern bool IsSetTakeProtite=false;
//extern int MyTradeCountSleepTime=5;
extern bool MyUse10EA = true;
extern bool MyUse20EA = false;
//---如果对应的FX公司不支持下单同时止损止盈则将下面的值设置为true
bool UseOrderModify=false;
bool IsUseTimeUSD=false;//使用USD的双建逻辑?
int EA_Timer=1;//5 minute
int EA_Times=1;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//---交易控制
double MyAccountBalance = 0.0;  //账号余额监视参数
int MyTradeCount = 0;           //为了控制交易频率,监视目前已经下单的个数从而判断EA是否需要休息了
int MySlippage=4;               //注文時のスリッページの指定
int MyOrderTime=0;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//---用来判断是否满足EA的运行条件
double MySpread = 40.0;//このスプレッド以下だったらこのEAを使用可能
double SysSpread = 0.0;//該当通貨ペアのスプレッド
int StopLevel=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);
//bool IsPairControl = true;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//---6个重要的全局变量的声明
double MyAsk = 0;//売り価格
double MyBid = 0;//買い価格
double MyStopLoss=0.0;//損切り価格
double MyTakeProfit=0.0;//利益確定価格
double MyAskRoundDown = 0.0;//売り価格の小数点2桁目以降を切り捨てて
double MyBidRoundDown = 0.0;//買い価格の小数点2桁目以降を切り捨てて
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//---全局变量声明
int OrderResult=0;
bool IsTest=false;// テストの場合にしか出さないメッセージを出すようにコントロールする
bool IsStarted=false;//
//+------------------------------------------------------------------+

//------------------------------------------
//重要的经济指标发表的时候不做交易(目前好像不起作用)
string NoTradingStartDate = "15:20";//日本時間21:20、中国時間20:20
string NoTradingEndDate   = "15:40";//日本時間21:40、中国時間22:40
//------------------------------------------

//+------------------------------------------------------------------+
//|  deinit                                                          |
//+------------------------------------------------------------------+
void deinit()
  {
//---删除屏幕提示
   Comment("");
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| OnInit                                                           |
//+------------------------------------------------------------------+
int OnInit()
  {
//---License判断
   IsUser=checkAccount(IsDebug,IsCustmize,ACCOUNTID,ACCOUNTNAME,YEAR,MONTH,DAY);
   if(!IsUser)
     {
      Alert("Licence Error!!");
      return INIT_FAILED;
     }

//---如果不是Custmize账户不可以运行在Demo中
   if(IsDemo() && (IsCustmize==false && ISSUPERUSER==false))
     {
      Alert("This version is not custmize version.\n Can not runing in demo account.");
      return INIT_FAILED;
     }

//---资金状况初始化
   MyAccountBalance=AccountBalance();

//---验证止盈和止损参数的设置状况
   if(UserStopLossPoint!=0 && UserStopLossPoint<StopLevel)
     {
      Alert("UserStopLossPoint miss!! \n Please Set UserStopLossPoint > ",StopLevel);
      return INIT_FAILED;
     }
   if(UserTakeProfitPoint!=0 && UserTakeProfitPoint<StopLevel)
     {
      Alert("UserTakeProfitPoint miss!! \n Please Set UserTakeProfitPoint > ",StopLevel);
      return INIT_FAILED;
     }

//---账号持单数量过多
   if(MyMaxPositions>MAX)
     {
      Alert("Error!MyMaxPositions:",MyMaxPositions);
      return INIT_FAILED;
     }

//---账号交易频率过大
/*
   if(MyTradeCountSleep *(60.0/MyTradeCountSleepTime)>120)
     {
      Alert("Error!MyTradeCountSleep:",MyTradeCountSleep,",MyTradeCountSleepTime:",MyTradeCountSleepTime);
      return INIT_FAILED;
     }
*/
//--- create timer
   EventSetTimer(EA_Timer*60);

//---显示屏幕提示
   MyCommont("$10ScalPerPro 5.2",MyMaxPositions);

//---自动平仓参数设置
   if(AccountCurrency()=="JPY")
     {
      if(EA_TakeProfit!=0) EA_TakeProfit=1;
      if(EA_TakeProfit_2!=0) EA_TakeProfit_2=2;
     }

//---返回初始化正常
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|  checkAccount                                                    |
//+------------------------------------------------------------------+
bool checkAccount(bool _IsDebug,bool _IsCustmize,int _UserID,string _UserName,int _Year,int _Month,int _Day)
  {
   bool _IsUser=true;
//---如果不是SuperUser则检查名字,否则只检测日期
//---检查用户账户ID是否合法,不合法返回false
   if(ISSUPERUSER!=true)
     {
      if(AccountNumber()!=_UserID && AccountName()!=_UserName)
        {
         if(_IsDebug) Print("AccountID Error!!");
         _IsUser=false;
         return _IsUser;
        }
     }
//---检查使用期限是否合法,不合法返回false
   if(Year()>_Year)
     {
      if(_IsDebug) Print("Licence Error!!");
      _IsUser=false;
      return _IsUser;
     }
   else if(Year()==_Year && Month()>_Month)
     {
      if(_IsDebug) Print("Licence Error!!");
      _IsUser=false;
      return _IsUser;
     }
   else if(Year()==_Year && Month()==_Month && Day()>_Day)
     {
      if(_IsDebug) Print("Licence Error!!");
      _IsUser=false;
      return _IsUser;
     }
   else
     {
      if(_IsDebug) Print("EAOK");
     }
//---如果不是Custmize账户限制指定的XM交易商以外不能用
   if(_IsCustmize==false && AccountCompany()!=XM)
     {
      if(_IsDebug) Print("FX Broker Error!!");
      _IsUser=false;
      return _IsUser;
     }
   return _IsUser;
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|  start                                                           |
//+------------------------------------------------------------------+
void start()
  {

   if(!IsTradeAllowed())
     {
      return;
     }
//---如果账户不合法则返回Error
   if(!IsUser)
     {
      if(IsDebug) Print("Licence?!");
      Alert("Licence End !!");
      return;
     }

//---如果是Demo账户,并且不是CustMize账户则返回Error
   if(IsDemo() && (IsCustmize==false && ISSUPERUSER==false))
     {
      if(IsDebug) Print("Account ID error!");
      return;
     }

//---显示屏幕提示
   MyCommont("$10ScalPerPro 5.2",MyMaxPositions);

//---计算系统的点差
   SysSpread=MarketInfo(Symbol(),MODE_SPREAD);

//---毎月の第一金曜日の服务器时间15:20~15:40の間注文しない
   if((DayOfWeek()==5) /* 5:金曜日 */
      && (Day()<=7)
      &&(MathFloor(TimeCurrent()) >= StrToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " " + NoTradingStartDate))
      &&(MathFloor(TimeCurrent()) <= StrToTime(TimeToStr(TimeCurrent(), TIME_DATE) + " " + NoTradingEndDate)))
     {
      if(IsDebug) Print("有重要经济指标发表此期间不交易不给人家服务器添堵");
      return;
     }

//---为了防止周一不必要的损失而在周五自动平仓
//---每周六上午3:00-4:00点(服务器时间应该是周五晚上23:00),不交易开始自动平仓
   if((DayOfWeek()==5) /* 5:金曜日 */
      && (StrToInteger(DoubleToStr(Hour(),0))>=22))
     {
      CloseAll(Symbol(),magic,10);
      return;
     }

//---防止start()函数同时启动多个这个好像是多余的。。。
   if(IsStarted)
     {
      if(IsDebug) Print("すでに注文処理中であるため、次へ進みません");
      return;
     }
   else
     {
      IsStarted=true;//処理中...

      //---对没有设置止盈止损的订单进行止盈止损设置
      if(UseOrderModify)
        {
         ModifyOrder();
        }

      //---运行EA策略
      if(MyUse10EA)
        {
         D10EA(magic);
        }
      if(MyUse20EA)
        {
         D20EA(magic);
        }

      //---DoTakeProfit
      //---将已经达到目标盈利额度的订单平掉
      if(checkAccount(IsDebug,IsCustmize,ACCOUNTID,ACCOUNTNAME,YEAR,MONTH,DAY))
        {
         if(EA_Lots!=0.0 && EA_TakeProfit!=0.0)
           {
            DoTakeProfit(magic,EA_Lots,EA_Symbol,EA_TakeProfit);
           }
         if(EA_Lots_2!=0.0 && EA_TakeProfit_2!=0.0)
           {
            DoTakeProfit(magic,EA_Lots_2,EA_Symbol,EA_TakeProfit_2);
           }
         //---将持单超过一定时间的刷单订单平掉
         //---如果魔术号码=本EA的号码,手数=刷单订单手数,订单的时间超过刷单的时间则将对应的订单平掉
         if(IsP2TEA)
           {
            CloseOrderByTakeProfiteOrTime(magic,EA_P2TLots,"",0,EA_HoldTime);
           }
        }

      //---运行USD账户相的USDJPYmicro的另外一个双建策略

      //---运行XM的双建策略赚取佣金策略

      //---运行XM的分割策略
      IsStarted=false;
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|  $10买卖策略买卖信号计算~下单                                     |
//+------------------------------------------------------------------+
void D10EA(int MagicNumber)
  {
//---下单手数计算
   double MyLots=0.01;
   if(IsCustmize)
     {
      MyLots=NormalizeDouble(UserDefineLots,2);//0.01;//この戦略の注文LOTSは0.01とする
     }

//---局部参数初始化
   double MySellRangeDown=0.0;
   double MySellRangeUp=0.0;
   string MyBidString="";
   double MyBuyRangeDown=0.0;
   double MyBuyRangeUp= 0.0;
   string MyAskString = "";

/*
#define SELL_RANGE_DOWN_PARAM 55
#define SELL_RANGE_UP_PARAM   95
#define BUY_RANGE_UP_PARAM    45
#define BUY_RANGE_DOWN_PARAM   5
*/

//---卖出价格范围
//---(XXXJPY Sell 0.055~0.095 )
//---(XXXUSD Sell 0.00055~0.00095 )
   double MySellRangeDownParam=NormalizeDouble(SELL_RANGE_DOWN_PARAM*GetPointPerPrice()*Point,Digits);
   double MySellRangeUpParam=NormalizeDouble(SELL_RANGE_UP_PARAM*GetPointPerPrice()*Point,Digits);

//---买入价格范围
//---(XXXJPY Buy  0.005~0.045 )
//---(XXXUSD Buy  0.00005~0.00045 )
   double MyBuyRangeUpParam=NormalizeDouble(BUY_RANGE_UP_PARAM*GetPointPerPrice()*Point,Digits);
   double MyBuyRangeDownParam=NormalizeDouble(BUY_RANGE_DOWN_PARAM*GetPointPerPrice()*Point,Digits);

//---6个重要的全局变量的初始化
   MyAsk = 0.0;//売り価格初期化
   MyBid = 0.0;//買い価格初期化
   MyStopLoss=0.0;//損切り価格初期化
   MyTakeProfit=0.0;//利益確定価格初期化
   MyAskRoundDown = 0.0;//売り価格の小数点2桁目以降を切り捨てて
   MyBidRoundDown = 0.0;//買い価格の小数点2桁目以降を切り捨てて

//---更新价格
   RefreshRates();

   MyBid=Bid;
   MyAsk=Ask;

//---对计算下单范围时用到的价格的前半部分进行编辑
//---MyBidString=DoubleToStr(MyBid,2);//XXXJPY小数点1桁目が四捨五入されないように
//---MyAskString=DoubleToStr(MyAsk,2);//XXXJPY小数点1桁目が四捨五入されないように
//---MyBidString=DoubleToStr(MyBid,4);//XXXUSD小数点1桁目が四捨五入されないように
//---MyAskString=DoubleToStr(MyAsk,4);//XXXUSD小数点1桁目が四捨五入されないように
   if(Digits%2==0)
     {
      MyBidString=DoubleToStr(MyBid,Digits);//小数点1桁目が四捨五入されないように
      MyAskString=DoubleToStr(MyAsk,Digits);//小数点1桁目が四捨五入されないように
     }
   else
     {
      MyBidString=DoubleToStr(MyBid,Digits - 1);//小数点1桁目が四捨五入されないように
      MyAskString=DoubleToStr(MyAsk,Digits - 1);//小数点1桁目が四捨五入されないように
     }

//---売り注文判断用変数計算      
//---Sell   121.050 121.140 121.040
//---Sell   1.21050 1.21140 1.21040
   MyBidRoundDown=StrToDouble(StringSubstr(MyBidString,0,StringLen(MyBidString)-1));//121.050->121.0  1.21050->1.210
   if(IsDebug) Alert("MyBidRoundDown:",MyBidRoundDown);
   MySellRangeDown = MyBidRoundDown + MySellRangeDownParam;//121.0 + 0.050->121.050  1.210 + 0.00050->1.21050
   MySellRangeUp =   MyBidRoundDown + MySellRangeUpParam;  //121.0 + 0.070->121.070  1.210 + 0.00070->1.21070

//---買い注文判断用変数計算      
//---Buy       121.040  120.960 121.060
//---Buy       1.21040  1.20960 1.21060
   MyAskRoundDown=StrToDouble(StringSubstr(MyAskString,0,StringLen(MyAskString)-1));//121.029->121.0  1.21029->1.210
   if(IsDebug) Alert("MyAskRoundDown:",MyAskRoundDown);
   MyBuyRangeDown = MyAskRoundDown + MyBuyRangeDownParam;//121.0 + 0.029->121.029  1.210 + 0.00029->1.21029
   MyBuyRangeUp =   MyAskRoundDown + MyBuyRangeUpParam;  //121.0 + 0.049->121.049  1.210 + 0.00049->1.21049

//---[売り価格の小数点2桁目以降を切り捨てて+0.050, 売り価格の小数点2桁目以降を切り捨てて+0.070] 売
//---121.055    ~ 121.075 
//---1.21055    ~ 1.21075 
   if(MyBid>=MySellRangeDown && MyBid<=MySellRangeUp)
     {
      D10StopLossTakeProfit(OP_SELL,MagicNumber);
      if(SellOrBuyControl==0 || SellOrBuyControl==2)
        {
         SendSellOrder(MyLots,10,MagicNumber);
        }
     }

//--------------------------------------------------------------
//---[買い価格の小数点2桁目以降を切り捨てて+0.029,買い価格の小数点2桁目以降を切り捨てて+0.049] 買
//---121.025    ~ 121.045
//---1.21025    ~ 1.21045
//--------------------------------------------------------------
   if(MyAsk>=MyBuyRangeDown && MyAsk<=MyBuyRangeUp)
     {
      D10StopLossTakeProfit(OP_BUY,MagicNumber);
      if(SellOrBuyControl==0 || SellOrBuyControl==1)
        {
         SendBuyOrder(MyLots,10,MagicNumber);
        }
     }
  }
//+------------------------------------------------------------------+
//|  損切り利益確定価格計算                                            |
//+------------------------------------------------------------------+
void D10StopLossTakeProfit(int MyOrderType,int MagicNumber)
  {
//---计算STOPLEVEL
   double MyStopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*GetPointPerPrice()*Point;

//---止损止盈价格初始化
   MyStopLoss=0.0;
   MyTakeProfit=0.0;

//---XM.com JPY账户 XXXJPYmicro 0.01手 止盈止损 设置(45logic)
   if(AccountCurrency()=="JPY" && AccountCompany()==XM && StringFind(Symbol(),"JPYmicro")!=-1 && UserDefineLots==0.01)
     {
      double MyRiskPrice=0.01;//10Point(1Pips)自分に不利な方向に調整する。目的は指値のスリッページによりプラスになるべきところが0になってしまい、0になるべきところをマイナスになってしまう。
      double MyStopLevelRisk=0.002;//TakeProfit滑るのを防ぐために

      //---更新价格
      RefreshRates();

      //---卖单时的止损和止盈的值的计算     
      if(MyOrderType==OP_SELL)
        {
         MyStopLoss=MyBidRoundDown+0.100+(0.050-MyRiskPrice)+0.100;
         MyTakeProfit=MathMin(Ask-MyStopLevel-MyStopLevelRisk,MyBidRoundDown+(0.05-MyRiskPrice));
        }
      //---买单时的止损和止盈的值的计算       
      if(MyOrderType==OP_BUY)
        {
         MyStopLoss=MyAskRoundDown-0.100+(0.050+MyRiskPrice)-0.100;
         MyTakeProfit=MathMax(Bid+MyStopLevel+MyStopLevelRisk,MyAskRoundDown+(0.050+MyRiskPrice));
        }
     }

//---XM.com USD账户 XXXUSDmicro 0.01手 止盈止损 设置(45logic)
   else if(AccountCurrency()=="USD" && AccountCompany()==XM && StringFind(Symbol(),"USDmicro")!=-1 && UserDefineLots==0.01)
     {
      double MyRiskPrice=0.0001;//10Point(1Pips)自分に不利な方向に調整する。目的は指値のスリッページによりプラスになるべきところが0になってしまい、0になるべきところをマイナスになってしまう。
      double MyStopLevelRisk=0.00002;//TakeProfit滑るのを防ぐために

      //---更新价格
      RefreshRates();

      //---卖单时的止损和止盈的值的计算     
      if(MyOrderType==OP_SELL)
        {
         MyStopLoss=MyBidRoundDown+0.00230;
         MyTakeProfit=MathMin(Ask-MyStopLevel-MyStopLevelRisk,MyBidRoundDown+(0.0005-MyRiskPrice));
        }
      //---买单时的止损和止盈的值的计算       
      if(MyOrderType==OP_BUY)
        {
         MyStopLoss=MyAskRoundDown-0.00100+(0.00050+MyRiskPrice)-0.00090;
         MyTakeProfit=MathMax(Bid+MyStopLevel+MyStopLevelRisk,MyAskRoundDown+(0.00050+MyRiskPrice));
        }
     }

//---XM.com GBP账户 XXXGBPmicro 0.01手 止盈止损 设置(45logic)
   else if(AccountCurrency()=="GBP" && AccountCompany()==XM && StringFind(Symbol(),"GBPmicro")!=-1 && UserDefineLots==0.01)
     {
      double MyRiskPrice=0.0001;//10Point(1Pips)自分に不利な方向に調整する。目的は指値のスリッページによりプラスになるべきところが0になってしまい、0になるべきところをマイナスになってしまう。
      double MyStopLevelRisk=0.00002;//TakeProfit滑るのを防ぐために

      //---更新价格
      RefreshRates();

      //---卖单时的止损和止盈的值的计算     
      if(MyOrderType==OP_SELL)
        {
         MyStopLoss=MyBidRoundDown+0.00230;
         MyTakeProfit=MathMin(Ask-MyStopLevel-MyStopLevelRisk,MyBidRoundDown+(0.0005-MyRiskPrice));
        }
      //---买单时的止损和止盈的值的计算       
      if(MyOrderType==OP_BUY)
        {
         MyStopLoss=MyAskRoundDown-0.00100+(0.00050+MyRiskPrice)-0.00090;
         MyTakeProfit=MathMax(Bid+MyStopLevel+MyStopLevelRisk,MyAskRoundDown+(0.00050+MyRiskPrice));
        }
     }

//---XM.com USD账户 USDJPYmicro 0.01手 止盈止损 设置(美金账户中的USDJPYmicro逻辑)
   else if(AccountCurrency()=="USD" && AccountCompany()==XM && StringFind(Symbol(),"USDJPYmicro")!=-1 && UserDefineLots==0.01)
     {
      //---卖单时的止损和止盈的值的计算     
      if(MyOrderType==OP_SELL)
        {
         MyStopLoss=NormalizeDouble(Bid+NormalizeDouble(MathMax(MyStopLevel,0.0015*MarketInfo(Symbol(),MODE_BID)-0.021),3),Digits);
         MyTakeProfit=NormalizeDouble(Bid-NormalizeDouble(MathMax(MyStopLevel,0.0005*MarketInfo(Symbol(),MODE_ASK)+0.011),3),Digits);
        }
      //---买单时的止损和止盈的值的计算        
      if(MyOrderType==OP_BUY)
        {
         MyStopLoss=NormalizeDouble(Ask-NormalizeDouble(MathMax(MyStopLevel,0.0015*MarketInfo(Symbol(),MODE_BID)-0.021),3),Digits);
         MyTakeProfit=NormalizeDouble(Ask+NormalizeDouble(MathMax(MyStopLevel,0.0005*MarketInfo(Symbol(),MODE_ASK)+0.011),3),Digits);
        }
     }

//---XM.com之外的任何账户 止盈止损 设置
   else
     {
      //---更新价格
      RefreshRates();

      //---卖单时的止损和止盈的值的计算     
      if(MyOrderType==OP_SELL)
        {
         if(UserStopLossPoint!=0)
           {
            MyStopLoss=Bid+UserStopLossPoint*GetPointPerPrice()*Point;
           }
         if(UserTakeProfitPoint!=0)
           {
            MyTakeProfit=Bid-UserTakeProfitPoint*GetPointPerPrice()*Point;
           }
        }

      //---买单时的止损和止盈的值的计算       
      if(MyOrderType==OP_BUY)
        {
         if(UserStopLossPoint!=0)
           {
            MyStopLoss=Ask-UserStopLossPoint*GetPointPerPrice()*Point;
           }
         if(UserTakeProfitPoint!=0)
           {
            MyTakeProfit=Ask+UserTakeProfitPoint*GetPointPerPrice()*Point;
           }
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 買い注文
//+------------------------------------------------------------------+
void SendBuyOrder(double MyLots,int Doller,int MagicNumber)
  {

//---如果由于最大下单量或者资金问题不能下单则返回
   if(IsCanNotOrder(MyLots)) return;

//---下买单
   if(IsSetTakeProtite)
     {
      OrderResult=OrderSend(Symbol(),OP_BUY,MyLots,NormalizeDouble(Ask,3),MySlippage,NormalizeDouble(MyStopLoss,3),NormalizeDouble(MyTakeProfit,3),"",MagicNumber,0,CLR_NONE);
     }
   else
     {
      OrderResult=OrderSend(Symbol(),OP_BUY,MyLots,NormalizeDouble(Ask,3),MySlippage,NormalizeDouble(MyStopLoss,3),0,"",MagicNumber,0,CLR_NONE);
     }

//---降低交易频率
//   MySleep();
   Sleep(60000);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 売り注文
//+------------------------------------------------------------------+
void SendSellOrder(double MyLots,int Doller,int MagicNumber)
  {

//---如果由于最大下单量或者资金问题不能下单则返回
   if(IsCanNotOrder(MyLots)) return;//如果由于最大下单量或者资金问题不能下单则返回

//---下卖单
   if(IsSetTakeProtite)
     {
      OrderResult=OrderSend(Symbol(),OP_SELL,MyLots,NormalizeDouble(Bid,3),MySlippage,NormalizeDouble(MyStopLoss,3),NormalizeDouble(MyTakeProfit,3),"",MagicNumber,0,CLR_NONE);
     }
   else
     {
      OrderResult=OrderSend(Symbol(),OP_SELL,MyLots,NormalizeDouble(Bid,3),MySlippage,NormalizeDouble(MyStopLoss,3),0,"",MagicNumber,0,CLR_NONE);
     }

//---降低交易频率
//   MySleep();
   Sleep(60000);
  }
//+------------------------------------------------------------------+
//| IsCanNotOrder
//| true:不可以在下订单了, false:还可以下订单
//+------------------------------------------------------------------+
bool IsCanNotOrder(double MyLots)
  {
//---点差太大不下单
   if(SysSpread>MySpread)
     {
      return true;
     }
//---订单总数在最大订单以上则不下单
   if(MyMaxPositions-OrdersTotal()<=0)
     {
      return true;
     }
//---保证金不足则不下单
   else if(AccountFreeMarginCheck(Symbol(),OP_SELL,MyLots)<=0 || GetLastError()==134)
     {
      return true;
     }
//---上述以外可以下单
   else
     {
      return false;//还可以下单
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 降低交易频率
//| 如果交易数量达到MyTradeCountSleep的值则让程序休息MyTradeCountSleepTime分钟
//+------------------------------------------------------------------+
/*
void MySleep()
  {
   MyTradeCount=MyTradeCount+1;
   if(MyTradeCount==MyTradeCountSleep)
     {
      MyTradeCount=0;

      //---反正接下来EA要休息了,不妨在此在判断一下License是否可以
      IsUser=checkAccount(IsDebug,IsCustmize,ACCOUNTID,ACCOUNTNAME,YEAR,MONTH,DAY);

      //---Sleep的时候也想执行的策略要写在这里,
      //---防止停顿的时候交易不频繁的RSI方法错过下单机会
      for(int i=1; i<=(60000*MyTradeCountSleepTime)/5000; i++)
        {
         Sleep(5000);//停顿5秒
        }
     }
  }
*/
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| CountTrades
//+------------------------------------------------------------------+
int CountTrades(string _symbol,int _magic)
  {
   int count=0;
   bool result=false;
   for(int pos=OrdersTotal()-1; pos>=0; pos--)
     {
      result=OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=_symbol || OrderMagicNumber()!=_magic) continue;
      if(OrderSymbol()==_symbol && OrderMagicNumber()==_magic)
         if(OrderType()==OP_SELL || OrderType()==OP_BUY) count++;
     }
   return (count);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| CloseAll
//+------------------------------------------------------------------+
void CloseAll(string _symbol,int _magic,int _slippage)
  {
   bool result=false;
   while(CountTrades(_symbol,_magic)>0)
     {
      for(int pos=OrdersTotal()-1; pos>=0; pos--)
        {
         result=OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==_symbol && OrderMagicNumber()==_magic)
           {
            if(OrderType()==OP_BUY)
              {
               result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),_slippage,Blue);
              }
            else if(OrderType()==OP_SELL)
              {
               result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),_slippage,Red);
              }
            else
              {
               result=OrderDelete(OrderTicket(),clrNONE);
              }
           }
         //Sleep(1000);
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| MyCommont
//+------------------------------------------------------------------+
void MyCommont(string eaName,int MaxPositions)
  {
   Comment(
           +eaName
           +"\n"
           +"________________________________"
           +"\n"
           +"Broker:         "+AccountCompany()
           +"\n"
           +"Brokers Time:  "+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)
           +"\n"
           +"________________________________"
           +"\n"
           +"Name:                  "+AccountName()
           +"\n"
           +"Account Number:        "+(string)AccountNumber()
           +"\n"
           +"Account Currency:      "+AccountCurrency()
           +"\n"
           +"_______________________________"
           +"\n"
           +"MAX ORDERS:             "+(string)MaxPositions
           +"\n"
           +"OrdersTotal:               "+(string)OrdersTotal()
           +"\n"
           +"MyEA ORDERS:               "+(string)CountTrades(Symbol(),magic)
           +"\n"
           +"_______________________________"
           +"\n"
           +"Account BALANCE:     "+DoubleToStr(AccountBalance(),2)
           +"\n"
           +"Account EQUITY:      "+DoubleToStr(AccountEquity(),2)
           +"\n"
           +"________________________________"
           +"\n");
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| GetPointPerPrice                                                 |
//+------------------------------------------------------------------+
double GetPointPerPrice()
  {
   string _symbol_suffix=Symbol();

   if(StringLen(_symbol_suffix)>6)
      _symbol_suffix=StringSubstr(_symbol_suffix,6);
   else
      _symbol_suffix="";

   int digits_jpy = (int)MarketInfo("USDJPY" + _symbol_suffix, MODE_DIGITS);
   int digits_usd = (int)MarketInfo("EURUSD" + _symbol_suffix, MODE_DIGITS);

   if(digits_jpy==2 || digits_usd==4)
     {
      return 0.1;
     }
   if(digits_jpy==3 || digits_usd==5)
     {
      return 1.0;
     }
   if(digits_jpy==4 || digits_usd==6)
     {
      return 10.0;
     }
   if(digits_jpy==0 && digits_usd==0)
     {
      if(Digits==3 || Digits==5)
        {
         return 1.0;
        }
      return 0.1;
     }
   return 1.0;
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| ModifyOrder                                                                 |
//+------------------------------------------------------------------+
void ModifyOrder()
  {
   bool result=false;
   double _StopLoss=0.0;
   double _TakeProfit=0.0;

   for(int pos=0;pos<OrdersTotal();pos++)
     {
      result=OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
        {
         //---更新价格
         RefreshRates();

         //---计算卖单的止盈止损
         if(OrderType()==OP_SELL && OrderStopLoss()==0.0 && UserStopLossPoint>0)
           {
            _StopLoss=Bid+UserStopLossPoint*GetPointPerPrice()*Point;
           }
         if(OrderType()==OP_SELL && OrderTakeProfit()==0.0 && UserTakeProfitPoint>0)
           {
            _TakeProfit=Bid-UserTakeProfitPoint*GetPointPerPrice()*Point;
           }

         //---计算买的止盈止损
         if(OrderType()==OP_BUY && OrderStopLoss()==0.0 && UserStopLossPoint>0)
           {
            _StopLoss=Ask-UserStopLossPoint*GetPointPerPrice()*Point;
           }
         if(OrderType()==OP_BUY && OrderTakeProfit()==0.0 && UserTakeProfitPoint>0)
           {
            _TakeProfit=Ask+UserTakeProfitPoint*GetPointPerPrice()*Point;
           }

         //---根据止盈止损的设置状况修改订单
         //---如果止盈止损都没有被设置则同时更新这两个值
         if(_StopLoss!=0.0 && _TakeProfit!=0.0)
           {
            result=OrderModify(OrderTicket(),OrderOpenPrice(),_StopLoss,_TakeProfit,0,clrNONE);
           }
         //---如果只有止损没有被设置,则更新止损
         else if(_StopLoss!=0.0 && _TakeProfit==0.0)
           {
            result=OrderModify(OrderTicket(),OrderOpenPrice(),_StopLoss,OrderTakeProfit(),0,clrNONE);
           }
         //---如果只有止盈没有被设置,则更新止盈
         else if(_StopLoss==0.0 && _TakeProfit!=0.0)
           {
            result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),_TakeProfit,0,clrNONE);
           }
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| USD_USDJPYmicroEA
//+------------------------------------------------------------------+
//void USD_USDJPYmicroEA(int times=1,bool IsDebug=false,double MyLots=0.01,int MySlippage=20,int MagicNumber=9999)
void USD_USDJPYmicroEA(int times=1,double MyLots=0.01,int MagicNumber=7777)
  {
//---限制只有在XM的美金账户的USDJPYmicro条件下才可以执行此策略
   if(AccountCompany()==XM && AccountCurrency()=="USD" && Symbol()=="USDJPYmicro")
     {
      //---判断自动交易是否开启
      if(!IsTradeAllowed()) return;

      //---判断License
      if(!IsUser)
        {
         Alert("License End!!");
         return;
        }

      //---判断是否可以交易
      if(IsCanNotOrder(0.01)) return;

      if(OrdersTotal()<=MyMaxPositions -2)
        {
         double _take_profit= NormalizeDouble(0.0005 * MarketInfo("USDJPYmicro",MODE_ASK)+0.011,3);
         double _stop_loss  =  NormalizeDouble(0.0015 * MarketInfo("USDJPYmicro",MODE_BID)-0.011,3);
         if(IsDebug) Print("_take_profit:",NormalizeDouble(_take_profit,3));
         if(IsDebug) Print("_stop_loss:",NormalizeDouble(_stop_loss,3));

         //下买单
         for(int i=0; i<times; i++)
           {
            OrderResult=OrderSend("USDJPYmicro",OP_BUY,MyLots,NormalizeDouble(Ask,Digits),MySlippage,NormalizeDouble(Ask-_stop_loss,Digits),NormalizeDouble(Ask+_take_profit,Digits),"",MagicNumber,0,CLR_NONE);
           }
         //下卖单
         for(int i=0; i<times; i++)
           {
            OrderResult=OrderSend("USDJPYmicro",OP_SELL,MyLots,NormalizeDouble(Bid,Digits),MySlippage,NormalizeDouble(Bid+_stop_loss,Digits),NormalizeDouble(Bid-_take_profit,Digits),"",MagicNumber,0,CLR_NONE);
           }
        }
     }
//---显示屏幕提示
   MyCommont("$10ScalPerPro 5.2",MyMaxPositions);

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(IsUseTimeUSD)
     {
      //---如果账户不合法则返回Error
      if(!IsUser)
        {
         if(IsDebug) Print("Licence?!");
         return;
        }
      //---如果是Demo账户,并且不是CustMize账户则返回Error
      if(IsDemo() && IsCustmize==false)
        {
         if(IsDebug) Print("Account ID error!");
         return;
        }
      //---下双建订单
      if(((DayOfWeek()==5) && (StrToInteger(DoubleToStr(Hour(),0))<=22)) || (DayOfWeek()<=4))
        {
         USD_USDJPYmicroEA(EA_Times,0.01,magic);
         return;
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 课题:Trap分割策略                                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|  $20买卖策略买卖信号计算~下单                                     |
//+------------------------------------------------------------------+
void D20EA(int MagicNumber)
  {
//---XM.com USD账户 XXXUSDmicro 0.01手 止盈止损 设置(45logic)
   if(AccountCurrency()=="USD" && AccountCompany()==XM && StringFind(Symbol(),"USDmicro")!=-1)
     {
     }
   else
     {
      return;
     }
//---下单手数计算
   double MyLots=0.02;
   if(IsCustmize)
     {
      MyLots=NormalizeDouble(UserDefineLots,2);//0.02;//この戦略の注文LOTSは0.01とする
     }

//---局部参数初始化
   double MySellRangeDown=0.0;
   double MySellRangeUp=0.0;
   string MyBidString="";
   double MyBuyRangeDown=0.0;
   double MyBuyRangeUp= 0.0;
   string MyAskString = "";

/*
#define SELL_RANGE_DOWN_PARAM_2 79  //0.00075
#define SELL_RANGE_UP_PARAM_2   99  //0.00099
#define BUY_RANGE_UP_PARAM_2    24  //0.00024
#define BUY_RANGE_DOWN_PARAM_2   5  //0.00005
*/

//---卖出价格范围
//---(XXXUSD Sell 0.00075~0.00099 )
   double MySellRangeDownParam=NormalizeDouble(SELL_RANGE_DOWN_PARAM_2*GetPointPerPrice()*Point,Digits);
   double MySellRangeUpParam=NormalizeDouble(SELL_RANGE_UP_PARAM_2*GetPointPerPrice()*Point,Digits);

//---买入价格范围
//---(XXXUSD Buy  0.00005~0.00024 )
   double MyBuyRangeUpParam=NormalizeDouble(BUY_RANGE_UP_PARAM_2*GetPointPerPrice()*Point,Digits);
   double MyBuyRangeDownParam=NormalizeDouble(BUY_RANGE_DOWN_PARAM_2*GetPointPerPrice()*Point,Digits);

//---6个重要的全局变量的初始化
   MyAsk = 0.0;//売り価格初期化
   MyBid = 0.0;//買い価格初期化
   MyStopLoss=0.0;//損切り価格初期化
   MyTakeProfit=0.0;//利益確定価格初期化
   MyAskRoundDown = 0.0;//売り価格の小数点2桁目以降を切り捨てて
   MyBidRoundDown = 0.0;//買い価格の小数点2桁目以降を切り捨てて

//---更新价格
   RefreshRates();

   MyBid=Bid;
   MyAsk=Ask;

//---对计算下单范围时用到的价格的前半部分进行编辑
//---MyBidString=DoubleToStr(MyBid,2);//XXXJPY小数点1桁目が四捨五入されないように
//---MyAskString=DoubleToStr(MyAsk,2);//XXXJPY小数点1桁目が四捨五入されないように
//---MyBidString=DoubleToStr(MyBid,4);//XXXUSD小数点1桁目が四捨五入されないように
//---MyAskString=DoubleToStr(MyAsk,4);//XXXUSD小数点1桁目が四捨五入されないように
   if(Digits%2==0)
     {
      MyBidString=DoubleToStr(MyBid,Digits);//小数点1桁目が四捨五入されないように
      MyAskString=DoubleToStr(MyAsk,Digits);//小数点1桁目が四捨五入されないように
     }
   else
     {
      MyBidString=DoubleToStr(MyBid,Digits - 1);//小数点1桁目が四捨五入されないように
      MyAskString=DoubleToStr(MyAsk,Digits - 1);//小数点1桁目が四捨五入されないように
     }

//---売り注文判断用変数計算      
//---Sell   1.13375     1.13399 
   MyBidRoundDown=StrToDouble(StringSubstr(MyBidString,0,StringLen(MyBidString)-1));//121.050->121.0  1.21050->1.210
   if(IsDebug) Print(__LINE__,"MyBidRoundDown:",MyBidRoundDown);
   MySellRangeDown = MyBidRoundDown + MySellRangeDownParam;//121.0 + 0.050->121.050  1.210 + 0.00050->1.21050
   MySellRangeUp =   MyBidRoundDown + MySellRangeUpParam;  //121.0 + 0.070->121.070  1.210 + 0.00070->1.21070

//---買い注文判断用変数計算      
//---Buy    1.13305     1.13324 
   MyAskRoundDown=StrToDouble(StringSubstr(MyAskString,0,StringLen(MyAskString)-1));//121.029->121.0  1.21029->1.210
   if(IsDebug) Print(__LINE__,"MyAskRoundDown:",MyAskRoundDown);
   MyBuyRangeDown = MyAskRoundDown + MyBuyRangeDownParam;//121.0 + 0.029->121.029  1.210 + 0.00029->1.21029
   MyBuyRangeUp =   MyAskRoundDown + MyBuyRangeUpParam;  //121.0 + 0.049->121.049  1.210 + 0.00049->1.21049

//---[売り価格の小数点2桁目以降を切り捨てて+0.050, 売り価格の小数点2桁目以降を切り捨てて+0.070] 売
//---Sell   1.13379     1.13399 
   if(IsDebug) Print(__LINE__,"MySellRangeDown:",MySellRangeDown);
   if(IsDebug) Print(__LINE__,"MySellRangeUp:",MySellRangeUp);
   if(IsDebug) Print(__LINE__,"MyBuyRangeDown:",MyBuyRangeDown);
   if(IsDebug) Print(__LINE__,"MyBuyRangeUp:",MyBuyRangeUp);
   if(IsDebug) Print(__LINE__,"MODE_STOPLEVEL:",MarketInfo(Symbol(),MODE_STOPLEVEL));

   if(MyBid>=MySellRangeDown && MyBid<=MySellRangeUp)
     {
      D20StopLossTakeProfit(OP_SELL,MagicNumber);
      if(SellOrBuyControl==0 || SellOrBuyControl==2)
        {
         SendSellOrder(MyLots,10,MagicNumber);
        }
     }

//--------------------------------------------------------------
//---[買い価格の小数点2桁目以降を切り捨てて+0.029,買い価格の小数点2桁目以降を切り捨てて+0.049] 買
//---Buy    1.13305     1.13324 
//--------------------------------------------------------------
   if(MyAsk>=MyBuyRangeDown && MyAsk<=MyBuyRangeUp)
     {
      D20StopLossTakeProfit(OP_BUY,MagicNumber);
      if(SellOrBuyControl==0 || SellOrBuyControl==1)
        {
         SendBuyOrder(MyLots,10,MagicNumber);
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|  損切り利益確定価格計算                                            |
//+------------------------------------------------------------------+
void D20StopLossTakeProfit(int MyOrderType,int MagicNumber)
  {
//---计算STOPLEVEL
   double MyStopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*GetPointPerPrice()*Point;
//---止损止盈价格初始化
   MyStopLoss=0.0;
   MyTakeProfit=0.0;

//---XM.com USD账户 XXXUSDmicro 0.02手 止盈止损 设置(45logic)
   if(AccountCurrency()=="USD" && AccountCompany()==XM && StringFind(Symbol(),"USDmicro")!=-1)
     {
      double MyRiskPrice=0.0001;//10Point(1Pips)自分に不利な方向に調整する。
      double MyStopLevelRisk=0.00002;//TakeProfit滑るのを防ぐために

      //---卖单时的止损和止盈的值的计算     
      if(MyOrderType==OP_SELL)
        {
         MyStopLoss=MathMin(Bid-MyStopLevel-MyStopLevelRisk,MyBidRoundDown+0.00214);
         //MyTakeProfit=MyBidRoundDown+0.00020;
         MyTakeProfit=0.0;

         if(IsDebug) Print(__LINE__,"MyBidRoundDown:",MyBidRoundDown);
         if(IsDebug) Print(__LINE__,"MyStopLoss:",MyStopLoss);
         if(IsDebug) Print(__LINE__,"MyTakeProfit:",MyTakeProfit);
        }
      //---买单时的止损和止盈的值的计算       
      if(MyOrderType==OP_BUY)
        {
         MyStopLoss=MyAskRoundDown-0.00120;
         //MyTakeProfit=MathMax(Ask+MyStopLevel+MyStopLevelRisk,MyAskRoundDown+0.00080);
         MyTakeProfit=0.0;

         if(IsDebug) Print(__LINE__,"MyBidRoundDown:",MyBidRoundDown);
         if(IsDebug) Print(__LINE__,"MyStopLoss:",MyStopLoss);
         if(IsDebug) Print(__LINE__,"MyTakeProfit:",MyTakeProfit);
        }
     }

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 盈利平仓策略
//+------------------------------------------------------------------+
void DoTakeProfit(int _EA_MagicNumber,double _EA_Lots,string _EA_Symbol,double _EA_TakeProfit)
  {
   int orderCounts=OrdersTotal();
   bool result=false;

   for(int position=0; position<orderCounts; position++)
     {
      result=OrderSelect(position,SELECT_BY_POS,MODE_TRADES);
      //---如果参数有设置则只平掉参数设置的Magic
      if(_EA_MagicNumber!=0)
        {
         if(OrderMagicNumber()!=_EA_MagicNumber) continue;//不是这个EA下的订单,continue
        }
      //---如果参数有设置则指平掉对应的手数
      if(_EA_Lots!=0)
        {
         if(OrderLots()!=_EA_Lots) continue;//不是0.01手,continue
        }
      //---如果参数有设置则指平掉对应的货币对
      if(_EA_Symbol!="")//USDJPYmicro,EURUSDmicro,AUDUSDmicro,GBPUSDmicro
        {
         if(OrderSymbol()!=_EA_Symbol) continue;//跟图上的货币对儿不同时,continue。
        }
      //---赢利到EA_TakeProfit的时候
      if(_EA_TakeProfit>0.0)
        {
         RefreshRates();
         if(OrderProfit()>=_EA_TakeProfit)
           {
            //---买单时获利平仓处理
            if(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP)
              {
               result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,DarkOrange);
              }
            //---卖单时获利平仓处理
            else
              {
               result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,DarkOrange);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| 持单超过一定时间的平仓策略
//+------------------------------------------------------------------+
//---功能1:循环各个订单如果满足指定手数,满足盈利额度则平仓
//---功能2:循环各个订单如果持单时间大于等于time秒时则删除挂单
void CloseOrderByTakeProfiteOrTime(int _EA_MagicNumber,double _EA_Lots,string _EA_Symbol,double _EA_TakeProfit,int _EA_HoldTime)
  {
   int orderCounts=OrdersTotal();
   bool result=false;

   for(int position=0; position<orderCounts; position++)
     {
      result=OrderSelect(position,SELECT_BY_POS,MODE_TRADES);
      //---如果参数有设置则只平掉参数设置的Magic
      if(_EA_MagicNumber!=0)
        {
         if(OrderMagicNumber()!=_EA_MagicNumber) continue;//不是这个EA下的订单,continue
        }
      //---如果参数有设置则指平掉对应的手数
      if(_EA_Lots!=0)
        {
         if(OrderLots()!=_EA_Lots) continue;//不是0.01手,continue
        }
      //---如果参数有设置则指平掉对应的货币对
      if(_EA_Symbol!="")//USDJPYmicro,EURUSDmicro,AUDUSDmicro,GBPUSDmicro
        {
         if(OrderSymbol()!=_EA_Symbol) continue;//跟图上的货币对儿不同时,continue。
        }
      //---赢利到EA_TakeProfit的时候
      if(_EA_TakeProfit>0.0)
        {
         RefreshRates();
         if(OrderProfit()>=_EA_TakeProfit)
           {
            //---买单时获利平仓处理
            if(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP)
              {
               result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,DarkOrange);
              }
            //---卖单时获利平仓处理
            else
              {
               result=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,DarkOrange);
              }
           }
        }
      //---当前时间-对应的挂单的开单时间 >= time分钟则删除对应的挂单
      if(_EA_HoldTime!=0 && MathFloor(TimeCurrent())-MathFloor(OrderOpenTime())>=_EA_HoldTime)
        {
         result=OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+

20
27
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
27