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

 

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

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

может кто то подскажет в чем логика?

часть кода, открывающего ордер выглядит так:

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

    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);
        bool   lb_NotMoney = false;
        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)                      //*************************************ИЗМ
            {
//---- Контролируем на текущем баре открытие только одного ордера------------------------------------------------------------------------------------------------------------

                fCalculate_Pribul (li_tmp_HistoryOrders, gia_MG[li_MG], ldt_BeginBarControl);         // если удалить, советник продолжает работать
                
                if (li_tmp_HistoryOrders > 0 || gdt_NewBarControl == ldt_BeginBarControl) {continue;} // пробовал блокировать - на работу не повлияло
                
                if (cur_Life_min <= gia_LifeStart[li_MG])

                  {
                    for (li_ORD = 0; li_ORD < 2; li_ORD++)
                    {
                        //---- Цена двигается от цены открытия
                        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;}
                            //---- Если цена прошла нужную дистанцию вниз
                            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)
                            {
                //---- Если есть все разрещения - открываем ордер------------------------------------------------------------------------------------------------------------------------------------
                //*
                                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;
                }
            }
        }
    }

} 

далее по коду, функции OP_BUY  , OP_SELL 

встречаются еще пару раз, однако по моему, они уже никак не связаны с открытием ордера:

//+-----------------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                            |
//|  Описание : Возвращает наименование торговой операции                             |
//+-----------------------------------------------------------------------------------+
//|  Параметры:                                                                       |
//|    op - идентификатор торговой операции                                           |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
string fGet_NameOP (int op) 
{
//----
    switch (op) 
    {
        case OP_BUY      : return ("BUY");
        case OP_SELL     : return ("SELL");
        case OP_BUYLIMIT : return ("BUYLIMIT");
        case OP_SELLLIMIT: return ("SELLLIMIT");
        case OP_BUYSTOP  : return ("BUYSTOP");
        case OP_SELLSTOP : return ("SELLSTOP");
    }
    return (StringConcatenate ("None (", op, ")"));
//----
}

//+-----------------------------------------------------------------------------------+
//|       Определение стоимости пункта                                                |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_PipsValue()
{
    double ld_Price, ld_TickValue, ld_pips;
//----
    //---- Если ордер закрыт
    if (OrderCloseTime() > 0) {ld_Price = OrderClosePrice();}
    else {if (OrderType() == OP_BUY) {ld_Price = Bid;} else {ld_Price = Ask;}}
    ld_pips = ((OrderOpenPrice() - ld_Price) / Point);
    if (ld_pips == 0) {return (1);}
    ld_TickValue = MathAbs (OrderProfit() / ld_pips);
    if (ld_TickValue == 0) {return (1);}
//----
    return (ld_TickValue);
}
 

Доброго дня всем.

Есть ли какая возможность через MQL получить текстовое значение поля сервер из окна логона?

Спасибо.

 

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

Подскажите пожалуйста как в MQL5 выглядит код, который разрешает или запрещает работу алгоритма в зависимости от времени (часы, минуты), например до 11 утра можно открывать ордера, а после 11 нельзя, MQL4 всё работает, а в MQL5 не получается портировать код.

 
EfremovSergey #:

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

Подскажите пожалуйста как в MQL5 выглядит код, который разрешает или запрещает работу алгоритма в зависимости от времени (часы, минуты), например до 11 утра можно открывать ордера, а после 11 нельзя, MQL4 всё работает, а в MQL5 не получается портировать код.

Здравствуйте, Сергей! Покажите какой код портируете, чтобы Вам смогли помочь.

С уважением, Владимир.

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

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

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

может кто то подскажет в чем логика?

часть кода, открывающего ордер выглядит так:

далее по коду, функции OP_BUY  , OP_SELL 

встречаются еще пару раз, однако по моему, они уже никак не связаны с открытием ордера:


Вот так:

                            //---- Если цена прошла нужную дистанцию вниз
                            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)
 
законопослушный гражданин #:

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

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

может кто то подскажет в чем логика?

часть кода, открывающего ордер выглядит так:

далее по коду, функции OP_BUY  , OP_SELL 

встречаются еще пару раз, однако по моему, они уже никак не связаны с открытием ордера:

Дай весь код чтобы понять
 
PapaYozh #:


Вот так:

И где здесь выбор направления?
 
Tretyakov Rostyslav #:
И где здесь выбор направления?

тут не нужен выбор направления, направление уже выбрано.

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

 
PapaYozh #:

тут не нужен выбор направления, направление уже выбрано.

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

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

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

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

может кто то подскажет в чем логика?


 

А направление выбирается в этой строке:

                    for (li_ORD = 0; li_ORD < 2; li_ORD++)
Причина обращения: