Code: Select all
//+------------------------------------------------------------------+
//| Exp_MACDCandle.mq5 |
//| Copyright © 2015, Nikolay Kositsin |
//| Khabarovsk, farria@mail.redcom.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Nikolay Kositsin"
#property link "farria@mail.redcom.ru"
#property version "1.00"
//+---------------------------------------------------+
//| Îáúÿâëåíèå ïå?å÷èñëåíèé |
//+---------------------------------------------------+
enum MODE
{
MODE_HISTOGRAM=0, // Ãèñòîã?àììà
MODE_SIGNAL_LINE=1 // Ñèãíàëüíàÿ ëèíèÿ
};
//+---------------------------------------------------+
//| Òî?ãîâûå àëãî?èòìû |
//+---------------------------------------------------+
#include <TradeAlgorithms.mqh>
//+---------------------------------------------------+
//| Âõîäíûå ïà?àìåò?û ?êñïå?òà |
//+---------------------------------------------------+
input double MM=0.1; // Äîëÿ ôèíàíñîâûõ ?åñó?ñîâ îò äåïîçèòà â ñäåëêå
input MarginMode MMMode=LOT; // Ñïîñîá îï?åäåëåíèÿ ?àçìå?à ëîòà
input int StopLoss_=1000; // Ñòîïëîññ â ïóíêòàõ
input int TakeProfit_=2000; // Òåéêï?îôèò â ïóíêòàõ
input int Deviation_=10; // Ìàêñ. îòêëîíåíèå öåíû â ïóíêòàõ
input bool BuyPosOpen=true; // ?àç?åøåíèå äëÿ âõîäà â äëèííûå ïîçèöèè
input bool SellPosOpen=true; // ?àç?åøåíèå äëÿ âõîäà â êî?îòêèå ïîçèöèè
input bool BuyPosClose=true; // ?àç?åøåíèå äëÿ âûõîäà èç äëèííûõ ïîçèöèé
input bool SellPosClose=true; // ?àç?åøåíèå äëÿ âûõîäà èç êî?îòêèõ ïîçèöèé
//+--------------------------------------------------+
//| Âõîäíûå ïà?àìåò?û äëÿ èíäèêàòî?à MACDCandle |
//+--------------------------------------------------+
input ENUM_TIMEFRAMES InpInd_Timeframe=PERIOD_H4; // ????????? ??????????
input uint SignalBar=1; // Íîìå? áà?à äëÿ ïîëó÷åíèÿ ñèãíàëà âõîäà
input uint fast_ema_period=12; // Ïå?èîä áûñò?îé ñ?åäíåé
input uint slow_ema_period=26; // Ïå?èîä ìåäëåííîé ñ?åäíåé
input uint signal_period=9; // Ïå?èîä óñ?åäíåíèÿ ?àçíîñòè
input MODE mode=MODE_SIGNAL_LINE; // Èñòî÷íèê äàííûõ äëÿ ?àñ÷åòà
//+--------------------------------------------------+
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïå?åìåííûõ äëÿ õ?àíåíèÿ ïå?èîäà ã?àôèêà â ñåêóíäàõ
int TimeShiftSec;
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïå?åìåííûõ äëÿ õåíäëîâ èíäèêàòî?îâ
int InpInd_Handle;
//---- îáúÿâëåíèå öåëî÷èñëåííûõ ïå?åìåííûõ íà÷àëà îòñ÷åòà äàííûõ
int min_rates_total;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---- ïîëó÷åíèå õåíäëà èíäèêàòî?à MACDCandle
InpInd_Handle=iCustom(Symbol(),InpInd_Timeframe,"MACDCandle",fast_ema_period,slow_ema_period,signal_period,mode);
if(InpInd_Handle==INVALID_HANDLE)
{
Print("Íå óäàëîñü ïîëó÷èòü õåíäë èíäèêàòî?à MACDCandle");
return(INIT_FAILED);
}
//---- èíèöèàëèçàöèÿ ïå?åìåííîé äëÿ õ?àíåíèÿ ïå?èîäà ã?àôèêà â ñåêóíäàõ
TimeShiftSec=PeriodSeconds(InpInd_Timeframe);
//---- èíèöèàëèçàöèÿ ïå?åìåííûõ íà÷àëà îòñ÷åòà äàííûõ
min_rates_total=int(MathMax(fast_ema_period,slow_ema_period));
if(mode==MODE_SIGNAL_LINE) min_rates_total+=int(signal_period);
min_rates_total+=int(1+2+SignalBar);
//--- çàâå?øåíèå èíèöèàëèçàöèè
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//----
GlobalVariableDel_(Symbol());
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---- ï?îâå?êà êîëè÷åñòâà áà?îâ íà äîñòàòî÷íîñòü äëÿ ?àñ÷åòà
if(BarsCalculated(InpInd_Handle)<min_rates_total) return;
//---- ïîäã?óçêà èñòî?èè äëÿ íî?ìàëüíîé ?àáîòû ôóíêöèé IsNewBar() è SeriesInfoInteger()
LoadHistory(TimeCurrent()-PeriodSeconds(InpInd_Timeframe)-1,Symbol(),InpInd_Timeframe);
//---- îáúÿâëåíèå ñòàòè÷åñêèõ ïå?åìåííûõ
static bool Recount=true;
static bool BUY_Open=false,BUY_Close=false;
static bool SELL_Open=false,SELL_Close=false;
static datetime UpSignalTime,DnSignalTime;
static CIsNewBar NB;
//+----------------------------------------------+
//| Îï?åäåëåíèå ñèãíàëîâ äëÿ ñäåëîê |
//+----------------------------------------------+
if(!SignalBar || NB.IsNewBar(Symbol(),InpInd_Timeframe) || Recount) // ï?îâå?êà íà ïîÿâëåíèå íîâîãî áà?à
{
//---- îáíóëèì òî?ãîâûå ñèãíàëû
BUY_Open=false;
SELL_Open=false;
BUY_Close=false;
SELL_Close=false;
Recount=false;
//---- îáúÿâëåíèå ëîêàëüíûõ ïå?åìåííûõ
double Col[2];
//---- êîïè?óåì âíîâü ïîÿâèâøèåñÿ äàííûå â ìàññèâû
if(CopyBuffer(InpInd_Handle,4,SignalBar,2,Col)<=0) {Recount=true; return;}
//---- ïîëó÷èì ñèãíàëû äëÿ ïîêóïêè
if(Col[1]==2)
{
if(BuyPosOpen && Col[0]<2) BUY_Open=true;
if(SellPosClose) SELL_Close=true;
UpSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec;
}
//---- ïîëó÷èì ñèãíàëû äëÿ ï?îäàæè
if(Col[1]==0)
{
if(SellPosOpen && Col[0]>0) SELL_Open=true;
if(BuyPosClose) BUY_Close=true;
DnSignalTime=datetime(SeriesInfoInteger(Symbol(),InpInd_Timeframe,SERIES_LASTBAR_DATE))+TimeShiftSec;
}
}
//+----------------------------------------------+
//| Ñîâå?øåíèå ñäåëîê |
//+----------------------------------------------+
//---- çàê?ûâàåì äëèííó? ïîçèöè?
BuyPositionClose(BUY_Close,Symbol(),Deviation_);
//---- çàê?ûâàåì êî?îòêó? ïîçèöè?
SellPositionClose(SELL_Close,Symbol(),Deviation_);
//---- îòê?ûâàåì äëèííó? ïîçèöè?
BuyPositionOpen(BUY_Open,Symbol(),UpSignalTime,MM,MMMode,Deviation_,StopLoss_,TakeProfit_);
//---- îòê?ûâàåì êî?îòêó? ïîçèöè?
SellPositionOpen(SELL_Open,Symbol(),DnSignalTime,MM,MMMode,Deviation_,StopLoss_,TakeProfit_);
}
//+------------------------------------------------------------------+
Mr. tools hii
Sir this EA opens a position, but opens a new position when covering the old lot. Or there is a signal, but doing a trade 2 times. Find a time and I'll be incredibly happy if you could review. Thanks.
regards