就是下面这个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);
}
|