[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 246

 
Vinin >>:

В каждом случае свое решение


Позвольте я приведу, на конструктивную критику общественности, програмный код (убедительная просьба воздержаться от конструктивной критики самого индикатора). Но сначала описание. Это индекс TSI (истинной силы). Строится по 1-дневному моментуму. Эти приращения сглаживаются експоненциальной средней (21 период). Теперь добавим масштабирование. Для этого возьмем разность high - low и сгладим их такой же экспоненциальной средней (21 период). Разделим гладенький моментум на гладенький размах. Это отношение сглаживается короткой експоненциальной средней (5 периодов). Мы получили осн. линию. Теперь сгладим осн. линию ергодикой (EMA(, 5)) и возрадуемся, получив сигнальную. Собственно, давайте возрадуемся еще раз, т.к. перед нами TSI - типичный трендовый индикатор. В моей реализации есть еще 3 буфер под "кружочки", которыми я обозначаю пересечение осн. и сигнальной линий. Господа, код в студию:

//--------------------------------------------------------------------
// TSI.mq4 
// Предназначен для использования в качестве трендового индикатора
//--------------------------------------------------------------------

#property indicator_separate_window         // indicator_chart_window, indicator_separate_window
#property indicator_buffers     3           // Количество буферов
#property indicator_color1      Red         // Цвет первой линии Red Blue Lime 
#property indicator_color2      Blue        // Цвет второй линии
#property indicator_color3      Yellow
#property indicator_level1      -20
#property indicator_level2       20
//#property indicator_minimum   -100
//#property indicator_maximum    100
 
extern int LengthMtm            = 21;
extern int LengthSmooth         = 5;
extern int LengthErgodic        = 5;
extern int HistoryLimit         = 2000;

double tsi[], ergodic[], cross[];           // Объявление массивов (под буферы индикатора)
double mtm[], base[], mtmMA[], mtmS[];


//-----------------------------------------------------------------------------
int MathSgn(double Value = 0.0)
{
    if (Value < 0) return(-1); else return( 1);
}

//-----------------------------------------------------------------------------
int init()                         
{
    SetIndexBuffer(0, tsi);                                 // Назначение массива буферу
    SetIndexBuffer(1, ergodic);                             // Назначение массива буферу
    SetIndexBuffer(2, cross);                               // Назначение массива буферу
    
    SetIndexStyle (0, DRAW_LINE,        STYLE_SOLID, 1);    // Стиль линии DRAW_HISTOGRAM STYLE_SOLID
    SetIndexStyle (1, DRAW_LINE,        STYLE_SOLID, 1);    // Стиль линии        
    SetIndexStyle (2, DRAW_ARROW,       STYLE_SOLID, 0);    // Стиль линии
    SetIndexArrow (2, 161);
    
    SetIndexLabel(0, "TSI");
    SetIndexLabel(1, "Ergodic");
    SetIndexLabel(2, "Cross");
    IndicatorShortName("TSI("+LengthMtm+","+LengthSmooth+","+LengthErgodic+")");    
    
    ArrayResize(        mtm,        Bars);
    ArrayResize(        base,       Bars);
    ArrayResize(        mtmMA,      Bars);
    ArrayResize(        mtmS,       Bars);

    ArraySetAsSeries(   mtm,        true);
    ArraySetAsSeries(   base,       true);
    ArraySetAsSeries(   mtmMA,      true); 
    ArraySetAsSeries(   mtmS,       true);


    return(0);                                      
}

//-----------------------------------------------------------------------------
int start()                         
{    
    if (HistoryLimit == 0) HistoryLimit = Bars;
    
    int Counted_bars            = IndicatorCounted();
    int i                       = MathMin(Bars - Counted_bars - 1, HistoryLimit); 
    while( i >= 0 ) {        
     
        mtm[i]                  = Close[i] - Close[i+1];
        base[i]                 = High[i]  - Low[i];
        mtmMA[i]                = iMAOnArray(mtm,   0, LengthMtm,     0, MODE_EMA, i) * 100;
        mtmMA[i]               /= iMAOnArray(base,  0, LengthMtm,     0, MODE_EMA, i);
        mtmS[i]                 = iMAOnArray(mtmMA, 0, LengthSmooth,  0, MODE_EMA, i);
        tsi[i]                  = mtmS[i];
        ergodic[i]              = iMAOnArray(mtmS,  0, LengthErgodic, 0, MODE_EMA, i); 
        
        if ( MathSgn(tsi[i+1] - ergodic[i+1]) != MathSgn(tsi[i] - ergodic[i]) )       
            cross[i]           = ergodic[i];
        else
            cross[i]           = EMPTY_VALUE;
        
        i--;                       
    }
    
    return(0);                          
}


  Позвольте я напомню причину обращения. Если вытащить индикатор на график, пропустить неслолько свечей и добавить еще один такой же, мы с вами получим расхождение в значениях индикаторов. Также наблюдается очень сильное расхождение, когда этот индикатор выводится при визуальном тестировании советника, а в последствии на график добавляется такой же индикатор. Могли бы вы помочь мне статьями или личным опытом на этот вид ошибки в индикаторе? Спасибо.
 
В тестере пропала кнопка Stop/Play и ползунок скорости. Что делать?
 
VAM_ >>:
В тестере пропала кнопка Stop/Play и ползунок скорости. Что делать?

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

 
Dmido >>:

Всем доброго дня суток)


Есть советник. Улавливает большие тренды, на них плюс хороший, но без доливок еле перекрывает минусы на безрыбье.

Вопрос: подскажите как написать сигнал доливки? Идея такая - доливаюсь, когда больше стопа над первой позицией и трендовые параметры показывают тренд.


Мне интересен сам блок отправки сигнала на совершение сделки. Пользуюсь кодом скопированным со стандартного советника МACD Sample.

Как подправить его, чтобы совершалась сделка доливки, а потом сразу же закрывались разом обе позиции и основная и доливка?


А то сделки плодятся как мухи и в итоге получается грааль блин с тысячей открытых сделок((((


как вариант: визуально отслеживай работу советника в реальном времени и доливайся вручную, на то он и гранит (искусства), но не грааль...

 
IlyaA >>:
        mtmMA[i]                = iMAOnArray(mtm,   0, LengthMtm,     0, MODE_EMA, i) * 100;
        mtmMA[i]               /= iMAOnArray(base,  0, LengthMtm,     0, MODE_EMA, i);

mtmMA - должно быть два различных массива. при делении таки желательно проверить на неравенство нулю.


для промежуточных расчетов удобней использовать буффер.

Если 8 штук не хватает, один из вариантов решения здесь.

 
Swan >>:

mtmMA - должно быть два различных массива. при делении таки желательно проверить на неравенство нулю.


для промежуточных расчетов удобней использовать буффер.

Если 8 штук не хватает, один из вариантов решения здесь.






Спасибо за комментарий. Заметьте мы говорим о средней по разнице high - low. Она всегда положительна. А средняя усиливает эту тенденцию. Я хотел проверять, но потом, думаю, в журнале если что увижу. Как вы считатете может ли ошибка деления на нуль вызвать расхождение графиков, добавленных в разные промежутки времени.
 
IlyaA >>:


Спасибо за комментарий. Заметьте мы говорим о средней по разнице high - low. Она всегда положительна. А средняя усиливает эту тенденцию. Я хотел проверять, но потом, думаю, в журнале если что увижу. Как вы считатете может ли ошибка деления на нуль вызвать расхождение графиков, добавленных в разные промежутки времени.

не может. но желательно проверять)

расхождение получается из-за использования массивов без сдвига.

 
IlyaA писал(а) >>

Позвольте я приведу, на конструктивную критику общественности, програмный код (убедительная просьба воздержаться от конструктивной критики самого индикатора). Но сначала описание. Это индекс TSI (истинной силы). Строится по 1-дневному моментуму. Эти приращения сглаживаются експоненциальной средней (21 период). Теперь добавим масштабирование. Для этого возьмем разность high - low и сгладим их такой же экспоненциальной средней (21 период). Разделим гладенький моментум на гладенький размах. Это отношение сглаживается короткой експоненциальной средней (5 периодов). Мы получили осн. линию. Теперь сгладим осн. линию ергодикой (EMA(, 5)) и возрадуемся, получив сигнальную. Собственно, давайте возрадуемся еще раз, т.к. перед нами TSI - типичный трендовый индикатор. В моей реализации есть еще 3 буфер под "кружочки", которыми я обозначаю пересечение осн. и сигнальной линий. Господа, код в студию:

Позвольте я напомню причину обращения. Если вытащить индикатор на график, пропустить неслолько свечей и добавить еще один такой же, мы с вами получим расхождение в значениях индикаторов. Также наблюдается очень сильное расхождение, когда этот индикатор выводится при визуальном тестировании советника, а в последствии на график добавляется такой же индикатор. Могли бы вы помочь мне статьями или личным опытом на этот вид ошибки в индикаторе? Спасибо.

Индикатор нормальный. Если обращения к iMAOnArray() в отдельном цикле, то можно добиться корректной работы индикатора независимо от времени его установки.

Нужно разбивать на три цикла твой один.

iMAOnArray() корректнее работать будет.

 
Swan >>:

не может. но желательно проверять)

расхождение получается из-за использования массивов без сдвига.

Я не очень понял, что значит без сдвига. Добавьте слов, пожалуйста.

 
IlyaA >>:

Я не очень понял, что значит без сдвига. Добавьте слов, пожалуйста.

Буферный массив при появлении нового бара сдвигается. индексы увеличиваются на 1. обычный нет.

по выше приведенной ссылке описано подробнее.