Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1105

[Удален]  

Добрый день, уважаемые!

Помогите пожалуйста добавить алерт в индикатор при появлении стрелки с указанием валютной пары.

Сам пробовал, но как говориться трудно не знать и забыть. Заранее спасибо.



#property indicator_chart_window

#property indicator_buffers 4

#property indicator_color1 White

#property indicator_color2 White

#property indicator_color3 LightGreen

#property indicator_color4 Red


extern int CountBars = 300;

extern string FS = " ** Filter sensitivity: High <-[1..3]-> Low ** ";

extern int Sensitivity = 2;

double g_ibuf_92[];

double g_ibuf_96[];

double g_ibuf_100[];

double g_ibuf_104[];

int gi_unused_108 = -1;


int init() {

   IndicatorBuffers(4);

   SetIndexStyle(2, DRAW_ARROW);

   SetIndexArrow(2, 233);

   SetIndexBuffer(2, g_ibuf_92);

   SetIndexStyle(3, DRAW_ARROW);

   SetIndexArrow(3, 234);

   SetIndexBuffer(3, g_ibuf_96);

   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3, White);

   SetIndexBuffer(0, g_ibuf_100);

   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 3, White);

   SetIndexBuffer(1, g_ibuf_104);

   SetIndexEmptyValue(0, 0);

   SetIndexEmptyValue(1, 0);

   SetIndexEmptyValue(2, 0);

   SetIndexEmptyValue(3, 0);

   SetIndexLabel(2, "Buy Signal");

   SetIndexLabel(3, "Sell Signal");

   SetIndexLabel(0, "High");

   SetIndexLabel(1, "Low");

   SetIndexEmptyValue(0, EMPTY_VALUE);

   SetIndexEmptyValue(1, EMPTY_VALUE);

   SetIndexEmptyValue(2, EMPTY_VALUE);

   SetIndexEmptyValue(3, EMPTY_VALUE);

   string ls_0 = "Scalper Signal";

   IndicatorShortName(ls_0);

   if (Sensitivity < 1) Sensitivity = 1;

   if (Sensitivity > 3) Sensitivity = 3;

   return (0);

}


int deinit() {

   return (0);

}


double sellSignal(int ai_0) {

   bool li_4 = TRUE;

   if (Sensitivity > 2)

      if (iHigh(Symbol(), Period(), ai_0 + 6) >= iHigh(Symbol(), Period(), ai_0 + 5)) li_4 = FALSE;

   if (Sensitivity > 1)

      if (iHigh(Symbol(), Period(), ai_0 + 5) >= iHigh(Symbol(), Period(), ai_0 + 4)) li_4 = FALSE;

   if (Sensitivity > 0)

      if (iHigh(Symbol(), Period(), ai_0 + 4) >= iHigh(Symbol(), Period(), ai_0 + 3)) li_4 = FALSE;

   if (li_4) {

      if (iClose(Symbol(), Period(), ai_0 + 2) < iHigh(Symbol(), Period(), ai_0 + 3))

         if (iClose(Symbol(), Period(), ai_0 + 1) < iLow(Symbol(), Period(), ai_0 + 3)) return (iHigh(Symbol(), Period(), ai_0 + 3) + 10.0 * Point);

   }

   return (0);

}


double buySignal(int ai_0) {

   bool li_4 = TRUE;

   if (Sensitivity > 2)

      if (iLow(Symbol(), Period(), ai_0 + 6) <= iLow(Symbol(), Period(), ai_0 + 5)) li_4 = FALSE;

   if (Sensitivity > 1)

      if (iLow(Symbol(), Period(), ai_0 + 5) <= iLow(Symbol(), Period(), ai_0 + 4)) li_4 = FALSE;

   if (Sensitivity > 0)

      if (iLow(Symbol(), Period(), ai_0 + 4) <= iLow(Symbol(), Period(), ai_0 + 3)) li_4 = FALSE;

   if (li_4) {

      if (iClose(Symbol(), Period(), ai_0 + 2) > iLow(Symbol(), Period(), ai_0 + 3))

         if (iClose(Symbol(), Period(), ai_0 + 1) > iHigh(Symbol(), Period(), ai_0 + 3)) return (iLow(Symbol(), Period(), ai_0 + 3) - 10.0 * Point);

   }

   return (0);

}


int start() {

   

   int li_0 = IndicatorCounted();

   if (li_0 < 0) return (-1);

   if (li_0 > 0) li_0--;

   int li_4 = Bars - li_0;

   for (int l_count_8 = 0; l_count_8 < li_4; l_count_8++) {

      g_ibuf_92[l_count_8 + 3] = buySignal(l_count_8);

      g_ibuf_96[l_count_8 + 3] = sellSignal(l_count_8);

      if (buySignal(l_count_8) > 0.0 || sellSignal(l_count_8) > 0.0) {

         g_ibuf_100[l_count_8 + 3] = iHigh(Symbol(), Period(), l_count_8 + 3);

         g_ibuf_104[l_count_8 + 3] = iLow(Symbol(), Period(), l_count_8 + 3);

      }

   }

   return (0);

}

Файлы:
 

Здравствовать копателям.

Какая-то кривизна у меня выходит с определением результата по истории ордеров.

Стратегия:

1-Открываются 2 ордера в разном направлении (лок по-факту) с коротким стопом и длинным профитом.

2-если цена уверенно уходит из диапазона, то она сшибает стоп одного из ордеров, и идёт за длинным профитом по другому ордеру.

3-в момент сшибания стопа одного из ордеров, на уровне его открытия выставляется отложка, и в случае возврата цены, снова открывается ордер

и возвращаемся к состоянию лока до очередного движения к профиту через вышибание короткого стопа.

 Задача:

Отследить 3 вышибания стопа, ибо на 4-ой отложке, включается Мартин. Проблема в том, что что-то идёт не так. Я определяю профитность ордера по истории OrderProfit()-ом,

а вот каким образом работает OrdersHistoryTotal() я так и не понял. То ли функция смотрит порядковый номер, то ли количественный номер ордера, так же не пойму, как она воспринимает

удаление отложки (то ли как убыток то ли никак вовсе). Каким образом отследить 3 последовательных убытка именно вот в такой ситуации, когда в истории помимо убытка есть ещё куча всего другого?

 

 
Fartarantula:

Здравствовать копателям.

Какая-то кривизна у меня выходит с определением результата по истории ордеров.

Стратегия:

1-Открываются 2 ордера в разном направлении (лок по-факту) с коротким стопом и длинным профитом.

2-если цена уверенно уходит из диапазона, то она сшибает стоп одного из ордеров, и идёт за длинным профитом по другому ордеру.

3-в момент сшибания стопа одного из ордеров, на уровне его открытия выставляется отложка, и в случае возврата цены, снова открывается ордер

и возвращаемся к состоянию лока до очередного движения к профиту через вышибание короткого стопа.

 Задача:

Отследить 3 вышибания стопа, ибо на 4-ой отложке, включается Мартин. Проблема в том, что что-то идёт не так. Я определяю профитность ордера по истории OrderProfit()-ом,

а вот каким образом работает OrdersHistoryTotal() я так и не понял. То ли функция смотрит порядковый номер, то ли количественный номер ордера, так же не пойму, как она воспринимает

удаление отложки (то ли как убыток то ли никак вовсе). Каким образом отследить 3 последовательных убытка именно вот в такой ситуации, когда в истории помимо убытка есть ещё куча всего другого?

Первое, что надо запомнить - отложенный ордер не бывает убыточным, он или сработал, или был удален.

Убыток надо смотреть на рыночных ордерах (бай, селл).

OrdersHistoryTotal() возвращает количество ВСЕХ ордеров в доступной истории торговли (включая пополнения и снятия со счёта, если режим отображения "вся история"). Номер 0 обычно - пополнение баланса после открытия счёта, то есть первый ордер; номер OrdersHistoryTotal()-1 - последний ордер в истории.

То есть надо  в цикле перебирать ордера с последнего по первый, попутно считая отложки и убыточные ордера.

Но зачем вообще ставить отложки, если всегда можно дождаться, когда цена опять достигнет уровня закрывшегося по стопу ордера и открыться сразу по рынку? Отложки - лишнее звено в этом случае, вносит путаницу в счёте.

[Удален]  
Fartarantula: Стратегия:

1-Открываются 2 ордера в разном направлении (лок по-факту) с коротким стопом и длинным профитом.

2-если цена уверенно уходит из диапазона, то она сшибает стоп одного из ордеров, и идёт за длинным профитом по другому ордеру.

Посмотрел на Вашу стратегию глазами программиста. Когда цена идет вверх доходит до SL Sell, то остается один ордер Buy со своим SL и где-то там наверху его TP. При этом вы успели получить небольшой убыток от закрытого ордера. А теперь давайте рассмотрим вариант с двумя отложками. Вместо открытия двух ордеров ставим две отложки на тех самых местах, где у Вас стояли SL. Когда цена доходит до Buy Stopl, то открывается ордер на покупку и получается та же самая позиция, но убыток отсутствует. А теперь самое интересное. По мере движения цены вверх ...

 

...А по мере движения цены вверх по вашему принципу, ваш ТП стал дальше. И шансов забрать профит у вас меньше чем у меня, если рассматривать наши действия в моменте.

И даже если не торговать параллельно мне с вами, то ваша опорная цена находится между отложками, а моя по-факту. И это будет всегда-вы дарите рынку часть направленного движения.

Если вы не знаете, то учтите, что даже несчастные 2 пункта спреда делают из положительной системы убыточную.  Судя по первому рисунку, у вас спред около 20 пунктов по 5-тизнаку,

ибо разница между одновременно выставленными ордерами "на глаз" 40 пунктов по рисунку.

Суть не в этом...нужен фрагмент кода, верного выявления серии из 3-ёх выбитых стопов. Зачем каждый норовит скорректировать систему? И методика вышесказанного товарища

тоже не подойдёт. По рынку просто могут не дать открыться, или откроют там где не надо. Блин парни, я всех вас прекрасно понимаю, и ваше желание поделиться опытом. Но мне просто надо отследить 3 стопа.

Всё уже на мази, просто случайно увидел, что проскочил не тот ордер с удвоением. Как оказалось, Хисторитотал выдал всё что посчитал нужным, и цикл определения закрытого ордера по убытку из истории пропустил ордер.

[Удален]  
Fartarantula  Всё уже на мази, просто случайно увидел, что проскочил не тот ордер с удвоением. Как оказалось, Хисторитотал выдал всё что посчитал нужным, и цикл определения закрытого ордера по убытку из истории пропустил ордер.

Надо отходить от квалификации Кодер и постигать азы программирования. Вот здесь подробнее...    И вот тут

Вот задача. Что возвращает, как выразился автор, Хисторитотал в этом скрипте на одном и том же счете в воскресенье.

void OnStart()
{
  Alert("Cчет " + DoubleToStr(AccountNumber(), 0),
        "  Дата ", TimeToStr(TimeLocal(),TIME_DATE),
        "  Ордеров ", OrdersHistoryTotal());
}

  Почему по разному?

Счет один, а ордеров то больше то меньше?  0   228   228   216   98 ?  А ведь если меньше ордеров - обработка быстрее!!!

Клиент потеет - невозможно работать, Терминал глючит, Хисторитотал выдал то, что захотел, цикл взял и пропустил !

 

Добрый день всем. Помогите поднять стрелки в индикаторе, нижние нормально, а верхние поверх свечей.

пробовал ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20); не получилось. Точка привязки стрелки (объекта) вверху, как её сместить вверх?

//display signal arrow 
      RefreshRates(); 
   
      if(   (High[i+1]  >upBuffer[i+1] ) 
         && (Close[i+1] >Open[i+1]     ) 
         && (Close[i]   <Open[i]       ) 
        )            
      {  //draw a dot on top of the bar
         string Arrow_name_jack1 = "AboveTopBand_SellBar_jack1_" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);  //TimeCurrent()
         ObjectCreate(Arrow_name_jack1, OBJ_ARROW, 0, Time[i], High[i]+iATR(NULL,0,20,i)/5);//5*pips);  //OBJ_ARROW=22,window=0,
//???????????? так не получилось         //  ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20);
            ObjectSet(Arrow_name_jack1, OBJPROP_ARROWCODE, 242          );  //159
            ObjectSet(Arrow_name_jack1, OBJPROP_COLOR,     Yellow    );  //Magenta
            ObjectSet(Arrow_name_jack1, OBJPROP_STYLE,     STYLE_SOLID  );
            ObjectSet(Arrow_name_jack1, OBJPROP_WIDTH,     2            ); 
            
      }
      else
      if (   (Low[i+1]   <dnBuffer[i+1] ) 
          && (Close[i+1] <Open[i+1]     ) 
          && (Close[i]   >Open[i]       ) 
         )            
      {  //draw a dot on top of the bar
          Arrow_name_jack1 = "BelowBotBand_BuyBar_jack1_" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);//TimeCurrent()
         ObjectCreate(Arrow_name_jack1, OBJ_ARROW, 0, Time[i], Low[i]-iATR(NULL,0,20,i)/5);//5*pips);  //OBJ_ARROW=22,window=0,
            ObjectSet(Arrow_name_jack1, OBJPROP_ARROWCODE, 241          );//159
            ObjectSet(Arrow_name_jack1, OBJPROP_COLOR,     Yellow   );//Magenta
            ObjectSet(Arrow_name_jack1, OBJPROP_STYLE,     STYLE_SOLID  );
            ObjectSet(Arrow_name_jack1, OBJPROP_WIDTH,     2            ); 
      }
   }//end for(i = limit; i >= 0; i--)
 
mikanit:

Добрый день всем. Помогите поднять стрелки в индикаторе, нижние нормально, а верхние поверх свечей.

пробовал ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20); не получилось. Точка привязки стрелки (объекта) вверху, как её сместить вверх?

ObjectSetInteger(0,Arrow_name_jack1 ,OBJPROP_ANCHOR,ANCHOR_BOTTOM);

Рекомендую использовать отдельные переменные для хранения имён верхней и нижней стрелок, во избежание путаницы.

И да, рисовать стрелки в индикаторе объектами - извращение. Есть же индикаторные буферы:    

SetIndexStyle(0,DRAW_ARROW,0,1,clrRed);

    SetIndexArrow(0,242);



 
evillive:

ObjectSetInteger(0,Arrow_name_jack1 ,OBJPROP_ANCHOR,ANCHOR_BOTTOM);

Рекомендую использовать отдельные переменные для хранения имён верхней и нижней стрелок, во избежание путаницы.

И да, рисовать стрелки в индикаторе объектами - извращение. Есть же индикаторные буферы.

Спасибо, всё работает.

Индикаторные буферы будут оставаться, если условия сигнала индикатора уже отсутствуют? (при перерисовке не должны пропадать старые стрелки))

 
mikanit:

Спасибо, всё работает.

Индикаторные буферы будут оставаться, если условия сигнала индикатора уже отсутствуют? (при перерисовке не должны пропадать старые стрелки))

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

А кому нужен перерисовывающий индикатор? Толку, если объекты останутся, а расчётное значение индикатора - уже не там и появляются всё новые стрелки, захламляя график? 

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