//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Y(){
double y=0;
for(int i=0; i<CountW1; i++)
{
y+=(iHigh(NULL,PERIOD_W1,i)-iLow(NULL,PERIOD_W1,i))/_Point;
}
return(y/(CountW1*1.3));
}
//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом |
//+------------------------------------------------------------------+
void TrailingPositions() {
bool rez;
int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber()==Magic) {
if (OrderSymbol()==Symbol()) {
if (OrderType()==OP_BUY) {
if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*Point) {
if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
rez=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*_Point,OrderTakeProfit(),0,clrBlue);
}
}
}
if (OrderType()==OP_SELL) {
if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*Point) {
if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
rez=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*_Point,OrderTakeProfit(),0,clrRed);
}
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CloseTime(){
int count=0;
double K=0, L=0, N=0;
double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,1)];
double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,1)];
double x=(hi-lo)/_Point;
K=NormalizeDouble(Y()*1,0);
L=x/120;
N=K/L;
count=(int)NormalizeDouble(N,0); // время закрытия в часах
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseTimeAll(int ot=-1){
bool cl=1;
int closeTime=CloseTime();
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
if(TimeCurrent()-OrderOpenTime()>closeTime*3600){
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1){
bool cl;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
if(OrderType()==0 && (ot==0 || ot==-1)){
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1)){
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,0)];
double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,0)];
double midl=(hi+lo)/2;
double x=(hi-lo)/_Point;
if(FletClose && x<Y() && CountTrades()!=0)CloseAll();
if(_CloseTime)CloseTimeAll();
if(Trailing)TrailingPositions();
if(CountTrades()<1 && x>Y())
{
if(Bid<hi && Bid>(hi+lo)/2)
PutOrder(0,Ask);
if(Bid>lo && Bid<(hi+lo)/2)
PutOrder(1,Bid);
}
/*
Comment( "\n ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS",
"\n Недельная норма движения : -- ",NormalizeDouble(Y(),0),
"\n Текущее движение на H1 : -- ",NormalizeDouble(x,0),
"\n Рассчитанный Трейлинг-стоп(Stop loss): -- ",NormalizeDouble(Y()*H,0),
"\n Рассчетное время закрытия позиции : -- ",NormalizeDouble(CloseTime(),0));
*/
/*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
1.Недельная норма движения=951(GBPUSD)
2.Рассчитываем этот параметр для получения кеф. по следующей схеме:
951/5/100 = 1,902(округляем), кеф.=1,9
(где 951-недельная норма движения,
5-количаство учитываемых торговых дней(параметр нужно вынести в блок управления),
100-это фиксированный делитель для получения кеф.
3.1,9 — это и будет кеф. для дальнейшего рассчёта.
4.Вычислив кеф. вычисляем ТП исходя из рассчитаного уже трейлинг стопа(стоп лосс)
5.Рассчитаный трейлинг стоп(стоп лосс) = 665
6.Рассчёт ТП:
665*1,9=1263,5(округляем),
где 665-рассчитаный трейлинг стоп(стоп лосс),
1,9 — это кеф. рассчитаный в п.2
6.1 Полученый результат 1263-это и будет являться ТП при выставлении ордера.
7.Если изменяются рассчёты(показатели) по Недельной норме движения и(или) Трейлинг стопу(стоп лоссу),
то соответственно пересчитытывается(переставляется) и тейк профит…
*/
double kef = NormalizeDouble(Y()/(n_Day*150),1);
int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа
int TP = (int)NormalizeDouble(TrailingStop*kef,0); // Рассчитанный Тейк Профит
SetLabel("Label1", "ПОКАЗАТЕЛИ ATS.H22 TALLROCK", LineColor, 5, 75, corner, raz);
SetLabel("Label2", "Недельная норма движения : -- "+DoubleToStr((Y())/10,0)+" пунктов", LineColor, 5, 60, corner, raz);
SetLabel("Label3", "Текущее движение на H1 : -- "+DoubleToStr((x)/10,0)+" пунктов", LineColor, 5, 45, corner, raz);
SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): -- "+DoubleToStr((Y()*H)/10,0)+" пунктов", LineColor, 5, 30, corner, raz);
SetLabel("Label5", "Рассчетное время закрытия позиции : -- "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);
SetLabel("Label12", "Рассчитанный КЕФ : -- "+DoubleToStr(kef,1)+" ", LineColor, 5, 30, 3, raz);
SetLabel("Label13", "Рассчитанный Тейк Профит : -- "+DoubleToStr(TP/10,0)+" пунктов", LineColor, 5, 15, 3, raz);
//==================================================
SetHLine(clrRed, "lo", lo, STYLE_SOLID, 3);
SetHLine(clrBlack, "midl", midl, STYLE_SOLID,3);
SetHLine(clrBlue, "hi", hi, STYLE_SOLID, 3);
double _lo=(lo+midl)/2;// линия Middle.L
double _hi=(hi+midl)/2;// линия Middle.H
double _lov=Low[iLowest(NULL,0,MODE_LOW,_CountH1,0)];//High и Low на промежутке 120 свечей на графике H1 за последние 48 часов.
double _hig=High[iHighest(NULL,0,MODE_HIGH,_CountH1,0)];//High и Low на промежутке 120 свечей на графике H1 за последние 48 часов.
if(lo<_lov && hi>_hig){
SetHLine(clrGreen, "_lo", _lo, STYLE_SOLID, 2);
SetHLine(clrMagenta, "_hi", _hi, STYLE_SOLID, 2);
SetLabel("Label6","ПОНИЖЕННАЯ ВОЛАТИЛЬНОСТЬ", clrPurple, 5, 15, 0, 17);
}
else{
SetLabel("Label6","ТРЕНД", clrGreen, 5, 10, 0, 17);
}
}
Lerdon