Price Data Components
Indicators Used
Miscellaneous
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---