Не удаётся выставить ордер

 

Пишу следующий код

MqlTradeResult MTRes;
            MqlTradeRequest MTReq;
            MTReq.action = TRADE_ACTION_DEAL;
            MTReq.order = i;
            MTReq.symbol = Instruments[i].instrument;
            Print("- ", AccountInfoDouble(ACCOUNT_BALANCE), " ", oneLot, " ",
               SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE)," ",
               SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK));
            MTReq.volume = MathFloor((AccountInfoDouble(ACCOUNT_BALANCE)*oneLot)/
               SymbolInfoDouble(Instruments[i].instrument, SYMBOL_TRADE_CONTRACT_SIZE)/
               SymbolInfoDouble(Instruments[i].instrument, SYMBOL_ASK));
            MqlTick m_tick;
            MTReq.price = m_tick.ask;
            MTReq.deviation = 10;
            MTReq.type = ORDER_TYPE_BUY;
            MTReq.type_filling = ORDER_FILLING_FOK; 
            MTReq.type_time = ORDER_TIME_DAY;
            MTReq.magic = i;
            MTReq.position = i;
            MTReq.position_by = i+100;
            if(!OrderSend(MTReq, MTRes)){
               PrintFormat("OrderSend error %d",GetLastError());
            } 


Instruments[22].instrument ранее присвоено "MTLR".

Вижу ошибку

2019.09.30 14:56:06.364 Core 1 2019.01.22 15:30:00   failed exchange buy 1.138K MTLR at market sl: 0.00 tp: 0.00 [Invalid request]

на временном интервале 2019.01.01, 2019.06.01. Начальный депозит 100000 р. Плечо 1/4

Подскажите, пожалуйста, в чём может быть дело?

 
TraSer:

Пишу следующий код


Instruments[22].instrument ранее присвоено "MTLR".

Вижу ошибку

2019.09.30 14:56:06.364 Core 1 2019.01.22 15:30:00   failed exchange buy 1.138K MTLR at market sl: 0.00 tp: 0.00 [Invalid request]

на временном интервале 2019.01.01, 2019.06.01. Начальный депозит 100000 р. Плечо 1/4

Подскажите, пожалуйста, в чём может быть дело?

А не проще воспользоваться стандартной библиотекой

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade

Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTrade - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rafail Mukhutdinov:

А не проще воспользоваться стандартной библиотекой

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade

Тогда ещё вопрос: как быть если мне не нужен ни sl ни tp?

И как потом сделать частичное закрытие ордера?
 
TraSer:

Тогда ещё вопрос: как быть если мне не нужен ни sl ни tp?

Пример: открываем позицию заданного направления (BUY или SELL) заданным объёмом (Lots) - ни Стоп лосс ни Тейк профита нет

//+------------------------------------------------------------------+
//|                                            Open One Position.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
//--- input parameters
input double               InpLots     = 10.0;              // Lots
input ENUM_POSITION_TYPE   InpPosType  = POSITION_TYPE_BUY; // Open position
input ulong                InpMagic    = 208060783;         // Magic number
//---
ulong  ExtSlippage=10;                // Slippage
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(ExtSlippage);
//---
   if(InpPosType==POSITION_TYPE_BUY)
      m_trade.Buy(InpLots);
   else
      if(InpPosType==POSITION_TYPE_SELL)
         m_trade.Sell(InpLots);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---

  }
//+------------------------------------------------------------------+
Файлы:
 
Vladimir Karputov:

Пример: открываем позицию заданного направления (BUY или SELL) заданным объёмом (Lots) - ни Стоп лосс ни Тейк профита нет

Спасибо! Пока вроде всё понятно. )

 
TraSer:

Спасибо! Пока вроде всё понятно. )

Заметьте - я показал наипростейший вариант. 
Что в нем плохого: торговый приказ в OnInit, а не в OnTick; нет проверки «а позиция открылась или нет» и многих других проверок.
 

Опять появился вопрос. Требуется закрыть позицию количеством лот, зависящем от количества открытых лот данной бумаги. Вот код

            CTrade m_trade;
            CSymbolInfo m_symbol;
            m_trade.SetExpertMagicNumber(i);
            m_trade.SetMarginMode();
            m_symbol.Name(Instruments[i].instrument);
            m_trade.SetTypeFillingBySymbol(m_symbol.Name());
            //Print(m_symbol.Name());
            m_trade.SetDeviationInPoints(6);
            //Print(m_trade.Sell(m_trade.RequestVolume(), Instruments[i].instrument),
            //   m_trade.RequestVolume()); 1 вариант
            
            //m_trade.PositionCloseBy(m_trade.RequestPosition(), m_trade.RequestPositionBy());
            // 2 вариант
            
            m_trade.PrintResult();

помогите, пожалуйста.

 
TraSer:

Опять появился вопрос. Требуется закрыть позицию количеством лот, зависящем от количества открытых лот данной бумаги. Вот код

помогите, пожалуйста.

Опишите своими словами, так сколько же нужно закрывать?

 
Vladimir Karputov:

Опишите своими словами, так сколько же нужно закрывать?

В одном случае полностью всю заявку, а в другом 1/5 (во втором случае заявка может быть отправлена несколько раз)

 
TraSer:

В одном случае полностью всю заявку, а в другом 1/5 (во втором случае заявка может быть отправлена несколько раз)

Сначала необходимо посчитать количество (лотов или позиций - тут я Вас не совсем понимаю). После этого применяется частичное закрытие m_trade. PositionClosePartial

 
Vladimir Karputov:

Сначала необходимо посчитать количество (лотов или позиций - тут я Вас не совсем понимаю). После этого применяется частичное закрытие m_trade. PositionClosePartial

Я тестирую робота на демо-счёте брокера "Открытие", и там неттинговый учёт. Речь об округлённом количестве доли в лотах.

Причина обращения: