+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

ssg

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

ssg

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

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

ssg

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

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

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

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

avatar

ssg

  • 6 января 2022, 12:48
+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

ssg

  • 6 января 2022, 07:25
+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

ssg

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

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

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

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

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

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

ssg

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

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

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

ssg

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

ssg

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

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

ssg

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

ssg

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

ssg

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

ssg

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

ssg

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

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

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

Да вот пока своих мыслей «навалом».Со своими то не успеваешь разобраться и осмыслить итоги.
avatar

ssg

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

ssg

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

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

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


avatar

ssg

  • 4 января 2022, 16:20
+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>
avatar

ssg

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

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

ssg

  • 4 января 2022, 11:04
+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

ssg

  • 4 января 2022, 08:11