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

 
Alexandr Sokolov #:
Подскажите если кто помнит как называется функция возврата индекса бара когда передаваемым в неё параметром указывается время открытия бара - я забыл и не могу её найти, а комбинации слов Get Index Bar в поисковике не помогают))

... уже не надо, нашел - это iBarShift

 

здравствуйте всем!

по коду сов открывает сделку внутри бара Н1, но по данным с баров М1 (есть сигнал на М1 - открываем)

но если ордер закроется внутри того же бара Н1, то (если есть новый сигнал) откроется еще один ордер внутри того же бара Н1.

Как запретить открытие более одного ордера внутри одного Н1 бара?

я нашел здесь функцию:

//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }}}}}}
  return(iBarShift(sy, tf, t, True));}

вставил в код и  вот так "прицепил":

//---- Процедура открытия ордеров----------------------------------------------------------------------------------------------------------------

    if (!gb_Pause) // Если время работы НЕ подпадает под ограничения, установленные в настройках
    {
        int    NO_orders = 0, li_cmd, li_ind, li_ORD;
        double ld_Price, ld_TP2, ld_PriceBar = iOpen (gs_Symbol, gi_ControlPeriod, 0);
        string lsa_ord[] = {"buy","sell"};
        color  lca_color[] = {Blue,Red};

                   
        //---- Работаем по отдельности с каждым набором настроек
        for (int li_PR = 0; li_PR < cnt_MG; li_PR++)
        {
            //---- Определяем очерёдность исполнения сетов
            if (Use_Prioritity && !gb_first) {li_MG = gia_Priority[li_PR];} else {li_MG = li_PR;}
            
            //---- Нет открытых ордеров по Магику
            if ((gia_MyOrders[li_MG] == 0)&& CountOrders()==0)                      //*************************************ИЗМ
            {
//---- Контролируем на текущем баре открытие только одного ордера------------------------------------------------------------------------------------------------------------
            
                if (cur_Life_min <= gia_LifeStart[li_MG])

                  {
                    for (li_ORD = 0; li_ORD < 2; li_ORD++)              //в этой строке выбирается направление (buy/sell) 0=buy 1=sell,,,
                    {
                        //---- Цена двигается от цены открытия
                        if (li_extrem == li_ORD)
                        {
                            //---- Вычисляем динамически MIN_Distance
                            if (gda_MIN_Distance[li_MG] < 0)
                            {
                                if (gda_MIN_Distance[li_MG] == -1.0)
                                
                                {lda_MIN_Distance[li_MG] = NormalizeDouble (gda_AvarageCandle[0], Digits);} // средний размер тела свечи за последние сутки
                                
                           else if (gda_MIN_Distance[li_MG] == -2.0)
                                
                                {lda_MIN_Distance[li_MG] = NormalizeDouble (gda_AvarageCandle[1] / 2.0, Digits);}//средний размер теней свечи за последние сутки
                            }
                           else {lda_MIN_Distance[li_MG] = gda_MIN_Distance[li_MG];}
                           
                            if (li_ORD == 0) {li_cmd = 1; li_ind = 1;} else {li_cmd = -1; li_ind = 0;}   //li_ORD == 0 - OP_BUY
                            
           //---- Если цена прошла нужную дистанцию вниз-----------------------------------//---- Но не зашла слишком далеко  
          if (li_cmd * (ld_PriceBar - gda_Price[li_ind]) >= lda_MIN_Distance[li_MG]  && li_cmd * (ld_PriceBar - gda_Price[li_ind]) <= lda_MIN_Distance[li_MG] * 2.0)
    //где     li_cmd=1 для  OP_BUY     
    //где               ld_PriceBar - это цена открытия текущ бара Н1!!!
    //где                             gda_Price -массив цен в котором: gda_Price[li_ind = 1] - Bid, gda_Price[li_ind = 0] - Ask
                            {
                //---- Если есть все разрещения - открываем ордер------------------------------------------------------------------------------------------------------------------------------------
                              if ( NumberOfBarOpenLastPos(NULL,0,li_ORD, MG2)!=0  )
                               {
                                if ( gdt_NewBarH1 != gdt_BeginBar_H1)
                                {
                                    li_Ticket1 = 0;
                                    ld_Price = NormalizeDouble (fGet_TradePrice (li_ind, RealTrade, gs_Symbol), Digits);
                                    ld_TP2 = NormalizeDouble (ld_Price + li_cmd * MathMax (gd_TP2, MarketInfo (gs_Symbol, MODE_STOPLEVEL) * Point), Digits);
                                    li_Ticket1  = OrderSend (gs_Symbol, li_ORD, LOT(), ld_Price, Slippage, NormalizeDouble (ld_Price - li_cmd * gd_SL, Digits), ld_TP2, lsa_ord[li_ORD], MG2, 0, lca_color[li_ORD]);  
                                                          //  символ   бай/селл  лот   цена откр проскальз ------------------стоп лосс------------------------   тейк     комментарий   магик срок истеч орд
                                    break;
                                }
                              }  
                           }
                        }
                    }
                }
                else
                {
                    //---- Подсчитываем количество сетов, "отработавших" на этом баре
                    NO_orders++;
                    if (NO_orders == cnt_MG - 1)
            //        {gdt_NewBarControl = ldt_BeginBarControl; return;}
                    continue;
                }
            }
        }
    }
//======================ИЗМ  Удалены строки 537 - 647(правила закрытия ордеров)
}

но что то не работает..

связь между функциями не работает?

где ошибка, подскажите пожалуйста?  


 
законопослушный гражданин #:


Как запретить открытие более одного ордера внутри одного Н1 бара?

идея запоминать время открытия предыдущего ордера не приходило в голову ? 

это один из вопросов намозоливших глаза..

 
Maxim Kuznetsov #:

идея запоминать время открытия предыдущего ордера не приходило в голову ? 

это один из вопросов намозоливших глаза..

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

 
законопослушный гражданин #:

здравствуйте всем!

У бери все что добавил

и пропиши это

  if ( gdt_NewBarH1 != gdt_BeginBar_H1)
  {
      li_Ticket1 = 0;
      ld_Price = NormalizeDouble (fGet_TradePrice (li_ind, RealTrade, gs_Symbol), Digits);
      ld_TP2 = NormalizeDouble (ld_Price + li_cmd * MathMax (gd_TP2, MarketInfo (gs_Symbol, MODE_STOPLEVEL) * Point), Digits);
      li_Ticket1  = OrderSend (gs_Symbol, li_ORD, LOT(), ld_Price, Slippage, NormalizeDouble (ld_Price - li_cmd * gd_SL, Digits), ld_TP2, lsa_ord[li_ORD], MG2, 0, lca_color[li_ORD]);
      gdt_NewBarH1 = gdt_BeginBar_H1; 
      //  символ   бай/селл  лот   цена откр проскальз ------------------стоп лосс------------------------   тейк     комментарий   магик срок истеч орд
      break;
  }
 
Tretyakov Rostyslav #:

У бери все что добавил

и пропиши это

и всё? так просто? спасибо!

 
кто нибудь встречал индикатор, который рисует (полупрозрачным фоном) свечу Д1  на графике М15, М30, Н1?
 
законопослушный гражданин #:
кто нибудь встречал индикатор, который рисует (полупрозрачным фоном) свечу Д1  на графике М15, М30, Н1?
Думаю такого для МТ4 нет
 
Tretyakov Rostyslav #:
Думаю такого для МТ4 нет

Есть, можно на канвасе нарисовать

P.S. Я вроде даже в котобазе встречал
 
Vitaly Muzichenko #:

Есть, можно на канвасе нарисовать

P.S. Я вроде даже в котобазе встречал
Нарисовать можно, но в наличии уже готового я сомневаюсь.
Причина обращения: