iCustom zasada działania i wydajność.

O jezykach programowania w platformach i nie tylko.
dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

iCustom zasada działania i wydajność.

Nieprzeczytany post autor: dulf »

Witam .
Spotkałem się w wielu wskaźnikach ,przeważnie takich w których stosowane są dosyć "ciężkie" obliczenia co widać z zachowania platformy z następującą konstrukcją (pseudo kod) :

Kod: Zaznacz cały

Indicator XXX

extern int a =100;
extern int b = 20;
extern int bars = 1000 ;

double Buff x[];
SetIndexBuffer(0,x) ;           // Bufor 0

   start(){            
                  count = bars - Bars ; 
     if(key)
     {
             for(count , .... count---)
            {
         z =   iCustom(NULL,period, "XXX",bars?    , numbuff-0,   /*index*/-0)  
           }
      }
}
Czyli następuje tutaj rekurencyjne wywołanie kodu wskaźnika w celu uzyskania jednej wartości z bufora przy pojedynczym wywołaniu iCustom .
Pytanie :
1.Jak to ma się do wydajności kodu i poco taki zabieg ?
2.Pierwsze wywołanie kodu wskaźnika musi przeliczyć wszystkie bary aby uzyskać wartość końcową buff[0] , następnie ilość świeczek potrzebna do przeliczenia jest przeważnie redukowana co zwiększa wydajność obliczeń .
Jak to ma się do iCustom , Czy chcąc uzyskać końcową wartość bufora trzeba do funkcji podać ilość bars do przeliczenia czy nie jest to już potrzebne ?
Mam tutaj wątpliwość bo jeśli istnieje konieczność przeliczania wszystkich świeczek od początku to wydajność będzie fatalna .
Głównie chodzi mi o nierekurencyjne wywołanie , czyli używam iCustom z kodu innego wskaźnika :

Kod: Zaznacz cały

Indicator  YYYYY
extern int a =100;
extern int b = 20;
extern int bars = 1000 ;

double Buff x[];

         double a =   iCustom(NULL,period, "XXX",bars?    , numbuff-0,   /*index*/-0)  

}
Czy w takim przypadku muszę podać pełną ilośc "Barów" do uzyskania wartości końcowej gdy właściwie interesuje mnie tylko końcowa wartość Buff ?
Jeśli tak to czy kolejne wywołanie iCustom też będzie przeliczać pełną ilość świec podaną do iCustom [?] ,a może zależy to tylko od konstrukcji wskaźnika "przekazanego" do iCustom ?
Jeśli nie podam ilości świec do przeliczenia iCustom to wskaźnik XXX przeliczy przy pierwszym wywołaniu "domyślną" wartość z ustawień wskaźnika ,a potem ilość która jest redukowana (załóżmy że jego kod tak jest napisany),
czy za każdym razem będzie przeliczał wszystkie .
Tzn , czy kod jest wykonywany od początku za każdym wywołaniem iCustom ,czy też jego stan jest "utrzymywany" i traktowany jako załadowany wskaźnik (.dll) do którego są potem tylko odwołania (kolejne wywołania iCustom) ?
Nie spiesz się , zawsze zdążysz stracić .

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

ja bym strzelal, ze zalezdy to od kodu wskaznika. MQL dziwnie pamiecia zarzadza i chyba nie ma opisu w jaki spob. Jezeli dobrze zrozumialem, i chesz wywolywac jeden wskanik parenascie razy i przyspieszyc i nie tracic na optymalnosci to bym to zorbil na jeden z 2 sposobow:

1. piszesz program w czyms innym i dll'ke do pamieci dzielonej, pierwsze wywolanie zapisuje, reszta, czyta z pamieci.

2. pierwwszym wywolaniem piszesz do pliku, kolejnym z niego czytasz

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Trochę inaczej .Mam wskaźnik który wykonuje dosyć skomplikowane obliczenia i strasznie muli platformę,sam z siebie już nie mówiąc o tym żeby go wywołać przez iCustom .Chcę go użyć w wywołaniu iCustom w strategii i innym wskaźniku aby pobrać parametry z niego .Najlepiej było by przepisać kod wskaźnika na dll , ale nie ja go pisałem i posiadam tylko kod po dekompilacji , jest długi i skomplikowany jak to po dekompilacji ,straszna sieczka więc chyba nie dam rady .Jeszcze w środku zawiera odwołanie do samego siebie .Oj pewnie jakbym posiedział z miesiąc to by coś z tego wyszło ale męczarnia straszna .
W iCustom używam wywołań dla M5 ,M15, M30 i td na jednym wykresie .
Ciekawi mnie to czy przy takich kolejnych wywołaniach na jednym wykresie:
iCustom(M5 , "wskaznik_nazwa" ...
iCustom(M15 , "wskaznik_nazwa" ...
iCustom(M30 , "wskaznik_nazwa" ...
Bary we "wskaznik_nazwa" są przeliczane w ilości takiej jak przy pierwszym załadowaniu wskaźnika na wykres czy też kod MT4 jakoś utrzymuje dane .

Jak dodajemy zwykły wskaźnik do wykresu to pierwsze wywołanie przelicza wszystkie bary potrzebne do pracy wskaźnika , następne dotyczą już wartości przeliczonych i nowych bieżących co przyśpiesz działanie bo kod nie przelicza za każdym tickiem wszystkiego od początku .

Czy wywołanie wskaźnika przez iCustom kolejno z różnymi Tf na jednym wykresie daje efekt taki jakby był ładowany za każdym razem od początku (nie dobrze,liczenie od początku) ,czy też jakby był załadowany stale na wykres (dobrze).
Jest to do sprawdzenia bo można dopisać jakieś logi do wskaźnika ,ale jeśli gdzieś są jakieś informacje na ten temat to szkoda roboty .
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

dulf pisze:Bary we "wskaznik_nazwa" są przeliczane w ilości takiej jak przy pierwszym załadowaniu wskaźnika na wykres czy też kod MT4 jakoś utrzymuje dane .
utrzymuje dane , perwsze wywolanie funkcji icustom powoduje zaladowanie wskaznika , pozniej juz z niego korzysta i oblicza tak jakby wskaznik byl na wykresie , a czy przelicza wszystkie bary czy nie to juz zalezy od budowy wskaznika

pozdrawiam
Andrzej Pierz
z poważaniem
Andrzej Pierz
FOREX-SERVICE

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

dulf: c od mql'a sie jakos specjlanei skladniwo nie rozni. Mysle, ze jak wrzucisz to w kompilator, przekompilujesz i zaczniesz poprawiac bledy to z dzien Ci sie zejdzie i przepiszesz to na c++. Nawet zebyb ylo szybciej mozesz popisac funkcje iClose itd.

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

crn pisze:dulf: c od mql'a sie jakos specjlanei skladniwo nie rozni. Mysle, ze jak wrzucisz to w kompilator, przekompilujesz i zaczniesz poprawiac bledy to z dzien Ci sie zejdzie i przepiszesz to na c++. Nawet zebyb ylo szybciej mozesz popisac funkcje iClose itd.
A jak niby miałby użyć tego iClose w c++ ?
Gdy odpalasz wskaźnik w mqlu to ma on dostęp do tylu danych historycznych ile masz na dysku. Więc odwołanie iClose[n] nie jest problemem.
Jeśli przepiszesz "na żywca" kod wskaźnika do c++ to nie będziesz miał tam danych historycznych - musiałbyś je jakoś przetrasferować do c++ (np. na starcie wskaźnika).
Druga sprawa: wskaźnik zapewne używa nie jednej funkcji wbudowanej w mqla (często wsakźniki używają np. iMA, iMAOnArray, iStdDevOnArray itd.)
Musisz więc te same funkcje napisać w c++. W sytuacji gdy kod wskaźnika jest długi i skomplikowany i na dodatek jeszcze nie wiemy dokładnie jak działa potrwa to sporo, i wygeneruje nie jeden problem.

Nie wiem z czym problem dotyczy pracy na żywo czy backtestów. Jeśli to pierwsze to nie wiele można poradzić (albo szybszy komp, albo optymalizacja wskaźnika), jeśli to drugie to problem można prosto obejść.
Green
Obrazek
Obrazek

crn
Gaduła
Gaduła
Posty: 117
Rejestracja: 17 mar 2009, 22:07

Nieprzeczytany post autor: crn »

green7: np. piszac ceny do pamieci wspoldzielonej jakims EA / czytajac z plikow MT4 (nie iwem jak, ale pewnie sie da ), a napisanie funkcji liczaca sredni czy odchylenie standardowe chyba nie jest skomplikowane i dlugo nei zajmuje, wiec nei widze problemu.

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Projekt Open Source.

http://sourceforge.net/projects/ta-lib/
ACOS Vector Trigonometric ACos
AD Chaikin A/D Line
ADD Vector Arithmetic Add
ADOSC Chaikin A/D Oscillator
ADX Average Directional Movement Index
ADXR Average Directional Movement Index Rating
APO Absolute Price Oscillator
AROON Aroon
AROONOSC Aroon Oscillator
ASIN Vector Trigonometric ASin
ATAN Vector Trigonometric ATan
ATR Average True Range
AVGPRICE Average Price
BBANDS Bollinger Bands
BETA Beta
BOP Balance Of Power
CCI Commodity Channel Index
CDL2CROWS Two Crows
CDL3BLACKCROWS Three Black Crows
CDL3INSIDE Three Inside Up/Down
CDL3LINESTRIKE Three-Line Strike
CDL3OUTSIDE Three Outside Up/Down
CDL3STARSINSOUTH Three Stars In The South
CDL3WHITESOLDIERS Three Advancing White Soldiers
CDLABANDONEDBABY Abandoned Baby
CDLADVANCEBLOCK Advance Block
CDLBELTHOLD Belt-hold
CDLBREAKAWAY Breakaway
CDLCLOSINGMARUBOZU Closing Marubozu
CDLCONCEALBABYSWALL Concealing Baby Swallow
CDLCOUNTERATTACK Counterattack
CDLDARKCLOUDCOVER Dark Cloud Cover
CDLDOJI Doji
CDLDOJISTAR Doji Star
CDLDRAGONFLYDOJI Dragonfly Doji
CDLENGULFING Engulfing Pattern
CDLEVENINGDOJISTAR Evening Doji Star
CDLEVENINGSTAR Evening Star
CDLGAPSIDESIDEWHITE Up/Down-gap side-by-side white lines
CDLGRAVESTONEDOJI Gravestone Doji
CDLHAMMER Hammer
CDLHANGINGMAN Hanging Man
CDLHARAMI Harami Pattern
CDLHARAMICROSS Harami Cross Pattern
CDLHIGHWAVE High-Wave Candle
CDLHIKKAKE Hikkake Pattern
CDLHIKKAKEMOD Modified Hikkake Pattern
CDLHOMINGPIGEON Homing Pigeon
CDLIDENTICAL3CROWS Identical Three Crows
CDLINNECK In-Neck Pattern
CDLINVERTEDHAMMER Inverted Hammer
CDLKICKING Kicking
CDLKICKINGBYLENGTH Kicking - bull/bear determined by the longer marubozu
CDLLADDERBOTTOM Ladder Bottom
CDLLONGLEGGEDDOJI Long Legged Doji
CDLLONGLINE Long Line Candle
CDLMARUBOZU Marubozu
CDLMATCHINGLOW Matching Low
CDLMATHOLD Mat Hold
CDLMORNINGDOJISTAR Morning Doji Star
CDLMORNINGSTAR Morning Star
CDLONNECK On-Neck Pattern
CDLPIERCING Piercing Pattern
CDLRICKSHAWMAN Rickshaw Man
CDLRISEFALL3METHODS Rising/Falling Three Methods
CDLSEPARATINGLINES Separating Lines
CDLSHOOTINGSTAR Shooting Star
CDLSHORTLINE Short Line Candle
CDLSPINNINGTOP Spinning Top
CDLSTALLEDPATTERN Stalled Pattern
CDLSTICKSANDWICH Stick Sandwich
CDLTAKURI Takuri (Dragonfly Doji with very long lower shadow)
CDLTASUKIGAP Tasuki Gap
CDLTHRUSTING Thrusting Pattern
CDLTRISTAR Tristar Pattern
CDLUNIQUE3RIVER Unique 3 River
CDLUPSIDEGAP2CROWS Upside Gap Two Crows
CDLXSIDEGAP3METHODS Upside/Downside Gap Three Methods
CEIL Vector Ceil
CMO Chande Momentum Oscillator
CORREL Pearson's Correlation Coefficient (r)
COS Vector Trigonometric Cos
COSH Vector Trigonometric Cosh
DEMA Double Exponential Moving Average
DIV Vector Arithmetic Div
DX Directional Movement Index
EMA Exponential Moving Average
EXP Vector Arithmetic Exp
FLOOR Vector Floor
HT_DCPERIOD Hilbert Transform - Dominant Cycle Period
HT_DCPHASE Hilbert Transform - Dominant Cycle Phase
HT_PHASOR Hilbert Transform - Phasor Components
HT_SINE Hilbert Transform - SineWave
HT_TRENDLINE Hilbert Transform - Instantaneous Trendline
HT_TRENDMODE Hilbert Transform - Trend vs Cycle Mode
KAMA Kaufman Adaptive Moving Average
LINEARREG Linear Regression
LINEARREG_ANGLE Linear Regression Angle
LINEARREG_INTERCEPT Linear Regression Intercept
LINEARREG_SLOPE Linear Regression Slope
LN Vector Log Natural
LOG10 Vector Log10
MA Moving average
MACD Moving Average Convergence/Divergence
MACDEXT MACD with controllable MA type
MACDFIX Moving Average Convergence/Divergence Fix 12/26
MAMA MESA Adaptive Moving Average
MAVP Moving average with variable period
MAX Highest value over a specified period
MAXINDEX Index of highest value over a specified period
MEDPRICE Median Price
MFI Money Flow Index
MIDPOINT MidPoint over period
MIDPRICE Midpoint Price over period
MIN Lowest value over a specified period
MININDEX Index of lowest value over a specified period
MINMAX Lowest and highest values over a specified period
MINMAXINDEX Indexes of lowest and highest values over a specified period
MINUS_DI Minus Directional Indicator
MINUS_DM Minus Directional Movement
MOM Momentum
MULT Vector Arithmetic Mult
NATR Normalized Average True Range
OBV On Balance Volume
PLUS_DI Plus Directional Indicator
PLUS_DM Plus Directional Movement
PPO Percentage Price Oscillator
ROC Rate of change : ((price/prevPrice)-1)*100
ROCP Rate of change Percentage: (price-prevPrice)/prevPrice
ROCR Rate of change ratio: (price/prevPrice)
ROCR100 Rate of change ratio 100 scale: (price/prevPrice)*100
RSI Relative Strength Index
SAR Parabolic SAR
SAREXT Parabolic SAR - Extended
SIN Vector Trigonometric Sin
SINH Vector Trigonometric Sinh
SMA Simple Moving Average
SQRT Vector Square Root
STDDEV Standard Deviation
STOCH Stochastic
STOCHF Stochastic Fast
STOCHRSI Stochastic Relative Strength Index
SUB Vector Arithmetic Substraction
SUM Summation
T3 Triple Exponential Moving Average (T3)
TAN Vector Trigonometric Tan
TANH Vector Trigonometric Tanh
TEMA Triple Exponential Moving Average
TRANGE True Range
TRIMA Triangular Moving Average
TRIX 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
TSF Time Series Forecast
TYPPRICE Typical Price
ULTOSC Ultimate Oscillator
VAR Variance
WCLPRICE Weighted Close Price
WILLR Williams' %R
WMA Weighted Moving Average

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

crn pisze:green7: np. piszac ceny do pamieci wspoldzielonej jakims EA / czytajac z plikow MT4 (nie iwem jak, ale pewnie sie da ), a napisanie funkcji liczaca sredni czy odchylenie standardowe chyba nie jest skomplikowane i dlugo nei zajmuje, wiec nei widze problemu.
Ja nie mówię, że się nie da - tylko, że to bardzo dużo pracy.
Ot mówisz odchylenie standardowe: ok, algorytm prosty ale czy mt4 liczy odchylenie standardowe czy może odchylenie standardowe populacji ?? Mała różnica (-1 we wzorze) ale musisz to sprawdzić - jeśli chcesz by przepisany wskaźnik działał jak w oryginale.
Esco pisze:Projekt Open Source.

http://sourceforge.net/projects/ta-lib/
:) Tak - tylko ta biblioteka ma całkiem inną filozofię niż mt4. Np. nie masz czegoś takiego jak indexowanie tablicy wstecz (0 to ostatni słupek 1 przedostatni itd.), wskaźniki działają po prostu na kawałkach pamięci, jak chcesz indexować jak w mqlu musisz sobie sam to zorganizować.
Poza tym jest sporo różnic w działaniu ta-lib'a i mql'a. Ot inaczej np. liczone są już niektóre średnie (EMA, SMMA). A że, średnie są podstawą większości wskaźników to siłą rzeczy i niektóre z nich działać będą inaczej. Stoch, Macd, Stddev - już te podstawowe wskaźniki dadzą inne wyniki w obu tych środowiskach. Część problemów wynika z tego, że Ta-lib inaczej zaokrągla wyniki. Ogólnie bardzo trudno będzie uzyskać to samo co w mqlu - coś o tym wiem.
Green
Obrazek
Obrazek

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Zrobiłem tak .Stwierdziłem że nie są mi potrzebne wartości wyliczane co tick , więc kod z iCustom jest odpalany co minutę + Sleep .Platforma przy takim rozwiązaniu chodzi w miarę płynnie .Poprzednio nie bardzo dało się na niej pracować .

Kod: Zaznacz cały

datetime trigger = 0 ;
datetime triggercurr = 0 ;

void SendDataBuff()
{  

   triggercurr = iTime(NULL,PERIOD_M1,0);
   
    
   if(triggercurr!=trigger)
   {
     trigger = triggercurr;

    
    Sleep(10);  

    DataBuff[OffsetIndicatorBuff]   = iCustom(NULL,PERIOD_M5,...
    DataBuff[OffsetIndicatorBuff+1] = iCustom(NULL,PERIOD_M5,...

    Sleep(10);

    DataBuff[OffsetIndicatorBuff+2] = iCustom(NULL,PERIOD_M15,...
    DataBuff[OffsetIndicatorBuff+3] = iCustom(NULL,PERIOD_M15,...

    Sleep(10);

    DataBuff[OffsetIndicatorBuff+4] = iCustom(NULL,PERIOD_M30,...
    DataBuff[OffsetIndicatorBuff+5] = iCustom(NULL,PERIOD_M30,..

    Sleep(10);

    DataBuff[OffsetIndicatorBuff+6] = iCustom(NULL,PERIOD_H1,...
    DataBuff[OffsetIndicatorBuff+7] = iCustom(NULL,PERIOD_H1,...

    Sleep(10);

    DataBuff[OffsetIndicatorBuff+8] = iCustom(NULL,PERIOD_H4,...
    DataBuff[OffsetIndicatorBuff+9] = iCustom(NULL,PERIOD_H4,...

    Sleep(10);

             QSendSignBuff(SymbolCurrency,0,DataBuff,SizeDataBuff);
  }
      
}
Nie spiesz się , zawsze zdążysz stracić .

ODPOWIEDZ