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

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

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

проблема нарисовалась.

сов открывает одновременно пару ордеров в попутном направлении (тейки разные)

при тестировании сова на демо в реал тайм выяснилось, что один из пары ордеров не открывается "ошибка 129 invalid price"

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

сегодня на одном счете  "проблемного" брокера увеличил Slipage с 2 до 20.- буду посмотреть.

Кто нибудь сталкивался с такой проблемой? в чем может быть причина?

робот тормозит..пока он решает что и как сделать, цена убегает и вот вам invalid price

ещё при вычислениях может получаться ненормализованная (неправильная) цена, её надо приводить в порядок при отправке приказа. (Честно, не помню какой там код ошибки - это уже на автомате делаю)

PS/ наступание на ошибки "invalid price, no price, offquotes, requote" это хороший признак - разворот и эффективная торговля где-то рядом

 
Maxim Kuznetsov #:

робот тормозит..пока он решает что и как сделать, цена убегает и вот вам invalid price

ещё при вычислениях может получаться ненормализованная (неправильная) цена, её надо приводить в порядок при отправке приказа. (Честно, не помню какой там код ошибки - это уже на автомате делаю)

PS/ наступание на ошибки "invalid price, no price, offquotes, requote" это хороший признак - разворот и эффективная торговля где-то рядом

хм.. спасибо. 

 

Alexey Viktorov #:
Slipage уже давно не работает. Наверное лучше обновлять котировки перед второй попыткой открытия.

в сове (он не мой/автор не доступен) цены для торговли получаются следующим образом:

//+-----------------------------------------------------------------------------------+
//|  Описание : Запускаем в цикл получение рыночной цены.                             |
//+-----------------------------------------------------------------------------------+
//|  Параметры:                                                                       |
//|    iPrice : 0 - Bid; 1 - Ask                                                      |
//|    isTrade: реальная торговля или оптимизация\тестирование                        |
//|    Symb   : валютная пара                                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_TradePrice (
    int iPrice,
    bool isTrade,
    string Symb = "")
//+...................................................................................+
{
    double ld_Price = 0.0;
//----
    if (Symb == "") {Symb = Symbol();}
    RefreshRates();
    switch (iPrice)
    {
        case 0:
            if (isTrade)
            {
                while (ld_Price == 0.0)
                {
                    if (Symb == Symbol()) {ld_Price = Bid;} else {ld_Price = MarketInfo (Symb, MODE_BID);}
                    if (!IsExpertEnabled() || IsStopped()) {break;}
                    Sleep (300); RefreshRates();
                }
            }
            else {if (Symb == Symbol()) {return (Bid);} else {return (MarketInfo (Symb, MODE_BID));}}
            break;
        case 1:
            if (isTrade)
            {
                while (ld_Price == 0.0)
                {
                    if (Symb == Symbol()) {ld_Price = Ask;} else {ld_Price = MarketInfo (Symb, MODE_ASK);}
                    if (!IsExpertEnabled() || IsStopped()) {break;}
                    Sleep (300); RefreshRates();
                }
            }
            else {if (Symb == Symbol()) {return (Ask);} else {return (MarketInfo (Symb, MODE_ASK));}}
            break;
    }
//----
    return (ld_Price);
}

и далее

:

//+-----------------------------------------------------------------------------------+
//|  Описание : Получаем цены, с которыми будет работать советник                     |
//+-----------------------------------------------------------------------------------+
//|  Параметры:                                                                       |
//|    ar_Price[]        : ar_Price[0] - Bid; ar_Price[1] - Ask                       |
//|    fi_VariantPrice   : 0 - Bid\Ask; 1 - Open[0]; 2 - Close [1]; 3 - Close[0]      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MineTradePrice (
    int fi_VariantPrice,
    double& ar_Price[])
//+...................................................................................+
{
    double ld_Price;
    static datetime ldt_NewBar;
//----
    gd_RealSPREAD = MarketInfo (gs_Symbol, MODE_SPREAD) * Point;
    switch (fi_VariantPrice)
    {
        case 0: 
            RefreshRates();
            ld_Price = fGet_TradePrice (0, RealTrade, gs_Symbol);
            break;
        case 1: ld_Price = Open[0]; break;
        case 2: ld_Price = Close[1]; break;
        case 3: ld_Price = Close[0]; break;
        case 4: ld_Price = iOpen (gs_Symbol, gi_CTRL_TF, 0); break;
        case 5: 
            ar_Price[0] = iHigh (gs_Symbol, gi_CTRL_TF, 1);
            ar_Price[1] = iLow (gs_Symbol, gi_CTRL_TF, 1);
            return;
        case 6: 
            ar_Price[0] = iHigh (gs_Symbol, gi_CTRL_TF, 0);
            ar_Price[1] = iLow (gs_Symbol, gi_CTRL_TF, 0);
            return;
        case 7: 
            ar_Price[0] = iHigh (gs_Symbol, 1, 1);
            ar_Price[1] = iLow (gs_Symbol, 1, 1);
            return;
    }
    ar_Price[0] = ld_Price;
    ar_Price[1] = NormalizeDouble (ld_Price + gd_RealSPREAD, Digits);
    double ld_Ask = fGet_TradePrice (1, RealTrade, gs_Symbol);
    //---- Сверяем соответствие формирования Ask
    if ((gd_RealSPREAD == 0.0 || NormalizeDouble (ld_Ask - ar_Price[1], Digits) > 0.0) && RealTrade)
    {
        if (ldt_NewBar != gdt_BeginBar_H1)
        {
            Print ("Attention: Price[Bid] = ", DoubleToStr (ar_Price[0], Digits), 
            " | Price[Bid+spread] = ", DoubleToStr (ar_Price[1], Digits), " | Ask = ", DoubleToStr (ld_Ask, Digits),
            " | spread = ", DoubleToStr (gd_RealSPREAD / Point, 0));
            ldt_NewBar = gdt_BeginBar_H1;
        }
        if (ld_Ask > 0.0)
        {ar_Price[1] = ld_Ask;}
    }
//----
}

как я понимаю, функция RefreshRates() -отвечает за обновление данных и получение актуальных BID / ASK.

Правильно? Может быть Sleep (300) - слишком большая задержка?

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

в сове (он не мой/автор не доступен) цены для торговли получаются следующим образом:

и далее

:

как я понимаю, функция RefreshRates() -отвечает за обновление данных и получение актуальных BID / ASK.

Правильно? Может быть Sleep (300) - слишком большая задержка?

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

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

в сове (он не мой/автор не доступен) цены для торговли получаются следующим образом:

и далее

:

как я понимаю, функция RefreshRates() -отвечает за обновление данных и получение актуальных BID / ASK.

Правильно? Может быть Sleep (300) - слишком большая задержка?

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

или 

Sleep ((TerminalInfoInteger(TERMINAL_PING_LAST)/1000)*3)
 
Volodymyr Zubov #:

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

или 

спасибо. попробую.

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

спасибо. попробую.

Я бы вообще Sleep не использовал - в советнике это зло.
 
Tretyakov Rostyslav #:
Я бы вообще Sleep не использовал - в советнике это зло.

а,что его  можно безболезненно удалить? 

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

а,что его  можно безболезненно удалить? 

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

а,что его  можно безболезненно удалить? 

Попробуй заменить на это

//+-----------------------------------------------------------------------------------+
//|  Описание : Запускаем в цикл получение рыночной цены.                             |
//+-----------------------------------------------------------------------------------+
//|  Параметры:                                                                       |
//|    iPrice : 0 - Bid; 1 - Ask                                                      |
//|    isTrade: реальная торговля или оптимизация\тестирование                        |
//|    Symb   : валютная пара                                                         |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_TradePrice ( int iPrice, bool isTrade, string Symb = "")
  {
   double ld_Price = 0.0;
//----
   if (Symb == "") {Symb = Symbol();}
   RefreshRates();
   if(iPrice==0)
      `ld_Price = MarketInfo (Symb, MODE_BID);}
   if(iPrice==1)
      `ld_Price = MarketInfo (Symb, MODE_ASK);}
//----
   return (ld_Price);
  }
Причина обращения: