304 lines
20 KiB
MQL5
304 lines
20 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| ProjectName |
|
|
//| Copyright 2020, CompanyName |
|
|
//| http://www.companyname.net |
|
|
//+------------------------------------------------------------------+
|
|
#include <General_class_.mqh>
|
|
#include <Indicators_class.mqh>
|
|
#include <ExternalIndicators_class.mqh>
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
CGeneral_class gc;
|
|
CIndicators_class ind;
|
|
CExternalIndicators_class externalind;
|
|
//+------------------------------------------------------------------+
|
|
//| Bollinger_bands |
|
|
//+------------------------------------------------------------------+
|
|
input int BBPeriod = 35; // Bands Period1
|
|
input double BBDev = 2; // Bands Deviation1
|
|
input double Razmah = 40; // Bands Deviation1 in Points
|
|
input ENUM_APPLIED_PRICE Bollinger_Applied_price = PRICE_CLOSE;
|
|
int _bars = 0;
|
|
double up[], dn[], bs[];
|
|
int BBHandl;
|
|
|
|
input group "------------------ Параметры MA и MACD - торговля ------------------ "
|
|
input int ma_period_1 = 19;
|
|
input int ma_shift1 = 0;
|
|
int handle_MA1;
|
|
double MA[];
|
|
input ENUM_APPLIED_PRICE Applied_price_MA = PRICE_OPEN;
|
|
input ENUM_MA_METHOD MA_Mode = MODE_SMA;
|
|
// MACD
|
|
int handle_MACD;
|
|
double MACD[], SignalMACD[];
|
|
input int Fast_ema_period = 12; // MACD период быстрой средней
|
|
input int Slow_ema_period = 36; // MACD период медленной средней
|
|
input int Signal_period = 14 ; // MACD период усреднения разности
|
|
input ENUM_APPLIED_PRICE Applied_price_MACD = PRICE_CLOSE;
|
|
int handle_MACD1 = 0;
|
|
|
|
input group "------------------ Параметры MA и MACD - долгосрочный ------------------ "
|
|
// MA долгосрочного периода
|
|
input int ma_period_2 = 21;
|
|
input int ma_shift2 = 0;
|
|
int handle_MA_second;
|
|
double MA_second[];
|
|
input ENUM_APPLIED_PRICE Applied_price_MA_second = PRICE_LOW;
|
|
input ENUM_MA_METHOD MA_Mode_second = MODE_SMA;
|
|
// MACD долгосрочного периода
|
|
int handle_MACD_second = 0;
|
|
double MACD_second[], SignalMACD_second[];
|
|
input int Fast_ema_period_second = 5; // период быстрой средней MACD
|
|
input int Slow_ema_period_second = 45; // период медленной средней MACD
|
|
input int Signal_period_second = 13; // период усреднения разности MACD
|
|
input ENUM_APPLIED_PRICE Applied_price_MACD_second = PRICE_LOW;
|
|
|
|
|
|
|
|
input bool NewBar = false;
|
|
input bool TimeCheck = false;
|
|
input bool Risk_lot = true; // SL % от Баланса
|
|
input ENUM_TIMEFRAMES per = PERIOD_M1; //Период для текущей торговли
|
|
input ENUM_TIMEFRAMES per2 = PERIOD_M5; //Период для долгосрочного тренда
|
|
|
|
input string Start_Time = "20";
|
|
input string End_Time = "01";
|
|
double SL = 150;
|
|
double Lot1_ = 0.1;
|
|
input double Lot_percent = 5; // риск % баланса
|
|
|
|
double lot_b = 0;
|
|
double lot_s = 0;
|
|
int Slippage = 30;
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
|
|
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert tick function |
|
|
//+------------------------------------------------------------------+
|
|
bool flagSell = true;
|
|
bool flagBuy = false;
|
|
bool flagSellclose = false;
|
|
bool flagBuyclose = false;
|
|
datetime b1 = 0;
|
|
datetime b2 = 0;
|
|
//bool firstrun= true;
|
|
void OnTick()
|
|
{
|
|
|
|
// if (firstrun)
|
|
// {
|
|
ind.Bollinger_bands(_Symbol,per,BBPeriod,0,BBDev,Bollinger_Applied_price, BBHandl,up,dn,bs,true);
|
|
ind.MA_(_Symbol,per,ma_period_1,ma_shift1,MA_Mode,Applied_price_MA,handle_MA1,MA,false);
|
|
ind.MA_(_Symbol,per2,ma_period_2,ma_shift2,MA_Mode,Applied_price_MA_second,handle_MA_second,MA_second,false);
|
|
ind.MACD(_Symbol,per,Fast_ema_period,Slow_ema_period,Signal_period,Applied_price_MACD,handle_MACD1, MACD,SignalMACD,false);
|
|
ind.MACD(_Symbol,per2,Fast_ema_period_second,Slow_ema_period_second,Signal_period_second,Applied_price_MACD_second,handle_MACD_second, MACD_second,SignalMACD_second,false);
|
|
// firstrun = false;
|
|
|
|
double Ask_ = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // получаем цену аск
|
|
double Bid_ = SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
|
Print("ASK/BID");
|
|
int ob = 0, os = 0;
|
|
datetime t_ob = 0, t_os = 0;
|
|
int trades = gc.CheckOpen(ob, os, t_ob, t_os); // на каждом тике проверяем наличие открытой позиции
|
|
int impuls = Impuls_signal();
|
|
int impuls_Trend = Impuls_signal_TREND();
|
|
//--- SL && TP
|
|
Print("LOTS");
|
|
double risk_lotBuy = gc.LotSize(SL, Lot_percent);
|
|
if(Risk_lot)
|
|
lot_b = risk_lotBuy;
|
|
else
|
|
lot_b = Lot1_;
|
|
double risk_lotSell = gc.LotSize(SL, Lot_percent);
|
|
if(Risk_lot)
|
|
lot_s = risk_lotSell;
|
|
else
|
|
lot_s = Lot1_;
|
|
|
|
// Анализ на новом баре
|
|
if(NewBar)
|
|
{
|
|
if(!gc.isNewBar(per))
|
|
return;
|
|
}
|
|
Print("Timecheck");
|
|
if(TimeCheck)
|
|
{
|
|
if(!gc.CheckTimePeriod(IntegerToString(Start_Time),IntegerToString(End_Time)))
|
|
return;
|
|
}
|
|
|
|
double r=up[0]-dn[0];
|
|
Print("OB/OS");
|
|
if(os>0)
|
|
{
|
|
if(Bid_ <= dn[0])
|
|
{
|
|
flagSellclose =true;
|
|
}
|
|
if(flagSellclose)
|
|
{
|
|
if(impuls = 1)
|
|
{
|
|
gc.CloseSell();
|
|
flagSellclose =false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(ob>0)
|
|
{
|
|
if(Ask_ >= up[0])
|
|
{
|
|
flagBuyclose =true;
|
|
}
|
|
if(flagBuyclose)
|
|
{
|
|
if(impuls = -1)
|
|
{
|
|
gc.CloseBuy();
|
|
flagBuyclose =false;
|
|
}
|
|
}
|
|
}
|
|
|
|
Print("OS == 0");
|
|
if(os==0)
|
|
{
|
|
if(Bid_ >= up[0] && r>Razmah*_Point)
|
|
{
|
|
flagSell =true;
|
|
b1 = iTime(_Symbol,per,0);
|
|
Print("bar1: ", b1);
|
|
SendMail(_Symbol + " 1-е условие выполнено", _Symbol + " Bid >= up[0] && r>Razmah*_Point, Период: " + GetNameTF());
|
|
}
|
|
int barSell = iBarShift(_Symbol,per,b1);
|
|
Print(": ", barSell);
|
|
if(barSell > 2)
|
|
{
|
|
flagSell = false;
|
|
Print("flagSell: ", flagSell);
|
|
}
|
|
if(flagSell)
|
|
{
|
|
if(impuls = -1)
|
|
{
|
|
gc.OpenSellPosition(lot_s,Bid_,Bid_+SL*_Point,0);
|
|
SendMail(_Symbol + " Новая позиция", _Symbol + " Сигнал_Продажа_Вход, Период: " + GetNameTF());
|
|
flagSell =false;
|
|
}
|
|
}
|
|
}
|
|
if(ob==0)
|
|
{
|
|
if(Ask_ <= dn[0] && r>Razmah*_Point)
|
|
{
|
|
flagBuy =true;
|
|
b2 = iTime(_Symbol,per,0);
|
|
SendMail(_Symbol + " 1-е условие выполнено", _Symbol + " Ask <= dn[0] && r>Razmah*_Point, Период: " + GetNameTF());
|
|
}
|
|
int barBuy = iBarShift(_Symbol,per,b2);
|
|
if(barBuy > 10)
|
|
{
|
|
flagBuy = false;
|
|
}
|
|
if(flagBuy)
|
|
{
|
|
if(impuls = 1)
|
|
{
|
|
gc.OpenBuyPosition(lot_b,Ask_,Ask_-SL*_Point,0);
|
|
SendMail(_Symbol + " Новая позиция", _Symbol + " Сигнал_Покупка_Вход, Период: " + GetNameTF());
|
|
flagBuy =false;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
// if(ob>0 && flagBuy == true)
|
|
// {
|
|
// gc.CloseBuyPartial(_Symbol,2);
|
|
// flagBuy = false;
|
|
// }
|
|
//
|
|
// if(os > 0 && flagSell == true)
|
|
// {
|
|
// gc.CloseSellPartial(_Symbol,2);
|
|
// Comment("Частичное закрытие");
|
|
// flagSell = false;
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
//Далее идут функции
|
|
//+------------------------------------------------------------------+
|
|
int Impuls_signal()
|
|
{
|
|
if(MA[1] > MA[2] && MACD[1] > MACD[2])
|
|
return 1; // MA и MACD растут
|
|
if(MA[1] < MA[2] && MACD[1] < MACD[2])
|
|
return -1; // MA и MACD падают
|
|
if((MA[1] > MA[2] && MACD[1] < MACD[2]) ||
|
|
(MA[1] < MA[2] && MACD[1] > MACD[2]))
|
|
return 2; // MA и MACD идут в разных направлениях - свеча i-1
|
|
if((MA[1] > MA[2] && MA[2] > MA[3] && MACD[1] < MACD[2] && MACD[2] < MACD[3]) ||
|
|
(MA[1] < MA[2] && MA[2] < MA[3] && MACD[1] > MACD[2] && MACD[2] > MACD[3]))
|
|
return 3; // MA и MACD идут в разных направлениях - свеча i-1 и i-2)
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
int Impuls_signal_TREND()
|
|
{
|
|
if(MA_second[0] > MA_second[1] && MACD_second[0] > MACD_second[1])
|
|
return 1; // MA и MACD растут
|
|
if(MA_second[0] < MA_second[1] && MACD_second[0] < MACD_second[1])
|
|
return -1; // MA и MACD падают
|
|
if((MA_second[0] > MA_second[1] && MACD_second[0] < MACD_second[1]) ||
|
|
(MA_second[0] < MA_second[1] && MACD_second[0] > MACD_second[1]))
|
|
return 2; // MA и MACD идут в разных направлениях - свеча i-0
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
double DeltaPos() // находит кол-во пунктов от цены открытия до текущей цены
|
|
{
|
|
double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
|
|
double price = 0;
|
|
for(int i = 0; i < PositionsTotal(); i++)
|
|
{
|
|
a_position.SelectByIndex(i);
|
|
if(a_position.Symbol() == _Symbol && a_position.Magic() == Magic)
|
|
{
|
|
price = a_position.PriceOpen();
|
|
break;
|
|
}
|
|
}
|
|
return MathAbs(Bid - price);
|
|
}
|
|
//+------------------------------------------------------------------+
|