Мультитаймфреймовые индикаторы - страница 1204

 
greenpar :

Еще раз благодарю вас за помощь. Я внесла изменения, которые вы описали, но у меня все еще возникают проблемы/ошибки (см. прикрепленный файл). Было бы здорово, если бы я смог получить дальнейшее руководство.

Спасибо.

Я загрузил исправленную программу и полный образец.
Файлы:
 
Naguisa Unada:
Я загрузил исправленную программу и полный образец.

Еще раз спасибо за помощь, я ввел изменения, как предлагалось (см. прикрепленный файл и код ниже). Я все еще получаю многочисленные ошибки при компиляции (см. прикрепленное изображение ошибок компиляции), я подозреваю, что это связано с выделенными строками в коде ниже.

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

Любая дальнейшая помощь будет высоко оценена.

#property description   "Indicator alerts when candle size is larger than CandlePoint value for specified period"
#property strict

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0


//+------------------------------------------------------------------+
//| Declaring Constants                                         |
//+------------------------------------------------------------------+
#define  RESET 0

//+------------------------------------------------------------------+
//| Enumeration for the indication of operation                                         |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Input parameters of the indicator                                           |
//+------------------------------------------------------------------+
//--- Candle point size
input uint CandlePointM1 = 5;                   // Minimum candle points for Period M1
input uint CandlePointM5 = 5;                   // Minimum candle points for Period M5
int timeFrame[] = {PERIOD_M1, PERIOD_M5, PERIOD_H1};
string currencyPairs[] = {"AUDCAD", "AUDNZD", "AUDJPY", "AUDUSD"}

//+------------------------------------------------------------------+
//| Custom indicator initialisation function                                            |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Deinitialisation                                            |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

//+------------------------------------------------------------------+
//| Custom 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[])


//+------------------------------------------------------------------+
//| Candle size indicator                                               |
//+------------------------------------------------------------------+
{
int range;
static datetime alertBar[] = {0, 0, 0}; // used for one alert/bar
datetime candleTime[3];

for(int i=0; i<3; i++)
        {
        for (int j=0 ;j<3 ;j++)
                {
                double candleLow, candleHigh;
                candleLow = iLow(currencyPairs[i],timeFrame[j],0);
                candleHigh = iHigh(currencyPairs[i],timeFrame[j],0);
                range = int((candleHigh-candleLow)/_Point);
                candleTime[j] = iTime(currencyPairs[i],timeFrame[j],0);

if (alertBar[j] != candleTime[j])
        {
        if (timeFrame[j] == PERIOD_M1 && range>int(CandlePointM1))
                {
                        Alert(currencyPairs[i], "PERIOD_M1", "candle >", CandlePointM1, "points");
                        alertBar[j] = candleTime[j];
                }
                if (timeFrame[j] == PERIOD_M5 && range>int(CandlePointM5))
                        {
                        Alert(currencyPairs[i], "PERIOD_M5", "candle >", CandlePointM5, "points");
                        alertBar[j] = candleTime[j];
                        }
                }
        }
}


Файлы:
 
greenpar :

Еще раз спасибо за помощь, я внес изменения, как и предлагалось (см. прикрепленный файл и код ниже). Я все еще получаю многочисленные ошибки при компиляции (см. прикрепленное изображение ошибок компиляции), я подозреваю, что это связано с выделенными строками в коде ниже.

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

Любая дальнейшая помощь будет очень признательна.


1. В конце строки отсутствует ;.

String currencyPairs [] = {"AUDCAD", "AUDNZD", "AUDJPY", "AUDUSD"};

2. Не хватало следующих строк.

Return (rates_total);
}

3. Я неправильно указал размерность массива. Он был изменен следующим образом и перемещен в глобальную область.

datetime alert_bar [3] [3];
datetime candleTime [3] [3];

Файлы:
 
Naguisa Unada:

1. В конце строки отсутствует ;.

String currencyPairs [] = {"AUDCAD", "AUDNZD", "AUDJPY", "AUDUSD"};

2. Не хватает следующих строк.

Return (rates_total);
}

3. Я неправильно указал размерность массива. Он был изменен следующим образом и перемещен в глобальную область.

datetime alert_bar [3] [3];
datetime candleTime [3] [3];


Еще раз большое спасибо. Теперь оповещение происходит на всех перечисленных таймфреймах и валютных парах.

Однако теперь оповещение происходит не один раз за бар, а при каждом увеличении точки свечи выше минимального размера точки свечи. Строки 78, 84 и 90 в файле 'Sample.mq4', который вы прикрепили к предыдущему сообщению, не обеспечивают оповещение только один раз на свечу. Я попытался изменить значения в '[]', но это, очевидно, не решило проблему. Как это можно исправить?

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

 
greenpar :

Однако он больше не подает сигнал один раз за бар, он подает сигнал при каждом увеличении точки свечи выше минимального размера точки свечи. Строки 78, 84 и 90 в 'Sample.mq4', которые вы прикрепили к предыдущему сообщению, не обеспечивают оповещение только один раз на свечу. Я попытался изменить значения в '[]', но это, очевидно, не решило проблему. Как это можно исправить?

Конечно. Я должен написать следующие строки в "OnInit".

 //ArrayResize(candleTime, CPNO); 
 //ArrayResize(alert_bar,  CPNO); 
 //ArrayInitialize(alert_bar, 0); 
int OnInit ()
{
         //--- indicator buffers mapping 
        TFNO = ArraySize (timeFrame);
        CPNO = ArraySize (currencyPairs);
        
         ArrayResize (candleTime, CPNO);
         ArrayResize (alert_bar,  CPNO);
         ArrayInitialize (alert_bar, 0 );
        
         if ( StringLen ( Symbol ()) > 6 )
        {
                sufix = StringSubstr ( Symbol (), 6 , 0 );
                 for ( int i = 0 ; i < CPNO; i++)
                        currencyPairs[i] += sufix;
        }
         //--- 
         return ( INIT_SUCCEEDED );
}

Числа в [ ] корректируются с помощью "ArrayResize" выше. Даже если количество валютных пар увеличится, оно будет автоматически скорректировано здесь, но если вы захотите добавить еще один таймфрейм, вам придется модифицировать программу напрямую. Это связано со спецификацией MQL4.

 
Naguisa Unada:

Конечно. Я должен написать следующие строки в "OnInit".

Числа в [ ] корректируются с помощью "ArrayResize" выше. Даже если количество валютных пар увеличится, оно будет автоматически скорректировано здесь, но если вы захотите добавить еще один таймфрейм, вам придется модифицировать программу напрямую. Это спецификация MQL4.


Еще раз спасибо. Я добавил код.

Алерт все еще предупреждает о каждом увеличении точки свечи выше минимального размера точки свечи - даже после удаления индикатора с графика, перекомпиляции, выхода из MT и т.д. Как я могу это исправить?

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

 
greenpar :

Оповещение по-прежнему появляется при каждом увеличении точки свечи выше минимального размера точки свечи - даже после удаления индикатора с графика, перекомпиляции, выхода из MT и т.д. Как я могу это исправить?

На моем ПК он работает нормально без каких-либо проблем. Я думаю, что что-то не так, но не знаю, что именно.

 
Naguisa Unada:

На моем ПК он работает нормально без каких-либо проблем. Я думаю, что что-то не так, но я не знаю, что именно.


Я использую MT4 build 1090. Не уверен, в чем проблема. Может быть, кто-то еще может помочь?

Спасибо.

 

может ли кто-нибудь модифицировать этот индикатор, когда stoch пересекают друг друга, стрелки отображаются на второй свече, но мне нужно, чтобы стрелка отображалась на текущей свече, немедленно каждый раз, когда stoch пересекают друг друга.


спасибо

 
fxprogramer:

может ли кто-нибудь модифицировать этот индикатор, когда stoch пересекают друг друга, стрелки отображаются на второй свече, но мне нужно, чтобы стрелка отображалась на текущей свече, немедленно каждый раз, когда stoch пересекают друг друга.

//for(i=1; i<=limit; i++) 
  for(i=0; i<=limit; i++) 

Это очень просто. Исправьте i = 1 на i = 0 в строке 77.


Причина обращения: