Author: Copyright 2015, AM2
Price Data Components
Series array that contains tick volumes of each bar
Indicators Used
Bollinger bands indicatorMovement directional index
Miscellaneous
It issuies visual alerts to the screen
11 Views
0 Downloads
0 Favorites
wellmartin
//+------------------------------------------------------------------+
//|                                                  Well Martin.mq5 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>            // Ïîäêëþ÷àåì òîðãîâûé êëàññ CTrade
//--- âõîäíûå ïàðàìåòðû èíäèêàòîðà Bollinger Bands
input int      BBPeriod  = 84;        // Ïåðèîä Bollinger Bands
input int      BBShift   = 0;         // Ñìåùåíèå îòíîñèòåëüíî ãðàôèêà
input double   BBDev     = 1.8;       // Ñòàíäàðòíîå îòêëîíåíèå
//--- âõîäíûå ïàðàìåòðû èíäèêàòîðà ADX
input int      ADXPeriod = 40;        // Ïåðèîä ADX
input int      ADXLevel  = 45;        // Óðîâåíü ADX
//--- âõîäíûå ïàðàìåòðû ýêñïåðòà
input int      TP        = 1200;      // Òåéê-ïðîôèò
input int      SL        = 1400;      // Ñòîï-ëîññ
input int      Slip      = 50;        // Ïðîñêàëüçûâàíèå
input int      Stelth    = 0;         // 1-Ðåæèì ñòîïû âèäèò òîëüêî ïîëüçîâàòåëü
input double   KLot      = 2;         // Êîýôôèöèåíò óìíîæåíèÿ ëîòà
input double   MaxLot    = 5;         // Ìàêñèìàëüíûé ëîò, ïîñëå êîòîðîãî ëîò íà÷àëüíûé
input double   Lot       = 0.1;       // Êîëè÷åñòâî ëîòîâ äëÿ òîðãîâëè 
input color    LableClr  = clrGreen;  // Öâåò ìåòêè
//--- ãëîáàëüíûå ïåðåìåííûå
int BBHandle;                         // Õýíäë èíäèêàòîðà Bolinger Bands
int ADXHandle;                        // Õýíäë èíäèêàòîðà ADX
double BBUp[],BBLow[];                // Äèíàìè÷åñêèå ìàññèâû äëÿ õðàíåíèÿ ÷èñëåííûõ çíà÷åíèé Bollinger Bands
double ADX[];                         // Äèíàìè÷åñêèå ìàññèâû äëÿ õðàíåíèÿ ÷èñëåííûõ çíà÷åíèé ADX
CTrade trade;                         // Èñïîëüçóåì òîðãîâûé êëàññ CTrade
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Ïîëó÷àåì õýíäë èíäèêàòîðîâ  Bollinger Bands è ADX
   BBHandle=iBands(_Symbol,0,BBPeriod,BBShift,BBDev,PRICE_CLOSE);
   ADXHandle=iADX(_Symbol,0,ADXPeriod);

//--- Íóæíî ïðîâåðèòü, íå áûëè ëè âîçâðàùåíû çíà÷åíèÿ Invalid Handle
   if(BBHandle==INVALID_HANDLE || ADXHandle==INVALID_HANDLE)
     {
      Print(" Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòîðîâ");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- îñâîáîæäàåì õýíäëû èíäèêàòîðîâ
   IndicatorRelease(BBHandle);
   IndicatorRelease(ADXHandle);
//--- óäàëèì ñîçäàííûå ìåòêè
   ObjectsDeleteAll(0,0,OBJ_ARROW_LEFT_PRICE);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Áóäåò ñîäåðæàòü öåíû, îáúåìû è ñïðåä äëÿ êàæäîãî áàðà
   MqlRates mrate[];
//--- Óñòàíîâèì èíäåêñàöèþ â ìàññèâàõ êîòèðîâîê è èíäèêàòîðîâ  êàê â òàéìñåðèÿõ
//--- ìàññèâ êîòèðîâîê
   ArraySetAsSeries(mrate,true);
//--- ìàññèâ çíà÷åíèé èíäèêàòîðîâ
   ArraySetAsSeries(BBUp,true);
   ArraySetAsSeries(BBLow,true);
   ArraySetAsSeries(ADX,true);
//--- Ïîëó÷èì èñòîðè÷åñêèå äàííûå ïîñëåäíèõ 3-õ áàðîâ
   if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Alert("Îøèáêà êîïèðîâàíèÿ èñòîðè÷åñêèõ äàííûõ - îøèáêà:",GetLastError(),"!!");
      return;
     }
//--- Êîïèðóåì çíà÷åíèÿ èíäèêàòîðà Bolinger Bands èñïîëüçóÿ õýíäëû
   if(CopyBuffer(BBHandle,1,0,3,BBUp)<0 || CopyBuffer(BBHandle,2,0,3,BBLow)<0)
     {
      Alert("Îøèáêà êîïèðîâàíèÿ áóôåðîâ èíäèêàòîðà Bollinger Bands - íîìåð îøèáêè:",GetLastError(),"!");
      return;
     }
//--- Êîïèðóåì çíà÷åíèÿ èíäèêàòîðà ADX èñïîëüçóÿ õýíäëû
   if(CopyBuffer(ADXHandle,0,0,3,ADX)<0)
     {
      Alert("Îøèáêà êîïèðîâàíèÿ áóôåðîâ èíäèêàòîðà ADX - íîìåð îøèáêè:",GetLastError(),"!");
      return;
     }
//--- Ëó÷øåå ïðåäëîæåíèå íà ïîêóïêó
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- Ëó÷øåå ïðåäëîæåíèå íà ïðîäàæó                           
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
//--- Ïðîôèò
   double pr=0;
//--- Ñòîïû
   double stop=0,take=0;
//--- îáúÿâëÿåì ïåðåìåííûå òèïà boolean, îíè áóäóò èñïîëüçîâàòüñÿ ïðè ïðîâåðêå óñëîâèé äëÿ ïîêóïêè è ïðîäàæè
//--- Ïðîáîé âåðõíåé ãðàíèöû Bolinger Bands è ïðîòèâîïîëîæíàÿ ñäåëêà
   bool Buy=Ask<BBLow[1] && ADX[1]<ADXLevel && (LastDealType()==0 || LastDealType()==2);
//--- Ïðîáîé íèæíåé ãðàíèöû Bolinger Bands è ïðîòèâîïîëîæíàÿ ñäåëêà                             
   bool Sell=Bid>BBUp[1] && ADX[1]<ADXLevel && (LastDealType()==0 || LastDealType()==1);
//--- Ïðîâåðêà íà íîâûé áàð  
   if(IsNewBar(_Symbol,0))
     {
      //--- Íåò ïîçèöèè è ñèãíàë íà ïîêóïêó
      if(PositionsTotal()<1 && Buy)
        {
         //--- Âû÷èñëÿåì ñòîïû
         if(SL==0)stop=0; else stop=NormalizeDouble(Ask-SL*_Point,_Digits);
         if(TP==0)take=0; else take=NormalizeDouble(Ask+TP*_Point,_Digits);
         //--- Ñòîïû âèðòóàëüíûå 
         if(Stelth==1) {stop=0;take=0;}
         //--- Îòêðûâàåì îðäåð íà ïîêóïêó
         trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Volume(),Ask,stop,take);
         //--- Ñòàâèì âèðòóàëüíûå ñòîïû
         if(Stelth==1) PutLable("SL"+DoubleToString(Ask,_Digits),TimeCurrent(),NormalizeDouble(Ask-SL*_Point,_Digits),LableClr);
         if(Stelth==1) PutLable("TP"+DoubleToString(Ask,_Digits),TimeCurrent(),NormalizeDouble(Ask+TP*_Point,_Digits),LableClr);
        }
      //--- Íåò ïîçèöèè è ñèãíàë íà ïðîäàæó
      if(PositionsTotal()<1 && Sell)
        {
         //--- Âû÷èñëÿåì ñòîïû
         if(SL==0)stop=0; else stop=NormalizeDouble(Bid+SL*_Point,_Digits);
         if(TP==0)take=0; else take=NormalizeDouble(Bid-TP*_Point,_Digits);
         //--- Ñòîïû âèðòóàëüíûå 
         if(Stelth==1) {stop=0;take=0;}
         //--- Îòêðûâàåì îðäåð íà ïðîäàæó
         trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Volume(),Bid,stop,take);
         if(Stelth==1) PutLable("TP"+DoubleToString(Bid,_Digits),TimeCurrent(),NormalizeDouble(Bid-TP*_Point,_Digits),LableClr);
         if(Stelth==1) PutLable("SL"+DoubleToString(Bid,_Digits),TimeCurrent(),NormalizeDouble(Bid+SL*_Point,_Digits),LableClr);
        }
     }
//--- Çàêðûòèå ïî ïðîôèòó
//--- Îòêðûòà ïîçèöèÿ è ðåæèì Ñòåëñ
   if(PositionSelect(_Symbol) && Stelth==1)
     {
      //--- Îòêðûòà ïîêóïêà
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         //--- Ñ÷èòàåì ïðîôèò
         pr=(Bid-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(pr>=TP)
           {
            //--- Çàêðûâàåì ïîçèöèþ
            trade.PositionClose(_Symbol);
           }
         if(pr<=-SL)
           {
            //--- Çàêðûâàåì ïîçèöèþ
            trade.PositionClose(_Symbol);
           }
        }
      //--- Îòêðûòà ïðîäàæà
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         //--- Ñ÷èòàåì ïðîôèò
         pr=(PositionGetDouble(POSITION_PRICE_OPEN)-Bid)/_Point;
         if(pr>=TP)
           {
            //--- Çàêðûâàåì ïîçèöèþ
            trade.PositionClose(_Symbol);
           }
         if(pr<=-SL)
           {
            //--- Çàêðûâàåì ïîçèöèþ
            trade.PositionClose(_Symbol);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Âèðòóàëüíûé ñòîï                                                 |
//+------------------------------------------------------------------+
void PutLable(const string name="",datetime time=0,double price=0,const color clr=clrGreen)
  {
//--- ñáðîñèì çíà÷åíèå îøèáêè
   ResetLastError();
//--- Ñîçäàåì ìåòêó
   if(!ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price))
     {
      Print(__FUNCTION__,
            ": íå óäàëîñü ñîçäàòü ëåâóþ öåíîâóþ ìåòêó! Êîä îøèáêè = ",GetLastError());
      return;
      //--- óñòàíîâèì öâåò ìåòêè
      ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
      //--- óñòàíîâèì ñòèëü îêàéìëÿþùåé ëèíèè
      ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
      //--- óñòàíîâèì ðàçìåð ìåòêè
      ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe)
  {
//---- ïîëó÷èì âðåìÿ ïîÿâëåíèÿ òåêóùåãî áàðà
   datetime TNew=datetime(SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE));
   datetime m_TOld=0;
//--- ïðîâåðêà íà ïîÿâëåíèå íîâîãî áàðà
   if(TNew!=m_TOld && TNew)
     {
      m_TOld=TNew;
      //--- ïîÿâèëñÿ íîâûé áàð!
      return(true);
      Print("Íîâûé áàð!");
     }
//--- íîâûõ áàðîâ ïîêà íåò!
   return(false);
  }
//+------------------------------------------------------------------+
//| Ñ÷èòàåì ëîò â çàâèñèìîñòè îò ïîëó÷åííîãî ïðîôèòà                 |
//+------------------------------------------------------------------+
double Volume(void)
  {
   double lot=Lot;
//--- Ïîëó÷èì äîñòóï ê èñòîðèè
   HistorySelect(0,TimeCurrent());
//--- Ñäåëêè â èñòîðèè
   int orders=HistoryDealsTotal();
//--- Òèêåò ïîñëåäíåé ñäåëêè  
   ulong ticket=HistoryDealGetTicket(orders-1);
   if(ticket==0)
     {
      Print("Íåò ñäåëîê â èñòîðèè! ");
      lot=Lot;
     }
//--- Ïðîôèò ñäåëêè
   double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
//--- Ëîò ñäåëêè
   double lastlot=HistoryDealGetDouble(ticket,DEAL_VOLUME);
//--- Ïðîôèò îòðèöàòåëüíûé
   if(profit<0.0)
     {
      //--- Óâåëè÷èâàåì ñëåäóþùèé ëîò
      lot=lastlot*KLot;
      Print(" Cäåëêà çàêðûòà ïî ñòîïó! ");
     }
//--- Ïðèâîäèì ëîò ê ìèíèìàëüíîìó
   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol)
      lot=minvol;
//--- Åñëè ëîò áîëüøå ìàêñèìàëüíîãî òî íà÷àëüíûé ëîò
   if(lot>MaxLot)
      lot=Lot;
//--- Âîçâðàùàåì òîðãîâûé îáúåì
   return(lot);
  }
//+------------------------------------------------------------------+
//| Ñìîòðèì òèï ïîñëåäíåé çàêðûòîé ñäåëêè                            |
//+------------------------------------------------------------------+
int LastDealType(void)
  {
   int type=0;
//--- Ïîëó÷èì äîñòóï ê èñòîðèè
   HistorySelect(0,TimeCurrent());
//--- Ñäåëêè â èñòîðèè
   int orders=HistoryDealsTotal();
//--- Òèêåò ïîñëåäíåé ñäåëêè  
   ulong ticket=HistoryDealGetTicket(orders-1);
//--- Íåò ñäåëîê â èñòîðèè
   if(ticket==0)
     {
      Print("Íåò ñäåëîê â èñòîðèè! ");
      type=0;
     }
   if(ticket>0)
     {
      //--- Ïîñëåäíÿÿ ñäåëêà BUY 
      if(HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_BUY)
        {
         type=2;
        }
      //--- Ïîñëåäíÿÿ ñäåëêà SELL
      if(HistoryDealGetInteger(ticket,DEAL_TYPE)==DEAL_TYPE_SELL)
        {
         type=1;
        }
     }
//---
   return(type);
  }
//+------------------------------------------------------------------+

Comments