НО попытаюсь ответить для телепатов:
- Если Вы скачали индикатор по этой ссылке (правленый мной):
- оригинальный индикатор перерисовывал стрелочки на последних 300 барах:
delObj(""); for (int i=300; i>=0; i--) {
- я запретил ему (индикатору) это делать:
bool gb_ClearObjects = false; if (gb_ClearObjects) delObj (indPrefix); for (int i = 300; i >= 0; i--) {
- Стрелочки оставил на месте (в индикаторе) - никуда не забирал.
Обращайтесь - (Анекдот: "Обращайся, сынок, а то вообще ничего знать не будешь!"). :)))
Стрелочки ваша версия индикатора не рисует. Вот так должна была выглядеть нормальная версия для того что бы с ней работать - тут можно увидеть реальное значение индикатора - стрелочки рисуются при пересечении линии с уровнями 0.8 и -0.8. Этот индикатор был копирован с индикатора ssrc. Он перерисовываеться. Версия приведенная ниже не перерисовываеться.
#property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Blue #property indicator_width1 3 #property indicator_style1 STYLE_SOLID #property indicator_level1 0.8 #property indicator_level2 -0.8 extern int FilterPeriod = 22; extern int SL_distance_pips = 20; int period = 22; double ulinop = 1.0; double indic_buffer0[]; double indic_buffer1[]; double indic_buffer2[]; int iConst_14 = 14; double dArray1[]; double dConst_pipDigits; int iArray1[]; int SortInt[]; int iSignFlag = 0; int iTimeBar0 = 0; string indPrefix="xxx"; string nosaukums; datetime lastAlertTime; void MartAxis(int i) { indic_buffer1[i] = iMA(NULL, 0, period + 1, 0, MODE_LWMA, PRICE_CLOSE, i); } void SmoothOverMart(int i) { double ld_4 = indic_buffer1[ArrayMaximum(indic_buffer1, FilterPeriod, i)]; double ld_12 = indic_buffer1[ArrayMinimum(indic_buffer1, FilterPeriod, i)]; indic_buffer2[i] = (2.0 * (ulinop + 2.0) * indic_buffer1[i] - (ld_4 + ld_12)) / 2.0 / (ulinop + 1.0); } double SpearmanRankCorrelation(double Ranks[], int N){ double res,z2; int i; for(i = 0; i < N; i++){ z2 += MathPow(Ranks[i] - i - 1, 2); } res = 1 - 6 * z2 / (MathPow(N,3) - N); return(res); } void RankPrices(int &InitialArray[]) { int i, k, m, dublicat, counter, etalon; double dcounter, averageRank; double TrueRanks[]; ArrayResize(TrueRanks, iConst_14); ArrayCopy(SortInt, InitialArray); for(i = 0; i < iConst_14; i++) { TrueRanks[i] = i + 1; } ArraySort(SortInt, WHOLE_ARRAY, 0, MODE_DESCEND); for(i = 0; i < iConst_14-1; i++){ if(SortInt[i] != SortInt[i+1]) { continue; } dublicat = SortInt[i]; k = i + 1; counter = 1; averageRank = i + 1; while(k < iConst_14){ if(SortInt[k] == dublicat){ counter++; averageRank += k + 1; k++; } else { break; } } dcounter = counter; averageRank = averageRank / dcounter; for(m = i; m < k; m++) { TrueRanks[m] = averageRank; } i = k; } for(i = 0; i < iConst_14; i++){ etalon = InitialArray[i]; k = 0; while(k < iConst_14) { if(etalon == SortInt[k]){ dArray1[i] = TrueRanks[k]; break; } k++; } } } int init() { IndicatorBuffers(3); SetIndexBuffer(0, indic_buffer0); SetIndexStyle(0, DRAW_LINE,STYLE_SOLID, 2); SetIndexBuffer(1, indic_buffer1); SetIndexStyle(1, DRAW_NONE); SetIndexBuffer(2, indic_buffer2); SetIndexStyle(2, DRAW_NONE); ArrayResize(dArray1, iConst_14); ArrayResize(iArray1, iConst_14); ArrayResize(SortInt, iConst_14); IndicatorShortName("BuySellWait"); dConst_pipDigits = MathPow(10, Digits); } int deinit() { delObj(indPrefix); } int start() { int limit; int counted_bars=IndicatorCounted(); if(counted_bars > 0) { counted_bars--; } limit = Bars - counted_bars - 1; for (int i = limit; i >= 0; i--) { MartAxis(i); } for (i = limit; i >= 0; i--) { SmoothOverMart(i); } for (i = limit; i >= 0; i--) { for (int y = 0; y < iConst_14; y++) { iArray1[y] = indic_buffer2[i + y] * dConst_pipDigits; } RankPrices(iArray1); indic_buffer0[i] = SpearmanRankCorrelation(dArray1, iConst_14); if (iSignFlag >= 0 && indic_buffer0[i+2] >=0.8 && indic_buffer0[i+1] <= 0.8){ iSignFlag = -1; drawSignalArrow(Time[i], Open[i], iSignFlag, Red); } else if (iSignFlag <= 0 && (indic_buffer0[i+2] <= -0.8) && (indic_buffer0[i+1] >= - 0.8)) { iSignFlag = 1; drawSignalArrow(Time[i], Open[i], iSignFlag, Lime); } } } void drawSignalArrow(datetime bultasLaiks, double bultasCena, int signaals, color kraasa){ int bultasTips; if (signaals>0) { bultasTips=233; bultasCena=bultasCena-1*Point; } else { bultasTips=234; bultasCena=bultasCena+10*Point; } nosaukums=indPrefix+"signalArrow"+bultasCena+bultasLaiks+bultasTips; ObjectDelete(nosaukums); ObjectCreate(nosaukums,OBJ_ARROW,0, bultasLaiks, bultasCena,0,0,0,0); ObjectSet(nosaukums, OBJPROP_WIDTH, 2); ObjectSet(nosaukums,OBJPROP_ARROWCODE,bultasTips); ObjectSet(nosaukums,OBJPROP_COLOR,kraasa); } void delObj(string prePrefix){ string name; for(int i = ObjectsTotal(); i>=0;i--) { name = ObjectName(i); if(StringFind(name, prePrefix, 0) == 0) { ObjectDelete(name); } } }
стрелочки ваша версия индикатора не рисует. Вот так должна была выглядеть нормальная версия для того что бы с ней работать - тут можно увидеть реальное значение индикатора - стрелочки рисуются при пересечении линии с уровнями 0.8 и -0.8
Обсуждаемый индикатор рисует стрелки не "из буфера", а объектами OBJ_ARROW посредством вот этой функции:
void drawSignalArrow (datetime bultasLaiks, double bultasCena, int signaals, color kraasa) { // papildus bultas uz grafika int li_arrow; if (signaals > 0) { li_arrow = 233; bultasCena = NDD (bultasCena - gda_sdvig[0]); } else { li_arrow = 234; bultasCena = NDD (bultasCena + gda_sdvig[1]); } string ls_Name = StringConcatenate (indPrefix, "signalArrow", bultasCena, bultasLaiks, li_arrow); //signalArrowName = ls_Name; // atceramies if (ObjectFind (ls_Name) == 0) ObjectDelete (ls_Name); ObjectCreate (ls_Name, OBJ_ARROW, 0, bultasLaiks, bultasCena, 0, 0, 0, 0); ObjectSet (ls_Name, OBJPROP_WIDTH, 2); ObjectSet (ls_Name, OBJPROP_ARROWCODE, li_arrow); // arrowcode ObjectSet (ls_Name, OBJPROP_COLOR, kraasa); }
А вот и картиночка с "потерянными" стрелочками:
у меня индикатор, код которого я привел рисует такую картинку, возможно у вас не так ?
Да, твой рисует именно так. А у TarasBY рисует одну стрелку и молчит, еще и терминал грузит непонятными вычислениями. Там в коде явно ошибки, просто их выискивать жалко времени. Пусть ентот гуру сам их правит.
У меня работает так (вариант от Тараса):
И что получается: у одних работает, а у других нет. Ответ очевиден: Грамотность - мать спокойствия и порядка. Что будет делать грамотный, у которого не заработало - разберётся. А что будет делать малограмотный и невежественный - конечно, права качать... :(
ДЛЯ интересующихся СУТЬЮ вопроса.
В индикатор я внёс дополнительно три переменных, две из которых вынес в настройки,
extern int BarControl = 2; // >= 2 extern double LevelControl = 0.8; // <= 1
а одну оставил на уровне локальной и задал ей статическое значение.
double currPrice, currTime, sl, ld_Popravka = 0.3;
В этом легко можно разобраться, если глянуть в код, конечно, если чуть-чуть разбираешься в MQL.
Вот оригинальный код, отвечающий за формирование сигнала SELL (BUY аналогично):
if (iSignFlag >= 0) { // ieprieksh dotais signaals: 1 = buy, 2 = sell if ((indic_buffer0[i+2] >=0.8) && ( indic_buffer0[i+1] <= 0.8)) // bija virs, tagad zem { iSignFlag = -1; sl=High[1]+SL_distance_pips*Point; kraasa=Red; if (i==0) { displayAlert("Sell signal",0, sl, currPrice); kraasa=Blue; } drawSignalArrow(currTime,currPrice,iSignFlag, kraasa); // Alert("BuySellWait (", Symbol(), ", ", Period(), ") - Sell"); } }
Вот мой (правленый) вариант с использованием упомянутых переменных (выделил их жирным шрифтом):
double currPrice, currTime, sl, ld_Popravka = 0.3; if (iSignFlag >= 0) // ieprieksh dotais signaals: 1 = buy, 2 = sell { if ((gda_BUF0[i+BarControl] >= LevelControl) && (gda_BUF0[i+1] <= LevelControl - ld_Popravka)) // bija virs, tagad zem { iSignFlag = -1; sl = High[1] + SL_distance_pips * Point; kraasa = Red; if (i == 0) { displayAlert ("Sell signal", 0, sl, currPrice); kraasa = Blue; } drawSignalArrow (currTime, currPrice, iSignFlag, kraasa); //Alert ("BuySellWait (", Symbol(), ", ", Period(), ") - Sell"); } }
Не трудно догадаться, что на значение переменной ld_Popravka = 0.3 будет "отличаться" формируемый индикатором сигнал - он будет формироваться РЕЖЕ, соответственно и стрелочки будут рисоваться РЕЖЕ. На картинке хорошо прослеживается принцип мной изложенного: сначала работал советник с ld_Popravka = 0.3, затем я отключил советника и поставил на чарт индикатор со значением ld_Popravka = 0.0. На момент снятия скриншота я вернул значение ld_Popravka = 0.3, индикатор пересчитал заново свои показания и результат вывел в красной надписи (в правом нижнем углу) "Current Signal BUY", где для него все последние стрелочки вниз "не имеют значения" - для него последний сигнал BUY - так работает введённый мной фильтр сигнала.
Переменная ld_Popravka отвечает за откат сигнала от порогового уровня LevelControl. Стрелки рисует ИНДИКАТОР и ему по-барабану самостоятельно работать или совместно с советником. Стрелки ЕСТЬ или их НЕТ (другого в 999 случаях из 1000 не дано - единичку оставим на "всякое в жизни бывает"). ;)
БЕЗ ПРОБЛЕМ! Готов выслушать конструктивные замечания (ЛЮБОЙ может ошибиться). В программировании исправить ошибку не сложно (было бы желание).
С претензиями к маме с папой.
Моськам - не нужно искать мнимых предлогов - тявкайте себе на здоровье.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
e-PSI@Multi_Scalper v.27.08.2012:
Author: TarasBY