Project_N_1/Bollinger_algo.mq5

305 lines
20 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:18:18 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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 "------------------ 0@0<5B@K MA 8 MACD - B>@3>2;O ------------------ "
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 ?5@8>4 1KAB@>9 A@54=59
input int Slow_ema_period = 36; // MACD ?5@8>4 <54;5==>9 A@54=59
input int Signal_period = 14 ; // MACD ?5@8>4 CA@54=5=8O @07=>AB8
input ENUM_APPLIED_PRICE Applied_price_MACD = PRICE_CLOSE;
int handle_MACD1 = 0;
input group "------------------ 0@0<5B@K MA 8 MACD - 4>;3>A@>G=K9 ------------------ "
// MA 4>;3>A@>G=>3> ?5@8>40
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 4>;3>A@>G=>3> ?5@8>40
int handle_MACD_second = 0;
double MACD_second[], SignalMACD_second[];
input int Fast_ema_period_second = 5; // ?5@8>4 1KAB@>9 A@54=59 MACD
input int Slow_ema_period_second = 45; // ?5@8>4 <54;5==>9 A@54=59 MACD
input int Signal_period_second = 13; // ?5@8>4 CA@54=5=8O @07=>AB8 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 % >B 0;0=A0
input ENUM_TIMEFRAMES per = PERIOD_M1; //5@8>4 4;O B5:CI59 B>@3>2;8
input ENUM_TIMEFRAMES per2 = PERIOD_M5; //5@8>4 4;O 4>;3>A@>G=>3> B@5=40
input string Start_Time = "20";
input string End_Time = "01";
double SL = 150;
double Lot1_ = 0.1;
input double Lot_percent = 5; // @8A: % 10;0=A0
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); // ?>;CG05< F5=C 0A:
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); // =0 :064>< B8:5 ?@>25@O5< =0;8G85 >B:@KB>9 ?>78F88
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_;
// =0;87 =0 =>2>< 10@5
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-5 CA;>285 2K?>;=5=>", _Symbol + " Bid >= up[0] && r>Razmah*_Point, 5@8>4: " + 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 + " >20O ?>78F8O", _Symbol + " !83=0;_@>4060_E>4, 5@8>4: " + GetNameTF());
flagSell =false;
}
}
}
if(ob==0)
{
if(Ask_ <= dn[0] && r>Razmah*_Point)
{
flagBuy =true;
b2 = iTime(_Symbol,per,0);
SendMail(_Symbol + " 1-5 CA;>285 2K?>;=5=>", _Symbol + " Ask <= dn[0] && r>Razmah*_Point, 5@8>4: " + 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 + " >20O ?>78F8O", _Symbol + " !83=0;_>:C?:0_E>4, 5@8>4: " + GetNameTF());
flagBuy =false;
}
}
}
// if(ob>0 && flagBuy == true)
// {
// gc.CloseBuyPartial(_Symbol,2);
// flagBuy = false;
// }
//
// if(os > 0 && flagSell == true)
// {
// gc.CloseSellPartial(_Symbol,2);
// Comment("'0AB8G=>5 70:@KB85");
// flagSell = false;
// }
}
//0;55 84CB DC=:F88
//+------------------------------------------------------------------+
int Impuls_signal()
{
if(MA[1] > MA[2] && MACD[1] > MACD[2])
return 1; // MA 8 MACD @0ABCB
if(MA[1] < MA[2] && MACD[1] < MACD[2])
return -1; // MA 8 MACD ?040NB
if((MA[1] > MA[2] && MACD[1] < MACD[2]) ||
(MA[1] < MA[2] && MACD[1] > MACD[2]))
return 2; // MA 8 MACD 84CB 2 @07=KE =0?@02;5=8OE - A25G0 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 8 MACD 84CB 2 @07=KE =0?@02;5=8OE - A25G0 i-1 8 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 8 MACD @0ABCB
if(MA_second[0] < MA_second[1] && MACD_second[0] < MACD_second[1])
return -1; // MA 8 MACD ?040NB
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 8 MACD 84CB 2 @07=KE =0?@02;5=8OE - A25G0 i-0
else
return 0;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double DeltaPos() // =0E>48B :>;-2> ?C=:B>2 >B F5=K >B:@KB8O 4> B5:CI59 F5=K
{
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);
}
//+------------------------------------------------------------------+