0

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

Lerdon

  • 19 января 2022, 19:48
0
попробую посчитаю еще кстати тему разработал связанную с торговлей во флете.
avatar

Lerdon

  • 19 января 2022, 19:05
0
так выйдет он по тейку и снова же зайдет в рынок
avatar

Lerdon

  • 19 января 2022, 18:46
0
разобрался спс
avatar

Lerdon

  • 19 января 2022, 18:46
0
вкратце, а в чем смысл Вашей доработки в систему?)
avatar

Lerdon

  • 19 января 2022, 18:22
0
Индикатор странный какой-то. В тестере посмотрел постоянно пишет что надо продавать внезависимости от того куда идет цена. да и не нужен по большому счету этот индикатор и так понятно по самому роботу когда продавать а когда покупать. Ладно буду думать возможно в феврале обращусь к Андрею за доработкой если конечно он согласится. Спасибо!
avatar

Lerdon

  • 9 января 2022, 22:03
0
Тольк когда прогонял модель самого робота в тестере заметил одну вещь. Когда получается статус «Флэт», то по идее должна врубаться система торгующая от зон внутрь канала с порезанным Tralling STOP на 1,5 от стандартного(та логика что описывал выше с Middle.H и т.д. Потому что просто когда идет статус «Сужение канала» то там пока ничего страшного, пускай работает в обычном режиме, опять таки исходя из той логики которую Вы написали в коде робота.)
avatar

Lerdon

  • 9 января 2022, 20:24
0
Модуль конечно неплох, почти 54% тоже ничего, учитывая что общая стата в +
avatar

Lerdon

  • 9 января 2022, 20:12
0


Прогнал примерно с октября по декабрь сегодня, процент успешных сделок за три месяца исходя из логики примерно 53.71% 62 сделки прибыльных 32, со средней прибылью 18 пунктов. При отсутствии модуля «Сужения» думаю процент убыточных будет больше.
avatar

Lerdon

  • 9 января 2022, 20:10
0
Спасибо, посмотрю наглядно как работает
avatar

Lerdon

  • 9 января 2022, 11:48
0
кстати тут покумекал. Сейчас основная мысль в том что пересиживать некоторые состояния рынка пока не начнется сильный тренд для того чтобы начать зарабатывать. Но на некоторых парах получается слишком широкий флэт чтобы констатировать его как стандартный. Под такой волатильный флэт, я разработал для робот идею режима «Сужения». Чтобы робот мог даже в таких движениях что то иметь.
Смысл такой:
Анализ High и Low на промежутке 120 свечей на графике H1 за последние 48 часов.
В случае если High и Low не обновились за последние 48 часов, то на рынке идет сужение волатильности.
Включается режим «Сужение».
Статус рынка отображается на панели:
«Сужение»
«Тренд»
«Флэт»
В этом случае от High и LOW отмеряется 50% движения, получаем Middle линию расстояние от которой до High и Low делится еще раз на 2. Таким образом получаем линии Middle.H — линия между High и основной Middle линией. И Middle.L — линия между Low и основной Middle линией. В получившемся варианте сделки на покупку открываются между линиями Middle.L и Low. А сделки на продажу межлу линиями Middle.H и High.
Остальные варианты игнорируются.
Режим «Сужение» отключается только после того как последний Low или High обновятся менее 48 часов назад.

Дополнительно на время режима «Сужение» меняется параметр стандартного Tralling Stop, дополнительно к получившемуся стандартному числу Tralling Stop применяется деление на 1.5. То есть. При стандартном вычислении Tralling Stop получается 45 пунктов, значит 45/1,5=30 пунктов Tralling Stop для режима «Сужение».


Что думаешь? Сейчас такая проблема решается путем простого пересиживания стадии рынка, терпя некоторые издержки.
avatar

Lerdon

  • 8 января 2022, 12:51
0
хорошо получилось, спасибо большое!
avatar

Lerdon

  • 7 января 2022, 15:51
0
Вы понимаете что при значения 1000 часов, у Вас СРЕДНЕЕ движение по активу должно быть выше 1600 пунктов?) Вы где такие значение нашли?)) Даже Биткоин установлен на 175 часов срок жизни позиции.
avatar

Lerdon

  • 6 января 2022, 14:21
0
На данный момент имеем следующее:
EURUSD — 144ч
GBPUSD — 136ч
USDCAD — 117ч
USDJPY — 114ч
USDCHF — 150ч

Как видите значение в среднем колеблются от 100 до 150 часов по всем пяти активам, откуда там взяться 1000 часам не ясно)
Исходя из данных значений имеем средний рассчитанный срок жизни позиции 1.5 недели, если не закроется по стопу раньше.
avatar

Lerdon

  • 6 января 2022, 13:54
0
Не уверен как могло произойти что у вас получилось 1000 часов, но на текущий момент выше 160 часов ничего не видел по данному пункту. Все показатели ближе к 100 часам. Учитывая то какие значения берутся во внимание 1000 там никак не получится если только не будет какой то глобальный обрыв на бирже.
avatar

Lerdon

  • 6 января 2022, 13:51
0
С учетом Вашей доработки, теперь наглядно видно что система использует некий элемент Фибоначчи. До этого у меня уже была система связанная с Фибоначчи, тоже была весьма неплоха, однако редко открывала сделки и из-за этого сложно было оценить ее на статистике. Здесь робот практически постоянно в рынке за исключением флэта.
avatar

Lerdon

  • 6 января 2022, 11:43
0
Однозначно, спасибо за Вашу работу. Вы я смотрю тоже всерьез заинтересовались данной идеей? Планируете всерьез тестировать?
avatar

Lerdon

  • 6 января 2022, 11:17
0
Мне автотейк не нужен. Если вам нужны дополнительные авто расчеты, то тут уже без меня. ТЗ у Вас есть, значит и понимание как работает робот изнутри.

Удачи
avatar

Lerdon

  • 6 января 2022, 00:06
0
ничего существенно не менял, просто дал понятные наименования для переменных которые выводятся на экран и переставил местами параметры снеся вниз те которые нельзя менять.
ничего особенного. Я лишь преположил касаемо автотейка.

В целом я считаю систему завершенной, траллинг вполне подходит для данной концепции. То что пытаетесь сделать вы уже попытка идеализировать систему что может вылиться в сбой в стратегии. Смотрите сами, я буду пользоваться той версией что есть.

#property copyright "Разработан 2022, AM2 и SSG"
#property link      "ATS-TALLROCK"
#property version   "1.04"
#property strict

//--- Inputs
extern double Lots           = 0.1;      // Фикс. размер позиции
extern double Risk           = 10;       // Размер в процентах от баланса
extern bool   Trailing       = true;    // Tralling STOP 
extern bool   ProfitTrailing = false; // Авто STOPLOSS(рекомендуемое FALSE)
extern double H              = 0.7;   // Расчет автотрейлинга(с 0 до 1)
extern bool _CloseTime       = true;    // авторасчет времени закрытия позиции
extern int Magic             = 123;      //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;      // Take Profit
extern int    TrailingStep   = 1;     // Шаг трала
extern int Slip              = 30;       // размер реквот
          //              Движок системы, не влезать!
extern int CountW1           = 50;       // свечей для расчета W1
extern int CountH1           = 120;      // свечей для расчета Н1


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  // Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price){
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }
   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }
   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(){
   double lot=Lots;
   if(Lots==0) lot=AccountBalance()*Risk/100000;// 10000*Risk/100000=1
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(){
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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*2));
  }

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
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()*2,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);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int closeTime=CloseTime();
   
   double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,0)];
   double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,0)];
   double x=(hi-lo)/_Point;
   
   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));
           

  }
//+------------------------------------------------------------------+
avatar

Lerdon

  • 6 января 2022, 00:05
0
Если будете вносить корректировки то просьба использовать данную вариацию кода)

#property copyright «Разработан 2022, AM2 и SSG»
#property link «ATS-TALLROCK»
#property version «1.04»
#property strict

//--- Inputs
extern double Lots = 0.1; // Фикс. размер позиции
extern double Risk = 10; // Размер в процентах от баланса
extern bool Trailing = true; // Tralling STOP
extern bool ProfitTrailing = false; // Авто STOPLOSS(рекомендуемое FALSE)
extern double H = 0.7; // Расчет автотрейлинга(с 0 до 1)
extern bool _CloseTime = true; // авторасчет времени закрытия позиции
extern int Magic = 123; //ID orders |показатели ниже не трогать|

extern int StopLoss = 0; // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit = 0; // Take Profit
extern int TrailingStep = 1; // Шаг трала
extern int Slip = 30; // размер реквот
// Движок системы, не влезать!
extern int CountW1 = 50; // свечей для расчета W1
extern int CountH1 = 120; // свечей для расчета Н1

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price){
int r=0;
color clr=Green;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0)
sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
if(TakeProfit>0)
tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0)
sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
if(TakeProfit>0)
tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
}
r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot(){
double lot=Lots;
if(Lots==0) lot=AccountBalance()*Risk/100000;// 10000*Risk/100000=1
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()<2) count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
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*2));
}

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом |
//+------------------------------------------------------------------+
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()*2,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);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int closeTime=CloseTime();
double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,0)];
double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,0)];
double x=(hi-lo)/_Point;
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));

}
//+------------------------------------------------------------------+
avatar

Lerdon

  • 5 января 2022, 18:56