Индикаторы: DXY (USDX) - страница 2

 
Andrey Khatimlianskii:
Куда?
Код ещё на модерации...
 
Обновлённый код опубликован.
 
Михаил:
Обновлённый код опубликован.

Если какого-то бара нет, можно использовать цену закрытия предыдущего бара.

И совсем не обязательно вызывать функцию 2 раза, она достаточно ресурсоемкая ;)

Но это уже детали. 

 
Andrey Khatimlianskii:

Если какого-то бара нет, можно использовать цену закрытия предыдущего бара.

И совсем не обязательно вызывать функцию 2 раза, она достаточно ресурсоемкая ;)

Но это уже детали. 

Отсутствующие бары, в основном, на М1. На М5 только в азиатскую сессию. На М15 1 в неделю. На M30 и старше - не нашёл. Считаю не критично для того, чтобы усложнять код.

Ресурсоёмкость оценить не могу - работаю на 8-ми ядрах с 8-ю ГБ памяти, но оптимизировать код считаю нужным.

Всему своё время. 

PS: Благодарю за конструктив. 

 
Михаил:

Отсутствующие бары, в основном, на М1. На М5 только в азиатскую сессию. На М15 1 в неделю. На M30 и старше - не нашёл. Считаю не критично для того, чтобы усложнять код.

Ресурсоёмкость оценить не могу - работаю на 8-ми ядрах с 8-ю ГБ памяти, но оптимизировать код считаю нужным.

Всему своё время. 

PS: Благодарю за конструктив. 

Да, если не строить из М1 старшие ТФ, то можно пренебречь пропусками. И оптимизировать нужно, только если тормозит.

Я и написал, что это детали )

 

Andrey Khatimlianskii #:

Все потому что расчет ведется по одному индексу баров (в этом коде - shift):

double dxyshift(int shift)
{  
    ResetLastError();
    double xs = 1, ys = 1;
    double exs,gxs,euros,jpys,gbps,cads,seks,chfs,dxs;
     exs=gxs=euros=jpys=gbps=cads=seks=chfs=dxs=0.0;
     exs = iClose("EURUSD", 0, shift);
     gxs = iClose("GBPUSD", 0, shift);
     if (exs != 0.0) xs /= exs;
     if (gxs != 0.0) ys /= gxs;
     euros = MathPow(xs, 0.576);
     jpys  = MathPow(iClose("USDJPY", 0, shift), 0.136);
     gbps  = MathPow(ys, 0.119);
     cads  = MathPow(iClose("USDCAD", 0, shift), 0.091);
     seks  = MathPow(iClose("USDSEK", 0, shift), 0.042);
     chfs  = MathPow(iClose("USDCHF", 0, shift), 0.036);
    
     dxs = NormalizeDouble(50.14348112 * euros * jpys * gbps * cads * seks * chfs, 2);
     Print(GetLastError());
    return(dxs);
}

Это неправильно. Нужны базовые расчеты, то есть JPYUSD, а не USDJPY.

То есть 1/USDJPY. Такесливче.

 
Evgeniy Scherbina #:

Это неправильно. Нужны базовые расчеты, то есть JPYUSD, а не USDJPY.

То есть 1/USDJPY. Такесливче.

Кстати, расчетный индекс по значениям отличается от реального. Они то ли изменили формулу на каком то этапе (добавили новые валюты), то ли веса поменяли. 
 
Evgeniy Scherbina #:

Это неправильно. Нужны базовые расчеты, то есть JPYUSD, а не USDJPY.

То есть 1/USDJPY. Такесливче.

Евгений, брать в приведённом коде 1/UDSJPY было бы правильно, если бы первые сомножители брались для EURUSD и GBPUSD. А они берутся как обратные: для 1/EURUSD и 1/GBPUSD.

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