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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
TraSer
113
TraSer  

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

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

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

Rafail Mukhutdinov
571
Rafail Mukhutdinov  
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
TraSer
113
TraSer  
Rafail Mukhutdinov:

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

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

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

И как потом сделать частичное закрытие ордера?
Vladimir Karputov
Модератор
181888
Vladimir Karputov  
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)
  {
//---

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

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

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

Vladimir Karputov
Модератор
181888
Vladimir Karputov  
TraSer:

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

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

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

            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();

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

Vladimir Karputov
Модератор
181888
Vladimir Karputov  
TraSer:

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

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

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

TraSer
113
TraSer  
Vladimir Karputov:

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

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

Vladimir Karputov
Модератор
181888
Vladimir Karputov  
TraSer:

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

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

TraSer
113
TraSer  
Vladimir Karputov:

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий