Библиотеки: MT4Orders - страница 10

 
Aliaksandr Kryvanos:

не работает выбор по символу и маджику

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

 не работает OrderSelect  не выбирает ордер (тикет по индексу) для работы с ним, простой пример во вложении и он не работает на мт5 почему-то

Ваш код не будет работать и на MT4 так, как хотелось бы. Т.к. в нем ошибка -  задаете своим позициям нулевой мэджик, а сравниваете с другим значением.
OrderSend(Symbol(),OP_BUY, 0.01,Ask, 0, 0,0,"",0,0,clrNONE);
Исправьте свой код на это
OrderSend(Symbol(),OP_BUY, 0.01,Ask, 0, 0,0,"",MagicNumber,0,clrNONE);
Тревога ложная.
 
Спасибо, я извиняюсь, так вышло, что возился с переводом на мт5 версию одного советника, и провозился очень долго, а логика торговли не совпадала, я вроде бы и Magic проверял и всё что могло бы так влиять, в итоге я написал простой пример и он не работал. Но я потом нашёл у себя ошибку, и этот пример выше к ней никакого отношения не имеет. Я хотел удалить своё сообщение но не успел.
 
Aliaksandr Kryvanos:

не работает выбор по символу и маджику

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
}

 не работает OrderSelect  не выбирает ордер (тикет по индексу) для работы с ним, простой пример во вложении и он не работает на мт5 почему-то

Вы магик не задаете в OrderSend
 

Здравствуйте, вот вопрос имеется у меня, как можно получить данные об ошибках при отправке ордеров для МТ5, в МТ4 варианте это выглядит так

bool CloseError = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
if (CloseError == false)
{
  ResetLastError();
  error = GetLastError();
  Print(" CloseOpenedTrades OrderClose failed" + " - ticket=", OrderTicket() + string(error) + ") " + ErrorDescription(error) + " - ticket= ", OrderTicket());
}

код ошибки содержится в структуре MqlTradeResult, я ведь не смогу использовать вышеприведённый код в МТ5, нед доступа к result, как можно модифицировать mt4orders.mqh для возврата ошибок торгового сервера? спасибо

 
Aliaksandr Kryvanos:

Здравствуйте, вот вопрос имеется у меня, как можно получить данные об ошибках при отправке ордеров для МТ5, в МТ4 варианте это выглядит так

bool CloseError = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
if (CloseError == false)
{
  ResetLastError();
  error = GetLastError();
  Print(" CloseOpenedTrades OrderClose failed" + " - ticket=", OrderTicket() + string(error) + ") " + ErrorDescription(error) + " - ticket= ", OrderTicket());
}

код ошибки содержится в структуре MqlTradeResult, я ведь не смогу использовать вышеприведённый код в МТ5, нед доступа к result, как можно модифицировать mt4orders.mqh для возврата ошибок торгового сервера? спасибо

Можно заставить GetLastError возвращать больше значений - дополнить и кодами из MqlTradeResult.
 
Т.е. если произойдёт ошибка при закрытии ордера GetLastError() вернёт код ошибки ( торгового сервера) , даже если мы не будем проверять MqlTradeResult Result; Result.retcode в OrderSend(Request, Result)?
 
Aliaksandr Kryvanos:
Т.е. если произойдёт ошибка при закрытии ордера GetLastError() вернёт код ошибки ( торгового сервера) , даже если мы не будем проверять MqlTradeResult Result; Result.retcode в OrderSend(Request, Result)?

Да, это не сложно реализовать.

Aliaksandr Kryvanos:
bool CloseError = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
if (CloseError == false)
{
  ResetLastError();
  error = GetLastError();
  Print(" CloseOpenedTrades OrderClose failed" + " - ticket=", OrderTicket() + string(error) + ") " + ErrorDescription(error) + " - ticket= ", OrderTicket());
}

 Не понял смысл выделенного.

 
fxsaber:

Да, это не сложно реализовать.

 Не понял смысл выделенного.

так было в советнике для мт4

 

Вы говорите не сложно реализовать, а по факту GetLastError() может вернуть ошибку торгового сервера, если ордер не отправится, без анализа структуры MqlTradeResult.

Просто можно дописать проверку в:

static bool NewOrderSend( const MqlTradeRequest &Request )
  {
    MqlTradeResult Result;
    if (::OrderSend(Request, Result) || Result.retcode != TRADE_RETCODE_DONE)
    {
      Print("OrderSend() error: ", ResultRetcodeDescription(Result.retcode));
      return(false);
    }
    else
    {
      return(true);
    }

    //return(MT4ORDERS::OrderSend(Request, Result) ? Result.retcode < TRADE_RETCODE_ERROR : false);
  }

 но нужно ли так делать, если GetLastError() может и так работать?

 
Aliaksandr Kryvanos:

так было в советнике для мт4

Тогда там ошибка в логике.

Вы говорите не сложно реализовать, а по факту GetLastError() может вернуть ошибку торгового сервера, если ордер не отправится, без анализа структуры MqlTradeResult.

Просто можно дописать проверку в:

static bool NewOrderSend( const MqlTradeRequest &Request )
  {
    MqlTradeResult Result;
    if (::OrderSend(Request, Result) || Result.retcode != TRADE_RETCODE_DONE)
    {
      Print("OrderSend() error: ", ResultRetcodeDescription(Result.retcode));
      return(false);
    }
    else
    {
      return(true);
    }

    //return(MT4ORDERS::OrderSend(Request, Result) ? Result.retcode < TRADE_RETCODE_ERROR : false);
  }

 но нужно ли так делать, если GetLastError() может и так работать?

Не понял Вас. Ваша реализация в if содержит ошибку. Более того, есть еще такое понятие, как TRADE_RETCODE_DONE_PARTIAL - это успешное выполнение OrderSend.

И даже если исправить Ваш код, то он только выведет в журнал сообщение об ошибке (а кто-то еще может не хотеть каждый раз это видеть). Но в MQL оно будет НЕ доступно.

Поэтому вариант, когда GetLastError возвращает и стандартные ошибки времени выполнения и дополнительные коды возврата торгового сервера, видится самым оптимальным.

 
Ясно, а можете натолкнуть на мысль как GetLastError()  заставить выводить и ошибки торгового сервера, я бы написал сам, если у Вас пока нет времени. Спасибо
Причина обращения: