Добрый ночи, Андрей, прошу вас доработать ваш же индикатор, который вы делали почти 3года назад
ТЫК, ибо я запутался и мне не хватает опыта его доделать
На основе вашего индикатора я вывел зоны — АТР текущего квартала(средний ход квартала, на основе исторических данных)
пример постройки верхней зоны текущего квартала:
Находим среднее арифметическое значение -> LOW за 10(например) кварталов
Находим средний ATR -> (HIGH — LOW)/10
Далее, от лоу + Атр = наша верхняя зона текущего квартала
и так:
1) при попытке поставить код в из Oninit в Oncalculator(дабы значения атр, хай и лоу менялись) — при каждом вызове(нажатии на кнопку) меняется расположение зоны
2) Прошу вас добавить историю зон(пример снизу)
Чтобы для каждого предыдущего квартала были данные соответствовавшие предыдущим данным
3) Убрать лишнее(если есть) или упростить
4) Прощу по возможности прокомментировать сложные(непонятные участки кода)
MMB_1.ex4 (13 Kb)
MMB_1.mq4 (12 Kb)
P.S Если я правильно понимаю, данные те что в Oninit должны быть в OnChartEvent(для первой постройки) и в Oncalculator(дабы данные менялись).
Прошу вас помочь мне — выполнив заказ.
Спасибо
Если не загрузится, код ниже
//+------------------------------------------------------------------+
//| Chart.mq4 |
//| Copyright 2022, AM2 |
//| https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link "https://www.forexsystems.biz"
#property version "1.00"
#property strict
#property indicator_chart_window
extern int ATR = 10; // Кол-во кварталов для расчета
int sum=0;
datetime t1kv2=0,t2kv2=0;
double hi=0,lo=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
PutButton("BUTON",33,33,"BUTON");
//---------------------------Код должен быть в OnCalculator дабы постоянно обновлялся при смене месяца(например)
t1kv2=iTime(NULL,PERIOD_MN1,Shift(Month())-1);
t2kv2=t1kv2+60*60*24*91.25; // тут изначально было: 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));
for(int ikv=0;ikv<ATR;ikv++)
{
double lokv=iLow(NULL,PERIOD_MN1,iLowest(NULL,PERIOD_MN1,MODE_LOW,3,Shift(Month())+ikv*3));
double hikv=iHigh(NULL,PERIOD_MN1,iHighest(NULL,PERIOD_MN1,MODE_HIGH,3,Shift(Month())+ikv*3));
int pokv=(int)((hikv-lokv)/_Point);
datetime t1kv=iTime(NULL,PERIOD_MN1,Shift(Month())-1+3*ikv);
datetime t2kv=iTime(NULL,PERIOD_MN1,Shift(Month())-1+3*(ikv+1));
sum+=pokv;
}
//---------------------------Код должен быть в OnCalculator дабы постоянно обновлялся при смене месяца(например)
//---
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[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // идентификатор события
const long& lparam, // параметр события типа long
const double& dparam, // параметр события типа double
const string& sparam // параметр события типа string
)
{
if (id == CHARTEVENT_OBJECT_CLICK) {
if (sparam == "BUTON") {
if(ObjectGetInteger(0,"BUTON",OBJPROP_STATE)==true) {
PutRect("h",t1kv2,lo+(sum/ATR)*_Point,t2kv2,lo+(sum/ATR)*0.9*_Point,Green);
PutRect("l",t1kv2,hi-(sum/ATR)*_Point,t2kv2,hi-(sum/ATR)*0.9*_Point,Green);
}
else
{
ObjectDelete("h");
ObjectDelete("l");
}
}
}
}
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()==9) 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);
}
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
{
ObjectDelete(0,name);
//--- создадим прямоугольник по заданным координатам
ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль линий прямоугольника
ObjectSetInteger(0,name,OBJPROP_STYLE,1);
//--- установим толщину линий прямоугольника
ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- включим (true) или отключим (false) режим заливки прямоугольника
ObjectSetInteger(0,name,OBJPROP_BACK,true);
//--- включим asdad
ObjectSetInteger(0,name, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0,name, OBJPROP_HIDDEN, true);
}
void PutButton(string name,int x,int y,string text)
{
ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(0,name,OBJPROP_CORNER,2);
//--- установим текст
ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет текста
ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(0,name,OBJPROP_HIDDEN,0);
}
Комментарии (39)
18 Boris54 Сообщений: 812 - ПенSионер
35 AM2 Сообщений: 16425 - Андрей
Спасибо
9 lafler356 Автор Сообщений: 305
Что еще нужно?
16 ssg Сообщений: 817
А нужуно чтобы расчет был постоянно за 5 месяцев, т.е хай(последних 5 кверталов) — лоу(последних 5 кверталов) / 5(последних 5 кверталов) Редактирован: 6 июля 2022, 11:20
9 lafler356 Автор Сообщений: 305
Правда похвально, что что-то пытаетесь сделать.Это конечно хорошо.
У в индикаторе Андрея, что он писал для вас, уже все есть.
Всего надо добавить одну маленькую строчку.
У вас есть атр каждого квартала.Да, да атр квартала это расстояние между полосками хай-лоу.Вот и складывайте их и затем делите на кол-во кварталов.
И все…
Для интереса проверьте значение индикатора потом с калькулятором.
16 ssg Сообщений: 817
это все было в индикаторе изначально, вы просто сумму всех поделали на кол-во периудов!!! и всё
тобишь сейчас известно только атр текущего кварталоа, а предыдущих нет!
9 lafler356 Автор Сообщений: 305
атр = (хай(предыдущих 5) -лоу(предыдущих 5)) / 5
9 lafler356 Автор Сообщений: 305
16 ssg Сообщений: 817
www.mql5.com/ru/code/7807
Ну, если у Вас есть свои любимые авторы...?
16 ssg Сообщений: 817
16 ssg Сообщений: 817
Я создал новую ветку, и упростил ТЗ
ТЫК Редактирован: 6 июля 2022, 21:15
9 lafler356 Автор Сообщений: 305
При периоде атр = 1, это как раз и будет разница между хай и лоу текущего периода.
Та строка которую я добавил в советнике в комментариях и показывает атр за последние 5 (input int count=5 кварталов.Закроется текущий квартал, индикатор пересчитает значения.Отбросит значение самого старого квартала и добавит значение только что закончившегося квартала.Текущий, нулевой квартал не учитывается.
16 ssg Сообщений: 817
Теперь же прошу Андрея, дописать его, дабы было известно и последних 5 кварталов
9 lafler356 Автор Сообщений: 305
Переведите.
16 ssg Сообщений: 817
ЧТобы посчитать предпоследнее значение нужно сделать тоже самое только со сдвигом. Как вы писали выше
Среднее значение — значение за N кварталов
9 lafler356 Автор Сообщений: 305
16 ssg Сообщений: 817
9 lafler356 Автор Сообщений: 305
16 ssg Сообщений: 817
далее, самая проблема это узнать АТР, чтобы узнать средний атр для текущего квартала(для текущего потому что в расчете будут 5 последних ((хай5-лоу5)+(хай4-лоу4)+(хай3-лоу3)+(хай2-лоу2)+(хай1-лоу1))(/5(так как мы складывали 5 (хай-лоу)) )
далее, как только мы узнали это, это как раз сумма (та что в индикаторе) её если поделить на Count тогда получится Средний АТр НО!!! Средний АТР ТЕКУЩЕГО квартала (почему текущего? потому что мы ближайшие 5хаи и 5лоу складывали
Проблема возникаем у меня в том что я не знаю как сделать цикл в цикле что ли))))
Смотрите, вот (если я правильно смог донести смысл) тогда мы знаем Средний атр квартала для текущего квартала, но нужно найти так же и остальные Средние атр кварталов для предыдущих кварталов(ПРОСТИТ ЗА ТАФТОЛОГИЮ) короче… Для предыдущего квартала так же нужно в рассчете использовать 5 предыдущих кварталов, но так как мы сместились, нам нужно использовать не:
((хай5-лоу5)+(хай4-лоу4)+(хай3-лоу3)+(хай2-лоу2)+(хай1-лоу1))/5
а уже:
((хай6-лоу6)+(хай5-лоу5)+(хай4-лоу4)+(хай3-лоу3)+(хай2-лоу2))(/5 Редактирован: 7 июля 2022, 16:09
7 divelse Сообщений: 152
В этом примере не видно, но если присмотреться тут на 6 месяц и за 7 месяц
т.е разинца в месяце Редактирован: 7 июля 2022, 16:10
7 divelse Сообщений: 152
7 divelse Сообщений: 152
В крайнем случае напишите индикатор где через iCustom или просто через iATR берите данные на месячном периоде и их обрабатывайте.
Вот набросал вам вариант получения нужных вам данных:
Если опять что-то не так, или не сможете использовать, тогда я «умываю руки».
Редактирован: 7 июля 2022, 17:22
16 ssg Сообщений: 817
7 divelse Сообщений: 152
16 ssg Сообщений: 817
9 lafler356 Автор Сообщений: 305
16 ssg Сообщений: 817
7 divelse Сообщений: 152
16 ssg Сообщений: 817
9 lafler356 Автор Сообщений: 305
Но неужели вам нужно знать квартальный АТР для торговли на самом деле?
Вы собираетесь открыть позицию, терпеть убытки и ждать пока цена не пройдет все значение АТР за квартал?
Я понимаю это работает на бирже, с акциями.Там нет такой волотильности и возможен более менее долгосрочный прогноз.Типа:«Зимой мазут и газ подорожают».
Но на форексе…
На мой взгляд намного продуктивнее и прибыльнее торговать используя текущую тенденцию на рынке.Только представьте какие колебания цены внутри месяца или квартала.Да даже дня.А вы открыли позицию, ждали целый квартал, глядели как у вас растет и падает прибыль и в итоге закрылись с убытком.
Но выбор конечно за вами.Деньги же ваши.
16 ssg Сообщений: 817
Ну… знаете за много лет в форексе я в плюс так и не вышел, но я и не говорил что это моя основная тактика, я для себя делаю индикатор который будет помогать мне в дальнейшем
Если я парвилньо поинмаю то тут сидят программисты, в основном начинающие, ибо если ктото из людей хочет чтобы Ему написали полноценный отличный одикатор или советник то они ошибаются, тут лишь наброски делают, они грубые. Вот я например начал делать индюк, и застопорился, и поэтому попросил Андрей допилить его же индюк
напишите пожалуйста вы понимаете что мне нужно или всё же я не смог донести и до вас ТЗ? Редактирован: 8 июля 2022, 20:20
9 lafler356 Автор Сообщений: 305
Я написал вам индикатор, который показывает в виде баров в подокне графика АТР за любое кол-во баров на любом таймфрейме.
Вы всегда можете взять эти данные для работы или для советника.Вам этого для торговли не хватает.
Сейчас какая то новая «узкая» задач. Мне не интересно и не нужно решать кому-то такие вещи.
Всю стратегию вы не озвучиваете ни здесь ни в привате. Наверное очень ей дорожите и поэтому храните в секрете. И это ваше законное право.
Но это вы обратились сюда за помощью.
А отвлекаться на написание каких то кусочков я не хочу и не буду.
Если хотите что-бы я попытался вам помощь озвучьте всю задачу (или здесь или в привате).
Ну, а нет, тогда я искренне желаю вам успехов и удачи.
16 ssg Сообщений: 817
9 lafler356 Автор Сообщений: 305
Или пусть советник их рисует.
К стати о восприятии: не знаю как до Урала, но у нас за Уралом в быту, однозначно, значение жаргонизма «дальняк» определяется как «отхожее место», «туалет», «сортир».
Видите сами какие мы разные.
Я использую в разговоре термины — долгосрочная торговля, долгосрочный прогноз.
Ну это так лирика.
Удачи.
16 ssg Сообщений: 817
Hi — atr = зона нижняя = lo
а
lo + atr = верхняя зона = Hi
16 ssg Сообщений: 817
9 lafler356 Автор Сообщений: 305
теперь то понятно?))) я ведь помоему уже писал, а вы опять мне что:
Hi — atr = зона нижняя = lo, нет он не будет равняться LO Редактирован: 12 июля 2022, 14:09
9 lafler356 Автор Сообщений: 305
18 Boris54 Сообщений: 812 - ПенSионер
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий