#property copyright "Klymenko Roman (needtome@icloud.com)" #property link "https://www.mql5.com/en/users/needtome" #property version "1.00" #property strict #ifdef __MQL5__ #include CTrade Trade; #endif enum TypeOfPos{ MY_BUY, MY_SELL, MY_BUYSTOP, MY_BUYLIMIT, MY_SELLSTOP, MY_SELLLIMIT, }; enum TypeOfLang{ MY_ENG, // English MY_RUS, // Русский }; enum TypeOfEnd{ MY_CLOSE, // Close the grid MY_NEW, // Add the grid MY_NEW_CLOSE, // Place new }; input int EA_Magic=111; // Magic number input TypeOfLang LANG=MY_ENG; // Language input double Lot=0.01; //Lot size input uint maxLimits=7; //Number of limit orders in the grid in one direction input int Step=10; //Grid step in points input double takeProfit=1; //Close the grid when reaching the specified profit, $ input double takeLoss=0; //Close the grid when reaching the specified loss, $ input double order_TP=2.5; //Take profit for a separate order in points input double order_SL=0; //Stop loss for a separate order in points input bool noOpenNewGrid=false; // Do not set an initial grid sinput string delimeter_01=""; // --- Grid revision options --- input TypeOfEnd methodOfStop = MY_NEW; // Action when revising the grid input uint revisionDays = 0; // Number of days passed since the last position input uint revisionPercent = 0; // Percentage of positions in both directions more than #ifdef __MQL5__ enum TypeOfFilling //Filling Mode { FOK,//ORDER_FILLING_FOK RETURN,// ORDER_FILLING_RETURN IOC,//ORDER_FILLING_IOC }; input TypeOfFilling useORDER_FILLING_RETURN=FOK; //Execution mode #endif double ST, orderST, orderTP; string prefix_graph="grider_"; double curLot; struct translate{ string err1; string err2; string err3; string err4; string err5; string err6; string err7; string err8; string err9; string err64; string err65; string err128; string err129; string err130; string err131; string err132; string err133; string err134; string err135; string err136; string err137; string err138; string err139; string err140; string err141; string err145; string err146; string err147; string err148; string err0; string retcode; string retcode10004; string retcode10006; string retcode10007; string retcode10010; string retcode10011; string retcode10012; string retcode10013; string retcode10014; string retcode10015; string retcode10016; string retcode10017; string retcode10018; string retcode10019; string retcode10020; string retcode10021; string retcode10022; string retcode10023; string retcode10024; string retcode10025; string retcode10026; string retcode10027; string retcode10028; string retcode10029; string retcode10030; string retcode10031; string retcode10032; string retcode10033; string retcode10034; string retcode10035; string retcode10036; string retcode10038; string retcode10039; string retcode10040; string retcode10041; string retcode10042; string retcode10043; string retcode10044; string noBuy; string closeAll; }; translate langs; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { init_lang(); if(!MQLInfoInteger(MQL_TRADE_ALLOWED)){ Alert(langs.noBuy+" ("+(string) EA_Magic+")"); ExpertRemove(); } ST= Step; orderST= order_SL; orderTP= order_TP; if(_Digits==5 || _Digits==3){ ST*= 10; orderST*= 10; orderTP*= 10; } ST*=SymbolInfoDouble(_Symbol, SYMBOL_POINT); orderST*=SymbolInfoDouble(_Symbol, SYMBOL_POINT); orderTP*=SymbolInfoDouble(_Symbol, SYMBOL_POINT); curLot=Lot; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectsDeleteAll(0, prefix_graph); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if( !pdxIsNewBar() ){ return; } if(takeProfit>0 && checkTakeProfit()>takeProfit){ closeAllPos(); }else if(takeLoss<0 && checkTakeProfit()0 && lastPosition()>revisionDays ){ startRevision(); } if( revisionPercent>0 && percentPosition()>revisionPercent ){ startRevision(); } }else{ // otherwise, set the grid if( !noOpenNewGrid ) initLimits(); } } void startRevision(){ switch(methodOfStop){ case MY_CLOSE: closeAllPos(); break; case MY_NEW: // curLot*=2; initLimits(); break; case MY_NEW_CLOSE: // curLot*=2; delGrid(); initLimits(); break; } } void delGrid(){ #ifdef __MQL5__ int cntMyPosO=OrdersTotal(); for(int ti=cntMyPosO-1; ti>=0; ti--){ ulong orderTicket=OrderGetTicket(ti); if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue; if(EA_Magic>0 && OrderGetInteger(ORDER_MAGIC)!=EA_Magic) continue; Trade.OrderDelete(orderTicket); } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderSymbol()!=_Symbol ) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; if( OrderType()==OP_BUY ){ }else if(OrderType()==OP_SELL){ }else{ if(!OrderDelete(OrderTicket())){ } } } } #endif } uint percentPosition(){ int countL=0; int countS=0; #ifdef __MQL5__ int cntMyPosO=OrdersTotal(); for(int ti=cntMyPosO-1; ti>=0; ti--){ ulong orderTicket=OrderGetTicket(ti); if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue; if(EA_Magic>0 && OrderGetInteger(ORDER_MAGIC)!=EA_Magic) continue; if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_STOP){ countL++; }else if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_STOP){ countS++; } } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderSymbol()!=_Symbol ) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; if( OrderType()==OP_BUYSTOP ){ countL++; }else if(OrderType()==OP_SELLSTOP){ countS++; } } } #endif if( !countL && !countS ) return 0; if(countL>countS) return ((maxLimits-countL)/maxLimits)*100; return ((maxLimits-countS)/maxLimits)*100; } uint lastPosition(){ datetime lastPos=0; datetime curPos=TimeCurrent(); #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=_Symbol) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; if( PositionGetInteger(POSITION_TIME)>lastPos ){ lastPos=(datetime) PositionGetInteger(POSITION_TIME); } } int cntMyPosO=OrdersTotal(); for(int ti=cntMyPosO-1; ti>=0; ti--){ ulong orderTicket=OrderGetTicket(ti); if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue; if(EA_Magic>0 && OrderGetInteger(ORDER_MAGIC)!=EA_Magic) continue; if( OrderGetInteger(ORDER_TIME_SETUP)>lastPos ){ lastPos=(datetime) OrderGetInteger(ORDER_TIME_SETUP); } } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderSymbol()!=_Symbol ) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; // if( OrderType()==OP_BUY || OrderType()==OP_SELL ){ }else{ continue; } if( OrderOpenTime()>lastPos ){ lastPos=OrderOpenTime(); } } } #endif if( lastPos==0) return 0; return (int) ((curPos-lastPos)/86400); } bool existLimits(){ #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=_Symbol) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; return true; } int cntMyPosO=OrdersTotal(); for(int ti=cntMyPosO-1; ti>=0; ti--){ ulong orderTicket=OrderGetTicket(ti); if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue; if(EA_Magic>0 && OrderGetInteger(ORDER_MAGIC)!=EA_Magic) continue; return true; } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if(OrderSymbol()!=_Symbol) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; return true; } } #endif return false; } void initLimits(){ // price for placing grid orders double curPrice; // current symbol price MqlTick lastme; SymbolInfoTick(_Symbol, lastme); // if failed to obtain the current price, cancel the grid if( lastme.bid==0 ){ return; } //minimum distance from the price available for placing stop losses and, // most probably, pending orders double minStop=SymbolInfoDouble(_Symbol, SYMBOL_POINT)*SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL); // place Long orders curPrice=lastme.bid; for(uint i=0; i0){ sl= curPrice-orderST; } if(orderTP>0){ tp= curPrice+orderTP; } if(!pdxSendOrder(MY_BUYSTOP, curPrice, sl, tp, curLot, 0, "", _Symbol)){ } } // place Short orders curPrice=lastme.ask; for(uint i=0; i0){ sl= curPrice+orderST; } if(orderTP>0){ tp= curPrice-orderTP; } if(!pdxSendOrder(MY_SELLSTOP, curPrice, sl, tp, curLot, 0, "", _Symbol)){ } } } bool pdxIsNewBar(){ static datetime Old_Time; datetime New_Time[1]; if(CopyTime(_Symbol,_Period,0,1,New_Time)>0){ if(Old_Time!=New_Time[0]){ Old_Time=New_Time[0]; return true; } } return false; } void OnChartEvent(const int id, // event ID const long& lparam, // event parameter of the long type const double& dparam, // event parameter of the double type const string& sparam) // event parameter of the string type { string text=""; switch(id){ case CHARTEVENT_OBJECT_CLICK: // if the clicked button name is prefix_graph+"delall", then if (sparam==prefix_graph+"delall"){ closeAllPos(); } break; } } // order send function bool pdxSendOrder(TypeOfPos mytype, double price, double sl, double tp, double volume, ulong position=0, string comment="", string sym=""){ // check passed values if( !StringLen(sym) ){ sym=_Symbol; } int curDigits=(int) SymbolInfoInteger(sym, SYMBOL_DIGITS); if(sl>0){ sl=NormalizeDouble(sl,curDigits); } if(tp>0){ tp=NormalizeDouble(tp,curDigits); } if(price>0){ price=NormalizeDouble(price,curDigits); } #ifdef __MQL5__ ENUM_TRADE_REQUEST_ACTIONS action=TRADE_ACTION_DEAL; ENUM_ORDER_TYPE type=ORDER_TYPE_BUY; switch(mytype){ case MY_BUY: action=TRADE_ACTION_DEAL; type=ORDER_TYPE_BUY; break; case MY_BUYSTOP: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_BUY_STOP; break; case MY_BUYLIMIT: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_BUY_LIMIT; break; case MY_SELL: action=TRADE_ACTION_DEAL; type=ORDER_TYPE_SELL; break; case MY_SELLSTOP: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_SELL_STOP; break; case MY_SELLLIMIT: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_SELL_LIMIT; break; } MqlTradeRequest mrequest; MqlTradeResult mresult; ZeroMemory(mrequest); mrequest.action = action; mrequest.sl = sl; mrequest.tp = tp; mrequest.symbol = sym; if(position>0){ mrequest.position = position; } if(StringLen(comment)){ mrequest.comment=comment; } if(action!=TRADE_ACTION_SLTP){ if(price>0){ mrequest.price = price; } if(volume>0){ mrequest.volume = volume; } mrequest.type = type; mrequest.magic = EA_Magic; switch(useORDER_FILLING_RETURN){ case FOK: mrequest.type_filling = ORDER_FILLING_FOK; break; case RETURN: mrequest.type_filling = ORDER_FILLING_RETURN; break; case IOC: mrequest.type_filling = ORDER_FILLING_IOC; break; } mrequest.deviation=100; } if(OrderSend(mrequest,mresult)){ if(mresult.retcode==10009 || mresult.retcode==10008){ return true; }else{ msgErr(GetLastError(), mresult.retcode); } } #else int type=OP_BUY; switch(mytype){ case MY_BUY: type=OP_BUY; break; case MY_BUYSTOP: type=OP_BUYSTOP; break; case MY_BUYLIMIT: type=OP_BUYLIMIT; break; case MY_SELL: type=OP_SELL; break; case MY_SELLSTOP: type=OP_SELLSTOP; break; case MY_SELLLIMIT: type=OP_SELLLIMIT; break; } if(OrderSend(sym, type, volume, price, 100, sl, tp, comment, EA_Magic, 0)<0){ msgErr(GetLastError()); }else{ return true; } #endif return false; } void getmeinfo_btn(string symname){ double posPlus=0; double posMinus=0; double profit=0; double positionExist=false; // count the number of open Long and Short positions, // as well as their total profit #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=symname) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; positionExist=true; profit+=PositionGetDouble(POSITION_PROFIT); profit+=PositionGetDouble(POSITION_SWAP); if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){ posPlus+=PositionGetDouble(POSITION_VOLUME); }else{ posMinus+=PositionGetDouble(POSITION_VOLUME); } } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderType()==OP_BUY || OrderType()==OP_SELL ){}else{ continue; } if(OrderSymbol()!=symname) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; positionExist=true; profit+=OrderCommission(); profit+=OrderProfit(); profit+=OrderSwap(); if(OrderType()==OP_BUY){ posPlus+=OrderLots(); }else{ posMinus+=OrderLots(); } } } #endif // if there are open positions, // then add the button for closing them if(positionExist){ createObject(prefix_graph+"delall", 233, langs.closeAll+" ("+DoubleToString(profit, 2)+") L: "+(string) posPlus+" S: "+(string) posMinus); }else{ // otherwise, remove the position closing button if(ObjectFind(0, prefix_graph+"delall")>0){ ObjectDelete(0, prefix_graph+"delall"); } } // update the current chart to implement // changes ChartRedraw(0); } void createObject(string name, int weight, string title){ // if there is no 'name' button on the chart, create it if(ObjectFind(0, name)<0){ // define the shift relative to the chart right angle where the button is to be displayed long offset= ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)-87; long offsetY=0; for(int ti=0; tioffsetY){ offsetY=tmpOffset; } } for(int ti=0; ti0 && tmpOffset=0; ti--){ if(PositionGetSymbol(ti)!=_Symbol) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; Trade.PositionClose(PositionGetInteger(POSITION_TICKET)); } int cntMyPosO=OrdersTotal(); for(int ti=cntMyPosO-1; ti>=0; ti--){ ulong orderTicket=OrderGetTicket(ti); if(OrderGetString(ORDER_SYMBOL)!=_Symbol) continue; if(EA_Magic>0 && OrderGetInteger(ORDER_MAGIC)!=EA_Magic) continue; Trade.OrderDelete(orderTicket); } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderSymbol()!=_Symbol ) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; if( OrderType()==OP_BUY ){ MqlTick latest_price; if(!SymbolInfoTick(OrderSymbol(),latest_price)){ Alert(GetLastError()); return; } if(!OrderClose(OrderTicket(), OrderLots(),latest_price.bid,100)){ } }else if(OrderType()==OP_SELL){ MqlTick latest_price; if(!SymbolInfoTick(OrderSymbol(),latest_price)){ Alert(GetLastError()); return; } if(!OrderClose(OrderTicket(), OrderLots(),latest_price.ask,100)){ } }else{ if(!OrderDelete(OrderTicket())){ } } } } #endif // remove the position closing button if(ObjectFind(0, prefix_graph+"delall")>0){ ObjectDelete(0, prefix_graph+"delall"); } } double checkTakeProfit(){ double curProfit=0; double profit=0; #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=_Symbol) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; profit+=PositionGetDouble(POSITION_PROFIT); profit+=PositionGetDouble(POSITION_SWAP); } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderType()==OP_BUY || OrderType()==OP_SELL ){}else{ continue; } if(OrderSymbol()!=_Symbol) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; profit+=OrderCommission(); profit+=OrderProfit(); profit+=OrderSwap(); } } #endif return profit; } void closeByPos(){ bool repeatOpen=false; #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=_Symbol) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; if( PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ){ long closefirst=PositionGetInteger(POSITION_TICKET); double closeLots=PositionGetDouble(POSITION_VOLUME); for(int ti2=cntMyPos-1; ti2>=0; ti2--){ if(PositionGetSymbol(ti2)!=_Symbol) continue; if(EA_Magic>0 && PositionGetInteger(POSITION_MAGIC)!=EA_Magic) continue; if( PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_SELL ) continue; if( PositionGetDouble(POSITION_VOLUME)!=closeLots ) continue; MqlTradeRequest request; MqlTradeResult result; ZeroMemory(request); ZeroMemory(result); request.action=TRADE_ACTION_CLOSE_BY; request.position=closefirst; request.position_by=PositionGetInteger(POSITION_TICKET); if(EA_Magic>0) request.magic=EA_Magic; if(OrderSend(request,result)){ repeatOpen=true; break; } } if(repeatOpen){ break; } } } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderSymbol()!=_Symbol ) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; if( OrderType()==OP_BUY ){ int closefirst=OrderTicket(); double closeLots=OrderLots(); for(int ti2=cntMyPos-1; ti2>=0; ti2--){ if(OrderSelect(ti2,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderSymbol()!=_Symbol ) continue; if(EA_Magic>0 && OrderMagicNumber()!=EA_Magic) continue; if( OrderType()!=OP_SELL ) continue; if( OrderLots()0){ curErr+=" "; switch(retcode){ case 10004: curErr+=langs.retcode10004; break; case 10006: curErr+=langs.retcode10006; break; case 10007: curErr+=langs.retcode10007; break; case 10010: curErr+=langs.retcode10010; break; case 10011: curErr+=langs.retcode10011; break; case 10012: curErr+=langs.retcode10012; break; case 10013: curErr+=langs.retcode10013; break; case 10014: curErr+=langs.retcode10014; break; case 10015: curErr+=langs.retcode10015; break; case 10016: curErr+=langs.retcode10016; break; case 10017: curErr+=langs.retcode10017; break; case 10018: curErr+=langs.retcode10018; break; case 10019: curErr+=langs.retcode10019; break; case 10020: curErr+=langs.retcode10020; break; case 10021: curErr+=langs.retcode10021; break; case 10022: curErr+=langs.retcode10022; break; case 10023: curErr+=langs.retcode10023; break; case 10024: curErr+=langs.retcode10024; break; case 10025: curErr+=langs.retcode10025; break; case 10026: curErr+=langs.retcode10026; break; case 10027: curErr+=langs.retcode10027; break; case 10028: curErr+=langs.retcode10028; break; case 10029: curErr+=langs.retcode10029; break; case 10030: curErr+=langs.retcode10030; break; case 10031: curErr+=langs.retcode10031; break; case 10032: curErr+=langs.retcode10032; break; case 10033: curErr+=langs.retcode10033; break; case 10034: curErr+=langs.retcode10034; break; case 10035: curErr+=langs.retcode10035; break; case 10036: curErr+=langs.retcode10036; break; case 10038: curErr+=langs.retcode10038; break; case 10039: curErr+=langs.retcode10039; break; case 10040: curErr+=langs.retcode10040; break; case 10041: curErr+=langs.retcode10041; break; case 10042: curErr+=langs.retcode10042; break; case 10043: curErr+=langs.retcode10043; break; case 10044: curErr+=langs.retcode10044; break; } } Alert(curErr); } void init_lang(){ switch(LANG){ case MY_ENG: langs.err1="No error, but unknown result. (1)"; langs.err2="General error (2)"; langs.err3="Incorrect parameters (3)"; langs.err4="Trade server busy (4)"; langs.err5="Old client terminal version (5)"; langs.err6="No connection to trade server (6)"; langs.err7="Not enough rights (7)"; langs.err8="Too frequent requests (8)"; langs.err9="Invalid operation disruptive server operation (9)"; langs.err64="Account blocked (64)"; langs.err65="Invalid account number (65)"; langs.err128="Expired waiting period for transaction (128)"; langs.err129="Invalid price (129)"; langs.err130="Wrong stop loss (130)"; langs.err131="Wrong volume (131)"; langs.err132="Market closed (132)"; langs.err133="Trade prohibited (133)"; langs.err134="Not enough money to complete transaction. (134)"; langs.err135="Price changed (135)"; langs.err136="No prices (136)"; langs.err137="Broker busy (137)"; langs.err138="New prices (138)"; langs.err139="Order blocked and already being processed (139)"; langs.err140="Only purchase allowed (140)"; langs.err141="Too many requests (141)"; langs.err145="Modification prohibited because order too close to market. (145)"; langs.err146="Trading subsystem busy (146)"; langs.err147="Using order expiration date prohibited by broker (147)"; langs.err148="Number of open and pending orders reached limit set by broker (148)"; langs.err0="Error occurred while running request"; langs.retcode="Reason"; langs.retcode10004="Requote"; langs.retcode10006="Request rejected"; langs.retcode10007="Request canceled by trader"; langs.retcode10010="Only part of request completed"; langs.retcode10011="Request processing error"; langs.retcode10012="Request canceled by timeout"; langs.retcode10013="Invalid request"; langs.retcode10014="Invalid volume in request"; langs.retcode10015="Invalid price in request"; langs.retcode10016="Invalid stops in request"; langs.retcode10017="Trade disabled"; langs.retcode10018="Market closed"; langs.retcode10019="Not enough money to complete request"; langs.retcode10020="Prices changed"; langs.retcode10021="No quotes to process request"; langs.retcode10022="Invalid order expiration date in request"; langs.retcode10023="Order state changed"; langs.retcode10024="Too frequent requests"; langs.retcode10025="No changes in request"; langs.retcode10026="Autotrading disabled by server"; langs.retcode10027="Autotrading disabled by client terminal"; langs.retcode10028="Request locked for processing"; langs.retcode10029="Order or position frozen"; langs.retcode10030="Invalid order filling type"; langs.retcode10031="No connection with trade server"; langs.retcode10032="Operation allowed only for live accounts"; langs.retcode10033="Number of pending orders reached limit"; langs.retcode10034="Volume of orders and positions for symbol reached limit"; langs.retcode10035="Incorrect or prohibited order type"; langs.retcode10036="Position with specified POSITION_IDENTIFIER already closed"; langs.retcode10038="Close volume exceeds current position volume"; langs.retcode10039="Close order already exists for specified position"; langs.retcode10040="Number of open items exceeded"; langs.retcode10041="Pending order activation request rejected, order canceled"; langs.retcode10042="Only long positions allowed"; langs.retcode10043="Only short positions allowed"; langs.retcode10044="Only position closing allowed"; langs.noBuy="Trading for expert prohibited!"; langs.closeAll="Close All"; break; case MY_RUS: langs.err0="Во время выполнения запроса произошла ошибка"; langs.err1="Нет ошибки, но результат неизвестен (1)"; langs.err2="Общая ошибка (2)"; langs.err3="Неправильные параметры (3)"; langs.err4="Торговый сервер занят (4)"; langs.err5="Старая версия клиентского терминала (5)"; langs.err6="Нет связи с торговым сервером (6)"; langs.err7="Недостаточно прав (7)"; langs.err8="Слишком частые запросы (8)"; langs.err9="Недопустимая операция нарушающая функционирование сервера (9)"; langs.err64="Счет заблокирован (64)"; langs.err65="Неправильный номер счета (65)"; langs.err128="Истек срок ожидания совершения сделки (128)"; langs.err129="Неправильная цена (129)"; langs.err130="Неправильные стопы (130)"; langs.err131="Неправильный объем (131)"; langs.err132="Рынок закрыт (132)"; langs.err133="Торговля запрещена (133)"; langs.err134="Недостаточно денег для совершения операции (134)"; langs.err135="Цена изменилась (135)"; langs.err136="Нет цен (136)"; langs.err137="Брокер занят (137)"; langs.err138="Новые цены (138)"; langs.err139="Ордер заблокирован и уже обрабатывается (139)"; langs.err140="Разрешена только покупка (140)"; langs.err141="Слишком много запросов (141)"; langs.err145="Модификация запрещена, так как ордер слишком близок к рынку (145)"; langs.err146="Подсистема торговли занята (146)"; langs.err147="Использование даты истечения ордера запрещено брокером (147)"; langs.err148="Количество открытых и отложенных ордеров достигло предела, установленного брокером (148)"; langs.retcode="Причина"; langs.retcode10004="Реквота"; langs.retcode10006="Запрос отклонен"; langs.retcode10007="Запрос отменен трейдером"; langs.retcode10010="Заявка выполнена частично"; langs.retcode10011="Ошибка обработки запроса"; langs.retcode10012="Запрос отменен по истечению времени"; langs.retcode10013="Неправильный запрос"; langs.retcode10014="Неправильный объем в запросе"; langs.retcode10015="Неправильная цена в запросе"; langs.retcode10016="Неправильные стопы в запросе"; langs.retcode10017="Торговля запрещена"; langs.retcode10018="Рынок закрыт"; langs.retcode10019="Нет достаточных денежных средств для выполнения запроса"; langs.retcode10020="Цены изменились"; langs.retcode10021="Отсутствуют котировки для обработки запроса"; langs.retcode10022="Неверная дата истечения ордера в запросе"; langs.retcode10023="Состояние ордера изменилось"; langs.retcode10024="Слишком частые запросы"; langs.retcode10025="В запросе нет изменений"; langs.retcode10026="Автотрейдинг запрещен сервером"; langs.retcode10027="Автотрейдинг запрещен клиентским терминалом"; langs.retcode10028="Запрос заблокирован для обработки"; langs.retcode10029="Ордер или позиция заморожены"; langs.retcode10030="Указан неподдерживаемый тип исполнения ордера по остатку "; langs.retcode10031="Нет соединения с торговым сервером"; langs.retcode10032="Операция разрешена только для реальных счетов"; langs.retcode10033="Достигнут лимит на количество отложенных ордеров"; langs.retcode10034="Достигнут лимит на объем ордеров и позиций для данного символа"; langs.retcode10035="Неверный или запрещённый тип ордера"; langs.retcode10036="Позиция с указанным POSITION_IDENTIFIER уже закрыта"; langs.retcode10038="Закрываемый объем превышает текущий объем позиции"; langs.retcode10039="Для указанной позиции уже есть ордер на закрытие"; langs.retcode10040="Количество открытых позиций превышено"; langs.retcode10041="Запрос на активацию отложенного ордера отклонен, а сам ордер отменен"; langs.retcode10042="Разрешены только длинные позиции"; langs.retcode10043="Разрешены только короткие позиции"; langs.retcode10044="Разрешено только закрывать существующие позиции"; langs.noBuy="Торговля для эксперта запрещена!"; langs.closeAll="Закрыть все"; break; } }