AccountFreeMarginCheck возвращает что то не то, или я не понимаю

 

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

при недостатке средств через такое условие  проходит почему то

      if(IsTradeAllowed() && AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis)>0)
        {
         for(c=0; c<=2; c++)
           {
            RefreshRates();
            Print("Open Sell ,"+c+", margueCheck="+AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis));
            ticket=OrderSend(Symbol(),OP_SELL,lotsis,Bid,SlipPage,0,0,"next",Magic,0,Red);
            e=GetLastError();
            if(e==0)
              {
               per=TimeCurrent();
               break;
              }
            else Print(Translate[Language][34],c+1," ",Bid," str 715 - Next Sell "+Translate[Language][35]+" : ",ErrorDescription(e)+" "+AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis));
           }
        }

в итоге AccountFreeMarginCheck(Symbol(),OP_BUY,lotsib) получается больше нуля (margueCheck=350.452962), но когда отсылается ордер - возвращает что он меньше нуля (это сообщает сам тестер - FreeMargin: -64.87) - я в ступоре

2016.07.24 17:49:13.334 2016.01.06 13:05  RSI_Grabber.1.1 XAUUSD,H1: OrderSend error 134
2016.07.24 17:49:13.334 2016.01.06 13:05  Tester: PrevBalance: 289.78, PrevPL: -78.57, PrevEquity 211.21, PrevMargin: 136.91, NewMargin: 276, FreeMargin: -64.87
2016.07.24 17:49:13.334 2016.01.06 13:05  Tester: not enough money for sell 0.64 XAUUSD at 1087.235 sl: 0.000 tp: 0.000 [2016.01.06 13:05]
2016.07.24 17:49:13.334 2016.01.06 13:05  RSI_Grabber.1.1 XAUUSD,H1: Open Sell ,2, margueCheck=350.452962
 
Yurij Izyumov:

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

при недостатке средств через такое условие  проходит почему то

в итоге AccountFreeMarginCheck(Symbol(),OP_BUY,lotsib) получается больше нуля (margueCheck=350.452962), но когда отсылается ордер - возвращает что он меньше нуля (это сообщает сам тестер - FreeMargin: -64.87) - я в ступоре

Где-то уже было такое, нужно добавить проверку на ошибку 134

if(IsTradeAllowed() && AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis)>0 && _LastError!=134)
 
Vitaly Muzichenko:

Где-то уже было такое, нужно добавить проверку на ошибку 134

Не совсем понял , а что 134 ошибка это не ошибка сто ли ?
 

Недостаточно денег для совершения операции. Где-то обсуждалось на форуме, что первый запрос функция возвращает что-то не то, а вот второй уже норм, если не ошибаюсь)

 

 

Совсем недавно где-то был точно такой же вопрос (не помню где). Ответ с тех пор не изменился - в справке указан правильный способ проверки достаточности средств. Для этого случая код должен быть следующим:

if (AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis)>0 && GetLastError() != 134)
{
 // можно торговать
}
 

Нет я всё равно видимо дурак, подождал всяких обновлений по терминалу, еще раз разбираюсь, хоть тресни

просачивается через условие

if(AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis)>0 && GetLastError()!=134)
        {
        Print(GetLastError());
         for(c=0; c<=2; c++)
           {
            RefreshRates();
            ResetLastError();
            Print(AccountFreeMarginCheck(Symbol(),OP_SELL,lotsis));
            Print(GetLastError());
            if(GetLastError()==134){ return(0); }
            ticket=OrderSend(Symbol(),OP_SELL,lotsis,Bid,SlipPage,0,0,"next",Magic,0,Red);
            e=GetLastError();
            if(e==0)
              {
               break;
              }
            }
        }

 

 и печатает в логе 

сначала при первом Print что ошибок нет = 0, потом пишет при второй проверке что оставшаяся маржа будет больше 0 (11213.3288), и что ошибок опять нет = 0 и все равно хрен там

  RSI_Grabber.1.1 XAUUSD,M30: OrderSend error 134
  Tester: PrevBalance: 10109.50, PrevPL: -5335.00, PrevEquity 4774.50, PrevMargin: 6320.10, NewMargin: 12750, FreeMargin: -7975.30
  Tester: not enough money for sell 25.60 XAUUSD at 1255.800 sl: 0.000 tp: 0.000 [2016.06.08 15:30]
  RSI_Grabber.1.1 XAUUSD,M30: 0
  RSI_Grabber.1.1 XAUUSD,M30: 11213.3288
  RSI_Grabber.1.1 XAUUSD,M30: 0

 Я видимо один такой сверх тупой =) что не могу справиться с такой простой функцией ? пока я вижу что ошибку 134 отправляет только OrderSend но никак не AccountFreeMarginCheck

 
Yurij Izyumov:

Нет я всё равно видимо дурак, подождал всяких обновлений по терминалу, еще раз разбираюсь, хоть тресни

просачивается через условие

 

 и печатает в логе 

сначала при первом Print что ошибок нет = 0, потом пишет при второй проверке что оставшаяся маржа будет больше 0 (11213.3288), и что ошибок опять нет = 0 и все равно хрен там

 Я видимо один такой сверх тупой =) что не могу справиться с такой простой функцией ? пока я вижу что ошибку 134 отправляет только OrderSend но никак не AccountFreeMarginCheck

Заметьте, что значение, возвращаемое функцией GetLastError(), обнуляется после первого вызова. Поэтому первый Print() в коде всегда будет выводить 0. От этой строки проку нет никакого.

Соответственно, последовательность строк:

Print(GetLastError());
if(GetLastError()==134){ return(0); }

 также никогда не приведет к выходу по ошибке. Чтобы получить значение GetLastError() и при этом распечатать его, а затем использовать в сравнении, необходимо кешировать ее значение. Например, так:

int error = GetLastError();
Print("error = ", error);
if (error == ...)
 
Andrey Barinov:

В документации написано иначе.

https://www.mql5.com/ru/docs/check/getlasterror 

А у меня в справке написано обратное )

GetLastError - Проверка состояния - Справочник MQL4
GetLastError - Проверка состояния - Справочник MQL4
  • docs.mql4.com
GetLastError - Проверка состояния - Справочник MQL4
 
Vitaly Muzichenko:

А у меня в справке написано обратное )

Да, я не сразу заметил что тут речь о МТ4 :)
 

Пробовал закешировать, одна фигня

Придется наверно в Сервисдеск написать, пусть пояснят, почему  AccountFreeMarginCheck не возвращает 134 ошибку

 
Yurij Izyumov:

Пробовал закешировать, одна фигня

Придется наверно в Сервисдеск написать, пусть пояснят, почему  AccountFreeMarginCheck не возвращает 134 ошибку

Думаю, что сервисдеск просто покажет ошибку в коде.