Начните с начала. Вот такого цикла в индикаторе:
for(int i= 0; i < Bars; i++)
не должно быть. Не должен индикатор на каждом тике рассчитываться для всех баров графика. Нужно вычислять диапазон обсчитываемых баров используя функцию IndicatorCounted(). Впрочем это уже устаревший подход. Сейчас нужно использовать функцию OnCalculate():
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[]){
При этом вычислять диапазон обсчитываемых баров используя переменные rates_total и prev_calculated.
Собственно по вопросу: при медвежьем баре вычисляем, а если бар не медвежий, надо взять значение с предыдущего бара.
Я только учусь mql и многое пока не понимаю, помогите и подскажите что сделать!
Есть код:
По задумке здесь подсчитываются только бычьи бары, но при наступлении медвежьего бара линия прирывается. Как это исправить?
То есть при выполнении условия if все происходит нормально (бар просчитался и отметился), получается надо чтобы при выполнении условий else if и else им возвращалось значение предыдущего бара. Тогда линия не будет обрыватся, а при наступлении нового бычьего бара, цена перейдет на другое значение. Как мне это осуществить?
У вас при переходе на медвежий в буфере стоит 0. Не проще отпустить else и не считать медвежьи бары. Тогда линия, по идеи должна отрисовываться на следующий бычий бар.
Или в else придать значению буферу, последнее значение медвежьего бара. Тогда на медвежьих барах будет отрисовываться прямая линия
Я только учусь mql и многое пока не понимаю, помогите и подскажите что сделать!
Есть код:
По задумке здесь подсчитываются только бычьи бары, но при наступлении медвежьего бара линия прирывается. Как это исправить?
То есть при выполнении условия if все происходит нормально (бар просчитался и отметился), получается надо чтобы при выполнении условий else if и else им возвращалось значение предыдущего бара. Тогда линия не будет обрыватся, а при наступлении нового бычьего бара, цена перейдет на другое значение. Как мне это осуществить?
Вот тебе уже второй раз повторяют что надо писать в новой редакции языка.
Начните с начала. Вот такого цикла в индикаторе:
не должно быть. Не должен индикатор на каждом тике рассчитываться для всех баров графика. Нужно вычислять диапазон обсчитываемых баров используя функцию IndicatorCounted(). Впрочем это уже устаревший подход. Сейчас нужно использовать функцию OnCalculate():
Примерно так должен выглядеть твой код
//+------------------------------------------------------------------+ //| MarketGOD_Indicators.mq4 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window // Индикатор рисуется в основном окне #property indicator_buffers 1 // Количество буферов #property indicator_color1 Green // Цвет первой линии #property indicator_width1 2 // Толщина линии double Buf_0[]; // Объявление массивов(под буферы индикатора) //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() // Специальная функция OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, Buf_0); // Назначение массива буферу SetIndexStyle (0, DRAW_SECTION); // Стиль линии //--- return(INIT_SUCCEEDED); // Выход из спец. ф-ии init() } //+------------------------------------------------------------------+ //| 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 i, limit = prev_calculated == 0 // Переменной limit, при условии что prev_calculated равно нулю ? rates_total-1 // будет присвоено значение rates_total(количество баров в окне) минус 1 : prev_calculated; // иначе будет присвоено prev_calculated(количество не посчитанных баров // Это можно было записать в одну строку, перенос строк сделан для удобства написания комментариев for(i = 0; i < limit; i++) // цикл { if(open[i] > close[i]) { /* 1 формула подсчета;*/ Buf_0[i] = (high[i]+low[i]+open[i]+close[i])/4.0;/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ; } else if(open[i] < close[i]) { /* 2 формула подсчета;*/ Buf_0[i] = EMPTY_VALUE/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ; } else//если будет равно то управление перейдет в этот блок { /* 3 формула подсчета;*/ Buf_0[i] = EMPTY_VALUE/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ; } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Чтобы линия не прерывалась достаточно назначить стиль DRAW_SECTION и не всегда полезно в буфер записывать 0 если в нём не должно быть значения. или-же в OnInit() надо установить значение пустой величины SetIndexEmptyValue(0, 0.0);
Вот тебе уже второй раз повторяют что надо писать в новой редакции языка.
Примерно так должен выглядеть твой код
Чтобы линия не прерывалась достаточно назначить стиль DRAW_SECTION и не всегда полезно в буфер записывать 0 если в нём не должно быть значения. или-же в OnInit() надо установить значение пустой величины SetIndexEmptyValue(0, 0.0);
Вот тебе уже второй раз повторяют что надо писать в новой редакции языка.
Примерно так должен выглядеть твой код
Чтобы линия не прерывалась достаточно назначить стиль DRAW_SECTION и не всегда полезно в буфер записывать 0 если в нём не должно быть значения. или-же в OnInit() надо установить значение пустой величины SetIndexEmptyValue(0, 0.0);
А как сделать чтобы каждое новое полученное значение усреднялось с предыдущим?
А как сделать чтобы каждое новое полученное значение усреднялось с предыдущим?
Так как ты и написал, берёшь текущее и предыдущее значение, складываешь, делишь на 2 и ты в дамках...
Ещё можно воспользоваться iMAOnArray()
![iMAOnArray - Технические индикаторы - Справочник MQL4 iMAOnArray - Технические индикаторы - Справочник MQL4](https://c.mql5.com/36/9/imaonarray-tehnicheskie-indikatori.png)
- docs.mql4.com
Так как ты и написал, берёшь текущее и предыдущее значение, складываешь, делишь на 2 и ты в дамках...
Ещё можно воспользоваться iMAOnArray()
Так как ты и написал, берёшь текущее и предыдущее значение, складываешь, делишь на 2 и ты в дамках...
Ещё можно воспользоваться iMAOnArray()
Пробовал даже пользовательскую функцию, компиляция без ошибок, но линия не отображается!
double bulls(int i, double b, double b_0) { for(i = 0; i < Bars; i++) // цикл { if(Open[i] > Close[i]) { b_0 = (High[i]+Low[i]+Open[i]+Close[i])/4.0;/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ; } else if(Open[i] < Close[i]) { b_0 = b/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ; } else//если будет равно то управление перейдет в этот блок { b_0 = b/* тут должна быть ваша котировка получившаяся после ваших расчетов на этом баре*/ ; } b = b_0; Buf_0[i] = b_0 + b; } return(b); }
Пробовал даже пользовательскую функцию, компиляция без ошибок, но линия не отображается!
Потомучто ты думаешь одно, а делаешь другое.
Попробуй думать и делать одно и то-же. Иными словами, делать то, что думаешь.
Потомучто ты думаешь одно, а делаешь другое.
Попробуй думать и делать одно и то-же. Иными словами, делать то, что думаешь.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я только учусь mql и многое пока не понимаю, помогите и подскажите что сделать!
Есть код:
По задумке здесь подсчитываются только бычьи бары, но при наступлении медвежьего бара линия прирывается. Как это исправить?
То есть при выполнении условия if все происходит нормально (бар просчитался и отметился), получается надо чтобы при выполнении условий else if и else им возвращалось значение предыдущего бара. Тогда линия не будет обрыватся, а при наступлении нового бычьего бара, цена перейдет на другое значение. Как мне это осуществить?