Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 151

 
Maxim Kuznetsov:

что-то типа такого :

string level="Level"+IntegerToString(iTime(_Symbol,iBarShift(OrderCloseTime())); // ид.уровня - по времени бара (!! не по тикету)

if (ObjectFind(level)‌==-1) {

  // гор.вектора нет - видимо первый ордер из закрытых на баре

  // сделать горизонтальную линию‌

  ObjectCreate(0,level,OBJ_TREND,0,OrderCloseTime(),OrderClosePrice(),OrderCloseTime()+PeriodSeconds(_Period)*3,OrderClosePrice);

 // указывающую только вправо‌

  ObjectSetInteger(level,‌OBJPROP_RAY,1);

  ObjectSetInteger(level,OBJPROP_RAYLEFT,0);

‌ // украсить её как-то :-)

 ObjectSetInteger(level,OBJPROP_‌COLOR,....)

 ....‌

} else {

  // гор.уровень есть - значит были ордера закрытые на этом баре

  // по фантазии - обновить метки/корректировать уровень/etc‌

}‌

int TotalPos=-1;

void start()
 
{
 // остальной код

//--
  if(OrdersTotal()!=TotalPos) { // не мучаем каждый тик
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      History();

  
     }
  }}} TotalPos=OrdersTotal(); // запомним количество
//--
}
 
 
 
 void History() {
  string Ticket=(string)OrderTicket();
  color col=Red;
  if(OrderType()==0)col=Blue;
  datetime a=OrderOpenTime();
  double b=OrderOpenPrice();
  datetime c=OrderCloseTime();
  double d=OrderClosePrice();
  double prSep=OrderProfit()+OrderCommission()+OrderSwap();
  double prAll=0;
  int    cn=0;
  string hTicket;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;
      }
   }}}
   ObjectCreate(Ticket+"Open",OBJ_ARROW,0,a,b);
   ObjectSet(Ticket+"Open",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Open",OBJPROP_ARROWCODE,1);
     
   ObjectCreate(Ticket+"Line",OBJ_TREND,0,a,b,c,d);
   ObjectSet(Ticket+"Line",OBJPROP_COLOR,col);
   ObjectSet(Ticket+"Line",OBJPROP_WIDTH,1);
   ObjectSet(Ticket+"Line",OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(Ticket+"Line",OBJPROP_RAY,0);
     
   ObjectCreate(Ticket+"Close",OBJ_ARROW,0,c,d);
   ObjectSet(Ticket+"Close",OBJPROP_COLOR,Green);
   ObjectSet(Ticket+"Close",OBJPROP_ARROWCODE,3);
 
   Ticket=cn>1?hTicket:Ticket;
   ObjectCreate(Ticket+"Profit",OBJ_TEXT,0,c,d);
   ObjectSet(Ticket+"Profit",OBJPROP_ANCHOR,0);
   ObjectSetText(Ticket+"Profit",DoubleToString(prAll,2),10,"Arial",White);
   ObjectSet(Ticket+"Profit",OBJPROP_PRICE1,d);
   ObjectSet(Ticket+"Profit",OBJPROP_TIME1,c+Period()*60*2);
}

Использовать вектор  в качестве поиска уровня - это не то.... не подойдет ....((

А что если сделать ход конем)

в поиске уровня  использовать принцип  суммирования профитов  на ценовом уровне запись которого уже есть..

например:  вот мы сделали перебор и сложили профиты с задержкой 60 секунд

 for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
     if(OrderSymbol()==Symbol() && OrderType()<=1) {
      datetime ct=OrderCloseTime();
      // 60 секунд разницы между закрытием первой и последней в сетке
      if(c<=ct+60 && c>=ct-60) {
        prAll+=OrderProfit()+OrderCommission()+OrderSwap();
        hTicket=(string)OrderTicket();
        cn++;

Далее надо придумать запись :

если  количество складываемых профитов на уровне > 1, то это наш ордер - наш уровень, от него  рисуем луч

 

Приветствую.

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

Подскажите, как сделать чтоб для каждого нового ордера создавались отдельные переменные для работы с ними и в последующих циклах?  (Предполагаю что это что-то типа Peremennaja+ticket=12345;)

 
Andrey Sokolov:

Приветствую.

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

Подскажите, как сделать чтоб для каждого нового ордера создавались отдельные переменные для работы с ними и в последующих циклах?  (Предполагаю что это что-то типа Peremennaja+ticket=12345;)

Лучше массив или даже массив структур.
 
Alexey Viktorov:
Лучше массив или даже массив структур.

Извините, а можно подробнее?
 
Andrey Sokolov:

Извините, а можно подробнее?


Здесь и здесь.

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

struct trade_settings
  {
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
   uchar  slippage;     // значение допустимого проскальзывания
  };
//--- создали массив типа trade_settings
trade_settings my_set[];
// присвоить значение нулевому индексу массива в основном коде
my_set[0].take = что_то;
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Структуры и, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL4
 

Здравствуйте.

Помогите, пожалуйста, найти точку пересечения горизонтальной линии “ResisL” и трендовой линии по углуTrndL

TRA
 
Nikolay Fedyay:

Здравствуйте.

Помогите, пожалуйста, найти точку пересечения горизонтальной линии “ResisL” и трендовой линии по углуTrndL

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(double left_bar, double left_price, double right_bar, double right_price, double bar_to_search) {
  return((right_bar==left_bar)?left_price:(right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
}
//+------------------------------------------------------------------+
Зная две точки координат наклонной линии, и вставив их в кач-ве параматров данной функции, на выходе из неё вы получите цену точки на баре bar_to_search. Остаётся лишь в цикле по барам вызывать данную ф-цию и сравнивать значение, возвращаемое ей, с ценой горизонтальной линии. Если на прошлом баре цикла значение, возвращаемое ф-цией, было ниже или равно значению цены горизонтальной линии, а на текущем баре цикла значение, возвращаемое ф-цией, больше цены линии, то координатами точки пересечения по X будет время, соответствующее индексу цикла, а по Y - цена, которую вернула ф-ция.
 
Artyom Trishkin:

Спасибо.

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

 
Nikolay Fedyay:

Спасибо.

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

Этой функцией не пробовал - нужно экспериментировать.

 
Artyom Trishkin:

Этой функцией не пробовал - нужно экспериментировать.

Пожалуйста, если найдёте время для эксперимента, поделитесь результатом.

Потому что, даже не представляю, с чем экспериментировать
.

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