Project_N_1/Bollinger_algo.mq5
super.admin fca2fc1d82 convert
2025-05-30 16:18:18 +02:00

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);
}
//+------------------------------------------------------------------+