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
0 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

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---