Скачать MetaTrader 5

Как в советнике, в тестере, открыть позицию по другому инструменту (не по тому на котором тестируется?)

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пиши программы на заказ. Зарабатывай с помощью сервиса Фриланс!
Forex Trader
114255
Forex Trader 2007.05.23 15:23 
терминал зависает во время тестирования когда советник пытается открыть позицию по другому инструменту т.е. тестируется на GBPJPY а пытается продать USDJPY и виснет ошибок не выдает просто виснет и фсе
вот код советника, идея такая: покупает индекс на ену и продает встречно EURJPY, (Liteforex) хотел проверить как такая пара позиций будет вести себя на истории.:
//+------------------------------------------------------------------+
//|                                               SwapTactic_WHC.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int      ExpertID               =  916505;     
extern string   ExpName                =  "SwapTest";
extern string   s1                =  "проц. используемой маржи";
extern double   ActiveMarge            =  100;
extern string   s2                =  "явное указание суммы маржи для исп.";
extern double   DefaultMarge            =  0;

double AM, Lots,GLot;
int StopLevel, CountStopsMode, TPLevel, CountTPMode,ST;   
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if(ST>100){return(0);}
RefreshRates();
double AFM  = DefaultMarge;
if(DefaultMarge<=0){AFM = NormalizeDouble(AccountFreeMargin()*(ActiveMarge/100),2);}
Print(" Свободная маржа "+AFM);
double ML          = NormalizeDouble(MarketInfo("LFXJPY",MODE_MINLOT),2);
double LFXJPYM     = NormalizeDouble(MarketInfo("LFXJPY",MODE_MARGINREQUIRED),2)* ML;
Print("LFXJPY мин. маржа "+LFXJPYM);
double EURJPYM        = NormalizeDouble(MarketInfo("EURJPY",MODE_MARGINREQUIRED),2)* ML;
Print("EURJPY мин. маржа "+EURJPYM);
double OnePool     = NormalizeDouble(LFXJPYM + EURJPYM,2);
Print(" маржа для 1 мин. пула "+OnePool);
double NumPools    = NormalizeDouble(AFM/OnePool,0);
Print("доступно пулов "+NumPools);
double LFXJPYLOT   = (NumPools  * ML);
Print("LFXJPY LOT "+LFXJPYLOT);
double EURJPYLOT   = (NumPools  * ML);
Print("EURJPY LOT "+EURJPYLOT);
//----

Transaction("LFXJPY",LFXJPYLOT,0); 
Transaction("EURJPY",EURJPYLOT,1); 
ST=TimeCurrent();
   return(0);
  }
//+------------------------------------------------------------------+
  
double Transaction(string sym, double lot, int op)
  {
   GLot = lot;
   if(ExistPositions()){return(0);}
   Print("Open "+sym+" "+lot+" LOTS "+" Oper "+op);
   double MaxLot = NormalizeDouble(MarketInfo(sym,MODE_MAXLOT),2);
   while (GLot>0)
     { 
       if(GLot>MaxLot)
         {
         if(op==0){OpenBuy( sym,  MaxLot);} 
         if(op==1){OpenSell( sym,  MaxLot);}
         }
       if(GLot<=MaxLot)
         {
         if(op==0){OpenBuy( sym,  GLot);} 
         if(op==1){OpenSell( sym,  GLot);}
         }
     }
  }

//********************************************************************************
bool ExistPositions(int MAGIC=0, int op=0){//1
int i;
 if(MAGIC !=0 && op!=0){//2	
  for ( i=0; i<OrdersTotal(); i++){//3
   if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){//4
  	 if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC && OrderType()== OP_BUY && op==1){//5
  	 return(True);
  	 }//5
  	 if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC && OrderType()== OP_SELL && op==2){//5
  	 return(True);
  	 }//5
  	}//4 
  }//3 
 }else{//2
 for ( i=0; i<OrdersTotal(); i++) {//3
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {//4
   if (OrderSymbol()==Symbol()) {//5
   return(True);
   }//5
  }//4 
 }//3 
}//2
}//1

void OpenBuy(string sym, double idLot){//1
 int Slippage=3; 
 double ldStop=GetStopLossBuy(); 
 double ldTake=GetTakeProfitBuy();
 string _OrderComment=ExpName; 
 int _OrderMadic=ExpertID;
 int _OrderExp=0;  
 color _Color=DeepSkyBlue;
 if(idLot==0){return(0);}
 double OpPrice = NormalizeDouble(Ask,Digits); 
 int LastError=0;
 int Pause = 500; 
 int i,i2,i3,fc;
  for (i2=1; i2<=5; i2++){//3 
   RefreshRates();
   if(IsTradeAllowed()||IsTesting()){//4   
   Pause=Pause+Pause;  
   fc = OrderSend(sym,OP_BUY,idLot,NormalizeDouble(Ask,Digits),Slippage,ldStop,ldTake,_OrderComment,_OrderMadic,_OrderExp,_Color);
   if(fc!=-1){GLot=GLot-idLot; break;}
   if(fc==-1){LastError = GetLastError(); Print(ErrorDescription(LastError));}
   
   }else{Sleep(Pause);}//4
  }//3
 }//2


void OpenSell(string sym, double idLot){//1
 
 int Slippage=3; 
 double ldStop=GetStopLossSell(); 
 double ldTake=GetTakeProfitSell();
 string _OrderComment=ExpName; 
 int _OrderMadic=ExpertID;
 int _OrderExp=0;  
 color _Color=DeepPink;
 //Print("Short SL "+ldStop+" Short TP "+ldTake);
 if(idLot==0){return(0);}
 int LastError=0;                                                                  
 int Pause = 500;                                                                  
 double OpPrice = NormalizeDouble(Bid,Digits);                                    
 int i,i2,i3,fc;                                                                    
  for (i2=1; i2<=5; i2++){//3 
   if(IsTradeAllowed()||IsTesting()){//4 
   RefreshRates();  
   Pause=Pause+Pause;  
   fc = OrderSend(sym,OP_SELL,idLot,NormalizeDouble(Bid,Digits),Slippage,ldStop,ldTake,_OrderComment,_OrderMadic,_OrderExp,_Color);
   if(fc!=-1){GLot=GLot-idLot; break;}
   LastError = GetLastError();
   }else{Sleep(Pause);}//3
  }//2
 }//1 


//**************************************
double GetStopLossBuy() {
int dsl=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
if(StopLevel==0 && CountStopsMode==0){return(0);}
if(StopLevel>0 && CountStopsMode==0){return(NormalizeDouble(Bid-StopLevel*Point,Digits));}
if(CountStopsMode==1){
}
} 


//**************************************
double GetStopLossSell() {
int dsl=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
if(StopLevel==0 && CountStopsMode==0){return(0);}
if(StopLevel>0 && CountStopsMode==0){return(NormalizeDouble(Ask+StopLevel*Point,Digits));}
if(CountStopsMode==1){
}
} 

double GetTakeProfitBuy() {
if(TPLevel==0 && CountTPMode==0){return(0);} 
if(CountTPMode==0){return(NormalizeDouble(Ask+TPLevel*Point,Digits)); }
if(CountTPMode==1)
 {
 }
} 

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

Forex Trader
114255
Forex Trader 2007.05.23 15:36  
Вообще-то, не должен виснуть. Должен выдать ошибку "неправильный символ".

В тестере открыть позицию по "чужому" инструменту нельзя, это - одно из ограничений тестирования. "MQL4: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4"
Forex Trader
114255
Forex Trader 2007.05.23 16:26  
Вообще-то, не должен виснуть. Должен выдать ошибку "неправильный символ".

В тестере открыть позицию по "чужому" инструменту нельзя, это - одно из ограничений тестирования. "MQL4: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4"


а зачем это, я просто хотел проверить как будет вести себя на истории, стратегия получения прибыли на свопах, когда покупаешь инструмент с высокими свопами в лонг, и хеджируешся другим инструментом в шорт, зачем запрещать такое тестирование?
Forex Trader
114255
Forex Trader 2007.05.23 17:17  
Это не запрет, а именно ограничение. Так как мы не моделируем поведение другого инструмента.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий