Советники: e-PSI@Multi_Scalper v.27.08.2012

 

e-PSI@Multi_Scalper v.27.08.2012:

Скальпер, работающий одновременно на нескольких инструментах. Создан на основе модульной конструкции. Есть управление общим профитом и динамически рассчитываемые СТОПы. Шаблон для конструирования мультивалютных стратегий.

Author: TarasBY

 
Индикатор возьмите здесь.
 
а нельзя было стрелочки оставить в индикаторе, сделав так что бы они не перерисовывались ?
 
excelf: а нельзя было стрелочки оставить в индикаторе, сделав так что бы они не перерисовывались ?
Молодой человек, сначала нужно научится чётко ФОРМАЛИЗОВАТЬ свой вопрос.

НО попытаюсь ответить для телепатов:

  • Если Вы скачали индикатор по этой ссылке (правленый мной):
  • оригинальный индикатор перерисовывал стрелочки на последних 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);
                                                }
                                             }
                                          }
                                           
                                          excelf:

                                          стрелочки ваша версия индикатора не рисует. Вот так должна была выглядеть нормальная версия для того что бы с ней работать - тут можно увидеть реальное значение индикатора - стрелочки рисуются при пересечении линии с уровнями 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);
                                          }

                                          А вот и картиночка с "потерянными" стрелочками:


                                           

                                          у меня индикатор, код которого я привел рисует такую картинку, возможно у вас не так ?


                                           
                                          Hog_21:
                                          excelf:

                                          у меня индикатор, код которого я привел рисует такую картинку, возможно у вас не так ?

                                          Да, твой рисует именно так. А у 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 не дано - единичку оставим на "всякое в жизни бывает"). ;)

                                          БЕЗ ПРОБЛЕМ! Готов выслушать конструктивные замечания (ЛЮБОЙ может ошибиться). В программировании исправить ошибку не сложно (было бы желание).
                                          С претензиями к маме с папой.
                                          Моськам - не нужно искать мнимых предлогов - тявкайте себе на здоровье.

                                           
                                          Зафлудили ветку. :( Обновляю ссылку на индикатор. К сожалению модератор по только ему известному "видению сверху" удалил эту ссылку из Примечания\Аннотации к советнику.
                                           
                                          Извините, а что сделать чтобы индикатор был полегче. У меня он терминал вешает почти полностью. Спасибо.
                                          Причина обращения: