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

 
Stellarator >>:

а были-ли когда-нибудь расхождения в исходных значениях и "в последствии развернутых"? все-таки double...)

пока не было.... все проблемы только от неаккуратности :)

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

Уж сразу и "вынужден"..... все бы так разубеждали. Спасибо за очередную незадокументированную особенность :)


 

FSB__Bar_Opening_Bar_Closing.mql4 v0.0.2 Beta


Market entry at Bar Opening;

Exit at Bar Closing (10 sec. till close or at the next open)


** This is only demo for testing Entry / Exit points. **


Code fragments:


bool bIsFirstTick;// It is used to catch the Bar Opening.
datetime dtCurrentBarOpeningTime;

int init()
{
   bIsFirstTick = false;
   dtCurrentBarOpeningTime = Time[0];
   return(0);
}

int start()
{
   // Is this the first tick for the bar
   bIsFirstTick = (dtCurrentBarOpeningTime != Time[0]);
   if(bIsFirstTick)
   {
      dtCurrentBarOpeningTime = Time[0];
   }

...
...



///
/// Exit at a Bar Closing price (almost).
///
/// MetaTrader does not provide an onBarClose event so we are not able to close a position
/// exactly at Bar Closing. We workaround the problem by closing the position within a time span
/// near to the bar closing time. In the cases when there is no any ticks within this period,
/// we close the position att he next bar opening price.
///
int ClosePositionsAtBarClosing(bool bCloseLong, bool bCloseShort, datetime dtClosingTimeSpan)
{
   int  iOrders = OrdersTotal();
   bool bIsOpen = false;

   for(int iOrder = 0; iOrder < iOrders; iOrder++)
   {
      OrderSelect(iOrder, SELECT_BY_POS, MODE_TRADES);
      
      if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {  // There is an open position for this symbol.

         datetime dtOpeningTime     = Time[0] - TimeSeconds(Time[0]); // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period() * 60;  // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent() ;                 // The time of current tick
         
         if(dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan ||  bIsFirstTick)
         {  // The current tick is within the closing time span or this is the first tick of the bar.

            // Code

         }
       }
    }
}
 

1. Regarding the performance:

Mostly we don't need to recalculate an indicator for every tick. (Reference -"Use previous bar value".) An indicator has to be calculated either at "Bar Opening" or at "Bar Closing".


2. fMicron:

I use fMicron = Point/2 when compare prices for trading decision. But this is not applicable for the indicators. Eg. for USDJPY point = 0.01; fMicron = 0.005.

0.000075 is a result of many tests through the years. I started working on FSB in 2001 :) Of course it doesn't mean anything. I have changed my mind many times about it.

**edit: MT gives this to the hands of the users. Probably the EA gurus can say what they use in their EAs.

**edit2: I'll put this parameter in the config file for experiments.


3. I'll start provide the original indicators source code for download for each FSB version. I'll not need to update the website for every small change in such a case.


I started changing float to double. I'll publish this version soon today evening or tomorrow. After that we have to test it thoroughly. We have to pass per each indicator to fix some problems / features before writing them in MQL.

 

1. Да, в большинстве случаев (учитывая общий подход FSB к открытию/закрытию позиций (at Bar Opening/at Bar Closing)) - это не нужно. Но, скажем так - правила хорошего тона - обязывают. Расчет индикатора каждый раз "с нуля" (пусть и один раз на Bar) - в целом (соглашусь) не критичный overhead в рамках больших периодов... А если период - минуты? А если индикатор все-таки нужно (или хочется) расчитывать каждый бар? (какой-нибудь изощренный Point of the Position, который нельзя (или уже нет возможности, из-за цены открытия меньшей, чем уровень стопов) отловить ордером?)

Конвертация усложняется не на много, на самом деле -да, появился некоторый код "в обвеске" и принцип хождения по барам меняется на обратный. Собственно, по большому счету - все. Главное оставить алгоритм (чтобы он легко читался и идентифицировался внутри исходника), сохранить параметрическую совместимость с FSB. Создать удобный механизм извлечения сигналов. И сделать индикатор удобным для использования чистым визуальщикам (которым нет дела до EA). По моему так.


2. Ну, вариант Point/2 я и не предлагал использовать для сравнения (на равно) значений индикаторов :) - я как раз предлагал константу. Вопрос в ее значении и размерности (0.000075 - не плохо, я этого не говорил - я не понимаю, почему здесь именно 75, а не "как обычно" 50:)?! Опыт "с 2001г" - весьма показателен (аргумент!) и я вполне готов согласиться с данным значением. Но как последнее замечание - для котировок с размерностью 0.12345 этого будет мало (в смысле - много :))). Число нужно сдвигать как минимум на один разрад вправо (0.0000075). В моем ДЦ, например, такие котировки уже обычная практика... Я бы предложил все-таки подстройку под инструмент и использование "10", а не 75 :):

fMicron = Point * 0.1f

Короче, да - предлагаю сделать это параметрически - задаваемым (думаю, после дружных экспериментов все встанет на свои места (хотя... если точка зрения много раз менялась ;)...). И подождать дополнительных мнений людей...


3. Выложенные исходники я качнуть успел :-P. Так что будет, "что сравнить" (в плане получившегося кода). Ну и как бы отвлекать более не хотелось - успехов в конвертации float to double!


(как там тест с RSI? ;), если руки успели дойти?)

 

I found out that the best is 100 > Micron > 50. That is why I took 75. It was for my broker: Point = 0.0001.

But you are right that brokers started quoting at 0.00001.

Let make it: Micron = Math.Min(Point * 0.75, 0.000075)

I hope I'll finish with conversion for 3 hours from now. I'll put here the program for testing.

I'll upload the converted indicators source codes also.

 

All indicators and parameters are double numbers.

Micron = 0.000075


Put the exe in the folder together with the last FSB v2.8.3.3 Beta. Both programs will share same data and strategies. It's convenient for comparing. Be careful about the indicators values. Practically all the indicators and the half of other files have been changed.

To see full precision press F12 in the chart or use Command Console (ind ###).


Please report any issues. Now is the moment to request changes about the indicators. We have to fixed them before to continue the work on MT integration.



 

Доброе утро!

Мирослав, очень ограничен по времени сейчас... так что быстро:

1. Спасибо за оперативный перевод (float to double)! Отлично!

2. Пока вроде бы все работает (сколько успел проверить), видны различия (с ходу), как в значениях индикаторов, так и в результатах стратегий :)

3. НО - различия оказались не теми, которые мы предварительно ожидали! (я вчера вечером провел внутренний эксперимент, и мои "опасения" подтвердились - конвертация повысит точность вычислений - НО не катастрофически изменит результат! что-то из области расхождений в четвертом- пятом разряде... но у нас-то расхождения уже во втором начинаются! (все тот-же RSI, например))


ПРИЧИНА В ЧЕМ-ТО ДРУГОМ!!!


Что успел проверить я:

1. Сначала подумал о том, нет ли каких-то жестких привязок на тему Digits (у меня инструменты с 5 знаками, напомню)... принудительное указание 4 знаков в свойствах инструмента - не помогло (кстати - зато работает!)

2. Код самих индикаторов... хм... ну не к чему там придраться! Сейчас везде double, сам код (как вижу) не менялся... Код достаточно простой (очень часто оперирует вообще одними сложениями и вычитаниями) - НЕ может там такая ошибка накопиться!!! (заявляю менее уверенно... но... ;))

3. Последняя мысль (которую мне проверить не получится) - ВОТ ЭТО ЧТО ТАКОЕ :)?!:



Bar Closing/Opening Values (???) (and other, potentially?)


Откуда берутся такие цифры??? :))) (это что еще за "приписьки" :D?)

Я так понимаю, откуда-то отсюда (Bar Closing.cs):

            // Saving the components
            component = new IndicatorComp[1];

            component[0] = new IndicatorComp();
            component[0].CompName  = "Closing price of the bar";
            component[0].DataType  = (parameters.SlotType == SlotTypes.Open) ? IndComponentType.OpenPrice : IndComponentType.ClosePrice;
            component[0].ChartType = IndChartType.NoChart;
            component[0].FirstBar  = 2;
            component[0].Value     = Data.Close;

В итоге мое первое рабочее предположение - что (возможно) дело в этом? ("неверной" (или "верной", но почему именно такой?) отдачи котировочных значений в функции?)

Частично, видимо, заодно к вопросу получаемых значений (для заполнения оперируемых буферов при расчете индикатора) из искомой функции protected static float[] Price(BasePrice price)


В общем, Мирослав - "мяч на вашей стороне" :). Пока могу заметить, что перенесенный мной код ВАШИХ индикаторов - прекрасно совместим по значениям с индикаторами МТ (я упорный :D, и тему с RSI все-таки "добью"):



Тот же бар, первый индикатор - конвертация, второй - родной от МТ.


Мысли, предложения??? (буду часов через 6)

 

Частично, видимо, заодно к вопросу получаемых значений (для заполнения оперируемых буферов при расчете индикатора) из искомой функции protected static float[] Price(BasePrice price)

All base classes, methods and properties return double values now as well as all trading functions (I changed the last 6 months ago).

It seams there is a difference in the formula of RSI. It can't be in the second sign "но у нас-то расхождения уже во втором начинаются!". :) I'll try to adopt the existing MT RSI formula in FSB.



**Edit:

Fixed already:

Default params: RSI(close, 14, smoothed) == MT RSI

            for (int iBar = 1; iBar < Bars; iBar++)
            {
                if (adBasePrice[iBar] > adBasePrice[iBar - 1]) adPos[iBar] = adBasePrice[iBar] - adBasePrice[iBar - 1];
                if (adBasePrice[iBar] < adBasePrice[iBar - 1]) adNeg[iBar] = adBasePrice[iBar - 1] - adBasePrice[iBar];
            }

            double[] adPosMA = MovingAverage(iPeriod, 0, maMethod, adPos);
            double[] adNegMA = MovingAverage(iPeriod, 0, maMethod, adNeg);

            for (int iBar = iFirstBar; iBar < Bars; iBar++)
            {
                if (adNegMA[iBar] == 0)
                    adRSI[iBar] = 100;
                else
                    adRSI[iBar] = 100 - (100 / (1 + adPosMA[iBar] / adNegMA[iBar]));
            }


Program for download soon.


 

Мирослав - да нет никаких differences в формулах. Как уже говорил в самом начале обсуждений RSI - у Вас просто ЛИШНИЙ цикл усреднения используется (который из любого результата корректно работающих функций MovingAverage принудительно делает Smoothed) :), ЗА ИСКЛЮЧЕНИЕМ первого значения (которое остается от выполнения MovingAverage :).

В общем, судя по последнему приведенному коду - все встало на свои места (и теперь RSI будет нормально считать другие режимы усреднения) :)! Yahoo!


(код индикаторов, который я сохранял раньше, уже содержит данное изменение ;) - чтобы в этом убедиться - достаточно вызвать fsbRSI со следующими параметрами:

indLogic = не важно

maMethod = 2 (! важно MODE_SMMA в терминах MT)

basePrice = 0 (PRICE_CLOSE в терминах MT)

iPeriod = 14

fLevel = не важно

iPrvs = не важно

И получить ТОЧНОЕ совпадение результатов с родным Relative Strength Index (который идет в комплекте у MT)

Вот только и fsbRSI и iRSI - НЕ совпадают с FSB :(


Поэтому вернемся к основной проблеме:


"All base classes, methods and properties return double values now as well as all trading functions (I changed the last 6 months ago)."


Ну и прекрасно! Я только не понял, как этот тезис должно влиять на

Opening price of the Bar и Closing price of the bar? В вышеприведенном примере.


Повторю вопрос: Почему искомые цены ОТЛИЧАЮТСЯ от котировок??? (я про 6,7,8, ... разряды)


double здесь СОВЕРШЕННО ни при чем! Значения в котировках нормализованы и при простом копировании между переменными должны сохраняться (быть полностью идентичны друг другу).

Если подобные значения начинают фигурировать при расчете индикаторов (когда заполняются буферы для расчета на базе котировочных значений protected static float[] Price(BasePrice price)), то мы БЛИЗКИ К ЦЕЛИ (как это не странно), т.е. как бы еще один источник (помимо бывшего float), "слегка" денормализованных данных :)

 

I changed slightly some of the indicators to look like the MT’s standard ones.


Changed FSB indicators:

RSI

Oscillator of RSI

RSI MA Oscillator

Bollinger Bands

Standard Deviation

Stochastics


There are differences in the following indicators:

Momentum

Market Facilitation Index


Other:

MT Moving Average Oscillator == FSB MACD Histogram

MT Momentum == FSB Rate of Change

Relative Vigor Index – not included in FSB


Now FSB and MT indicators should be more or less equal.


TODO:

Stochastics – revision of the signals;

Market Facilitation Index - formula revision;

A Momentum like the MT's one to be included in FSB - named “Momentum MT”

Including “Relative Vigor Index” in FSB.

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