Ошибка 10013 - страница 3

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2017.02.08 14:19

// Скрипт позволяет быстро разобраться, как в MT5 формировать соответствующий MT4-аналогу MqlTradeRequest-запрос в OrderSend.

#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

#include <MT4Orders.mqh>

#define PRINT(A) A; Print(#A + "\n" + ToString(MT4ORDERS::LastTradeRequest) + ToString(MT4ORDERS::LastTradeResult));

void OnStart()
{
  // Открыли позицию
  const int TicketPosition = PRINT(OrderSend(NULL, OP_BUY, 1, SymbolInfoDouble(Symbol(), SYMBOL_ASK), 100, 0, 0, "My Position"))

  if (OrderSelect(TicketPosition, SELECT_BY_TICKET))
  {
    // Установили SL/TP
    PRINT(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - 100 * _Point, OrderOpenPrice() + 100 * _Point, 0))

    // Закрыли позицию
    PRINT(OrderClose(OrderTicket(), OrderLots(), SymbolInfoDouble(Symbol(), SYMBOL_BID), 100))
  }

  // Установили отложенный ордер
  const int TicketOrder = PRINT(OrderSend(NULL, OP_BUYLIMIT, 1, SymbolInfoDouble(Symbol(), SYMBOL_ASK) - 100 * _Point, 100, 0, 0, "My Order"))

  if (OrderSelect(TicketOrder, SELECT_BY_TICKET))
    // Удалили ордер
    PRINT(OrderDelete(OrderTicket()))
}
 
Alexey Volchanskiy:
Так кто мешает? Раз не получается сделать с АПИ, посмотрите, как открывается позиция в СБ. Это займет 2 минуты и не надо писать на форум и ждать помощи ))
Я-то давно разобрался. И ни разу не гундел что плохой язык. А вот в СБ, на мой взгляд, такого нагородили, что лучше туда не заглядывать. Слава Богу, что я узнал о СБ только после того как разобрался с торговыми функциями.

Alexey Volchanskiy:
Советую посмотреть код, который генерят эти мастера. Пойдет только для курсовой работы на 1-2 курсе. ИМХО, нормальные люди это не используют.
Ты намекаешь на то, что барабашка не нормальный? Это он в CodeBase размещает советники написанные мастером mql5.

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

Ошибка 10013 - самая дурная ошибка МТ5. Как удалось выяснить после 3х часов копания в этой проблеме - у некоторых брокеров на одном Мт5 настройки символов в части Symbol Properties TRADE_EXECUTION могут различаться, т.е.у обычных FX-символов вполне может стоять SYMBOL_TRADE_EXECUTION_INSTANT, а у CFD быть может выставлено значение SYMBOL_TRADE_EXECUTION_MARKETЮ, хотя по своей сути этот все тот же Форекс.

Поэтому что бы избежать ошибки 10013 тут нужно использовать вспомогательную функцию

ENUM_ORDER_TYPE_FILLING SetFillingType(string aSymbol)
{
        
        if(mExec==SYMBOL_TRADE_EXECUTION_REQUEST || mExec==SYMBOL_TRADE_EXECUTION_INSTANT)
        {
                return ORDER_FILLING_FOK;
        }
        else
        {
                //--- get possible filling policy types by symbol
                uint filling=(uint)SymbolInfoInteger(aSymbol,SYMBOL_FILLING_MODE);
        
                //--- for the MARKET execution mode
                if(mExec==SYMBOL_TRADE_EXECUTION_MARKET)
                {
                        //--- in case of instant execution order
                        //--- if the required filling policy is supported, add it to the request
                        if((filling & SYMBOL_FILLING_ALL_OR_NONE)!=0)
                        {
                                return ORDER_FILLING_FOK;
                        }
                        else if((filling & SYMBOL_CANCEL_REMAIND)!=0)
                        {
                                return ORDER_FILLING_IOC;
                        }
                }
                //--- EXCHANGE execution mode
                else
                {
                        //--- in case of limit order or instant execution order
                        //--- if the required filling policy is supported, add it to the request
                        if((filling & SYMBOL_FILLING_ALL_OR_NONE)!=0)
                        {
                                return ORDER_FILLING_FOK;
                        }
                        //--- in case of limit order or instant execution order
                        //--- if the required filling policy is supported, add it to the request
                        else if((filling & SYMBOL_CANCEL_REMAIND)!=0)
                        {
                                return ORDER_FILLING_IOC;
                        }
                        else
                        {
                        //--- add filling policy to the request
                                return ORDER_FILLING_RETURN;
                        }
                }
                return ORDER_FILLING_FOK;
        }
        return ORDER_FILLING_FOK;
}
 
Stan Baftalovskiy #:

у некоторых брокеров на одном Мт5 настройки символов в части Symbol Properties TRADE_EXECUTION могут различаться

Просьба написать названия серверов, где такое происходит. Нужно для проверки библиотеки.