Как в советнике, в тестере, открыть позицию по другому инструменту (не по тому на котором тестируется?)
Вообще-то, не должен виснуть. Должен выдать ошибку "неправильный символ".
В тестере открыть позицию по "чужому" инструменту нельзя, это - одно из ограничений тестирования. "MQL4: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4"
В тестере открыть позицию по "чужому" инструменту нельзя, это - одно из ограничений тестирования. "MQL4: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4"
Вообще-то, не должен виснуть. Должен выдать ошибку "неправильный символ".
В тестере открыть позицию по "чужому" инструменту нельзя, это - одно из ограничений тестирования. "MQL4: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4"
В тестере открыть позицию по "чужому" инструменту нельзя, это - одно из ограничений тестирования. "MQL4: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4"
а зачем это, я просто хотел проверить как будет вести себя на истории, стратегия получения прибыли на свопах, когда покупаешь инструмент с высокими свопами в лонг, и хеджируешся другим инструментом в шорт, зачем запрещать такое тестирование?
Это не запрет, а именно ограничение. Так как мы не моделируем поведение другого инструмента.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
вот код советника, идея такая: покупает индекс на ену и продает встречно 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); }