Ошибка 10017 Trade disabled

 

Из-за чего данная ошибка возникает. Как ее исправить?

Пишу так:

MqlTradeRequest mtr;

   MqlTradeCheckResult mtcr;

   mtr.magic = magic;

   mtr.action = TRADE_ACTION_DEAL;

   mtr.symbol = Symbol();

   mtr.volume = volume;
 mtr.type = ORDER_TYPE_BUY;
  

   if (OrderCheck(mtr, mtcr))

   {

      MqlTradeResult mTrRs;

      OrderSend(mtr, mTrRs);

   }  
 

Посмотрите в документации коды возвратов торгового сервера - https://www.mql5.com/ru/docs/constants/errorswarnings/enum_trade_return_codes:

Все приказы на совершение торговых операций отправляются в виде структуры торгового запроса MqlTradeRequest с помощью функции OrderSend(). Результат выполнения этой функции помещается в структуру MqlTradeResult, поле retcode которой содержит код возврата торгового сервера.

Код

Идентификатор

Описание

10004

TRADE_RETCODE_REQUOTE

Реквота

10006

TRADE_RETCODE_REJECT

Запрос отвергнут

10007

TRADE_RETCODE_CANCEL

Запрос отменен трейдером

10008

TRADE_RETCODE_PLACED

Ордер размещен

10009

TRADE_RETCODE_DONE

Заявка выполнена

10010

TRADE_RETCODE_DONE_PARTIAL

Заявка выполнена частично

10011

TRADE_RETCODE_ERROR

Ошибка обработки запроса

10012

TRADE_RETCODE_TIMEOUT

Запрос отменен по истечению времени

10013

TRADE_RETCODE_INVALID

Неправильный запрос

10014

TRADE_RETCODE_INVALID_VOLUME

Неправильный объем в запросе

10015

TRADE_RETCODE_INVALID_PRICE

Неправильная цена в запросе

10016

TRADE_RETCODE_INVALID_STOPS

Неправильные стопы в запросе

10017

TRADE_RETCODE_TRADE_DISABLED

Торговля запрещена

Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений / Коды возврата торгового сервера - Документация по MQL5
 

Возникает две ошибок с кодом 10017 и 10027. Как их можно исправить. Автотрейдинг включен советник может торговать. Данная валюта и счет может торговать.

Код

//+------------------------------------------------------------------+
//|                                                    WesTexBot.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include<Trade\SymbolInfo.mqh>
#include<Trade\Trade.mqh>
#include <Trade\AccountInfo.mqh>

input int Magic = 77777;
input double Lots = 0.1;
input int Deviation=10;
input int CountPipsForSetLimit = 20;
input int TPReal = 100;
input int SLReal = 200;
input int TPVirt = 100;
input int SLVirt = 200;
input int Tral = 50;
input int BrakePoint = 50;
enum eTypeLimit {
   Buy_Limit = ORDER_TYPE_BUY_LIMIT,
   Sell_Limit = ORDER_TYPE_SELL_LIMIT
};
input eTypeLimit TypeLimit = Buy_Limit;
input ENUM_ORDER_TYPE_FILLING TypeOrder = ORDER_FILLING_RETURN;
//--- объект для проведения торговых операций
CTrade  trade;

int OnInit()
  {
  //--- объект для работы со счетом
   CAccountInfo account;
   ENUM_ACCOUNT_TRADE_MODE account_type=account.TradeMode();
//--- если счет оказался реальным, прекращаем работу эксперта немедленно!
  //--- выведем тип счета    
   Print("Тип счета: ",EnumToString(account_type));
//--- выясним, можно ли вообще торговать на данном счете
   if(account.TradeAllowed())
      Print("Торговля на данном счете разрешена");
   else
      Print("Торговля на счете запрещена: возможно, вход был совершен по инвест-паролю");
//--- выясним, разрешено ли торговать на счете с помощью эксперта
   if(account.TradeExpert())
      Print("Автоматическая торговля на счете разрешена");
   else
      Print("Запрещена автоматическая торговля с помощью экспертов и скриптов");
//--- допустимое количество ордеров задано или нет
//--- объект для получения свойств символа
   CSymbolInfo symbol_info;
//--- зададим имя символа, для которого будем получать информацию
   symbol_info.Name(_Symbol);
//--- получим текущие котировки и выведем
   symbol_info.RefreshRates();
   //Print(symbol_info.Name()," (",symbol_info.Description(),")","  Bid=",symbol_info.Bid(),"   Ask=",symbol_info.Ask());
//--- получим значения минимальных отступов для торговых операций
   Print("StopsLevel=",symbol_info.StopsLevel()," pips, FreezeLevel=",
         symbol_info.FreezeLevel()," pips");
//--- получим количество знаков после запятой и размер пункта
   Print("Digits=",symbol_info.Digits(),
         ", Point=",DoubleToString(symbol_info.Point(),symbol_info.Digits()));
//--- информация о спреде
   Print("SpreadFloat=",symbol_info.SpreadFloat(),", Spread(текущий)=",
         symbol_info.Spread()," pips");
//--- размер контрактов
   Print("Размер стандартного контракта: ",symbol_info.ContractSize(),
         " (",symbol_info.CurrencyBase(),")");
//--- минимальный, максимальный размеры объема в торговых операциях
   Print("Volume info: LotsMin=",symbol_info.LotsMin(),"  LotsMax=",symbol_info.LotsMax(),
         "  LotsStep=",symbol_info.LotsStep());
   trade.SetExpertMagicNumber(Magic);
//--- установим допустимое проскальзывание в пунктах при совершении покупки/продажи
   trade.SetDeviationInPoints(Deviation);
//--- режим заполнения ордера, нужно использовать тот режим, который разрешается сервером
   trade.SetTypeFilling(TypeOrder);
//--- какую функцию использовать для торговли: true - OrderSendAsync(), false - OrderSend()
   trade.SetAsyncMode(false);
   return(0);
  }

void OnDeinit(const int reason)
  {
   
  }

int GetCountOrder()
{
   int cnt=0;
   int total=PositionsTotal();
   for(int i=0;i<total;i++)
  {
      ulong  position_ticket=PositionGetTicket(i);// тикет позиции
      ulong  mag=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции
      if (mag==Magic) cnt++;
  }
  return cnt;
}

void OnTick()
  {
   //int total=PositionsTotal();
   //if ()
   double volume=Lots;
   string symbol=_Symbol;    // укажем символ, на котором выставляется ордер
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // количество знаков после запятой
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // пункт
   double price=0.0;
   double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
   if (Buy_Limit == TypeLimit) {                                                               
      //price=ask-CountPipsForSetLimit*point;
      price=ask;
   } else {
      //price=bid+CountPipsForSetLimit*point;
      price=bid;
   }
   price=NormalizeDouble(price,digits);                        // нормализуем цену открытия
   double sl=0;                                              // Stop Loss в пунктах
   double tp=0;                                              // Take Profit в пунктах
   ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // тип позиции
   if(type==POSITION_TYPE_BUY)
  {
   sl=NormalizeDouble(bid-SLReal*point,digits);
   tp=NormalizeDouble(ask+TPReal*point,digits);
  }
   else
  {
   sl=NormalizeDouble(ask+SLReal*point,digits);
   tp=NormalizeDouble(bid-TPReal*point,digits);
  }
   datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_CURRENT)*5;
   string comment=StringFormat("Buy Limit %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(price,digits),
                               DoubleToString(sl,digits),
                               DoubleToString(tp,digits));
   bool res=false;
   if (Buy_Limit == TypeLimit) { 
      res=trade.BuyLimit(0.1,price);
      //res=trade.BuyLimit(volume,price,symbol,sl,tp,ORDER_TIME_DAY,expiration,comment);
   } else {
      //res=trade.SellLimit(volume,price,symbol,sl,tp,ORDER_TIME_DAY,expiration,comment);
   }
   if(!res)
     {
      Print("Метод Открытия ордера потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Метод BuyLimit() выполнен успешно. Код возврата=",trade.ResultRetcode(),
            " (",trade.ResultRetcodeDescription(),")");
     }
  }