0
Тестируйте.Для ваших «хотелок» вполне хватит.
Видно что по этой стратегии вы и не торговали, если не можете внятно объяснить условия выставления ордеров.
Если в настройках укажите extern ENUM_TIMEFRAMES TF = PERIOD_W1; // период свечи тогда торгуйте на Н4.
Если укажите в настройках extern ENUM_TIMEFRAMES TF = PERIOD_D1; // период свечи тогда торгуйте на Н1.
А вообще посмотрите в базе разный варианты советников.Это будет познавательно.

//+------------------------------------------------------------------+
//|                                                         OTL v0.1 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                          OTL.mq4 |
//|                                            Copyright © 2013, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AM2"
#property link      "http://www.forexsystems.biz"

// 1. Выставляем отложку на расстоянии Delta от цены в StartHour часов на пробой.
// 2. Время истечения ордера Expiration часов.
// 3. Ордер выставляется с установленными значениями стоплосс и тейкпрофит.
// 4. Торговля фиксированным лотом.
// 5. Торговля на открытии свечи на часовом графике.

#define MAGIC  20130228
extern ENUM_TIMEFRAMES TF  = PERIOD_W1; // период свечи
extern bool   Del          = false;    
extern double StopLoss     = 1000; //Стоплосс ордера  
extern double TakeProfit   = 1000; //Тейкпрофит ордера
extern int    StartHour    = 0;    //Час начала торговли(терминальное время)
extern int    Delta        = 100;  //Расстояние от цены для установки ордера
extern int    Expiration   = 23;   //Время истечения ордера
extern double Lot          = 0.1;  //Объём позиции

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---  
   int b,s,p,res;
   double BuyPrice=0; 
   double SellPrice=0;
   datetime expiration;  
   double op=iOpen(NULL,TF,1);
   double cl=iClose(NULL,TF,1);
//----   
   if(cl>op){
        BuyPrice=cl+Delta*Point;
        SellPrice=op-Delta*Point;
        }
     else{
        BuyPrice=op+Delta*Point;
        SellPrice=cl-Delta*Point;
        }
//----        
   if(Expiration>0){
         expiration = TimeCurrent()+3600*Expiration; 
        }
    else{
        expiration = 0;
        }   
//----        
   if(Volume[0]>1) return;
//----  
   for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP) b++;
        if (OrderType()==OP_SELLSTOP) s++;        
      }   
    }
//----
   if(Del && p!=0)DelOrder();
//----       
   if(Hour()==StartHour){
//---- buy stop   
      if( b<1 && Bid<BuyPrice)  
        {
         res=OrderSend(Symbol(),OP_BUYSTOP,Lot,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"",MAGIC,expiration,Blue);
        }
//---- sell stop        
     if( s<1 && Bid>SellPrice) 
       {
        res=OrderSend(Symbol(),OP_SELLSTOP,Lot,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"",MAGIC,expiration,Red );
      }            
   } 
//----
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder(){
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
           {
            if(OrderType()>1)del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+


Это советник тоже из базы.Я его лишь немного переписал.
avatar

ssg

  • 14 ноября 2021, 10:01
0
В общепринятой терминологии
High — максимальная цена за период;
Low — минимальная цена за период;
В переводе с английского низкий и высокий.
Вы уже определитесь по хай лоу или по телу свечи — Open, Close.
И с настройками заберитесь.Исходя из настроек ставьте советник на график того или иного таймфрейма.
avatar

ssg

  • 13 ноября 2021, 21:45
0
extern ENUM_TIMEFRAMES TF = PERIOD_W1; // период свечи
avatar

ssg

  • 13 ноября 2021, 21:37
0
«скрипт это одноразовая штука как правило. выставил ордера и баста. чтобы следить за дальнейшим развитием событий нужен советник»
АМ
avatar

ssg

  • 6 ноября 2021, 08:40
0
Имеется в виду:
0+х=бай
0-х=селл
х можно вывести в настройки.Причем х можно назначить равным 0.
avatar

ssg

  • 3 ноября 2021, 10:06
0
Спасибо, Слава.Посмотрел.Мне кажется код слишком избыточен.Надо править.
Подожду что скажет Андрей.Если откажется значит нужно будет уделить время, разобраться и написать самому.
avatar

ssg

  • 1 ноября 2021, 09:25
0
Может тогда перепишите на МТ5 этот советник:

//+------------------------------------------------------------------+
//|                                                Corel6 hetmap.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                       Corel6.mq4 |
//|                                              Copyright 2021, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern string Symb1      = "EURUSD";
extern string Symb2      = "USDCHF";
extern double Delta_open =  0.5;  
extern double Delta_close=  0.2;

extern double Lot        = 1;        // лот
extern double Loss       = 2000;     // убыток
extern double Profit     = 100;      // профит
extern int Slip          = 111;      // реквот
extern int Magic         = 123;      // магик

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(string symb,int type,double price)
  {
   int r=0;
   int dg=(int)SymbolInfoInteger(symb,SYMBOL_DIGITS);

   color clr=Green;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
     }

   r=OrderSend(symb,type,Lot,NormalizeDouble(price,dg),Slip,0,0,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   bool cl;
   int dig=0;
   string symb="";
   double bid=0,ask=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic && (OrderSymbol()==Symb1 || OrderSymbol()==Symb2))
           {
            if(OrderType()==0)
              {
               symb=OrderSymbol();
               bid=MarketInfo(symb,MODE_BID);
               dig=(int)MarketInfo(symb,MODE_DIGITS);
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(bid,dig),Slip,White);
              }
            if(OrderType()==1)
              {
               symb=OrderSymbol();
               ask=MarketInfo(symb,MODE_ASK);
               dig=(int)MarketInfo(symb,MODE_DIGITS);
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(ask,dig),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double pr=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic && (OrderSymbol()==Symb1 || OrderSymbol()==Symb2))
           {
            pr+=OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic && (OrderSymbol()==Symb1 || OrderSymbol()==Symb2))
           {
            if(OrderType()<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double ask1=MarketInfo(Symb1,MODE_ASK);
   double ask2=MarketInfo(Symb2,MODE_ASK);

   double bid1=MarketInfo(Symb1,MODE_BID);
   double bid2=MarketInfo(Symb2,MODE_BID);
   
   double delta1=(iClose(Symb1,PERIOD_D1,0)/iClose(Symb1,PERIOD_D1,1)-1)*100;
   double delta2=(iClose(Symb2,PERIOD_D1,0)/iClose(Symb2,PERIOD_D1,1)-1)*100;
   double Delta=MathAbs(delta1-delta2);

   if(AllProfit()>Profit && Profit>0){
      CloseAll();
      Alert("Позиции закрыты по достижению советником прибыли :",Profit);
      }

   if(AllProfit()<-Loss && Loss>0){
      CloseAll();
     Alert("Позиции закрыты по достижению советником убытка :",Loss);
      }
         
   if(CountTrades()>=1 && Delta<Delta_close){
      CloseAll();
      Alert("Позиции закрыты по достижению советником минимального расхождения  :",Delta_close,"%");
      }
  
  
   if(CountTrades()<1)
     {
      if(Delta>Delta_open && delta1>delta2){
         PutOrder(Symb1,1,bid1);
         PutOrder(Symb2,0,ask2);
         Alert("Позиции открыты по достижению советником необходимого расхождения  :",Delta_open,"%");
         }
     if(Delta>Delta_open && delta1<delta2){ 
         PutOrder(Symb1,0,ask1);
         PutOrder(Symb2,1,bid2);
         Alert("Позиции открыты по достижению советником необходимого расхождения  :",Delta_open,"%");
         }
     }

   Comment(
   "\n",Symb1," ",DoubleToStr(delta1,2),"%",
   "\n",Symb2," ",DoubleToStr(delta2,2),"%",
   "\nDelta ",DoubleToStr(Delta,2),"%",
   "\nDelta_open ",Delta_open,"%",
   "\nDelta_close ",Delta_close,"%",
   "\n Profit : ",AllProfit());
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 31 октября 2021, 18:46
0
Просьба организовать закрытие по профиту как каждой пары отдельно, так и всего советника по общему профиту в целом.
Список пар определяет пользователь.
avatar

ssg

  • 31 октября 2021, 14:27
0
Вот написал еще один вариант.
Рисует столбик гистограммы разницы значений на текущем баре.

//+------------------------------------------------------------------+
//|                                             hetmap_sw 2 hist.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict
//----
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color3 clrYellow
#property indicator_style2 0
#property indicator_level2 0
#property  indicator_width3 3
#property indicator_maximum 1
#property indicator_minimum -1
extern string Symb1="EURAUD";
extern string Symb2="EURNZD";

double line1[],line2[],line3[];
//+------------------------------------------------------------------+
int OnInit(void)
{
   IndicatorBuffers(3);
   SetIndexBuffer(0,line1);
   SetIndexBuffer(1,line2);
   SetIndexBuffer(2,line3);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexLabel(2,"Delta");
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const datetime& time[],
                 const double& open[],
                 const double& high[],
                 const double& low[],
                 const double& close[],
                 const long& tick_volume[],
                 const long& volume[],
                 const int& spread[])
  {
  /*
   double delta1=(iClose(Symb1,PERIOD_D1,0)/iClose(Symb1,PERIOD_D1,1)-1)*100.0;
   double delta2=(iClose(Symb2,PERIOD_D1,0)/iClose(Symb2,PERIOD_D1,1)-1)*100.0;
   double Delta=MathAbs(delta1-delta2);
*/
  line1[0] = NormalizeDouble((iClose(Symb1,PERIOD_D1,0)/iClose(Symb1,PERIOD_D1,1)-1)*100.0,2);
  line2[0] = NormalizeDouble((iClose(Symb2,PERIOD_D1,0)/iClose(Symb2,PERIOD_D1,1)-1)*100.0,2);
  line3[0] = MathAbs(line1[0]-line2[0]);
  Comment(
           "Символ №1 - "+Symb1+"  "+DoubleToString(line1[0],2)+
           " \nСимвол №2 - "+Symb2+"  "+DoubleToString(line2[0],2)+
           " \nРазница = "+DoubleToString(line3[0],2)
           );
   
   return(rates_total);
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 30 октября 2021, 10:48
0
Мой вариант индикатора:
<code>
//+------------------------------------------------------------------+
//|                                             hetmap_sw 2 line.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrRed
#property indicator_color2 clrLime
#property indicator_level1 0.0

input string s1="EURUSD";
input string s2="GBPUSD";
input int limit = 5; 
double line1[],line2[],line3[];

double Price_s1=0;
double Price_s2=0;
double Price_s3=0;

int period_D=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1);
   SetIndexStyle(0,DRAW_LINE,0,2,clrRed);
   SetIndexLabel(0,s1);

   SetIndexBuffer(1,line2);
   SetIndexStyle(1,DRAW_LINE,0,2,clrLime);
   SetIndexLabel(1,s2);

//--- 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    for(int i=limit; i>=0; i--)
     {
      if (TimeDay(iTime(s1,0,i))!=period_D)
        {
         period_D=TimeDay(iTime(s1,0,i));
         Price_s1=0;Price_s2=0;
        }
/*
   double delta1=(iClose(Symb1,PERIOD_D1,0)/iClose(Symb1,PERIOD_D1,1)-1)*100.0;
   double delta2=(iClose(Symb2,PERIOD_D1,0)/iClose(Symb2,PERIOD_D1,1)-1)*100.0;
   double Delta=MathAbs(delta1-delta2);
*/        
   Price_s1=Price_s1+(iClose(s1,0,i)/iClose(s1,0,i+1)-1)*100.0;
   line1[i]=Price_s1;
   Price_s2=Price_s2+(iClose(s2,0,i)/iClose(s2,0,i+1)-1)*100.0;
   line2[i]=Price_s2; 
   double Delta=MathAbs(line1[i]-line2[i]);
   
   SetLabel("Label1", "Суточное отклонение пары "+s1+""+NormalizeDouble(line1[i],2), clrRed, 5, 15, 3, 10);
   SetLabel("Label2", "Суточное отклонение пары "+s2+""+NormalizeDouble(line2[i],2), clrLime, 5, 30, 3, 10);
   SetLabel("Label3", "Дельта отклонений "+s1+" / "+s1+" "+NormalizeDouble(Delta,2), clrYellow, 5, 45, 3, 10);   
  } 
   for (int i=0; i<5; i++) {
   datetime dt=StrToTime((TimeToStr(TimeCurrent()-i*1440*60, TIME_DATE))+" 00:00");
   int nb=iBarShift(s1, 0, dt, True);
   SetVLine(Coral, "VLine"+i, Time[nb], STYLE_DOT);  
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2008                                                     |
//|  Описание : Установка объекта OBJ_VLINE вертикальная линия                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время                      (0  - время открытия текущего бара)     |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (1  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetVLine(color cl, string nm="", datetime t1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_VLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1, t1);
  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);
}
//+----------------------------------------------------------------------------+
</code>
avatar

ssg

  • 30 октября 2021, 09:49
0
Так пользуйтесь.*hi* 
avatar

ssg

  • 29 октября 2021, 21:50
0
Разные формулы расчета у них:

Расчет
Основная формула расчета технического индикатора Relative Strength Index:

RSI = 100 — (100 / (1 + U / D))

Где:
U — среднее значение положительных ценовых изменений;
D — среднее значение отрицательных ценовых изменений.
avatar

ssg

  • 29 октября 2021, 21:30
0
Но написан он на пятерке.
Чьи слова:mq5 не открывается на МТ4?
Это говорит о том, что в последних билдах некоторые функции и операторы четверки и пятерки условно взаимозаменяемые.
Все таки надо читать документацию! Надо!:) 
Ну и что означает термин компиляция тоже надо посмотреть.
avatar

ssg

  • 29 октября 2021, 21:08
0
Первый попавшийся из базы индикатор

//+------------------------------------------------------------------+
//|                                                    Bar level.mq5 |
//|                              Copyright © 2021, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.000"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//--- input parameters
//---
double   m_curr_high=DBL_MIN;
double   m_curr_low=DBL_MAX;
datetime m_curr_time=0;
string   m_high_name="Bar Level High";
string   m_low_name="Bar Level Low";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   TrendCreate(ChartID(),m_high_name,0,0,0,0,0,clrRed);
   TrendCreate(ChartID(),m_low_name,0,0,0,0,0,clrBlue);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(prev_calculated==0)
     {
      m_curr_high=high[rates_total-1];
      m_curr_low=low[rates_total-1];
      m_curr_time=time[rates_total-1];
      TrendPointChange(ChartID(),m_high_name,0,time[rates_total-1],m_curr_high);
      TrendPointChange(ChartID(),m_high_name,1,time[rates_total-1]+PeriodSeconds()*3,m_curr_high);
      TrendPointChange(ChartID(),m_low_name,0,time[rates_total-1],m_curr_low);
      TrendPointChange(ChartID(),m_low_name,1,time[rates_total-1]+PeriodSeconds()*3,m_curr_low);
      return(rates_total);
     }
   if(high[rates_total-1]>m_curr_high || low[rates_total-1]<m_curr_low)
     {
      m_curr_high=high[rates_total-1];
      m_curr_low=low[rates_total-1];
      m_curr_time=time[rates_total-1];
      TrendPointChange(ChartID(),m_high_name,0,time[rates_total-1],m_curr_high);
      TrendPointChange(ChartID(),m_high_name,1,time[rates_total-1]+PeriodSeconds()*3,m_curr_high);
      TrendPointChange(ChartID(),m_low_name,0,time[rates_total-1],m_curr_low);
      TrendPointChange(ChartID(),m_low_name,1,time[rates_total-1]+PeriodSeconds()*3,m_curr_low);
      return(rates_total);
     }
   TrendPointChange(ChartID(),m_high_name,0,m_curr_time,m_curr_high);
   TrendPointChange(ChartID(),m_high_name,1,time[rates_total-1]+PeriodSeconds()*3,m_curr_high);
   TrendPointChange(ChartID(),m_low_name,0,m_curr_time,m_curr_low);
   TrendPointChange(ChartID(),m_low_name,1,time[rates_total-1]+PeriodSeconds()*3,m_curr_low);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Indicator deinitialization function                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(ChartID(),m_high_name);
   ObjectDelete(ChartID(),m_low_name);
  }
//+------------------------------------------------------------------+
//| Create a trend line by the given coordinates                     |
//+------------------------------------------------------------------+
bool TrendCreate(const long            chart_ID=0,        // chart's ID
                 const string          name="TrendLine",  // line name
                 const int             sub_window=0,      // subwindow index
                 datetime              time1=0,           // first point time
                 double                price1=0,          // first point price
                 datetime              time2=0,           // second point time
                 double                price2=0,          // second point price
                 const color           clr=clrRed,        // line color
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // line style
                 const int             width=1,           // line width
                 const bool            back=false,        // in the background
                 const bool            selection=false,   // highlight to move
                 const bool            ray_left=false,    // line's continuation to the left
                 const bool            ray_right=true,    // line's continuation to the right
                 const bool            hidden=true,       // hidden in the object list
                 const long            z_order=0)         // priority for mouse click
  {
//--- set anchor points' coordinates if they are not set
   ChangeTrendEmptyPoints(time1,price1,time2,price2);
//--- reset the error value
   ResetLastError();
//--- create a trend line by the given coordinates
   if(!ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2))
     {
      Print(__FUNCTION__,
            ": failed to create a trend line! Error code = ",GetLastError());
      return(false);
     }
//--- set line color
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set line display style
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- set line width
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- enable (true) or disable (false) the mode of moving the line by mouse
//--- when creating a graphical object using ObjectCreate function, the object cannot be
//--- highlighted and moved by default. Inside this method, selection parameter
//--- is true by default making it possible to highlight and move the object
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- enable (true) or disable (false) the mode of continuation of the line's display to the left
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_LEFT,ray_left);
//--- enable (true) or disable (false) the mode of continuation of the line's display to the right
   ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Move trend line anchor point                                     |
//+------------------------------------------------------------------+
bool TrendPointChange(const long   chart_ID=0,       // chart's ID
                      const string name="TrendLine", // line name
                      const int    point_index=0,    // anchor point index
                      datetime     time=0,           // anchor point time coordinate
                      double       price=0)          // anchor point price coordinate
  {
//--- if point position is not set, move it to the current bar having Bid price
   if(!time)
      time=TimeCurrent();
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- reset the error value
   ResetLastError();
//--- move trend line's anchor point
   if(!ObjectMove(chart_ID,name,point_index,time,price))
     {
      Print(__FUNCTION__,
            ": failed to move the anchor point! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Check the values of trend line's anchor points and set default   |
//| values for empty ones                                            |
//+------------------------------------------------------------------+
void ChangeTrendEmptyPoints(datetime &time1,double &price1,
                            datetime &time2,double &price2)
  {
//--- if the first point's time is not set, it will be on the current bar
   if(!time1)
      time1=TimeCurrent();
//--- if the first point's price is not set, it will have Bid value
   if(!price1)
      price1=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- if the second point's time is not set, it is located 9 bars left from the second one
   if(!time2)
     {
      //--- array for receiving the open time of the last 10 bars
      datetime temp[10];
      CopyTime(Symbol(),Period(),time1,10,temp);
      //--- set the second point 9 bars left from the first one
      time2=temp[0];
     }
//--- if the second point's price is not set, it is equal to the first point's one
   if(!price2)
      price2=price1;
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 29 октября 2021, 19:16
0
Теперь в аналогичной ситуации вы поймете в чем причина.Подскажите другим. Может кто-то тоже не понял, но стесняется спросить.
avatar

ssg

  • 29 октября 2021, 16:18
0
Что бы не свернуть в кювет нужно немного больше чем шашечки, как минимум мозги.
Посмотрите пожалуйста внимательно код индикатора.Что и как он считает, в каких единицах.
А потом посмотрите на Вами представленные скрины(подсказываю — цифры).
avatar

ssg

  • 29 октября 2021, 11:42