- Сколько стоит сделать общий сигнал для нескольких стандартных индикаторов?
- Индикаторы: cm-Volume-Level
- Зависание терминала при тестировании мультивалютного индикатора
Нужен обычный ССI из метатрейдера безо всяких гистограмм и наворотов, но с возможностью указывать в настройках любую пару из терминала. Чтоб их можно было натаскать несколько в одно окошко. Очень нужно.
Если очень нужно, то есть прямой резон сделать самому.
Берете из CodeBase оригинальный код CCI.
1. Добавляете внешнюю переменную: extern string CCISymbol="EURUSD"; //потом вставляется нужный символ
2. В iMA(NULL,........) заменяете NULL на CCISymbol.
3. High[k], Low[k], Close[k] заменяете на iHigh( CCISymbol, 0, k), iLow( CCISymbol,0, k), iClose( CCISymbol, 0, k) соответственно.
4. Записываете код под новым именем как CCI_Symbol, компилируете и наслаждаетесь результатом.
5. Рассказываете знакомым девушкам, какой Вы крутой кодер.
Если очень нужно, то есть прямой резон сделать самому.
Берете из CodeBase оригинальный код CCI.
1. Добавляете внешнюю переменную: extern string CCISymbol="EURUSD"; //потом вставляется нужный символ
2. В iMA(NULL,........) заменяете NULL на CCISymbol.
3. High[k], Low[k], Close[k] заменяете на iHigh( CCISymbol, 0, k), Low( CCISymbol,0, k), Close( CCISymbol, 0, k) соответственно.
4. Записываете код под новым именем как CCI_Symbol, компилируете и наслаждаетесь результатом.
5. Рассказываете знакомым девушкам, какой Вы крутой кодер.
Улыбнуло;))
Если очень нужно, то есть прямой резон сделать самому.
Берете из CodeBase оригинальный код CCI.
1. Добавляете внешнюю переменную: extern string CCISymbol="EURUSD"; //потом вставляется нужный символ
2. В iMA(NULL,........) заменяете NULL на CCISymbol.
3. High[k], Low[k], Close[k] заменяете на iHigh( CCISymbol, 0, k), iLow( CCISymbol,0, k), iClose( CCISymbol, 0, k) соответственно.
4. Записываете код под новым именем как CCI_Symbol, компилируете и наслаждаетесь результатом.
5. Рассказываете знакомым девушкам, какой Вы крутой кодер.
Спасибо!
Однако ж я ни в зуб ногой в этом деле. Вроде все сделал, как велено, только у меня на графике получается совсем не та линия.
Чего еще надо поменять? Взялись повышать мое реноме у девушек, так уж давайте теперь, до конца :)
#property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 LightSeaGreen //---- input parameters extern string CCISymbol="EURJPY"; extern int CCIPeriod = 14; //---- buffers double CCIBuffer[]; double RelBuffer[]; double DevBuffer[]; double MovBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 3 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(1, RelBuffer); SetIndexBuffer(2, DevBuffer); SetIndexBuffer(3, MovBuffer); //---- indicator lines SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, CCIBuffer); //---- if(CCIPeriod <= 0) CCIPeriod = 14; //---- SetIndexDrawBegin(0, CCIPeriod); //---- name for DataWindow and indicator subwindow label short_name="CCI(" + CCIPeriod + ")"; IndicatorShortName(short_name); SetIndexLabel(0, short_name); //---- return(0); } //+------------------------------------------------------------------+ //| Commodity Channel Index | //+------------------------------------------------------------------+ int start() { int i, k, counted_bars = IndicatorCounted(); double price, sum, mul; if(CCIPeriod <= 1) return(0); if(Bars <= CCIPeriod) return(0); //---- initial zero if(counted_bars < 1) { for(i = 1; i <= CCIPeriod; i++) CCIBuffer[Bars-i] = 0.0; for(i = 1; i <= CCIPeriod; i++) DevBuffer[Bars-i] = 0.0; for(i = 1; i <= CCIPeriod; i++) MovBuffer[Bars-i] =0.0; } //---- last counted bar will be recounted int limit = Bars - counted_bars; if(counted_bars > 0) limit++; //---- moving average for(i = 0; i < limit; i++) MovBuffer[i] = iMA(CCISymbol, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i); //---- standard deviations i = Bars - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = Bars - counted_bars - 1; mul = 0.015 / CCIPeriod; while(i >= 0) { sum = 0.0; k = i + CCIPeriod - 1; while(k >= i) { price =(iHigh( CCISymbol, 0, k) + iLow( CCISymbol,0, k) + iClose( CCISymbol, 0, k) / 3); sum += MathAbs(price - MovBuffer[i]); k--; } DevBuffer[i] = sum*mul; i--; } i = Bars - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { price = (High[i] + Low[i] + Close[i]) / 3; RelBuffer[i] = price - MovBuffer[i]; i--; } //---- cci counting i = Bars - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = Bars - counted_bars - 1; while(i >= 0) { if(DevBuffer[i] == 0.0) CCIBuffer[i] = 0.0; else CCIBuffer[i] = RelBuffer[i] / DevBuffer[i]; i--; } //---- return(0); } //+------------------------------------------------------------------+
while(k >= i) { //в отношениях с девушками главное скобки правильно расставить price =(iHigh( CCISymbol, 0, k) + iLow( CCISymbol,0, k) + iClose( CCISymbol, 0, k)) / 3; // _______ sum += MathAbs(price - MovBuffer[i]); k--; }
2
price = (High[i] + Low[i] + Close[i]) / 3; //???????
Мне кажется надо заменить Bars, High, Low, Close на iBars, iHigh, iLow, iClose соответсвенно проставив там CCISymbol.
Я потомственный танкист в этом деле.
Где "там "проставить CCISymbol, и во всем ли коде нужно Bars, High, Low, Close заменить на iBars, iHigh, iLow, iClose, или только в некоторой части? Я смысла этих манипуляций не представляю совершенно, так что простите за тупость.
Кстати, спасибо за LeMan Trend, вещь хорошая.
Kos - спасибо, посмотрел, там целый пакет валют в одном, для моих целей это будет неудобно совершенно. Мне просто нужен индюк с двумя параметрами - период и валюта, все.
#property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 LightSeaGreen //---- input parameters extern string CCISymbol="GBPJPY"; extern int CCIPeriod = 14; //---- buffers double CCIBuffer[]; double RelBuffer[]; double DevBuffer[]; double MovBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 3 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(0, CCIBuffer); SetIndexBuffer(1, RelBuffer); SetIndexBuffer(2, DevBuffer); SetIndexBuffer(3, MovBuffer); //---- indicator lines SetIndexStyle(0, DRAW_LINE); //---- if(CCIPeriod <= 0) CCIPeriod = 14; //---- SetIndexDrawBegin(0, CCIPeriod); //---- name for DataWindow and indicator subwindow label short_name="CCI(" + CCIPeriod + ")"; IndicatorShortName(short_name); SetIndexLabel(0, short_name); //---- return(0); } //+------------------------------------------------------------------+ //| Commodity Channel Index | //+------------------------------------------------------------------+ int start() { int i, k, counted_bars = IndicatorCounted(); double price, sum, mul; if(CCIPeriod <= 1) return(0); if(iBars(CCISymbol,0) <= CCIPeriod) return(0); //---- initial zero if(counted_bars < 1) { for(i = 1; i <= CCIPeriod; i++) CCIBuffer[iBars(CCISymbol,0)-i] = 0.0; for(i = 1; i <= CCIPeriod; i++) DevBuffer[iBars(CCISymbol,0)-i] = 0.0; for(i = 1; i <= CCIPeriod; i++) MovBuffer[iBars(CCISymbol,0)-i] =0.0; } //---- last counted bar will be recounted int limit = iBars(CCISymbol,60) - counted_bars; if(counted_bars > 0) limit++; //---- moving average for(i = 0; i < limit; i++) MovBuffer[i] = iMA(CCISymbol, 0, CCIPeriod, 0, MODE_SMA, PRICE_TYPICAL, i); //---- standard deviations i = iBars(CCISymbol,0) - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = iBars(CCISymbol,0) - counted_bars - 1; mul = 0.015 / CCIPeriod; while(i >= 0) { sum = 0.0; k = i + CCIPeriod - 1; while(k >= i) { price =(iHigh(CCISymbol, 0, k) + iLow(CCISymbol,0, k) + iClose(CCISymbol, 0, k)) / 3; sum += MathAbs(price - MovBuffer[i]); k--; } DevBuffer[i] = sum*mul; i--; } i = iBars(CCISymbol,0) - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = iBars(CCISymbol,0) - counted_bars - 1; while(i >= 0) { price = (iHigh(CCISymbol,0,i) + iLow(CCISymbol,0,i) + iClose(CCISymbol,0,i)) / 3; RelBuffer[i] = price - MovBuffer[i]; i--; } //---- cci counting i = iBars(CCISymbol,0) - CCIPeriod + 1; if(counted_bars > CCIPeriod - 1) i = iBars(CCISymbol,0) - counted_bars - 1; while(i >= 0) { if(DevBuffer[i] == 0.0) CCIBuffer[i] = 0.0; else CCIBuffer[i] = RelBuffer[i] / DevBuffer[i]; i--; } //---- return(0); } //+------------------------------------------------------------------+
За LeManTrend пожалуйста.
Все должно работать
Есть еще одно решение предложенное Vinin, но для WPR, после небольших модификаций получаем то, что доктор прописал:))
//+------------------------------------------------------------------+ //| VininI_MV_WPR_v1.mq4 | //| Victor Nicolaev aka Vinin| //| vinin@mail.ru | //+------------------------------------------------------------------+ #property copyright "Сopyright 2008. Victor Nicolaev aka Vinin" #property link "e-mail: vinin@mail.ru" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Aqua #property indicator_level1 0 #property indicator_level2 100 #property indicator_level3 -100 //---- input parameters extern string CCI_Symbol="GBPUSD"; extern int CCI_Period= 14; extern int Limit=1440; double CCI[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { SetIndexStyle(0,DRAW_LINE); SetIndexDrawBegin(0,CCI_Period); SetIndexBuffer(0,CCI); IndicatorShortName(CCI_Symbol+"(CCI,"+CCI_Period+")"); SetIndexLabel(0,CCI_Symbol+"(CCI)"); return(0); } //+------------------------------------------------------------------+ int start() { static int TimeCCI=-1; int limit; int counted_bars=IndicatorCounted(); int i, CurrentTime, CCIPos; if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; if (limit>Limit && Limit>0) limit = Limit; if (TimeCCI>0) limit+=iBarShift(CCI_Symbol,Period(),TimeCCI); for (i = limit;i>=0;i--){ CurrentTime=Time[i]; CCIPos=iBarShift(CCI_Symbol,Period(),CurrentTime); if (iTime(CCI_Symbol,Period(),CCIPos)<CurrentTime) CCIPos++; CCI[i] = iCCI(CCI_Symbol,Period(),CCI_Period,PRICE_TYPICAL,CCIPos); } TimeCCI=iTime(CCI_Symbol,Period(),0); return(0); }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования