SuppResZZTrader
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «suppreszztrader@lifeindreamsworld.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
SuppResZZTrader — это торговый советник для MetaTrader 4, рассчитанный на работу с парой EURUSD на часовом графике. Советник формирует уровни поддержки и сопротивления на основе индикатора ZigZag и анализирует их в сочетании с полосами Боллинджера, стандартным отклонением, скользящей средней и индикатором ADX.
При выполнении условий для покупки или продажи советник открывает рыночные ордера Buy или Sell с заданными параметрами управления капиталом. Доступны настройки тейк-профита, стоп-лосса, трейлинг-стопа и лимитов на количество открытых ордеров.
Советник обрабатывает события OnTick: отслеживает начало нового бара для оценки торговых сигналов, управляет трейлинг-стопом на каждом тике, а также закрывает позиции при появлении нового триггера или разворачивающегося паттерна. Действия ограничены заданным временным окном торговли.
Настройки программы
| Настройка | Описание |
|---|---|
| MagicNumber | Магический номер — Магический номер для идентификации ордеров данного советника. |
| Close Trade by New Trigger (CloseTrade) | Закрытие сделки по новому триггеру — Переключатель автоматического закрытия позиции при появлении нового триггера. |
| Close Trade: Prof Type (0:all,1:pos,2:neg) (ProfitTypeClTrd) | Тип прибыли при закрытии — Тип прибыли при закрытии: 0 — все позиции, 1 — только прибыльные, 2 — только убыточные. |
| N1 | Разделитель триггеров — Текстовый разделитель группы данных для триггеров покупки/продажи. |
| Boll Band Lower Limit (BBSprd_LwLim) | Нижний предел полос Боллинджера — Нижний предел спреда полос Боллинджера для фильтра триггера. |
| Boll Band Upper Limit (BBSprd_UpLim) | Верхний предел полос Боллинджера — Верхний предел спреда полос Боллинджера для фильтра триггера. |
| ZigZag Depth (ExtDepth) | Глубина ZigZag — Глубина поиска экстремумов для ZigZag. |
| ZigZag Deviation (ExtDeviation) | Отклонение ZigZag — Допустимое отклонение в пунктах для экстремумов ZigZag. |
| ZigZag BacdkStp (ExtBackstep) | Откаты ZigZag — Количество баров для откатов при построении ZigZag. |
| Min Bars in ZZ Segment (ProcBars_Min) | Мин. баров в сегменте ZigZag — Минимальное количество баров в сегменте ZigZag для допуска к торговле. |
| SMA Period (SMAPer) | Период SMA — Период скользящей средней для определения уровней поддержки и сопротивления. |
| Std Dev Period (SigPer) | Период стандартного отклонения — Период расчёта стандартного отклонения. |
| Std Dev Upper Limit (SigLim) | Лимит стандартного отклонения — Верхний предел стандартного отклонения для фильтра сигнала. |
| Period ADX (ADX_Per) | Период ADX — Период расчёта индикатора ADX. |
| ADX Lim (Min Lvl) (ADX_Lim) | Лимит ADX — Минимальное значение индикатора ADX для допуска к торговле (фильтр тренда). |
| Trade Entry Hour (0, ... 23) (entryhour) | Час входа в торговлю — Час начала торговли (от 0 до 23). |
| Trade Duration Hours (12.. 23) (openhours) | Продолжительность торгового окна — Продолжительность торгового окна в часах. |
| N2 | Разделитель управления капиталом — Текстовый разделитель группы параметров управления капиталом. |
| Lots | Размер лота — Размер лота для открытия позиции. |
| TakeProfit | Тейк-профит — Уровень тейк-профита в пунктах для открытой позиции. |
| StopLoss | Стоп-лосс — Уровень стоп-лосса в пунктах для открытой позиции. |
| TrailingStop | Трейлинг-стоп — Расстояние трейлинг-стопа в пунктах для управления открытыми позициями. |
| N3 | Разделитель лимитов ордеров — Текстовый разделитель группы лимитов количества ордеров. |
| Max Open Orders this Symbol (NumOpenOrders) | Макс. открытых ордеров на символ — Максимальное количество открытых ордеров на данный символ. |
| Max Open Orders All Symbols (TotOpenOrders) | Макс. открытых ордеров всего — Максимальное общее количество открытых ордеров по всем символам. |
Поиск по коду файла
#property strict
#define NAME "SuppResZZTrader"
#include <WinUser32.mqh>
double PipValue;
int magic_number;
double _point,_bid,_ask,_spread,_Low,_High,_close,_open;
int _digits;
string _symbol;
int slpg=3;
double MULT;
input int MagicNumber=123456; //
input bool CloseTrade=true; // Close Trade by New Trigger
input int ProfitTypeClTrd=1; // Close Trade: Prof Type (0:all,1:pos,2:neg)
int BBPeriod = 20; // Boll Band Period
double BBSigma = 2.0; // Boll Band Sigma
input string N1=" --------- Buy/Sell Trigger Data ----------";
input double BBSprd_LwLim = 25.; // Boll Band Lower Limit
input double BBSprd_UpLim = 70.; // Boll Band Upper Limit
extern int ExtDepth = 14; // ZigZag Depth
extern int ExtDeviation = 7; // ZigZag Deviation
extern int ExtBackstep = 8; // ZigZag BacdkStp
extern int ProcBars_Min = 8; // Min Bars in ZZ Segment
input int SMAPer= 7; // SMA Period
input int SigPer = 30; // Std Dev Period
input double SigLim = 1.38; // Std Dev Upper Limit
input int ADX_Per = 10; // Period ADX
input double ADX_Lim = 24.; // ADX Lim (Min Lvl)
input int entryhour = 5; // Trade Entry Hour (0, ... 23)
input int openhours = 20; // Trade Duration Hours (12.. 23)
input string N2=" --------- Money__Management ----------";
input double Lots = 0.01;
input double TakeProfit = 200.;
input double StopLoss = 125.;
input double TrailingStop = 55.;
input string N3=" ------- Order Number Limits ----------";
input int NumOpenOrders = 1; // Max Open Orders this Symbol
input int TotOpenOrders = 8; // Max Open Orders All Symbols
int OnInit()
{
// код доступен только после оплаты
} //--------------------End init ---------------------------------------------
void OnDeinit(const int reason)
{
Print(" Active Symbol ",Symbol()," Period ",Period()," pip value ",PipValue);
Print(" Broker Factor*_point = ",_point*MULT," _point = ",100000.*_point);
return;
}//------------------------------------------------------------------
void OnTick()
{
// код доступен только после оплаты
}
void SupResTrigger(bool &buysig,bool &sellsig)
{
double ADX1_Val;
double BB_Spread;
double Sigma[10]={10*0.};
double SMA1_Hi,SMA1_Lo;
double ResVal,SupVal;
double zzArray[100];
int Proc_BarsMin=4;
int jj;
int BarSel,EndBar,ProcBars;
int limit = 90;
buysig = false;
sellsig = false;
EndBar=0;
BB_Spread=(iBands(_symbol,0,BBPeriod,BBSigma,0,PRICE_CLOSE,MODE_UPPER,1) -
iBands(_symbol,0,BBPeriod,BBSigma,0,PRICE_CLOSE,MODE_LOWER,1))/(MULT*_point);
ADX1_Val=iADX(_symbol,0,ADX_Per,PRICE_CLOSE,MODE_MAIN,1);
if(BB_Spread<BBSprd_LwLim || BB_Spread>BBSprd_UpLim || ADX1_Val < ADX_Lim) return;
for(jj=0;jj<5;jj++)
{
Sigma[jj]=1000.*iStdDev(_symbol,0,SigPer,0,MODE_SMA,PRICE_HIGH,1+jj);
}
FunZigZag(limit,ExtDepth,ExtDeviation,ExtBackstep,zzArray);
for(jj=0; jj<limit; jj++)
{
if(zzArray[jj+1]>0.01 && jj>Proc_BarsMin-1)
{
EndBar=jj+1;
break;
}
}
ProcBars=EndBar; // total bars to process
if(ProcBars<ProcBars_Min) return;
BarSel=1; // use close of last bar
GetSupRes(ProcBars,BarSel,SupVal,ResVal);
SMA1_Hi=iMA(_symbol,0,SMAPer,0,MODE_SMA,PRICE_HIGH,1 ); // high
SMA1_Lo=iMA(_symbol,0,SMAPer,0,MODE_SMA,PRICE_LOW, 1 ); // low
if(SMA1_Hi>ResVal && Sigma[0]<SigLim && Sigma[0]>Sigma[1]) buysig=true;
if(SMA1_Lo<SupVal && Sigma[0]<SigLim && Sigma[0]>Sigma[1]) sellsig=true;
return;
}
void GetSupRes(int ProcBars,int BarSel,double &SupVal,double &ResVal)
{
double MM,BBS,BBR,ResBarVal,SupBarVal;
int TotBars,BarSup,BarRes,StartBar;
StartBar=1;
TotBars = ProcBars+StartBar-1;
MM=(iClose(NULL,0,TotBars)-iClose(NULL,0,StartBar))/ProcBars; // slope
BarRes=Highest(NULL,0,MODE_HIGH,TotBars,StartBar);
ResBarVal=iHigh(NULL,0,BarRes);
BBR = ResBarVal-MM*BarRes; // Res line intercept
ResVal = MM*BarSel+BBR; // compute value of Resistance at last closed bar
BarSup=Lowest(NULL,0,MODE_LOW,TotBars,StartBar);
SupBarVal=iLow(NULL,0,BarSup);
BBS = SupBarVal-MM*BarSup; // Supp line intercept
SupVal = MM*BarSel+BBS; // compute value of Support at last closed bar
return;
}
bool CheckMoneyForTrade(string symb,double &olots,int type)
{
if( olots<NormalizeDouble(MarketInfo(NULL,MODE_MINLOT),2) ){ olots=NormalizeDouble(MarketInfo(NULL,MODE_MINLOT),2); }
if( olots>NormalizeDouble(MarketInfo(NULL,MODE_MAXLOT),2) ){ olots=NormalizeDouble(MarketInfo(NULL,MODE_MINLOT),2); }
double free_margin=AccountFreeMarginCheck(symb,type,olots);
if(free_margin<=0.)
{
string oper=(type==OP_BUY)? "Buy":"Sell";
Print("** Not enough money for ",oper," ",olots," ",symb," Error code=",GetLastError());
Print(" Account Margin ",AccountMargin()," Free Margin ",AccountFreeMargin());
return(false);
}
return(true);
}
int GetOpnTrdType()
{
int cnt,total,TrdType;
total=OrdersTotal();
TrdType= 0;
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==_symbol && OrderMagicNumber()==magic_number)
{
if(OrderType()==OP_SELL ) TrdType=2;
if(OrderType()==OP_BUY ) TrdType=1;
break;
}
}
}
return(TrdType);
}
bool HourRange(int hour_current,int lentryhour,int lopenhours)
{
bool Hour_Test;
int closehour;
bool wrap;
Hour_Test=true;
wrap=false;
closehour=lentryhour+lopenhours;
if(closehour>23)wrap=true;
closehour=int(MathMod((closehour),24));
if( wrap && (hour_current<lentryhour && hour_current >closehour)) Hour_Test=false;
if(!wrap && (hour_current<lentryhour || hour_current >closehour)) Hour_Test=false;
return(Hour_Test);
}
void OpenOrder(int tr_entry,double Ord_Lots,double Stop_Loss,double Take_Profit,string New_Comment,int Num_OpenOrders)
{
int total_EA,total,Mag_Num,trade_result,cnt;
double tp_norm,sl_norm;
string NetString;
total_EA=0;
total=OrdersTotal();
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderType()<=OP_SELL)
total_EA=total_EA+1;
} // loop
if(total_EA>=TotOpenOrders) return; // max number of open orders allowed( all symbols)
total_EA=0;
for(cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) break;
Mag_Num=OrderMagicNumber();
if(OrderType()<=OP_SELL && OrderSymbol()==_symbol && Mag_Num==magic_number)
total_EA=total_EA+1;
} //---- loop -------
if(total_EA<Num_OpenOrders) // open new order if below OpenOrder limit
{
if(tr_entry==1) //Open a Buy Order
{
sl_norm = NormalizeDouble(_ask - Stop_Loss*MULT*_point, _digits);
tp_norm = NormalizeDouble(_ask + Take_Profit*MULT*_point, _digits);
trade_result=Buy_Open(Ord_Lots,sl_norm,tp_norm,magic_number,New_Comment);
if(trade_result<0)
return;
} // --- end of tr_entry = 1 --------------------------------
if(tr_entry==2) // Open a Sell Order
{
sl_norm = NormalizeDouble((_bid + Stop_Loss*MULT*_point), _digits);
tp_norm = NormalizeDouble((_bid - Take_Profit*MULT*_point),_digits);
trade_result=Sell_Open(Ord_Lots,sl_norm,tp_norm,magic_number,New_Comment);
if(trade_result<0)
return;
} // ------------------ end tr_entry = 2Показано первые 50% кода (символов: 14755)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.