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

 
shtr:

Ого!!! Спасибо! Это требует осмысления. 

Может где-нибудь есть "самоучитель" по новым правилам?  4-х значный номер страницы немного напрягает...

А кому щас легко... В архиве ещё 5 таких тем про новичков )))

Если честно, примеров из справки и кодобазы вполне достаточно, если уже есть опыт программирования, желательно на С++. Если опыта совсем нет, тогда можно поизучать учебник С++ сначала, MQL  очень похож по синтаксису.

 
evillive:

А кому щас легко... В архиве ещё 5 таких тем про новичков )))

Если честно, примеров из справки и кодобазы вполне достаточно, если уже есть опыт программирования, желательно на С++. Если опыта совсем нет, тогда можно поизучать учебник С++ сначала, MQL  очень похож по синтаксису.

  string Опыта нет = учебник С++; )))

Благодарю вас за помощь! 

 

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

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

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



#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);



Причина обращения: