//+------------------------------------------------------------------+ //| FileExecV1.mq5 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #include #include #include #include //#include CAccountInfo account; CSymbolInfo symbol_info; CTrade trade; CFile file; input string symb="GAZP.MM"; input double VM=100; input datetime DayExp=0; input double MaxProfit=20; input double MinProfit=-20; input bool OpenPositionsBuy=false,OpenPositionsSell=false; input int lot1=1,lot=10,lotK=10; //input bool ClosePositions=false; input int Round=1; string symb1; ENUM_TIMEFRAMES per; double ticksize0,ticksize1,tickvalue0,tickvalue1,di,DeltaSpread=0.03; int digit0,digit1; bool spos,spos1; double maxProfit,minProfit,Profit; double ask,bid,last,ask1,bid1,last1,high,low,open,SLask,SLbid,high01,low01,open01,close01,open11,close11; double ds,maxspread0=0.016,prCalc0,prCalc1,sprd,sprdI,sprdO; int spread0,spread1; string commentB,commentS; int day,hour,min,BARS,BARS1,minH,minL; bool trueTime=false,trueTrade=false; int tempmin=0,timePos=0,rd=0; bool keyclose=false; double High[],Low[],Close[],Open[],Spread[],reg[]; int Spr[]; datetime Time[]; bool buypos=false,sellpos=false,buypos1=false,sellpos1=false,buypos2=false,sellpos2=false; string posS="NONE",posS1="NONE",posS2="NONE"; int posC=0,posC1=0,posC2=0; double sd,sdu1,sdu2,sdu3,sdu4,sdu5,sdd1,sdd2,sdd3,sdd4,sdd5,sr,srb,srs; double Dreg=0; double DIV=0,maxDIV,minDIV; double pDIV=0,pDIVmax=0,pDIVmin=0, pDIVi=0,pDIVimax=0,pDIVimin=0, pDIVo=0,pDIVomax=0,pDIVomin=0; double pDIVisr=0; datetime dayC; int daym,mon; int sf,sord=0; int lotA; MqlDateTime dt; //MqlBookInfo bArr1[]; //MqlBookInfo bArr2[]; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- получим номер счета, на котором запущен советник long login=account.Login(); Print("Login=",login); //--- выясним тип счета ENUM_ACCOUNT_TRADE_MODE account_type=account.TradeMode(); //--- если счет оказался реальным, прекращаем работу эксперта немедленно! /* if(account_type==ACCOUNT_TRADE_MODE_REAL) { // MessageBox("Работа на реальном счете запрещена, выходим","Эксперт запущен на реальном счете!"); MessageBox("РЕАЛЬНЫЙ СЧКЕТ !!!"); // return(-1); }*/ //--- выведем тип счета Print("Тип счета: ",EnumToString(account_type)); //--- выясним, можно ли вообще торговать на данном счете if(account.TradeAllowed()) Print("Торговля на данном счете разрешена"); else Print("Торговля на счете запрещена: возможно, вход был совершен по инвест-паролю"); //--- выясним, разрешено ли торговать на счете с помощью эксперта if(account.TradeExpert()) Print("Автоматическая торговля на счете разрешена"); else Print("Запрещена автоматическая торговля с помощью экспертов и скриптов"); //--- допустимое количество ордеров задано или нет int orders_limit=account.LimitOrders(); if(orders_limit!=0)Print("Максимально допустимое количество действующих отложенных ордеров: ",orders_limit); //--- выведем имя компании и сервера Print(account.Company(),": server ",account.Server()); //--- напоследок выведем баланс и текущую прибыль на счете Print("Balance=",account.Balance()," Profit=",account.Profit()," Equity=",account.Equity()); //---------------------------------------------------------------------------------------- //--- объект для получения свойств символа //--- зададим имя символа, для которого будем получать информацию symb1=_Symbol; per=_Period; Symbol_Info(symb); Symbol_Info(symb1); ticksize0=SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE); ticksize1=SymbolInfoDouble(symb1,SYMBOL_TRADE_TICK_SIZE); tickvalue0=SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE); tickvalue1=SymbolInfoDouble(symb1,SYMBOL_TRADE_TICK_VALUE); digit0=(int)SymbolInfoInteger(symb,SYMBOL_DIGITS); digit1=(int)SymbolInfoInteger(symb1,SYMBOL_DIGITS); //------------------------------------------------------------------------------------ //--- зададим MagicNumber для идентификации своих ордеров int MagicNumber=123456; trade.SetExpertMagicNumber(MagicNumber); //--- установим допустимое проскальзывание в пунктах при совершении покупки/продажи int deviation=1; trade.SetDeviationInPoints(deviation); //--- режим заполнения ордера, нужно использовать тот режим, который разрешается сервером trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- режим логирования: лучше не вызывать этот метод вообще, класс сам выставит оптимальный режим trade.LogLevel(1); //--- какую функцию использовать для торговли: true - OrderSendAsync(), false - OrderSend() trade.SetAsyncMode(false); //--- file.SetCommon(FILE_COMMON); //\Terminal\Common\Files // string text="maxProfit"; CheckPos(); // day=dt; dayC=TimeCurrent(); day=dd(dayC,DayExp); lotA=lot*lotK; pDIV=0;pDIVmax=0;pDIVmin=0; pDIVi=0;pDIVisr=0; pDIVimax=0;pDIVimin=0; pDIVo=0;pDIVomax=0; pDIVomin=0; EventSetTimer(1); //ExecClose(); Print(__FUNCTION__," completed"); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTimer() { symbol_info.Name(symb); if (!symbol_info.IsSynchronized() || !symbol_info.RefreshRates()) return; symbol_info.Name(symb1); if (!symbol_info.IsSynchronized() || !symbol_info.RefreshRates()) return; //------------------------------------------ TiksInfo(); // OpenPos(); // ClosePos(); //show(); } //----------------------------------------------------------- //------------------------------------------------------------ void OnTick() { //--- // symbol_info.Name(symb); // if (!symbol_info.IsSynchronized() || !symbol_info.RefreshRates()) return; // symbol_info.Name(symb1); // if (!symbol_info.IsSynchronized() || !symbol_info.RefreshRates()) return; //TiksInfo(); //if (!IsTradeSessionOpen(symb) || !IsTradeSessionOpen(symb1)) return; OpenPos(); // ClosePos(); show(); } //================================================================== void OpenPos1(int v,int l) { if (posC1!=0) return; if(v==2) { if(!trade.Buy(l,symb,0,0,0,"2")) //if(!trade.Buy(1,symb,0,SLask, 0,commentB)) { //--- сообщим о неудаче Print("Метод Buy() SYM потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription()); } else { Print("Метод Buy() SYM выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); spos=PositionSelect(symb); spos1=PositionSelect(symb1); sord=OrdersTotal(); // minProfit=0; // maxProfit=0; Profit=0; timePos=0; Print ("sprd= ",sprdI," bid1= ",bid1," ask= ",ask," bid= ",bid," pDIVisr= ",pDIVi); pDIVisr=0; } } if(v==1) { if(!trade.Sell(l,symb,0,0,0,"1")) //SLbid { //--- сообщим о неудаче Print("Метод Sell()SYM потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription()); } else { Print("Метод Sell()SYM выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } } } //================================================================= void OpenPos2(int v) { //if (posC2!=0) return; if(v==2) { if(!trade.Buy(1,symb1,0,0,0,"2")) //if(!trade.Buy(1,symb,0,SLask, 0,commentB)) { //--- сообщим о неудаче Print("Метод Buy() SYM1 потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription()); } else { Print("Метод Buy() SYM1 выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } } if(v==1) { if(!trade.Sell(1,symb1,0,0,0,"1")) //SLbid { //--- сообщим о неудаче Print("Метод Sell() SYM1 потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription()); } else { Print("Метод Sell() SYM1 выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } } } //--------------------------------------------------------------- void OpenBuySell(int v) { for(int i=0; i<100; i++) { if(v==2 && posC1!=0 && posC2!=0) { buypos=true; Print("BUY"); break; } if(v==1 && posC1!=0 && posC2!=0) { sellpos=true; Print("SELL"); break; } // if(v==2 && posC1==0) OpenPos1(1); if(v==2 && posC2==0) OpenPos2(2); // if(v==1 && posC1==0) OpenPos1(2); if(v==1 && posC2==0) OpenPos2(1); CheckPos(); } } //================================================================ void OpenPos() { //------sell ---------------------------- if(OpenPositionsSell && pDIVi>=12 ) { // Print ("sprd= ",sprdI," bid1= ",bid1," ask= ",ask); // OpenBuySell(1); spos=PositionSelect(symb); spos1=PositionSelect(symb1); sord=OrdersTotal(); OpenLimitOrd(1,symb1,bid1,0,0,"2",lot1); // OpenLimitOrd(2,symb,ask+2,0,0,"1",10); } if (PositionSelect(symb1)) OpenPos1(2,lot); //OpenLimitOrd(2,symb,ask+1,0,0,"1",lot); } } //==================================================================== bool OpenLimitOrd(int v,string s,double pr,int sl,int tp,string poc,int l) { double st=0,tr=0; // if(sord>0 || (spos && spos1)) return(true); if ( CheckOrd(s) || PositionSelect(s)) return(true); // if((spos && spos1)) return(true); if(v==1) { if(sl>0) st=NormalizeDouble(pr+sl*ticksize0,digit0); if(tr>0) tr=NormalizeDouble(pr-tp*ticksize0,digit0); if(!trade.SellLimit(l,pr,s,st,tr,0,0,poc)) //SLbid { //--- сообщим о неудаче Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription()); } else { Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); // spos=PositionsTotal(); spos=PositionSelect(symb); spos1=PositionSelect(symb1); sord=OrdersTotal(); // minProfit=0; // maxProfit=0; Profit=0; timePos=0; Print ("sprd= ",sprdI," bid1= ",bid1," ask= ",ask," bid= ",bid," pDIVisr= ",pDIVi); pDIVisr=0; } } if(v==2) { if(sl>0) st=NormalizeDouble(pr-sl*ticksize0,digit0); if(tr>0) tr=NormalizeDouble(pr+tp*ticksize0,digit0); if(!trade.BuyLimit(l,pr,s,st,tr,0,0,poc)) //s SLoss Tprofit { //--- сообщим о неудаче Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода: ",trade.ResultRetcodeDescription()); } else { Print("Метод Buy () выполнен успешно. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); // spos=PositionsTotal(); spos=PositionSelect(symb); spos1=PositionSelect(symb1); sord=OrdersTotal(); // minProfit=0; // maxProfit=0; Profit=0; timePos=0; } } if(sord>0 || spos) return(true); return (false); } //================================================================= bool CheckOrd(string s) { bool oc=false; for(int i=0;i=MaxProfit && timePos>=2 ) { ExecClose(); Print("CLOSE v1: sprd= ",sprd," sr= ",sr); } if(MaxProfit==0 && timePos>=2 && ( (buypos==true && sprd>=sr) || (sellpos==true && sprd<=sr)) ) { ExecClose(); Print("CLOSE v2: sprd= ",sprd," sr= ",sr); } if((Profit<=MinProfit && timePos>=2) || (((posC1!=0 && posC2==0) || (posC1==0 && posC2!=0)) && timePos>=5) ) { ExecClose(); Print("CLOSE v3"); } } //============================================================================ void ExecClose() { if(posC1==0 && posC2==0) return; for(int i=0; i<100; i++) { if(posC1>0) { if(!trade.PositionClose(symb)) { //--- сообщим о неудаче Print("Метод PositionClose() потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода sym: ",trade.ResultRetcodeDescription()); } else { Print("Метод PositionClose() выполнен успешно SYM. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } } if(posC2>0) { if(!trade.PositionClose(symb1)) { //--- сообщим о неудаче Print("Метод PositionClose() потерпел неудачу. Код возврата=",trade.ResultRetcode(), ". Описание кода sym1: ",trade.ResultRetcodeDescription()); } else { Print("Метод PositionClose() выполнен успешно SYM1. Код возврата=",trade.ResultRetcode(), " (",trade.ResultRetcodeDescription(),")"); } } CheckPos(); if(posC1==0 && posC2==0) break; } } //============================================================================ void TiksInfo() { // TimeLocal(dt); TimeTradeServer(dt); // day=dt; hour=dt.hour; min=dt.min; daym=dt.day; mon=dt.mon; bid=SymbolInfoDouble(symb,SYMBOL_BID); ask=SymbolInfoDouble(symb,SYMBOL_ASK); last=SymbolInfoDouble(symb,SYMBOL_LAST); bid1=SymbolInfoDouble(symb1,SYMBOL_BID); ask1=SymbolInfoDouble(symb1,SYMBOL_ASK); last1=SymbolInfoDouble(symb1,SYMBOL_LAST); spread0=(int)((ask-bid)*lotA);///ticksize0); spread1=(int)((ask1-bid1)*lot1);///ticksize1); sprd=(int)(last1*lot1-lotA*last); sprdI=(int)(bid1*lot1-lotA*ask); sprdO=(int)(ask1*lot1-lotA*bid); double ba=MathMax(ask,bid); pDIV=NormalizeDouble(((last1-last*lotA)/(last1*VM/100+last*lotA))*100*365/day,2); pDIVi=NormalizeDouble(((bid1-ba*lotA)/(bid1*VM/100+ba*lotA))*100*365/day,2); if(pDIVmax==0 || pDIVmin==0) { pDIVmax=pDIV; pDIVmin=pDIV;} if(pDIV>pDIVmax) pDIVmax=pDIV; if(pDIVpDIVimax) { pDIVimax=pDIVi; } if(pDIVimaxProfit) maxProfit=Profit; if(ProfitpDIVomax) pDIVomax=pDIVo; if(pDIVo