Lerdon
Destian Farbius

 
Уровень 9

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Добавить функцию в советника.

Добрый день!

Речь пойдет о ранее созданном советнике zakaz.opentraders.ru/49509.html

В него нужно добавить функцию авторасчет трейлинг стопа.

Формула следующая.
После всех расчетов
полученное значение Y * H(параметр указывается в настройках робота).
Далее полученное значение должно выставляться автоматически в поле Tralling Stop(по возможности вывести на экран «текущее значение Tralling Stop»).

В настройки для этого нужно добавить новый пункт
Процентный размер трейлинга =
это и будет параметр H.
Например в это поле вставят значение 0.7

Значит Y*0.7=Tralling STOP

Y*H=Tralling STOP
H указывается в параметрах робота(значение от 0 до 1).
Y это рассчитанная недельная норма движения цены.

Взаимодействие с параметром Y уже указано в коде робота.
Нужно лишь добавить к нему функцию Y*H для получения значения трейлинг стопа, и чтобы робот сам подставлял это значение в параметры и использовал его.

P.S. Робот прекрасно адаптируется под рынок, единственное что хочется его по максимуму автоматизировать.
  • 0
  • Просмотров: 3287
  • 3 января 2022, 22:21
  • Lerdon
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
индикатор
02 января 2022
06 января 2022

Брокер для ваших роботов, 15 лет на рынке

Комментарии (108)

+
0
на 4-е
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 3 января 2022, 23:56
+
+2
Что бы не отвлекать Андрея предложу такой вариант, хотя у Андрея возможно готов и свой вариант.


//+------------------------------------------------------------------+
//|               Weakly Советник с мультитаймфреймовым анализом.mq4 |
//|                                              Copyright 2019, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double Risk       = 10;       // риск
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern bool   Trailing   = false;    // Тралить 
extern bool   ProfitTrailing = false; // Тралить только профит
extern double H              = 0.7;   // Множитель трейлингстопа
extern int    TrailingStep   = 1;     // Шаг трала
extern int Slip          = 30;       // реквот
extern int CountW1       = 50;       // свечей для расчета W1
extern int CountH1       = 120;      // свечей для расчета Н1
extern int CloseTime     = 3;        // время закрытия в часах
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| 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 = 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);
              }
            }
          }
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseTimeAll(int ot=-1){
   bool cl=1;
   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()
  {
   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(Trailing)TrailingPositions();   
      
   if(CloseTime>0)CloseTimeAll();

   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 Y: ",Y(),
           "\n Tralling_STOP: ",NormalizeDouble(Y()*H,0),
           "\n X: ",x);
  }
//+------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 08:11
+
0
Спасибо большое вам.
Если возможно сможете ли добавить финальную функцию.

Автоматический расчет времени слежения позиции.

Для поля «Время закрытия в часах».
Y*2=K
X/120(свечей для расчета H1) = L
K/L=N.
N- это значение для поля «Время закрытия в часах».
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 10:34
+
0
Расшифруйте буквы.
Например
N-CloseTime // время закрытия в часах
Y-
X-
H1-
и так по всем буквам.Я не знаю что имеется в виду.
И что имеется в виду
Автоматический расчет времени слежения позиции.

Может время жизни позиции (в часах, в минутах), после истечении которого позиция закрывается принудительно?
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 11:04
+
0
N — это время закрытия в часах которое рассчитано с помощью формул.(время жизни в часах, далее позиция принудительно закрывается)
Y — этот параметр уже есть в коде он отвечает за расчет недельного тренда.
Перепишу сюда тот текст который уже есть по ссылке: zakaz.opentraders.ru/49509.html
«рассчитывается расстояние от High до Low каждой свечи из 50 свечей, затем все складывается и делится на их число(50), то есть выясняем средний размер недельной свечи на промежутке в 50 свечей. Полученное значение делим еще раз на 2 и получаем значение Y которое система будет подставлять в следующие формулы»
X — Система отсчитывает последние 120 баров на текущем ТФ. После чего берет во внимание точки HIGH и LOW на заданном промежутке. Именно промежутке, то есть берется самая высокая точка за последние 120 баров и самая низкая.
Далее идет расчет минимального движения цены для определения тренда по формуле:
HIGH(периода в 120 баров) – LOW(периода в 120 баров) = Х > Y пунктов на рынке тренд.
HIGH(периода в 120 баров) – LOW(периода в 120 баров) = Х =< Y на рынке флет.

H1 — это Таймфрейм.

То есть полученные выше значения мы подставляем в следующие формулы:
Y*2=K
X/120(на количество свечей для расчета H1(текущий таймфрем)) = L
K/L=N.
N- это значение для поля «Время закрытия в часах».
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 11:43
+
+2
Сделал отдельную функцию.
Взамен объясните столь иезуитский расчет времени жизни позиции?
Какой логикой руководились или это последствия НГ?
<code>

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double Risk       = 10;       // риск
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern bool   Trailing   = false;    // Тралить 
extern bool   ProfitTrailing = false; // Тралить только профит
extern double H              = 0.7;   // Множитель трейлингстопа
extern int    TrailingStep   = 1;     // Шаг трала
extern int Slip          = 30;       // реквот
extern int CountW1       = 50;       // свечей для расчета W1
extern int CountH1       = 120;      // свечей для расчета Н1
extern bool _CloseTime   = false;    // разрешить  закрытия в часах
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| 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 Недельный диапазон : ",NormalizeDouble(Y(),0),
           "\n Tralling_STOP: ",NormalizeDouble(Y()*H,0),
           "\n CloseTime : ",NormalizeDouble(CloseTime(),0),
           "\n Часовой диапазон : ",NormalizeDouble(x,0));
  }
//+------------------------------------------------------------------+
</code>

Редактирован: 4 января 2022, 14:11
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 14:09
+
0
Огромное спасибо!
Все крепится вокруг анализа движка советника.
Суть в том что советник выявляет норму движения цены для актива и вычисляет что для него является трендом, а что нет(самоптимизация). Сделано это с целью игнорировать ФЛЭТ. Учитывая из каких данных берутся расчеты для определения тренда, то я решил на основе этих же данных вычислить срок жизни тренда, после которого позиция будет закрыта. Сделано это с целью полной автономии робота.)
Вот как робот себя чувствует с ручными корректировками:
www.mql5.com/ru/signals/1309312?source=Site+Profile#!tab=account


Редактирован: 4 января 2022, 14:18
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 14:18
+
+1
Не думаете, что с доработками статистика измениться в худшую сторону?
Сами же говорите
Вот как робот себя чувствует с ручными корректировками:

Я так понимаю, что торгуете одиеаковым советником на 5 парах одновременно.Или это мультивалютный советник?
Какой стартовый лот? не кажется, что двойку лучше внести в настройки для возможности тестирования и подбора размера лучшего множителя

K=NormalizeDouble(Y()*2,0);


avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 16:20
+
+1
Я установил советника на 5 валютных пар. Те настройки что устанавливались вручную, теперь устанавливаются автоматически так как рассчитываются так же как рассчитывались вручную. В тестере погонять робота не получится из-за мультитаймфреймовости системы(расчеты движка синхронизируется одновременно с W1 и H1). Поэтому гоняю отдельно на мониторинге в более менее «реальных условиях». Лот я устанавливаю вручную из расчета 0.10 на 1000$ или 0.01 на 100$. Никакого усреднения и мартина как вы поняли. Чистая статистика и четкие стопы. Погоняю монитор до 1 мая, если все будет пучком поставлю на него 500$ и лот 0,01 на каждую из 5 пар.
Редактирован: 4 января 2022, 16:46
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 16:43
+
+1
Понятно.Удачи.
Может есть смысл организовать закрытие всех позиций при определенном профите (убытке) по всему счету? Или сделать мультивалютный советник с такой функцией?
А почему не торговать всеми мажорами?
Редактирован: 4 января 2022, 16:55
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 16:52
+
+1
Ну я пока исхожу из идей риска, можно конечно его влупить вообще на все пары, но и депозит нужен хороший под это.
А в чем отличия от того что советник будет либо мультивалютный либо одинаковый робот на 5 парах стоит?
На счет закрытия позиций по общей прибыли по всему счету, это уже попытка идеализировать систему, может вылиться в то что общая статистика изменится и неизвестно в какую сторону. Попробуйте сделать свою версию этой системы и поставить на мониторинг посмотрим какая мысль смотрится профитнее)
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 17:03
+
0
Ну я пока исхожу из идей риска, можно конечно его влупить вообще на все пары, но и депозит нужен хороший под это.

1.Речь не идет о торговле всеми 128 парами.Просто увидел 5 пар и все мажоры.
По моему логичен вопрос — почему только 5 пар?
А в чем отличия от того что советник будет либо мультивалютный либо одинаковый робот на 5 парах стоит?

2.Единственное отличие не возможность одновременного тестирования.Если написать советник на пятерке тогда можно значительно сократить время подбора нужных пар и нужных параметров.
Попробуйте сделать свою версию этой системы и поставить на мониторинг посмотрим какая мысль смотрится профитнее)

Да вот пока своих мыслей «навалом».Со своими то не успеваешь разобраться и осмыслить итоги.
Редактирован: 4 января 2022, 17:46
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 17:45
+
0
5 пар выбрал самые ликвидные и низкие по спреду. AUDUSD NZDUSD хронически не переношу поэтому не буду с ними работать. Система не нуждается в серьезных настройках. Я сейчас просто тестирую то на что я могу рассчитывать с ней и дееспособна ли эта мысль или нет. Система не нуждается в оптимизации, по крайней мере такой которая требует долго тестирования и подбора параметров. Тут просто либо работает либо нет.
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 18:03
+
0
Сейчас до 1 мая подожду. Посмотрю что будет. После закажу перевод данного советника на кодификацию MQL5 и дальше в Альфа-Форекс двину.
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 18:05
+
+1
Удачи!*hi* 
Только учтите что на Альфе очень не большое плечо.Значит нужен более большой депозит.
А что мешает (принципиально) сейчас заказать советник на пятерке.
Отсутствие средств — это тоже аргумент.
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 18:26
+
0
Средства есть, но пока жду 1 мая. Я не хочу ставить 500$ на кота в мешке. Идея хороша и логика просчитана. Движок прорабатывался долго. Но все равно, пока не увижу стоящие результаты на мониторинге не буду суетится.
Насчет кредитного плеча уже все посчитано. Минимальная маржа для обеспечения 0.05 лота по всем нужным мне парам составляет 164$ это 32,8% от общего депо 500$ много, но реально.

Сам пока работаю с БКС на фондовом рынке, депо ~1200$. Плюс там планирую увеличить его до 1700-1900$ после чего подумаю об открытии 500$ счета для моего робота в Альфе. Для меня главное это платить налоги чтобы мне счета не заблокировали)

начинал я с 40$ полтора года назад в сентябре 2020. Фонду бросать не собираюсь, форекс только робот и только как дополнительное направление)
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 18:34
+
0
Если есть осмысленная стратегия действий на перспективу — это хорошо.
Я и не предлагал бросить тест советника в его нынешнем варианте.
Просто доппроверки в тестере тоже бы не помешали.Возможно появились бы новые мысли или новые вариации.
Знаю по себе.
Планируете использовать тот вариант советника что я написал, или он был нужен для проверки каких то идей.
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 18:51
+
0
Вашу конечную вариацию потому что она дает автоматизацию тех процессов что до этого делались вручную.
В тестере бессмысленно его гонять он мультитаймфреймовый.
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 4 января 2022, 18:55
+
+1
Ну еще раз успехов и удачи!
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 19:10
+
0
Сейчас пришло в голову, если говорить о автоматизации:
почему бы тогда и стоплосс и тейкпрофит не вычислять как все остальное програмно?
avatar

  16  ssg Сообщений: 817

  • 4 января 2022, 21:21
+
0
И еще
Далее идет расчет минимального движения цены для определения тренда по формуле:
HIGH(периода в 120 баров) – LOW(периода в 120 баров) = Х > Y пунктов на рынке тренд.
HIGH(периода в 120 баров) – LOW(периода в 120 баров) = Х =< Y на рынке флет.

Тогдаможет просто закрывать позицию если начался флет.
avatar

  16  ssg Сообщений: 817

  • 5 января 2022, 07:00
+
0
на счет флэта можно попробовать заставить робота закрывать принудительно позиции при наступлении условий.
Стоп лосс уже автоматизирован достаточно поставить FALSE на пункт «Тралить только профит» и будет вам автостоплосс именно так сейчас робот и работает. Вместо автотейка стоит срок жизни сделки в часах.
По Take Profit есть такая мысль
Y*2=K
K-X(текущее движение на H1)= Take Profit.
То бишь берем например GBPUSD(пока что лучшая пара)= 94.8пунктов(Y)*2=189.6.
Далее 189.6 — 133 = 56.6 пунктов Take Profit.
Вот такая мысль по Тейк профиту. Если будут свои мысли смело реализуйте.
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 5 января 2022, 18:31
+
0

вот то как выглядит робот у меня, я немного его причесал чтобы удобнее было следить за ним
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 5 января 2022, 18:53
+
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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 5 января 2022, 18:56
+
0
Всем моё почтение, да, мысль Lerdon действительно стоящая, и каков бы не был «выхлоп» уже за одну систематизированную мысль «снимаю шляпу»!!! ssg, отдельное, огромное спасибо, за воплощение сих замыслов в реалии!!! Поставил на 9 пар, два раза подымалось по 11$, лотом 0,01, но к утру вернулось к начальному депо… Исходя из последнего и принося извинения, прошу ssg воплотить свои последние мысли в новый вариант стратегии и советника...(… стоплосс и тейкпрофит вычислять как все остальное програмно) и (… закрывать позицию если начался флет), только сделать эти функции откльчаемыми!!! Думаю данный вариант стоит права на проверку, поставлю на другой комп, паралельно.., будет видно что и по чём… В любом случае моя признательность ребята…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 5 января 2022, 09:24
+
0
… пока воткнул доп.сова для фиксации прибыли, что уже отклонение от «истины», хотя.., кому ведомо где оная???
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 5 января 2022, 09:26
+
0
касаемо отката прибыли, нужно ждать и не трогать робота, самое главное не трогать параметра свечей для расчета W1 и H1 это специально подобранные значения. Анализ ведется за последний год, и на основе него выстраивается модель стратегии. Поэтому эти значение 50 и 120 нужно оставлять по умолчанию. Остальное тестируйте, опыт расчетов показывает что для авторасчета стоплоса так же нужно вводить данные от 0 до 1 в расчет автотрейлинга. При значение FALSE в поле «тралить только профит» получите сразу автостоплосс.
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 5 января 2022, 18:39
+
0
1.Ну положим как работает трал я знаю.(Если не забыли я сам его дополнил
и добавил в советник).Думал возможно есть какие то мысли по поводу
расчета стоплосса и тейка.
2.Соотнесите размер автостоплосса и рассчитанного по вашей формуле тейка.
Тейк не маловат?
3.Задам вопрос ещё раз
Далее идет расчет минимального движения цены для определения тренда по формуле:
HIGH(периода в 120 баров) – LOW(периода в 120 баров) = Х > Y пунктов на рынке тренд.
HIGH(периода в 120 баров) – LOW(периода в 120 баров) = Х =< Y на рынке флет.

Тогда может просто закрывать позицию если начался флет.

4.Что значит «я немного его причесал ».Внесли какие то изменения или
дополнения в код?
5.Выложите код через опцию . В выложенном варианте код
неудобочитаем, без интервалов, без разделителей.
avatar

  16  ssg Сообщений: 817

  • 5 января 2022, 21: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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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

Удачи
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 6 января 2022, 00:06
+
0
Попробовать внести изменения возможно я думаю.
Только нужно знать методику расчетов стопов, тейков, а то к автору.
Будет методика — будут дополнения (надеюсь).*hi* 
avatar

  16  ssg Сообщений: 817

  • 5 января 2022, 09:41
+
0
Ну, надеюсь, уважаемому Lerdon этот вариант не будет не интересен и Он «разложит» методику.., поэтому я, со своей стороны, прошу Lerdon дать разясьнения по поводу рассчётов, при любом раскладе и Вам и Ему огромный респект…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 5 января 2022, 09:52
+
0
Стратегия понятна:
1.вычисляется средний размер недельной свечи за 1 год.
2.вычисляется расстояние пройденное часовыми свечами за последние 5 торговых
суток.
3.сравниваются эти величины между собой:
— если средний размер недельной свечи больше расстояния пройденное часовыми
свечами — значит пока флет. Позиции не открываются.
— иначе — тренд. Открываются позиции в зависимости от положения цены к
средней линии расстояние пройденное часовыми свечами.
Посмотрите расчет CloseTime(); По комментам видны какие то огромные цифры, иногда более 1000 часов. А это почти полтора месяца.Мне кажется при таком расчете закрытие по времени не работает.
В советнике добавил закрытие при наступлении флета

 if(FletClose && x<Y() && CountTrades()!=0)CloseAll(); 

Опция отключается

extern bool   FletClose      = true;  // Закрывать открытые позиции при флете

И добавил отрисовку

 Текущее движение на H1 : --  ",NormalizeDouble(x,0),
avatar

  16  ssg Сообщений: 817

  • 6 января 2022, 07:23
+
+1


//--- 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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

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

avatar

  16  ssg Сообщений: 817

  • 6 января 2022, 07:24
+
+1

//+------------------------------------------------------------------+
//| 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));
           
   SetHLine(clrRed, "io", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
               
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}  
//+------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 6 января 2022, 11:17
+
+1
Вы я смотрю тоже всерьез заинтересовались данной идеей? Планируете всерьез тестировать?

Пока не уверен.Пока нет ощущения законченности данной стратегии.
Да и своих «хотелок» не успеваешь тестировать.Но меня больше привлекают мультивалютные стратегии и торговля корзинами валют.
А там только зацепись и…
Так, что пока повременю.
Да и mishelbb пишет:
Думаю данный вариант стоит права на проверку, поставлю на другой комп, паралельно.., будет видно что и по чём…

Так что прошу при случае выкладывайте оба результаты или здесь или в новом топике.Ну и сам буду заглядывать на итоги работы сюда

www.mql5.com/ru/signals/1309312?source=Site+Profile#!tab=account
Может потом при наличии результатов и появиться советник на пятерке.
А сейчас просто мог помочь — вот и помог.*hi* 


Редактирован: 6 января 2022, 12:49
avatar

  16  ssg Сообщений: 817

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 6 января 2022, 11:43
+
0
А расчет
int CloseTime()

все таки пересмотрите и если найдете для себя разумное обоснование формулы расчета обращайтесь, попробую помочь.
Конечно трал играет свою роль, но все таки…
avatar

  16  ssg Сообщений: 817

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 6 января 2022, 14:21
+
0
Спорить не буду.Может при отладке советника и его прогона в тестере в режиме визуализации эта цифра вылезла (запускал с января 2020), а может взгляд не за ту цифру зацепился.Не могу сказать точно.Да это и не важно.
Главное что Вы меня услышали и этот момент отслеживаете.
Что бы другие тоже не ошибались при просмотре информации немного доработал советник.
Место расположения информации, шрифт и цвет можно менять через настройки советника.
avatar

  16  ssg Сообщений: 817

  • 6 января 2022, 17:23
+
+1


#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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 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);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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                                             |
//+------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

  • 6 января 2022, 17:24
+
+1


//+------------------------------------------------------------------+
//| 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));
 
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "io", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
               
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+

avatar

  16  ssg Сообщений: 817

  • 6 января 2022, 17:25
+
0
хорошо получилось, спасибо большое!
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 7 января 2022, 15:51
комментарий был удален 2022-01-08 12:51:44 Lerdon

+
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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 8 января 2022, 12:51
+
0
Вариант организации работы советника в режиме «тренд» и режиме «флет» для меня был очевиден сразу. Не стал его озвучивать, была фраза :
P.S. Робот прекрасно адаптируется под рынок, единственное что хочется его по максимуму автоматизировать.

Да и тема не моя.
Не знаю, пока не убедили. Сами на истории хотя бы месяц поторгуйте и поделитесь результатами.
Сейчас всё это кажется притянутым за уши.Торговля на отбой в пограничной зоне.
Откроете продажу а через 2-3 часа нужно открываться на покупку.И что делать? Сидеть в минусовом локе? Трал может и не помочь.Получите сначала убыток по продаже, а затем цена опять пойдет вниз и будет убыток от покупки.
Тогда уж лучше торговать в «мертвой зоне».
А если High совпали а Low нет, или наоборот? Что делать тогда?
В общем пока не зацепило.
Одну пару на истории хотя бы месяц про торгуйте руками с листком и карандашом.
Уровни на калькуляторе можно просчитать.Линии нарисовать.Трал тоже один раз посчитать.Всего четыре недели на часовых свечах.Только честно, как для себя.
Потом когда будут результаты и поговорим.
avatar

  16  ssg Сообщений: 817

  • 8 января 2022, 20:35
+
0
Добавил немного визуализации для облегчения расчетов, а именно
-нанесение линий Middle.H и Middle.L если на графике нет тренда,
-строковое обозначение ситуации на графики:
Статус рынка отображается на панели:
«Сужение»
«Тренд»
«Флэт»

Месяц руками просчитайте свою стратегию, поделитесь результатами анализа- потом поговорим о добавлении условий торговли в советник.
Работы на час с перекурами и кофе.
начале добавьте строку
int _CountH1 = 48; // свечей для расчета Н1 flet последние 48 часов
Замените только этот блок
<code>
//+------------------------------------------------------------------+
//| 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));
 */
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "lo", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
  
   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(clrWhiteSmoke, "_lo", _lo, STYLE_SOLID, 1); 
          SetHLine(clrAqua, "_hi", _hi, STYLE_SOLID, 1);     
          SetLabel("Label6"," High и Low не обновились за последние 48 часов = Флет", clrRed, 5, 15, 0, 12);         
         }
   else{
        SetLabel("Label6"," High и Low  обновились за последние 48 часов = Тренд", clrLime, 5, 15, 0, 12);
        }
        
   if((lo<_lov && hi<=_hig) || (lo>=_lov && hi>_hig)){
       SetLabel("Label7"," High и Low частично обновились за последние 48 часов = Сужение канала",clrYellow, 5, 30, 0, 12); 
       }
   else{SetLabel("Label7","", clrNONE, 5, 30, 0, 12);}     
  }

Редактирован: 9 января 2022, 10:10
avatar

  16  ssg Сообщений: 817

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 9 января 2022, 11:48
+
+1
Ну и что, просчитали?
Если посчитали — огласите результат.
Взамен написал для вас индикатор, наверное он вас заинтересует.
По моему анализ данных индикатора натолкнет на новые идеи и решения
avatar

  16  ssg Сообщений: 817

  • 9 января 2022, 15:11
+
0


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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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


Индикатор сплошными линиями рисует хай и лоу и середину за 120 баров.
Индикатор пунктирными линиями рисует хай и лоу и середину за 48 баров.
Численные значения выводятся на экран.
Цвет линий и значений совпадают для удобства.
В зависимости от положения средних линий относительно друг друга дается рекомендация по направлению торговли.
Индикатор будет работать до 15.01.2022 гг.
cloud.mail.ru/public/FZrW/qRu7jTxHj
Редактирован: 9 января 2022, 21:46
avatar

  16  ssg Сообщений: 817

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 9 января 2022, 22:03
+
0
Да, в одном месте была логическая ошибка. Копировал кусок кода и не поменял знак на противоположенный.Ну это уже в части рекомендаций.Поэтому и было это сообщение.На сами расчеты это не влияло.В индикаторе было важным положение линий между собой и положение цены относительно этих линий.
Ну не интересен и ладно.Удалил его.
avatar

  16  ssg Сообщений: 817

  • 11 января 2022, 07:32
+
0
Здравствуйте, уважаемый SSG, Вы можете сделать блок рассчёта(отключаемый), ТР по следущей схеме: недельная норма движения, она же рассчитывается, (ЕНД) / 5(раб. дни в неделе) / 100 = кеф., затем это кеф. * на уже рассчитаный трейлинг стоп(стоп лосс) — это и будет ТР. Если изменяются рассчёты ЕНД и(или) SL, то соответственно пересчитытывается(переставляется) и тейк… И куда этот блок вставить, с кодами я на весьма поверхностном уровне(у меня последние изменения стоят в советниках(скрины))… Буду признателен…
Редактирован: 19 января 2022, 06:59
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 06:58
+
0
Здравствуйте.
Если делаете свои сокращения, то нужно пояснять что имеется в виду.
Давайте вы все это по пунктам запишете в цифрах (как пример):
1.Недельная норма движения = 3000;
2.ЕНД (наверное-ежедневная норма движения.)= 3000/5=600
3…
4…
Если я пойму что Вы просите, посмотрю.Ну и нужен код советника о котором идет речь.
avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 09:41
+
0
Всё отправил, гляньте пожалуйста, там два варианта кода, последний с чётом «сужения»…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 12:03
+
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.Если изменяются рассчёты(показатели) по Недельной норме движения и(или) Трейлинг стопу(стоп лоссу), то соответственно пересчитытывается(переставляется) и тейк профит…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 11:48
+
0
… исправлено, ниже
Редактирован: 19 января 2022, 13:14
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 11:54
+
0
… исправлено, ниже
Редактирован: 19 января 2022, 13:14
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 11:57
+
0
…исправлено, ниже
Редактирован: 19 января 2022, 13:09
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 12:00
+
0
…исправлено, ниже
Редактирован: 19 января 2022, 13:10
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 12:01
+
0
Выложите код через кнопку code
В том виде как сейчас символы в советнике не равнозначны символам в тексте.
Отсюда куча ошибок.Исправлять их нет никакого желания.
Для понимания и на будущее сами скопируйте то что вы выложили.
75 errors, 34 warnings 76 35

avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 12:23
+
0
… приношу извинения, сам с кодами на «вы», ну да век живи-век учись, правда один хрен «дураком» помирать, спасибо что подсказали, теперь буду знать как.
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 13:03
+
0
//+-------------------------------------------------------------------------------------+
//|         Weakly Советник с мультитаймфреймовым анализом от Lerdon, AM2 и SSG_mdf.mq4 |
//|                                                Copyright 2019, Lerdon, AM2 и SSG_mdf|
//|                                                         http://www.forexsystems.biz |
//+-------------------------------------------------------------------------------------+
#property copyright "Разработан 2022, Lerdon, AM2 и SSG_mdf"
#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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 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);
  }
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 12:57
+
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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));
 
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "io", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
               
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 12:58
+
0
//+-------------------------------------------------------------------------------------+
//|        Weakly Советник с мультитаймфреймовым анализом от Lerdon, AM2 и SSG_flet.mq4 |
//|                                               Copyright 2019, Lerdon, AM2 и SSG_flet|
//|                                                         http://www.forexsystems.biz |
//+-------------------------------------------------------------------------------------+
#property copyright "Разработан 2022, Lerdon, AM2 и SSG_flet"
#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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 int CountH1           = 120;      // свечей для расчета Н1
 int _CountH1          = 48;       // свечей для расчета Н1 flet последние 48 часов
//+------------------------------------------------------------------+
//| 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);
  }
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 13:00
+
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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));
 */
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "lo", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
  
   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(clrWhiteSmoke, "_lo", _lo, STYLE_SOLID, 1); 
          SetHLine(clrAqua, "_hi", _hi, STYLE_SOLID, 1);     
          SetLabel("Label6"," High и Low не обновились за последние 48 часов = Флет", clrRed, 5, 15, 0, 12);         
         }
   else{
        SetLabel("Label6"," High и Low  обновились за последние 48 часов = Тренд", clrLime, 5, 15, 0, 12);
        }
        
   if((lo<_lov && hi<=_hig) || (lo>=_lov && hi>_hig)){
       SetLabel("Label7"," High и Low частично обновились за последние 48 часов = Сужение канала",clrYellow, 5, 30, 0, 12); 
       }
   else{SetLabel("Label7","", clrNONE, 5, 30, 0, 12);}     
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 13:00
+
0
Ничего страшного. Значит что то другое больше удается.
1.Добавил расчет в блоке

void PutOrder(int type,double price)

В настройки добавил параметры


extern string s              = "Блок";
extern bool   Blok_TP        = true;
extern double n_Day          = 5;

При

extern bool   Blok_TP        = true;

Советник рассчитает ТП и выставит сразу к позиции.
При

extern bool   Blok_TP        = false;

Все будет по старому.
Добавил вывод на экран в блоке
void OnTick()
в правый нижний угол.
Дополнения хорошо видны.В другие советники ставьте сами.
Сделал как понял.Переделывать не буду.
avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 14:10
+
0
Поставил, попробовал, всё нормально считает, ещё раз моя огромная признательность, буду с переносом на другой сов. разбираться, что там — куда.., спасибо…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 15:14
+
0
Пользуйтесь на здоровье.
avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 15:16
+
0


//+-------------------------------------------------------------------------------------+
//|        Weakly Советник с мультитаймфреймовым анализом от Lerdon, AM2 и SSG_flet.mq4 |
//|                                               Copyright 2019, Lerdon, AM2 и SSG_flet|
//|                                                         http://www.forexsystems.biz |
//+-------------------------------------------------------------------------------------+
#property copyright "Разработан 2022, Lerdon, AM2 и SSG_flet"
#property link      "ATS-TALLROCK"
#property version   "1.04"
#property strict

extern string s              = "Блок";
extern bool   Blok_TP        = true;
extern double n_Day          = 5;
//--- 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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 int CountH1           = 120;      // свечей для расчета Н1
 int _CountH1          = 48;       // свечей для расчета Н1 flet последние 48 часов
//+------------------------------------------------------------------+
//| 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;  
//=====================================================================
/*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
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*100),1);//  Рассчитанный КЕФ 
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,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(Blok_TP)
         tp=NormalizeDouble(price-TP*_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);
       if(Blok_TP)
         tp=NormalizeDouble(price+TP*_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);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 14:12
+
0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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));
 */
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
//================================================= 
 /*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
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*100),1);
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,0); // Рассчитанный Тейк Профит 
    
   SetLabel("Label10", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, 3, raz);
   SetLabel("Label11", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 45, 3, raz);
   SetLabel("Label12", "Рассчитанный КЕФ : --  "+DoubleToStr(kef,1)+" ", LineColor, 5, 30, 3, raz);  
   SetLabel("Label13", "Рассчитанный Тейк Профит : --  "+DoubleToStr(TP,0)+" пп", LineColor, 5, 15, 3, raz);  
     
//==================================================  
   SetHLine(clrRed, "lo", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
  
   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(clrWhiteSmoke, "_lo", _lo, STYLE_SOLID, 1); 
          SetHLine(clrAqua, "_hi", _hi, STYLE_SOLID, 1);     
          SetLabel("Label6"," High и Low не обновились за последние 48 часов = Флет", clrRed, 5, 15, 0, 12);         
         }
   else{
        SetLabel("Label6"," High и Low  обновились за последние 48 часов = Тренд", clrLime, 5, 15, 0, 12);
        }
        
   if((lo<_lov && hi<=_hig) || (lo>=_lov && hi>_hig)){
       SetLabel("Label7"," High и Low частично обновились за последние 48 часов = Сужение канала",clrYellow, 5, 30, 0, 12); 
       }
   else{SetLabel("Label7","", clrNONE, 5, 30, 0, 12);}     
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//---------------------------------------------------------------------------+  

Редактирован: 19 января 2022, 14:14
avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 14:13
+
0
Ага, понял, спасибо Вам огромное, поди сам управлюсь с этим, спасибо!!!
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 14:40
+
0
Обратите внимание на

extern double n_Day          = 5;

число сделано не целочисленным специально.Может принимать дробные значения
например

extern double n_Day          = 3.5;
avatar

  16  ssg Сообщений: 817

  • 19 января 2022, 15:21
+
0
… ага, спасибо, учту.
avatar

  12  mishelbb Сообщений: 220 - mishelbb

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 19 января 2022, 18:46
+
0
… в том, что без тейка гоняет от профита к лузу туда сюда, и толу нет без фиксации, руками не наставишся, а самое главное движение гадать — не нагадаешся, тут хоть по средниму(может быть) попытка от всех рассчётов, фиксируеш профит — вроде нормально, как отпускаеш в «свободный полёт», так хрен в стакан, стопы подтягиваются и готовы ордера…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 19 января 2022, 18:46
+
0
… да пусть хоть десять раз заходит если рассчёты дают заходить, входит он нормально, профит ловит но не удерживает, его фиксировать надо, ТП я вижу при сильном и резком движении, оно есть, и его надо ловить и не отпускать под стопы тральные, не знаю как, но трал не нравится мне, самое гловное что схема действительно рабочая вроде, как до ума домутить…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 19 января 2022, 19:05
+
0
Сов. большую часть времени находится в плюсе, но то, что наколбашевает — убивают подтягивающиеся стопы…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 19:06
+
0
Попробуйте конечно, возможно какая то часть вопросов решиться.., покумекайте и над тейком с этим грёбаным тралом, может что придёт в голову.., может отключить трал вообще.., ну там безубыток может, хотя это тоже не выход, так для успокения что не в минусе. Будут варианты поделитесь надеюсь… и за эту вариацию спасибо большое!!!
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 19:13
+
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

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 19 января 2022, 19:48
+
0
Я скорректировал часть расчетов для более менее «адекватных» цифр исходя из движений цены. В коде обрезан начала и конец они у вас есть там ничего не менял
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 19 января 2022, 19:49
+
0
Понял, давайте так попробуем, благодарю.., дай то Бог…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 19 января 2022, 21:44
+
0
Здравствуйте уважаемый, при компи ляции выдаёт ошибку почему то, а в кодах я не силён настолько, если не сложно гляньте пожалуйста…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 02:55
+
0
Может не тот код, тут их уже как грязи, голову сломать можно, просьба большая, если что то меняете в коде, Вы сразу готовый вриант сделайте, я не думаю что это настолько Вам обременительно, а куски эти, ну вот не соображаю я настолько в них, потом мудриш тут, я понимаю — это нужно понимать, но когда вот такое выползает а ты смотришь как «баран на новые ворота», начинаеш мудрить и в конечном итоге вообще жесть получается…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 03:05
+
0
Я понимаю, этот вопрос не ко мне. А что если самому немного подумать, а? Переведите с помощью любого переводчика (гугл, маил.ру, ..., да хоть с со словарем) текст где указана причина ошибки.И все станет сразу ясно.*think* 
avatar

  16  ssg Сообщений: 817

  • 20 января 2022, 03:46
+
0
Господа гляньте пожалуйста, что не так??? Ничерта не выходит, выдаёт ошибку и всё тут…
//+-------------------------------------------------------------------------------------+
//|       Weakly Советник с мультитаймфреймовым анализом от Lerdon, AM2 и SSG_mdfV2.mq4 |
//|                                              Copyright 2019, Lerdon, AM2 и SSG_mdfV2|
//|                                                         http://www.forexsystems.biz |
//+-------------------------------------------------------------------------------------+
#property copyright "Разработан 2022, Lerdon, AM2 и SSG_mdfV2"
#property link      "ATS-TALLROCK"
#property version   "1.04"
#property strict

extern string s              = "Блок";
extern bool   Blok_TP        = true;
extern double n_Day          = 5;
//--- 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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 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;  
//=====================================================================
/*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
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*100),1);//  Рассчитанный КЕФ 
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,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(Blok_TP)
         tp=NormalizeDouble(price-TP*_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);
       if(Blok_TP)
         tp=NormalizeDouble(price+TP*_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);
              }
            }
          }
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 04:09
+
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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));
 
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "io", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
               
  }
//================================================= 
 /*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
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*100),1);
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,0); // Рассчитанный Тейк Профит 
    
   SetLabel("Label10", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, 3, raz);
   SetLabel("Label11", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 45, 3, raz);
   SetLabel("Label12", "Рассчитанный КЕФ : --  "+DoubleToStr(kef,1)+" ", LineColor, 5, 30, 3, raz);  
   SetLabel("Label13", "Рассчитанный Тейк Профит : --  "+DoubleToStr(TP,0)+" пп", LineColor, 5, 15, 3, raz);            
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 04:09
+
0
Это всё давным давно и в первую очередь было сделано, но ни на йоту не даёт понимания.., 33 ошибки и 4 предупреждения про то что трейлинг стоп скрывает глобальную переменную. Мне это не даёт понимания что исправлять… я не на начальном уровне, это всё равно что посадить в самолет показать где включаются двигатели и показать штурвал, а дальше думай… много там надумаеш когда не знаеш, не понимаеш, да ещё половину забыл и напутал…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 04:25
+
0
Вам это, конечно, может казаться элементарным, а для меня это пока «дремучий лес», тем более на шестом десятке.., то что у меня пацан решает за пол часа мне на это сутки, а то и двое нужно, увы…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 04:33
+
+1
Дело не в годах, а в нежелании. Я написал — переводите в чем ошибка.
Кроме того, что Вам показали где включаются двигатели и показали штурвал жали еще и письменные инструкции!
В первом сообщении (где одна ошибка) переводиться — '_ CountH1' — необъявленный идентификатор. Это элементарно переведено с помощью майл.ру.
Значит в коде переменная есть, а кто она такая неизвестно. Нет на нее пропуска.
А по коду ее нет в настройках.
сравните свой скопированный код и как было раньше

         //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 int CountH1           = 120;      // свечей для расчета Н1
 int _CountH1          = 48;       // свечей для расчета Н1 flet последние 48 часов

Это лишь ваша невнимательность.
Вот так каждую ошибку переводите и тогда поймете как её исправить.
Удалите все Ваши варианты исправления и попробуйте добавить тот код что дал автор, заменяя старые блоки на новые. Не торопитесь.Все получиться.
avatar

  16  ssg Сообщений: 817

  • 20 января 2022, 06:36
+
+1
Иногда только исправишь только один символ а исчезнут 10 ошибок.
Читайте текст внутри!!!

//+------------------------------------------------------------------+
//| 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));
 
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "io", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
               
  }//БУДЬТЕ ВНИМАТЕЛЬНЕЕ ПРИ КОПИРОВАНИИ!!! СЧИТАЙТЕ ВСЕ СКОБКИ ЕСЛИ СКОБКА ОТКРЫТА - ОНА ДОЛЖНА БЫТЬ ЗАКРЫТА!! В ДАННОМ СЛУЧАЕ ЭТА СКОБКА ЛИШНЯЯ!!! УДАЛИТЕ ЁЁ !!!
//================================================= 
 /*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
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*100),1);
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,0); // Рассчитанный Тейк Профит 
    
   SetLabel("Label10", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, 3, raz);
   SetLabel("Label11", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 45, 3, raz);
   SetLabel("Label12", "Рассчитанный КЕФ : --  "+DoubleToStr(kef,1)+" ", LineColor, 5, 30, 3, raz);  
   SetLabel("Label13", "Рассчитанный Тейк Профит : --  "+DoubleToStr(TP,0)+" пп", LineColor, 5, 15, 3, raz);            
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

  • 20 января 2022, 06:51
+
0
Спасибо за понимание, солдатами не рождаются — ими становятся в «тажолылых и трудных походах и боях», конечно анализ провожу, как иначе, самосу меньше проблем когда понимаеш что к чему… Кстати, int _CountH1 = 48; // свечей для расчета Н1 flet последние 48 часов — это не невнимательность, это ясам, намеренно удалил, в том варианте не нужно сужение. Сов. сейчас стоит на старых вариантах, один с учётом сужения, другой без, и вот где сужения нет, за полторы недели, что в работе, результаты лучше… поэтому я два варианта кода и отправлял, Вы реализовали сужение как раз, я и пытаюсь второй сам осуществить. В любом случае моё Вам почтение…
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 07:49
+
0
Если нет параметра вверху — надо удалить его и внизу.
avatar

  16  ssg Сообщений: 817

  • 20 января 2022, 08:41
+
0
Здравствуйте уважаемый SSG, обращаюсь к Вам, т.к. Вы в курсе темы.., нужно дополнить функционал советника, если возьмётесь — я опишу, там ничего «космического», чисто вспомогательные функции...???
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 31 января 2022, 03:54
+
0
решили усреднение прикрутить? по моему перегружаете бота «новыми функциями» я например наоборот часть отключил чтобы не мешали.
avatar

  9  Lerdon Автор Сообщений: 242 - Destian Farbius

  • 31 января 2022, 19:21
+
0
… да не сразу дохотит чё к чему, всё ВСЕМ СПАСИБО!!!, разобрался малость, всё сделал(чуть не построчно, но сделал), всё работает, поглядим так что и как, спасибо парни!!!
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 20 января 2022, 10:25
+
0
… для SSG
//+-------------------------------------------------------------------------------------+
//|   Weakly Советник с мультитаймфреймовым анализом от Lerdon, AM2 и SSG_flet_TPvL.mq4 |
//|                                          Copyright 2019, Lerdon, AM2 и SSG_flet_TPvL|
//|                                                         http://www.forexsystems.biz |
//+-------------------------------------------------------------------------------------+
#property copyright "Разработан 2022, Lerdon, AM2 и SSG_flet_TPvL"
#property link      "ATS-TALLROCK"
#property version   "1.04"
#property strict

extern string s              = "Блок";
extern bool   Blok_TP        = true;
extern double n_Day          = 5;
//--- 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 bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 int CountH1           = 120;      // свечей для расчета Н1
 int _CountH1          = 48;       // свечей для расчета Н1 flet последние 48 часов
//+------------------------------------------------------------------+
//| 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;  
//=====================================================================
/*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
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*100),1);//  Рассчитанный КЕФ 
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,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(Blok_TP)
         tp=NormalizeDouble(price-TP*_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);
       if(Blok_TP)
         tp=NormalizeDouble(price+TP*_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*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);
              }
            }
          }
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 31 января 2022, 08:17
+
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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                                             |
//+------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 31 января 2022, 08:20
+
0
//+------------------------------------------------------------------+
//| 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);
        }   
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//---------------------------------------------------------------------------+
avatar

  12  mishelbb Сообщений: 220 - mishelbb

  • 31 января 2022, 08:22

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий