1赞

9评论

0收藏

大神帮我改一下,很简单的,有偿!

 

avatar Hyuwen | 1804 人阅读 | 9 人评论 | 2019-06-07

就是下面这个EA,只能做欧元,能不能改成可以做其他货币的,当然不止6位数的货币,需要4位数3位数都能够运行的,大神帮我改改,有偿,谢谢。

//+------------------------------------------------------------------+
// Copyright , AAA
// System Name:  AAA
//+------------------------------------------------------------------+
#property copyright "20190607 by AAA"
#property link "AAA"


///////////////////////////Model1////////////////////////////
extern string Model1_tip="BUY";
extern bool m1alert=true;string M1_Symbol;double M1_Point;int M1_Mt;datetime Model1_lastOpenOrderTime;
extern string M1S1_tip="Strategy Group1";
extern string M1S1_Filter_tip="Filter Conditions";
extern string M1S1_Exec_tip="Execution Conditions";
extern string M1S1_Shift_tip="Shift Conditions";
extern string M1S1C1_Shift_tip="Shift Condition 1";
///////////////////////////Model2////////////////////////////
extern string Model2_tip="SELL";
extern bool m2alert=true;string M2_Symbol;double M2_Point;int M2_Mt;datetime Model2_lastOpenOrderTime;
extern string M2S1_tip="Strategy Group1";
extern string M2S1_Filter_tip="Filter Conditions";
extern string M2S1_Exec_tip="Execution Conditions";
extern string M2S1_Shift_tip="Shift Conditions";
extern string M2S1C1_Shift_tip="Shift Condition 1";
///////////////////////////Model3////////////////////////////
extern string Model3_tip="STOP";
string M3_Symbol;double M3_Point;int M3_Mt;datetime Model3_lastOpenOrderTime;
extern string M3S1_tip="Strategy Group1";
extern string M3S1_Filter_tip="Filter Conditions";
extern string M3S1_Exec_tip="Execution Conditions";
extern string M3S1_Shift_tip="Shift Conditions";
extern string M3S1C1_Shift_tip="Shift Condition 1";
double m1s1shift1_A_val;double m1s1shift1_B_val;
double m2s1shift1_A_val;double m2s1shift1_B_val;
double m3s1shift1_A_val;double m3s1shift1_B_val;
datetime lastBarTime[4];
int modelMagic[4];
bool canClose31=true;
bool closeOneTime31=1;
bool canClose32=true;
bool closeOneTime32=1;

int maxtry=10;
bool printLog=true;
int sleepTime=2000;
int init(){
  M1_Symbol=Symbol();  double m1_point = MarketInfo(M1_Symbol,MODE_POINT);  int m1_digits = MarketInfo(M1_Symbol,MODE_DIGITS);  if(m1_digits==3 || m1_digits==5){
    M1_Point=m1_point*10;
M1_Mt=10;
  }else{
    M1_Point=m1_point;
    M1_Mt=1;
  }
  modelMagic[1]=150232;
  M2_Symbol=Symbol();  double m2_point = MarketInfo(M2_Symbol,MODE_POINT);  int m2_digits = MarketInfo(M2_Symbol,MODE_DIGITS);  if(m2_digits==3 || m2_digits==5){
    M2_Point=m2_point*10;
M2_Mt=10;
  }else{
    M2_Point=m2_point;
    M2_Mt=1;
  }
  modelMagic[2]=150233;
  M3_Symbol=Symbol();  double m3_point = MarketInfo(M3_Symbol,MODE_POINT);  int m3_digits = MarketInfo(M3_Symbol,MODE_DIGITS);  if(m3_digits==3 || m3_digits==5){
    M3_Point=m3_point*10;
M3_Mt=10;
  }else{
    M3_Point=m3_point;
    M3_Mt=1;
  }
  modelMagic[3]=150234;
   
}
int start(){
    runModel1();runModel2();runModel3();
  return (0);
}

void runModel1(){
  int totalPosition = countPositionByMagicSymbol(150232,M1_Symbol,0);
  if( 0>0 && (MarketInfo(M1_Symbol,MODE_ASK)-MarketInfo(M1_Symbol,MODE_BID))>0*M1_Point )return;
  if((0!=0)&&(!isNewBar(M1_Symbol,5,1))) return;
  bool canRunCheck=false;
  int maxOrder=5;
  if(!0)maxOrder=1;
  if(totalPosition<maxOrder)canRunCheck=true;
  if(maxOrder>1&&totalPosition>=1){
    if(TimeCurrent()<(Model1_lastOpenOrderTime+5*60))canRunCheck=false;
    if(!checkCanOpenMaxOrder(0,0,M1_Symbol,150232,M1_Point))canRunCheck=false;
  }
  if(0>0&&totalPosition>0)breakEven(150232,M1_Symbol,0,M1_Point);
  if(0>0&&0<=2&&totalPosition>0)trailStop(150232,M1_Symbol,0,50,20,M1_Point);
  if(canRunCheck){
  if(checkM1S1()){
    int orderType=OP_BUY;if(0>0)orderType=OP_SELL;
    if(1>0){
    double lots = getlots(0.1,0,2,0,M1_Symbol,M1_Mt,0.1,100);
    int sl= 0;
    int tp = 0;
    int ticket = openposition(
              M1_Symbol,
              orderType,
              lots,
              sl,
              tp,
              150232,
              1,
              1,
              0,
              0,
              20,
              720,
              M1_Point,
              M1_Mt,
              0);
    Model1_lastOpenOrderTime = getOrderOpenTime(ticket);}
    if(m1alert){soundAlert("alert.wav",1);m1alert=false;}
  }
  else{m1alert=true;}
  }
}
void runModel2(){
  int totalPosition = countPositionByMagicSymbol(150233,M2_Symbol,0);
  if( 0>0 && (MarketInfo(M2_Symbol,MODE_ASK)-MarketInfo(M2_Symbol,MODE_BID))>0*M2_Point )return;
  if((0!=0)&&(!isNewBar(M2_Symbol,5,2))) return;
  bool canRunCheck=false;
  int maxOrder=5;
  if(!0)maxOrder=1;
  if(totalPosition<maxOrder)canRunCheck=true;
  if(maxOrder>1&&totalPosition>=1){
    if(TimeCurrent()<(Model2_lastOpenOrderTime+5*60))canRunCheck=false;
    if(!checkCanOpenMaxOrder(0,0,M2_Symbol,150233,M2_Point))canRunCheck=false;
  }
  if(0>0&&totalPosition>0)breakEven(150233,M2_Symbol,0,M2_Point);
  if(0>0&&0<=2&&totalPosition>0)trailStop(150233,M2_Symbol,0,50,20,M2_Point);
  if(canRunCheck){
  if(checkM2S1()){
    int orderType=OP_SELL;if(0>0)orderType=OP_BUY;
    if(1>0){
    double lots = getlots(0.1,0,2,0,M2_Symbol,M2_Mt,0.1,100);
    int sl= 0;
    int tp = 0;
    int ticket = openposition(
              M2_Symbol,
              orderType,
              lots,
              sl,
              tp,
              150233,
              1,
              1,
              0,
              0,
              20,
              720,
              M2_Point,
              M2_Mt,
              0);
    Model2_lastOpenOrderTime = getOrderOpenTime(ticket);}
    if(m2alert){soundAlert("alert.wav",1);m2alert=false;}
  }
  else{m2alert=true;}
  }
}
void runModel3(){
  if((0!=0)&&(!isNewBar(M3_Symbol,5,3))) return;
  bool canRunCheck=false;
  if(checkHasPosition(150232,M1_Symbol)){canRunCheck=true;}else{if(closeOneTime31)canClose31=true;}
  bool spread31=true;  if( 0>0 && (MarketInfo(M1_Symbol,MODE_ASK)-MarketInfo(M1_Symbol,MODE_BID))>0*M1_Point )spread31=false;
  if(checkHasPosition(150233,M2_Symbol)){canRunCheck=true;}else{if(closeOneTime32)canClose32=true;}
  bool spread32=true;  if( 0>0 && (MarketInfo(M2_Symbol,MODE_ASK)-MarketInfo(M2_Symbol,MODE_BID))>0*M2_Point )spread32=false;
  if(canRunCheck){
  if(checkM3S1()){
    bool allClose;
    if(canClose31&&spread31){
      allClose=closeModelPosition(150232,M1_Symbol,1,0,M1_Mt,0);
      if(closeOneTime31&&allClose)canClose31=false;
      if(!checkHasPosition(150232,M1_Symbol)){if(closeOneTime31)canClose31=true;}
    }
    if(canClose32&&spread32){
      allClose=closeModelPosition(150233,M2_Symbol,1,0,M2_Mt,0);
      if(closeOneTime32&&allClose)canClose32=false;
      if(!checkHasPosition(150233,M2_Symbol)){if(closeOneTime32)canClose32=true;}
    }
  }
  }
}
bool checkM1S1(){
  int i;
  int limit = 100;  bool reValue=false;
  int preBar=0;
  if(0==2)preBar=1;
  bool filter12=true;
  bool filter34=true;
  bool exec12_temp=true, exec12_a=false, exec12_b=true,exec12=false;
  if(exec12_a&&exec12_b)exec12=true;
  exec12=true;
  bool bshift=true;
  if(bshift){
   m1s1shift1_A_val=iClose(Symbol(),0,0);
   m1s1shift1_B_val=iClose(Symbol(),0,1);
   if(!(m1s1shift1_A_val>(m1s1shift1_B_val+0))){bshift=false;}
  }
  if(filter12&&filter34&&exec12&&bshift)reValue=true;
  return (reValue);
}
bool checkM2S1(){
  int i;
  int limit = 100;  bool reValue=false;
  int preBar=0;
  if(0==2)preBar=1;
  bool filter12=true;
  bool filter34=true;
  bool exec12_temp=true, exec12_a=false, exec12_b=true,exec12=false;
  if(exec12_a&&exec12_b)exec12=true;
  exec12=true;
  bool bshift=true;
  if(bshift){
   m2s1shift1_A_val=iClose(Symbol(),0,0);
   m2s1shift1_B_val=iClose(Symbol(),0,1);
   if(!(m2s1shift1_A_val<(m2s1shift1_B_val-0))){bshift=false;}
  }
  if(filter12&&filter34&&exec12&&bshift)reValue=true;
  return (reValue);
}
bool checkM3S1(){
  int i;
  int limit = 100;  bool reValue=false;
  int preBar=0;
  if(0==2)preBar=1;
  bool filter12=true;
  bool filter34=true;
  bool exec12_temp=true, exec12_a=false, exec12_b=true,exec12=false;
  if(exec12_a&&exec12_b)exec12=true;
  exec12=true;
  bool bshift=true;
  if(bshift){
   m3s1shift1_A_val=iClose(Symbol(),0,1);
   m3s1shift1_B_val=iOpen(Symbol(),0,1);
   if(!(m3s1shift1_A_val!=(m3s1shift1_B_val+0))){bshift=false;}
  }
  if(filter12&&filter34&&exec12&&bshift)reValue=true;
  return (reValue);
}

bool isNewBar(string s,int timeframe,int model){
  datetime currentBarTime = iTime(s,timeframe,0);
  if(lastBarTime[model]!=currentBarTime){        
    lastBarTime[model] = currentBarTime;
    return (true);
   }else{
    return (false);
   }               
}
bool checkCanOpenMaxOrder(int mode,int pip,string symbol,int magic,double point){
  bool result=true;int i,count=0;double profitPip;
  switch(mode){
    case 0: result=true;break;
    case 1:
  for(i=OrdersTotal();i>=0;i--){
       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
       if(OrderSymbol()==symbol&&OrderMagicNumber()==magic){
         count++;
     if(!(OrderProfit()>0)){result=false;break;}
     if(count==1){
       if(OrderType()==OP_BUY)profitPip = (MarketInfo(OrderSymbol(),MODE_BID) - OrderOpenPrice())/point;
       if(OrderType()==OP_SELL)profitPip = (OrderOpenPrice() - MarketInfo(OrderSymbol(),MODE_ASK))/point;
       if(!(profitPip>pip)){result=false;break;}
     }
       }
     }
    break;
    case 2:
     for(i=OrdersTotal();i>=0;i--){
       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
       if(OrderSymbol()==symbol&&OrderMagicNumber()==magic){
         count++;
         if(!(OrderProfit()<0)){result=false;break;}
         if(count==1){
       if(OrderType()==OP_BUY)profitPip = (MarketInfo(OrderSymbol(),MODE_BID) - OrderOpenPrice())/point;
       if(OrderType()==OP_SELL)profitPip = (OrderOpenPrice() - MarketInfo(OrderSymbol(),MODE_ASK))/point;
       if(!((-1*profitPip)>pip)){result=false;break;}
     }
       }
     }
    break;
  }
  return (result);
}

double getlots(double DefaultLots,bool MoneyManage,double Risk,double StopLoss,string symbol,int mt,double MinLots,double MaxLots){
   double lot;
   if(MoneyManage){
     int LotDigits=0;
     if(MarketInfo(symbol,MODE_MINLOT)==0.1)LotDigits=1;
     else if(MarketInfo(symbol,MODE_MINLOT)==0.01)LotDigits=2;
     else if(MarketInfo(symbol,MODE_MINLOT)==0.001)LotDigits=3;
     if(StopLoss>0)lot=NormalizeDouble((AccountEquity()*(Risk/100))/(MarketInfo(symbol,MODE_TICKVALUE)*mt*StopLoss ),LotDigits);
     else lot= NormalizeDouble(AccountEquity()/10000*Risk,LotDigits);
     if(lot<MinLots)lot=MinLots;
     if(lot>MaxLots)lot=MaxLots;
   }else lot=DefaultLots;      
   return(lot);
}

int openposition(string symbol,int type,double lots,double StopLoss,double TakeProfit,int magic,bool ECN,bool InstantOrder,bool StopOrder,bool LimitOrder,int Gap,int Expiration,double point,int mt,int Slippage){
  int ticket=0;int expire=0;int try=0;
  if(StopOrder || LimitOrder)if(Expiration>0)expire=TimeCurrent()+(Expiration*60);
  double ask=MarketInfo(symbol,MODE_ASK);double bid=MarketInfo(symbol,MODE_BID);
  if(type==OP_BUY){//buy
   if(ECN){
     if(InstantOrder){
       while(ticket<=0 && try<maxtry){
          RefreshRates();
          ticket=open(symbol,OP_BUY,lots,ask,0,0,magic,expire,point,mt,Slippage,Blue);
          if(ticket<0){try++;if(printLog)Print("Error opening Instant BUY order!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
          if(ticket>0){ecnsltpLong(ticket,StopLoss,TakeProfit,point);}         
       }
     }
     if(StopOrder){
         RefreshRates();
         ticket=open(symbol,OP_BUYSTOP,lots,ask+Gap*point,0,0,magic,expire,point,mt,Slippage,Blue);
         if(ticket>0){ecnsltpLong(ticket,StopLoss,TakeProfit,point);}
     }
     if(LimitOrder){
         RefreshRates();
         ticket=open(symbol,OP_BUYLIMIT,lots,bid-Gap*point,0,0,magic,expire,point,mt,Slippage,Blue);
         if(ticket>0){ecnsltpLong(ticket,StopLoss,TakeProfit,point);}
     }   
   }else{
     if(InstantOrder){
       while(ticket<=0 && try<maxtry){
          RefreshRates();
          ticket=open(symbol,OP_BUY,lots,ask,StopLoss,TakeProfit,magic,expire,point,mt,Slippage,Blue);
          if(ticket<0){try++;if(printLog)Print("Error opening Instant BUY order!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
       }
     }
     if(StopOrder){RefreshRates();ticket=open(symbol,OP_BUYSTOP,lots,ask+Gap*point,StopLoss,TakeProfit,magic,expire,point,mt,Slippage,Blue);}
     if(LimitOrder){RefreshRates();ticket=open(symbol,OP_BUYLIMIT,lots,bid-Gap*point,StopLoss,TakeProfit,magic,expire,point,mt,Slippage,Blue);}
   }
  }else if(type==OP_SELL){ // Sell
   if(ECN){
     if(InstantOrder){
       while(ticket<=0 && try<maxtry){
          RefreshRates();
          ticket=open(symbol,OP_SELL,lots,bid,0,0,magic,expire,point,mt,Slippage,Red);
          if(ticket<0){try++;if(printLog)Print("Error opening Instant SELL order!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
          if(ticket>0){ecnsltpShort(ticket,StopLoss,TakeProfit,point);}
       }
     }
     if(StopOrder){
         RefreshRates();
         ticket=open(symbol,OP_SELLSTOP,lots,bid-Gap*point,0,0,magic,expire,point,mt,Slippage,Red);
         if(ticket>0){ecnsltpShort(ticket,StopLoss,TakeProfit,point);}
     }
     if(LimitOrder){
         RefreshRates();
         ticket=open(symbol,OP_SELLLIMIT,lots,ask+Gap*point,0,0,magic,expire,point,mt,Slippage,Red);
         if(ticket>0){ecnsltpShort(ticket,StopLoss,TakeProfit,point);}
     }   
   }else{
     if(InstantOrder){
       while(ticket<=0 && try<maxtry){
          RefreshRates();
          ticket=open(symbol,OP_SELL,lots,bid,StopLoss,TakeProfit,magic,expire,point,mt,Slippage,Red);
          if(ticket<0){try++;if(printLog)Print("Error opening Instant SELL order!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
       }
     }
     if(StopOrder){RefreshRates();ticket=open(symbol,OP_SELLSTOP,lots,bid-Gap*point,StopLoss,TakeProfit,magic,expire,point,mt,Slippage,Red);}
     if(LimitOrder){RefreshRates();ticket=open(symbol,OP_SELLLIMIT,lots,ask+Gap*point,StopLoss,TakeProfit,magic,expire,point,mt,Slippage,Red);}
   }
  }
  
  return (ticket);
}

int open(string symbol,int type,double lots,double price,double stoploss,double takeprofit,int magic, int expire,double point,int mt,int Slippage,color clr){
   int ticket=0;
   double sl,tp;
   if(type==OP_BUY || type==OP_BUYSTOP || type==OP_BUYLIMIT){
      if(stoploss>0){sl=price-stoploss*point;}else{sl=0;}
      if(takeprofit>0){tp=price+takeprofit*point;}else{tp=0;}
   }
   if(type==OP_SELL || type==OP_SELLSTOP || type==OP_SELLLIMIT){
      if(stoploss>0){sl=price+stoploss*point;}else{sl=0;}
      if(takeprofit>0){tp=price-takeprofit*point;}else{tp=0;}
   }
   ticket=OrderSend(symbol,type,lots,NormalizeDouble(price,MarketInfo(symbol,MODE_DIGITS)),Slippage*mt,sl,tp,"Prower by myeatrade.com",magic,expire,clr);
   return(ticket);
}
datetime getOrderOpenTime(int ticket){
   OrderSelect(ticket,SELECT_BY_TICKET);
   return (OrderOpenTime());
}

void ecnsltpLong(int ticket,double StopLoss,double TakeProfit,double point){
  OrderSelect(ticket,SELECT_BY_TICKET);
  bool succeed;int try;
  succeed=false;try=0;
  if(OrderStopLoss()==0&&StopLoss>0){
     while(!succeed && try<maxtry){
       RefreshRates();
       succeed = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-StopLoss*point,MarketInfo(OrderSymbol(),MODE_DIGITS)),OrderTakeProfit(),0,Blue);
       if(!succeed){try++;if(printLog)Print("Error modify long order stoploss!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
     }
  }
  RefreshRates();
  succeed=false;try=0;
  OrderSelect(ticket,SELECT_BY_TICKET);
  if(OrderTakeProfit()==0&&TakeProfit>0){
     while(!succeed && try<maxtry){
       RefreshRates();
       succeed = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(OrderOpenPrice()+TakeProfit*point,MarketInfo(OrderSymbol(),MODE_DIGITS)),0,Blue);
       if(!succeed){try++;if(printLog)Print("Error modify long order takeprofit!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
     }
  }
}
void ecnsltpShort(int ticket,double StopLoss,double TakeProfit,double point){
  OrderSelect(ticket,SELECT_BY_TICKET);
  bool succeed;int try;
  succeed=false;try=0;
  if(OrderStopLoss()==0&&StopLoss>0){
     while(!succeed && try<maxtry){
       RefreshRates();
       succeed = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+StopLoss*point,MarketInfo(OrderSymbol(),MODE_DIGITS)),OrderTakeProfit(),0,Blue);
       if(!succeed){try++;if(printLog)Print("Error modify short order stoploss!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
     }
  }
  RefreshRates();
  succeed=false;try=0;
  OrderSelect(ticket,SELECT_BY_TICKET);
  if(OrderTakeProfit()==0&&TakeProfit>0){
     while(!succeed && try<maxtry){
       RefreshRates();
       succeed = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(OrderOpenPrice()-TakeProfit*point,MarketInfo(OrderSymbol(),MODE_DIGITS)),0,Blue);
       if(!succeed){try++;if(printLog)Print("Error modify short order takeprofit!",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
     }
  }
}

int countPositionByMagicSymbol(int magic,string symbol,int hardCloseTime){
   int count=0;
   if(OrdersTotal()>0){
      for(int i=OrdersTotal();i>=0;i--){
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber()==magic&&OrderSymbol()==symbol){
           count++;
           if(hardCloseTime>0&&(TimeCurrent()>OrderOpenTime()+hardCloseTime*60)){
             if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),MarketInfo(symbol,MODE_BID),0);
             else if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),MarketInfo(symbol,MODE_ASK),0);
           }
         }
      }
      return(count);
   }
}

void breakEven(int magic,string symbol,int BreakEven,double point){
  RefreshRates();
  if(OrdersTotal()>0){
    for(int i=0;i<OrdersTotal();i++){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderMagicNumber()==magic && OrderSymbol()==symbol){
        if(OrderType()==OP_BUY){
          if( NormalizeDouble((MarketInfo(symbol,MODE_BID)-OrderOpenPrice()),MarketInfo(symbol,MODE_DIGITS))>=NormalizeDouble(BreakEven*point,MarketInfo(symbol,MODE_DIGITS))){
            if( (OrderStopLoss()-OrderOpenPrice())<0)
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Blue);
          }
        }else{
          if( NormalizeDouble((OrderOpenPrice()-MarketInfo(symbol,MODE_ASK)),MarketInfo(symbol,MODE_DIGITS))>=NormalizeDouble(BreakEven*point,MarketInfo(symbol,MODE_DIGITS))){
            if(((OrderOpenPrice()-OrderStopLoss())<0)||(OrderStopLoss()==0))
              OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
          }     
        }     
      }
    }  
  }
}

void trailStop(int magic,string symbol,int TrailMode,int TrailStart,int TrailStop,double point){
  RefreshRates();
  if(OrdersTotal()>0){
    for(int i=0;i<OrdersTotal();i++){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderMagicNumber()==magic && OrderSymbol()==symbol){
        int digits=MarketInfo(symbol,MODE_DIGITS);
        double ask = MarketInfo(symbol,MODE_ASK);double bid = MarketInfo(symbol,MODE_BID);
        if(OrderType()==OP_BUY){
          if( NormalizeDouble((bid-OrderOpenPrice()),digits)>=NormalizeDouble(TrailStart*point,digits)){
            if(TrailMode==1){
              if(NormalizeDouble(OrderStopLoss(),digits)<NormalizeDouble(bid-TrailStop*point,digits)){
                OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(bid-TrailStop*point,digits),OrderTakeProfit(),0,Blue);
              }
            }
            if(TrailMode==2){
              if(bid-TrailStop*point >=OrderStopLoss()+TrailStop*point){
                OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(bid-TrailStop*point,digits),OrderTakeProfit(),0,Blue);
              }
            }
          }
        }else{
          if( NormalizeDouble((OrderOpenPrice()-ask),digits)>=NormalizeDouble(TrailStart*point,digits)){
            if(TrailMode==1){
              if( (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(ask+TrailStop*point,digits)) || OrderStopLoss()==0 ){
                OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ask+TrailStop*point,digits),OrderTakeProfit(),0,Red);
              }
            }
            if(TrailMode==2){
              if((ask+TrailStop*point <=OrderStopLoss()-TrailStop*point) || OrderStopLoss()==0 ){
                OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ask+TrailStop*point,digits),OrderTakeProfit(),0,Blue);
              }
            }
          }     
        }     
      }
    }  
  }
}





void soundAlert(string fileName,int reTimes){for(int i=0;i<=reTimes;i++){PlaySound(fileName);Sleep(5000);}}

string errordescription(int code){
   string error;
   switch(code){
      case 0:
      case 1:error="no error";break;
      case 2:error="common error";break;
      case 3:error="invalid trade parameters";break;
      case 4:error="trade server is busy";break;
      case 5:error="old version of the client terminal";break;
      case 6:error="no connection with trade server";break;
      case 7:error="not enough rights";break;
      case 8:error="too frequent requests";break;
      case 9:error="malfunctional trade operation";break;
      case 64:error="account disabled";break;
      case 65:error="invalid account";break;
      case 128:error="trade timeout";break;
      case 129:error="invalid price";break;
      case 130:error="invalid stops";break;
      case 131:error="invalid trade volume";break;
      case 132:error="market is closed";break;
      case 133:error="trade is disabled";break;
      case 134:error="not enough money";break;
      case 135:error="price changed";break;
      case 136:error="off quotes";break;
      case 137:error="broker is busy";break;
      case 138:error="requote";break;
      case 139:error="order is locked";break;
      case 140:error="long positions only allowed";break;
      case 141:error="too many requests";break;
      case 145:error="modification denied because order too close to market";break;
      case 146:error="trade context is busy";break;
      case 4000:error="no error";break;
      case 4001:error="wrong function pointer";break;
      case 4002:error="array index is out of range";break;
      case 4003:error="no memory for function call stack";break;
      case 4004:error="recursive stack overflow";break;
      case 4005:error="not enough stack for parameter";break;
      case 4006:error="no memory for parameter string";break;
      case 4007:error="no memory for temp string";break;
      case 4008:error="not initialized string";break;
      case 4009:error="not initialized string in array";break;
      case 4010:error="no memory for array\' string";break;
      case 4011:error="too long string";break;
      case 4012:error="remainder from zero divide";break;
      case 4013:error="zero divide";break;
      case 4014:error="unknown command";break;
      case 4015:error="wrong jump (never generated error)";break;
      case 4016:error="not initialized array";break;
      case 4017:error="dll calls are not allowed";break;
      case 4018:error="cannot load library";break;
      case 4019:error="cannot call function";break;
      case 4020:error="expert function calls are not allowed";break;
      case 4021:error="not enough memory for temp string returned from function";break;
      case 4022:error="system is busy (never generated error)";break;
      case 4050:error="invalid function parameters count";break;
      case 4051:error="invalid function parameter value";break;
      case 4052:error="string function internal error";break;
      case 4053:error="some array error";break;
      case 4054:error="incorrect series array using";break;
      case 4055:error="custom indicator error";break;
      case 4056:error="arrays are incompatible";break;
      case 4057:error="global variables processing error";break;
      case 4058:error="global variable not found";break;
      case 4059:error="function is not allowed in testing mode";break;
      case 4060:error="function is not confirmed";break;
      case 4061:error="send mail error";break;
      case 4062:error="string parameter expected";break;
      case 4063:error="integer parameter expected";break;
      case 4064:error="double parameter expected";break;
      case 4065:error="array as parameter expected";break;
      case 4066:error="requested history data in update state";break;
      case 4099:error="end of file";break;
      case 4100:error="some file error";break;
      case 4101:error="wrong file name";break;
      case 4102:error="too many opened files";break;
      case 4103:error="cannot open file";break;
      case 4104:error="incompatible access to a file";break;
      case 4105:error="no order selected";break;
      case 4106:error="unknown symbol";break;
      case 4107:error="invalid price parameter for trade function";break;
      case 4108:error="invalid ticket";break;
      case 4109:error="trade is not allowed";break;
      case 4110:error="longs are not allowed";break;
      case 4111:error="shorts are not allowed";break;
      case 4200:error="object is already exist";break;
      case 4201:error="unknown object property";break;
      case 4202:error="object is not exist";break;
      case 4203:error="unknown object type";break;
      case 4204:error="no object name";break;
      case 4205:error="object coordinates error";break;
      case 4206:error="no specified subwindow";break;
      default:error="unknown error";
   }
   return(error);
}

bool checkHasPosition(int magic,string symbol){
  if(OrdersTotal()>0){
      for(int i=OrdersTotal();i>=0;i--){
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber()==magic&&OrderSymbol()==symbol) return(true);
      }  
  }
  return (false);
}
bool closeModelPosition(int magic,string symbol,double percent,int m,int mt,int Slippage){
  double closeLots=0;
  bool AllClose=true;
  bool succeed;int try;
  if(OrdersTotal()>0){
    for(int i=OrdersTotal();i>=0;i--){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==magic&&OrderSymbol()==symbol){
        if(TimeCurrent()-OrderOpenTime()<m*60){AllClose=false;continue;}
        closeLots=OrderLots()*percent;
        if(closeLots<MarketInfo(OrderSymbol(),MODE_MINLOT))closeLots=MarketInfo(OrderSymbol(),MODE_MINLOT);
        if(OrderType()==OP_BUY){
          succeed=0;try=0;
          while(!succeed && try<maxtry){
            RefreshRates();
            succeed = OrderClose(OrderTicket(),closeLots,MarketInfo(symbol,MODE_BID),Slippage*mt);
            if(!succeed){try++;if(printLog)Print("Error close order in CloseModel ",""+OrderTicket(),"! ",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
          }
          if(!succeed){AllClose=false;}
        }
        if(OrderType()==OP_SELL){
          succeed=0;try=0;
          while(!succeed && try<maxtry){
            RefreshRates();
            succeed = OrderClose(OrderTicket(),closeLots,MarketInfo(symbol,MODE_ASK),Slippage*mt);
            if(!succeed){try++;if(printLog)Print("Error close order in CloseModel ",""+OrderTicket(),"! ",errordescription(GetLastError())," retry "+try+" times");Sleep(sleepTime);}
          }
          if(!succeed){AllClose=false;}
        }
  if(OrderType()==OP_BUYLIMIT||OrderType()==OP_BUYSTOP||OrderType()==OP_SELLLIMIT||OrderType()==OP_SELLSTOP){
          RefreshRates();
          if(!OrderDelete(OrderTicket())){AllClose=false;}
        }
      }
    }  
  }
  return (AllClose);
}


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

评论|共 9 个

唐盗盗

发表于 2019-6-7 18:33:19 | 显示全部楼层

货币对没有限制的  我这边也可以开镑美的单子

唐盗盗

发表于 2019-6-7 18:35:06 | 显示全部楼层

QQ浏览器截图20190607183445.png

可以正常使用的,没有啥限制

Hyuwen

发表于 2019-6-7 19:11:59 | 显示全部楼层

唐盗盗 发表于 2019-6-7 18:35
可以正常使用的,没有啥限制

镑美6位数的,6位数以外的就不可以了

acong

发表于 2019-6-7 20:20:30 | 显示全部楼层

试下这个

ea.mq4

Hyuwen

发表于 2019-6-7 20:55:11 | 显示全部楼层

本帖最后由 Hyuwen 于 2019-6-7 22:00 编辑
只能做6位数的货币,5位数的有些不行,4位数的全部不行。

acong

发表于 2019-6-7 22:26:19 | 显示全部楼层

Hyuwen 发表于 2019-6-7 20:55
只能做6位数的货币,5位数的有些不行,4位数的全部不行。

我这里测试5位数的也可以做  3位的也可以  4位数的没这样的品种  用的艾福瑞平台

金币

参与人数 1金币 +10 收起 理由
Hyuwen + 10 谢谢啊~

查看全部打赏

Hyuwen

发表于 2019-6-7 22:45:34 | 显示全部楼层

acong 发表于 2019-6-7 22:26
我这里测试5位数的也可以做  3位的也可以  4位数的没这样的品种  用的艾福瑞平台

卧!!!搞半天是平台的问题呀。。。。

w2611026

发表于 2019-8-10 18:03:12 | 显示全部楼层

什么情况,回测一直开单 一直止损。。。弄不明白这ea

Edison_su

发表于 2019-9-6 15:52:38 | 显示全部楼层

微信:CY-King-X 兄弟 不会让你失望 报价可做 加微信聊

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

EA之家评论守则