Кому стратегию? Много и бесплатно) - страница 61

 
Stellarator >>:

Друзья машину обмавыть позвали ...

Ну вот ...

А говорят кризис ;)

 

It seams we have to start comparing one by one until fix all issues.

Here I compared FSB Accelerator Oscillator to MT iAC(..):



How to do this:

1. Update the forex rates of FSB with the current ones used in MT. (From MT Ctrl+S and save the xxxxxx.csv file in the FSB ./Data directory. If your data are in a different folder - use Market -> Data Directory from FSB to point it.)

2. Make the script Indicator_Values.mq4 printing the desired indicator. (The script is on the previous forum's page.)

3. Set this indicator in FSB. (Be sure using the same parameters.) Export the FSB indicator by function Export -> Indicators.

4. If you see any difference, please report it.


Have a nice luck!


------------

Edit:

Please use the latest FSB v2.8.3.5 Beta

 
Miroslav_Popov >>:

The classical formula is: Momentum(n) = Close - Close(n)

This is the formula FSB uses.

MT uses: Momentum(n) = 100 * Close / Close(n)

Это я знаю.Я имел ввиду параметры индикатора. Период сглаживания. Метод сглаживания. Ведь мы не задаем это. Какие параметры берутся по умолчанию: 0,0?

 

Hi zfs,


You can see the default parameters in the Indicator Parameters dialog window. (Press Default)



Note that "Additional smoothing" period = 0. That means no smoothing is applied.


The second place where you can see the default values is in the source code:


        /// <summary>
        /// Sets the default parameters for the designated slot type
        /// </summary>
        public Momentum(SlotTypes slotType)
        {
            sIndicatorName  = "Momentum";
            parameters      = new IndicatorParam();
            component       = new IndicatorComp[] { };
            bSeparatedChart = true;
            bIsCalculated   = false;

            // The indicator name
            parameters.IndicatorName = sIndicatorName;

            // The slot type
            parameters.SlotType = slotType;

            // The ComboBox parameters
            parameters.ListParam[0].Caption  = "Logic";
            parameters.ListParam[0].ItemList = new string[]
            {
                "The Momentum rises",
                "The Momentum falls",
                "The Momentum is higher than the Level line",
                "The Momentum is lower than the Level line",
                "The Momentum crosses the Level line upward",
                "The Momentum crosses the Level line downward",
                "The Momentum changes its direction upward",
                "The Momentum changes its direction downward"
            };
            parameters.ListParam[0].Index    = 0;
            parameters.ListParam[0].Text     = parameters.ListParam[0].ItemList[parameters.ListParam[0].Index];
            parameters.ListParam[0].Enabled  = true;
            parameters.ListParam[0].ToolTip  = "Logic of application of the indicator.";

            parameters.ListParam[1].Caption  = "Smoothing method";
            parameters.ListParam[1].ItemList = Enum.GetNames(typeof(MAMethod));
            parameters.ListParam[1].Index    = 0;
            parameters.ListParam[1].Text     = parameters.ListParam[1].ItemList[parameters.ListParam[1].Index];
            parameters.ListParam[1].Enabled  = true;
            parameters.ListParam[1].ToolTip  = "The Moving Average method used for smoothing the Momentum value.";

            parameters.ListParam[2].Caption  = "Base price";
            parameters.ListParam[2].ItemList = Enum.GetNames(typeof(BasePrice));
            parameters.ListParam[2].Index    = 3;
            parameters.ListParam[2].Text     = parameters.ListParam[2].ItemList[parameters.ListParam[2].Index];
            parameters.ListParam[2].Enabled  = true;
            parameters.ListParam[2].ToolTip  = "The price the Momentum is based on.";

            // The NumericUpDown parameters
            parameters.NumParam[0].Caption = "Period";  <----- Parameter Name
            parameters.NumParam[0].Value   = 10;        <----- Default Value
            parameters.NumParam[0].Min     = 1;
            parameters.NumParam[0].Max     = 200;
            parameters.NumParam[0].Enabled = true;
            parameters.NumParam[0].ToolTip = "The period of Momentum.";
 
            parameters.NumParam[1].Caption = "Additional smoothing"; <----- Parameter Name 
            parameters.NumParam[1].Value   = 0;        <----- Default Value
            parameters.NumParam[1].Min     = 0;
            parameters.NumParam[1].Max     = 200;
            parameters.NumParam[1].Enabled = true;
            parameters.NumParam[1].ToolTip = "The period of additional smoothing.";

            parameters.NumParam[2].Caption = "Level";  <----- Parameter Name
            parameters.NumParam[2].Value   = 0;        <----- Default Value
            parameters.NumParam[2].Min     = -100;
            parameters.NumParam[2].Max     = 100;
            parameters.NumParam[2].Point   = 4;
            parameters.NumParam[2].Enabled = true;
            parameters.NumParam[2].ToolTip = "A critical level (for the appropriate logic).";

            // The CheckBox parameters
            parameters.CheckParam[0].Caption = "Use previous bar value";
            parameters.CheckParam[0].Checked = Data.Strategy.PrepareUsePrevBarValueCheckBox(slotType);
            parameters.CheckParam[0].Enabled = true;
            parameters.CheckParam[0].ToolTip = "Use the indicator value from the previous bar.";
        }
 
Miroslav_Popov >>:

Hi zfs,

Я в принципе не сомневался в вашой безупречности. Дело в том, что несмотря на всё это конечные значения индикаторов у меня не совпадают. Или не совпадали? Некогда сейчас проверить, к сожалению.

 

Zfs,

With the help of Stellarator I fixed many issues in FSB. I also changed the default parameters of FSB to be like this in MT. I hope most of the differences are fixed already.


Please don't hesitate to report any possible bugs. All feedback and critiques are well appreciated.

 
Stellarator >>:

Вынужден разубедить! Ключевой нюанс - "предел одной итерации советника". Так вот - в этих пределах индикатор расчитывается ОДНОКРАТНО (при первом своем вызове)! Заявляю со 100% уверенностью. Все дальнейшие вызовы вообще не запускают его start(), а просто берут нужные значения из нужных буферов. Условие 100% при неизменности входных параметров (за исключением буфера и смещения). Правило действует при вычислениях в пределах одного инструмента. Но, думаю, принцип сохраняется даже тогда, когда iCustom обращается к другим TF и инструментам.


Вопрос не по теме, я как раз увлекся написанием советника, который на 0-м баре 240 раз обращается к индикатору за значением индикатора в текущую минуту. Т.е. получается на выходе всегда имеем первое значение? Подтвердите плиз, а то для меня это новость.

 
zfs >>:

Вопрос не по теме, я как раз увлекся написанием советника, который на 0-м баре 240 раз обращается к индикатору за значением индикатора в текущую минуту. Т.е. получается на выходе всегда имеем первое значение? Подтвердите плиз, а то для меня это новость.

Советник заново стартует по каждому новому тику, а это уже другая итерация, соответственно и значения индикатора будут другими.

 
rider >>:

Советник заново стартует по каждому новому тику, а это уже другая итерация, соответственно и значения индикатора будут другими.

If you use "Use previous bar value" parameter correctly you don't need the current bar value of the indicator.

Let say you us MA(simple, 12, close) on a daily chart. To calculate this MA correctly you need the closing prices of 12 bars.

If now is 3PM, the current "close" price is not the real close price of the bar. It is going to be changed till 12PM. So using MA for the current bar doesn't include the real close price but a temporary one. In the same time the back test uses real (already fixed) closing price of the historical bars. This practice will bring differences between the backtest and the real trade.


Even worse:

Let see the logic rule "A FastMA goes above a SlowMA" where both MA are based on Close price.

If during the day the market rises rapidly, the FastMa can cross above the SlowMA, which will rise a buy signal. You will buy following the signal. Let after the deal the market goes down and closes so lower, that will move the FastMA below the Slow one. Do you see the problem? You have already bought befor the close of the bar. If you backtest this strategy later, you will see that there is no such buy signal for within this bar. And what? You will blame the backtester, but the problem is in the wrong strategy logic.


Forex Strategy Builder protects you from such logical errors by altomatically setting the "Use previous bar value" parameter. FSB never uses changing (not yet fixed) indicators for backtesting. And in that logic why an EA has to calculate an indicator for every tick if the strategy don't use it. One calculation per bar is enough:

- if the indicator uses Open price - the calculation has to be at bar opening;

- if the indicator uses Close, High, Low or any combination of the prices - the calculation has to be at bar closing.






 

Доброго вечера всем!


На выходные остался без компа :(. А сегодня просто было ни до чего из-за работы... как-то так...

Зато было время подумать. И (надеюсь) - определился стратегически (в плане каркаса индикаторов).

В общем, внутренняя структура индикаторов с данного момента будет похожа (опишу позже, завтра может быть). То, что "торчит" наружу (параметры) - максимально приближены к FSB. Т.е. их количество, значения (и их границы) и определяемый ими функционал - ну... почти один к одному :). Микро-нюансы остаются, но это уже по ходу определимся.


Пока очень коротко (спать уже собираюсь, завтра-послезавтра меня не будет здесь, скорей всего, по работе очень много дел намечено) (на примере "нашего любимого" RSI :D):

1. Параметры:

// -------- Indicator parameters
extern int     slotType = SLOT_TYPE_OPENFILTER; // SLOT_TYPE_LC
extern int     indLogic = INDICATOR_RISES;      // INDICATOR_RISES <= indLogic <= INDICATOR_CHANGES_DIR_DOWNWARD
extern int     maMethod = MA_METHOD_SMOOTHED;   // MA_METHOD_SIMPLE <= maMethod <= MA_METHOD_SMOOTHED
extern int     basePrice= BASE_PRICE_CLOSE;     // BASE_PRICE_OPEN <= basePrice <= BASE_PRICE_WEIGHTED
extern int     iPeriod  = 14;                   // 1 <= iPeriod <= 200
extern int     dLevel   = 30;                   // 0 <= dLevel <= 100
extern bool    iPrvs    = True;                 // True / False




Думаю, из картинки все более-менее понятно и так. Единственное, что может вызвать затруднение: slotType, соотв. его значения (которые, возможно, отличаются от FSB, но в данном случае это не является принципиальным моментом):

// Slot Types
#define  SLOT_TYPE_OPEN                   0  // Point of the Position
#define  SLOT_TYPE_CLOSE                  1  // Point of the Position
#define  SLOT_TYPE_OPENFILTER             2  // Logic Condition
#define  SLOT_TYPE_CLOSEFILTER            3  // Logic Condition

Ну а дальше - просто. Числовые значения задаются как есть. Значения в ComboBox'ах нумеруются от 0 (как массивы), соотв. какое выбрали по счету (начиная с 0!) - то и задаете числом в параметрах.

Числовые значения методов сглаживания и ценовых констант ОТЛИЧАЮТСЯ от MT (долго думал, но решил в угоду совместимости с FSB отойти от стереотипов :) ). Это все, собственно, сделано для того, чтобы в последствии болванки экспертов (или то, что пользователи напишут сами) могли "дергать" индикаторы легко и не принужденно :) (что увидели в FSB - то и задали ("что вижу - то пою")). Грубо:

double dRSI = iCustom(NULL, 0, "-FSB- RSI", 2, 0, 3, 3, 14, 30, 1, 0, 0);

для приведенного выше примера.


2. Возвращаемые значения:

Два первых индикаторных буфера в каждом индикаторе зарезервированы под значения цены открытия позиций (длинных/коротких соотв.), либо под логические условия (1.0 - да / любое другое значение - нет). Дальше идут сами значения индикаторов (если они кому-то будут интересны):


Содержимое первых двух буферов определяется логикой работы индикатора (slotType и indLogic) (т.е. еще раз - там либо цены, либо 1 / 0 (проверять рекомендую именно на "1", т.к. другие значения могут быть не только нулевые (в общем случае - как отсутствие значения у индикатора там может находиться EMPTY_VALUE)).


Все индикаторы соптимизированы с учетом IndicatorCounted() (это основное изменение оригинального кода, по большому счету) (Мирослав, в общем случае - прав насчет того, что реально пересчитывать значения индикаторов понадобится один раз на бар (опять же - в общем случае... ;))). Но для корректного визуального отображения, да и в целом (хороший тон)... В общем, тормозить особо не должно.


Для отрисовки цветных и аналогичных ("особо одаренных" :)) индикаторов используются графические объекты (чтобы буферы лишние не занимать). У себя потестировал - вполне так работоспособно (при визуальном отображении явно медленней, чем через индикаторные буферы, но не критично, а при вызовах iCustom, думаю, графические функции вообще не вызываются, так что "излишества" особо на скорости не должны будут сказаться).


Пока все, накопилось пара вопросов Мирославу, но уже сил нет :), завтра постараюсь задать (но буду, как уже говорил - напрыгом)...


p.s. Перед переносом файлов из архива - удалите в папке Experts\Indicators\ файлы fsb*.mq4 . Остальное нужно просто переписать поверх старого. С данного момента соглашения об именах файлов меняться не будут (все индикаторы будут иметь префикс "-FSB- ").

Файлы:
experts_1.rar  148 kb