0
Да… Попробуйте привести пример в числах и ценах.Пока я ничего не понимаю, а значит не смогу ничем помочь.
avatar

ssg

  • 7 июля 2022, 12:40
0
мне нужно знать среднее значение, среднее значение выводится за 5(например) последних кварталов) потом делится на 5 и получается для последнего квартала среднее значение.



"\n ATR за   " +count+ " кварталов: ",sum/count,
"\n ATR lafler356 : ",(sum/count)/count,

avatar

ssg

  • 7 июля 2022, 08:00
0
известно только текущий атр за последние 5 кварталов


Теперь же прошу Андрея, дописать его, дабы было известно и последних 5 кварталов

Переведите.
avatar

ssg

  • 7 июля 2022, 04:27
0
Проехали. Просто многие проблемы возникают от неправильной или вольной трактовки терминов, и как следствие недопонимание друг друга.
При периоде атр = 1, это как раз и будет разница между хай и лоу текущего периода.
Та строка которую я добавил в советнике в комментариях и показывает атр за последние 5 (input int count=5;)  кварталов.Закроется текущий квартал, индикатор пересчитает значения.Отбросит значение самого старого квартала и добавит значение только что закончившегося квартала.Текущий, нулевой квартал не учитывается.
avatar

ssg

  • 6 июля 2022, 21:34
0
атр2=((хай2-лоу2)+(хай1-лоу1))/2;
avatar

ssg

  • 6 июля 2022, 21:02
0

//+------------------------------------------------------------------+
//|                                                          ATR.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property description "Average True Range"
#property strict

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  DodgerBlue
//--- input parameter
input int InpAtrPeriod=14; // ATR Period
//--- buffers
double ExtATRBuffer[];
double ExtTRBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- 1 additional buffer used for counting.
   IndicatorBuffers(2);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtATRBuffer);
   SetIndexBuffer(1,ExtTRBuffer);
//--- name for DataWindow and indicator subwindow label
   short_name="ATR("+IntegerToString(InpAtrPeriod)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//--- check for input parameter
   if(InpAtrPeriod<=0)
     {
      Print("Wrong input parameter ATR Period=",InpAtrPeriod);
      return(INIT_FAILED);
     }
//---
   SetIndexDrawBegin(0,InpAtrPeriod);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;
//--- check for bars count and input parameter
   if(rates_total<=InpAtrPeriod || InpAtrPeriod<=0)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtATRBuffer,false);
   ArraySetAsSeries(ExtTRBuffer,false);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
//--- preliminary calculations
   if(prev_calculated==0)
     {
      ExtTRBuffer[0]=0.0;
      ExtATRBuffer[0]=0.0;
      //--- filling out the array of True Range values for each period
      for(i=1; i<rates_total; i++)
         ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      //--- first AtrPeriod values of the indicator are not calculated
      double firstValue=0.0;
      for(i=1; i<=InpAtrPeriod; i++)
        {
         ExtATRBuffer[i]=0.0;
         firstValue+=ExtTRBuffer[i];
        }
      //--- calculating the first value of the indicator
      firstValue/=InpAtrPeriod;
      ExtATRBuffer[InpAtrPeriod]=firstValue;
      limit=InpAtrPeriod+1;
     }
   else
      limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit; i<rates_total; i++)
     {
      ExtTRBuffer[i]=MathMax(high[i],close[i-1])-MathMin(low[i],close[i-1]);
      ExtATRBuffer[i]=ExtATRBuffer[i-1]+(ExtTRBuffer[i]-ExtTRBuffer[i-InpAtrPeriod])/InpAtrPeriod;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
avatar

ssg

  • 6 июля 2022, 20:57
0
А по вашему это нечто иное?
www.mql5.com/ru/code/7807
Технический индикатор Средний Истинный Диапазон (Average True Range, ATR) — это показатель волатильности рынка. Его ввел Уэллс Уайлдер в книге «Новые концепции технических торговых систем» и с тех пор индикатор применяется как составляющая многих других индикаторов и торговых систем.
Индикатор Average True Range часто достигает высоких значений в основаниях рынка после стремительного падения цен, вызванного паническими продажами. Низкие значения индикатора часто соответствуют продолжительным периодам горизонтального движения, которые наблюдаются на вершинах рынка и во время консолидации. Его можно интерпретировать по тем же правилам, что и другие индикаторы волатильности. Принцип прогнозирования с помощью Average True Range формулируется так: чем выше значение индикатора, тем выше вероятность смены тренда; чем ниже его значение, тем слабее направленность тренда.

Расчет
Истинный диапазон (True Range) есть наибольшая из следующих трех величин:

разность между текущими максимумом и минимумом;

разность между предыдущей ценой закрытия и текущим максимумом;

разность между предыдущей ценой закрытия и текущим минимумом.

Индикатор Среднего Истинного Диапазона (Average True Range, ATR) представляет собой скользящее среднее значений истинного диапазона.

Ну, если у Вас есть свои любимые авторы...?
avatar

ssg

  • 6 июля 2022, 20:57
0
Да, умеете вы изъясняться и тз. составлять.Поэтому так-же и пытаетесь их решать.Такого нагородили…
Правда похвально, что что-то пытаетесь сделать.Это конечно хорошо.
У в индикаторе Андрея, что он писал для вас, уже все есть.
Всего надо добавить одну маленькую строчку.
У вас есть атр каждого квартала.Да, да атр квартала это расстояние между полосками хай-лоу.Вот и складывайте их и затем делите на кол-во кварталов.
И все…

//+------------------------------------------------------------------+
//|                                                      Kvartal.mq4 |
//|                                              Copyright 2019, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
/*
http://zakaz.opentraders.ru/49318.html

готово: www.opentraders.ru/downloads/2203/
*/
#property copyright "Copyright 2019, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int count=5;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ObjectsDeleteAll();
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Kvart(int month)
  {
   int kv=0;
   if(month<4) kv=1; // 1 2 3
   if(month>3 && month<7) kv=2; // 4 5 6
   if(month>6 && month<10) kv=3; // 7 8 9
   if(month>9) kv=4; // 10 11 12
   return(kv);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Shift(int month) // 1-rv = 1 2 3
  {
   int shift=0;

   if(Kvart(Month())==1 && Month()==1) shift=1;
   if(Kvart(Month())==1 && Month()==2) shift=2;
   if(Kvart(Month())==1 && Month()==3) shift=3;

   if(Kvart(Month())==2 && Month()==4) shift=1;
   if(Kvart(Month())==2 && Month()==5) shift=2;
   if(Kvart(Month())==2 && Month()==6) shift=3;

   if(Kvart(Month())==3 && Month()==7) shift=1;
   if(Kvart(Month())==3 && Month()==8) shift=2;
   if(Kvart(Month())==3 && Month()==8) shift=3;

   if(Kvart(Month())==4 && Month()==10) shift=1;
   if(Kvart(Month())==4 && Month()==11) shift=2;
   if(Kvart(Month())==4 && Month()==12) shift=3;

   return(shift);
  }
//+------------------------------------------------------------------+
//| Put Text Function                                                |
//+------------------------------------------------------------------+
void Text(string name,const string text,double price,datetime time,const color clr)
  {
   ObjectDelete(0,name);
//--- create a "Text" object 
   ObjectCreate(0,name,OBJ_TEXT,0,time,price);
//--- set the text
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- set the font of the text
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- set the font size
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,14);
//--- set the method binding
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_UPPER);
//--- set the color
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutTrendLine(string name,datetime time1,double price1,datetime time2,double price2,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
//--- установим цвет линии 
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии 
   ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим толщину линии 
   ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо 
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int sum=0;
   double hi=0,lo=0;
   datetime t1=0,t2=0;

   for(int i=0;i<count;i++)
     {
      lo=iLow(NULL,PERIOD_MN1,iLowest(NULL,PERIOD_MN1,MODE_LOW,3,Shift(Month())+i*3));
      hi=iHigh(NULL,PERIOD_MN1,iHighest(NULL,PERIOD_MN1,MODE_HIGH,3,Shift(Month())+i*3));
      int po=(int)((hi-lo)/_Point);

      t1=iTime(NULL,PERIOD_MN1,Shift(Month())-1+3*i);
      t2=iTime(NULL,PERIOD_MN1,Shift(Month())-1+3*(i+1));

      PutTrendLine((string)i+"lo",t1,lo,t2,lo,Aqua);
      PutTrendLine((string)i+"hi",t1,hi,t2,hi,Aqua);
      Text(string(i),(string)po,lo,(t1+t2)/2,Red);
      sum+=po;
     }

   t1=iTime(NULL,PERIOD_MN1,Shift(Month())-1);
   t2=t1+60*60*24*90;

   lo=iLow(NULL,PERIOD_MN1,iLowest(NULL,PERIOD_MN1,MODE_LOW,Shift(Month()),0));
   hi=iHigh(NULL,PERIOD_MN1,iHighest(NULL,PERIOD_MN1,MODE_HIGH,Shift(Month()),0));

   PutTrendLine("lo",t1,lo,t2,lo,Aqua);
   PutTrendLine("hi",t1,hi,t2,hi,Aqua);

   Comment("\n Kvartal: ",Kvart(Month()),
           "\n Month: ",Month(),
           "\n Summ: ",sum,
           "\n ATR за   " +count+ " квартолов: ",sum/count,
           "\n Shift: ",Shift(Month()));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Для интереса проверьте значение индикатора потом с калькулятором.
avatar

ssg

  • 6 июля 2022, 13:54
0
А что не устраивает в текущей версии? Хай/Лоу поквартально отрисовывает, диапазон численно обозначает.
Что еще нужно?
avatar

ssg

  • 6 июля 2022, 10:17
0
Нет, я его никому не продал.Кроме вас его никто не видел и не тестировал.Я скажу больше, я вообще его удалил. Во первых места мало для новых советников и пора давно сделать ревизию. А во вторых коли я сам его писал и сам разрабатывал алгоритм, то при необходимости могу его написать опять. Пусть не в мелких деталях и украшениях, но по сути.
avatar

ssg

  • 5 июля 2022, 17:39
0
Это вы о чьём советнике говорите?
avatar

ssg

  • 5 июля 2022, 16:48
0
То, что хочу то всегда выкладываю.
avatar

ssg

  • 5 июля 2022, 16:01
0
Наверное потому, что в моем советнике была некоторая «изюминка».
avatar

ssg

  • 5 июля 2022, 15:32
0

extern double CloseBuy      = 1;        // закрытие по общему профиту бай
extern double CloseSell     = 1;        // закрытие по общему профиту селл

за четыре года на сайте наверное уже можно было узнать разницу между double и int*hi* 
avatar

ssg

  • 5 июля 2022, 14:17
0

extern double Profit     = 10;       // язь в рублях
.
.
extern int CloseBuy      = 1;        // закрытие по общему профиту бай
extern int CloseSell     = 1;        // закрытие по общему профиту селл
.
.
.
.
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int delta=int(TimeCurrent()-TimeOrderOpen());

   if(Profit>0)
     {
      if(AllProfit()>Profit)
         CloseAll();

      if(AllProfit(0)>Profit && CloseBuy)
         CloseAll(0);

      if(AllProfit(1)>Profit && CloseSell)
         CloseAll(1);
     }

avatar

ssg

  • 5 июля 2022, 11:19
0
Если откинуть в сторону, что у АМ2 советник написан не по Вашему ТЗ, то может быть это и лучший вариант. Не знаю не проверял в тестере.Мне достаточно посмотреть код советника, что бы сопоставить ТЗ и исполнениё.
Замените у себя главную функцию на этот вариант. Я всего лишь добавил комментарии о текущих лотах, а значит и открытых позициях.Проверьте и проанализируйте информацию на экране и в журнале. Правила закрытия в советнике и в ТЗ сопоставьте сами.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//-----------------------
   double LB=0,LS=0;
   int i,tip;
   for (i=0; i<OrdersTotal(); i++){    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==maga){
            tip = OrderType();
            if (tip==OP_BUY)            
            {  
               LB+=OrderLots();
            }                                        
            if (tip==OP_SELL)        
            {
               LS+=OrderLots();
            }
         }
      }
   }
 //-------------------
   int r=0;

   if(OrdersTotal()>3)
     {
      if(Minus(0)+AllProfit(1)>pr)
        {
         CloseMinus(0);
         CloseAll(1);
        }

      if(Minus(1)+AllProfit(0)>pr)
        {
         CloseMinus(1);
         CloseAll(0);
        }
     }


   if(CountTrades()<1)
     {
      r=OrderSend(NULL,0,lot,NormalizeDouble(Ask,_Digits),slip,0,0,"",maga);
      r=OrderSend(NULL,1,lot,NormalizeDouble(Bid,_Digits),slip,0,0,"",maga);
      last=Bid;
     }

   if(MathAbs(last-Bid)>=step*_Point && CountTrades()<count)
     {
      r=OrderSend(NULL,0,lot,NormalizeDouble(Ask,_Digits),slip,0,0,"",maga);
      r=OrderSend(NULL,1,lot,NormalizeDouble(Bid,_Digits),slip,0,0,"",maga);
      last=Bid;
     }

   Comment("\n All Profit: ",AllProfit(),
           "\n Buy Profit: ",AllProfit(0),
           "\n Sell Profit: ",AllProfit(1),
           "\n Buy Minus: ",Minus(0),
           "\n Sell Minus: ",Minus(1),
           "\n Buy Lot: ",LB,
           "\n Sell Lot: ",LS);
  }
//+------------------------------------------------------------------+


Остальные предложенные варианты даже не комментирую.Не зачем.
Мой вариант написан строго по Вашему ТЗ, без вольностей и отклонений.
Не его вина, что стратегия не очень прибыльная.
Зато 2,5 года держит стабильно при оптимизации только за полгода в тестере.Только тестируйте или на М1 или на других таймфреймах но по тикам.
Не занимайтесь самообманом.
avatar

ssg

  • 26 июня 2022, 11:27
0
Освежите в памяти, или перечитайте две басни Крылова И.А.«Мартышка и очки» и «Лисица и виноград».
Хотя, учитывая:
Блин, очки другие купить что ли нужно.

сам приведу окончания басен:
… То к темю их прижмет, то их на хвост нанижет,
То их понюхает, то их полижет…

Как ни полезна вещь,— цены не зная ей,
Невежда про нее свой толк всё к худу клонит…


и другая басня:
Голодная кума Лиса залезла в сад,
В нем винограду кисти рделись.
У кумушки глаза и зубы разгорелись;
А кисти сочные как яхонты горят;
Лишь то беда, висят они высоко:
Отколь и как она к ним ни зайдет,
Хоть видит око,
Да зуб неймет.
Пробившись попусту час целой,
Пошла и говорит с досадою: «Ну, что ж!
На взгляд-то он хорош,
Да зелен — ягодки нет зрелой:
Тотчас оскомину набьешь».
avatar

ssg

  • 26 июня 2022, 04:40
0
Здравствуйте. ТЗ-это описание стратегии озвученное sergs в самом верху топика.
avatar

ssg

  • 25 июня 2022, 20:46
0
Данный советник работает строго по ТЗ топикстартера.
От себя добавил некоторые функции и немного расширил функционал.
Подробнее о закрытии ордеров.
После перехода цены с одного уровня на другой нужно высчитать сумму прибылей всех прибыльных ордеров и вычесть из нее убыток самого убыточного ордера в валюте. Если есть несколько убыточных ордеров с одинаковым убытком, то выбирается самый старый. Если результат будет равен или больше, чем значение профита в валюте в настройках, то эти ордера закрываются. Если меньше, то ни один ордер не закрывается.

Доработки:

extern bool   Trade = true;   //использовать автоторговлю

-включение/отключение автоторговли согласно ТЗ. В случае Trade = false;
советник сам позиции не открывает, но отслеживает существующие позиции и
закрывает их согласно ТЗ.
Кроме того при отключении данной функции советник может быть использован как
помощник для закрытия позиций, открытых другим советником.

extern int    Magic        = 0;     //-1 все ордера по символу

-Советник может отслеживать только свои позиции или все позиции, том числе
открытые в ручную или другим советником по данной паре.
В связи с тем, что это облегчённая версия без проверок, использовать можно только или на демосчете или в тестере.
В связи с тем, то советник открывает позиции через шаг, следовательно тестировать нужно только или на минутках или по тикам. Минимальный период доступных данных в тестере это минутки. Даже режим «тики» в тестере — это данные с минутного графика.Поэтому не занимайтесь самообманом тестируя советники в других режимах «по ценам открытия» или тем более «по контрольным точкам»!!!
cloud.mail.ru/public/qg7C/mnqbNjUiZ

avatar

ssg

  • 25 июня 2022, 17:26
0
Для решения такой проблемы нужно разбираться с каждым случаем отдельно.
Сейчас это выглядит примерно так:
Доктор у меня иногда что-то болит.Что это может быть и почему?
Подумайте сами, если ошибка возникает иногда и при определенных условиях, значит проблема не в коде, а в тех условиях когда она возникла.
Может быть открыто несколько разнонаправленных позиций и усредняется какая-то другая позиция. Не знаю.
Скажу честно сразу заниматься поиском причины сбоев не желания и не буду.
Пользуйтесь теми парами где нет ошибок, или пересмотрите условия открытия позиций на тех парах где возникают указанные ошибки.
avatar

ssg

  • 22 июня 2022, 21:00