Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 696

 
Treder9:

Всем привет ! мне нужно копировать сделки советника с демо счета на реальный счет так можно сделать?

Чтоб точь в точь как на демо было открылся ордер и там тоже сразу закрылось по тп и там тоже так можно подключить 2 терминала к друг другу или счета 

как сказал Артем выше, будут задержки в любом случае, и это зависит не от копира, который Вы будете использовать, а от исполнения на стороне сервера Вашего брокера. 

Точь в точь - не получится, как бы ВЫ не старались, и какие мегаразумы программистов не подключали к программированию такого копира.  

 
Dmitry Melnichenko:

такой вопрос:

Как обработать событие(если есть), при отключении кнопки "Авто-торговля" в мт5.

К примеру нужно что-бы советник закрывал позы при Отключении авто-торговли! 

раньше такое можно было делать, и многие делали, сейчас к сожалению автоторговля отключает не только событие прихода ТИКА для эксперта, но и собственно запрещает ему торговать. 
 
Vladislav Andruschenko:
раньше такое можно было делать, и многие делали, сейчас к сожалению автоторговля отключает не только событие прихода ТИКА для эксперта, но и собственно запрещает ему торговать. 
Неа, не всё отключает - только торговые приказы. Как программист такое не знает? И вы не первый, кто так пишет на форуме.
 
Vitalie Postolache:
Неа, не всё отключает - только торговые приказы. Как программист такое не знает? И вы не первый, кто так пишет на форуме.

странно, но мне казалось что и при start тики переставали идти? сейчас проверил , даже при отключенной автоторговле - тики идут. 

ХМ.  

 
Vladislav Andruschenko:

странно, но мне казалось что и при start тики переставали идти? сейчас проверил , даже при отключенной автоторговле - тики идут. 

ХМ.  

Вы можете, конечно, продолжать писать start() в своих кодах, вот только компилятор его всё равно заменит на правильный вариант (OnTick() для советника) при компиляции ;)
 
Vitalie Postolache:
Вы можете, конечно, продолжать писать start() в своих кодах, вот только компилятор его всё равно заменит на правильный вариант (OnTick() для советника) при компиляции ;)
Я не пишу старт в  своих кодах. хотя старые коды не менял. они и так прекрасно работают. 
 

Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.

Ситуация такая:

выставляем 2 отложенных ордера в разных направлениях, как только срабатывает один из них, то другой удаляется и больше не выставляется.

Буду очень благодарен за помощь.

Спасибо. 

[Удален]  
yaaarik777:

Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.

Ситуация такая:

выставляем 2 отложенных ордера в разных направлениях, как только срабатывает один из них, то другой удаляется и больше не выставляется.

Буду очень благодарен за помощь.

Спасибо. 

https://docs.mql4.com/ru/trading/orderclose
OrderClose - Торговые функции - Справочник MQL4
OrderClose - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderClose - Торговые функции - Справочник MQL4
 
yaaarik777:

Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.

Ситуация такая:

выставляем 2 отложенных ордера в разных направлениях, как только срабатывает один из них, то другой удаляется и больше не выставляется.

Буду очень благодарен за помощь.

Спасибо. 

Есть несколько путей. Один из них - использование OnTradeTransaction.

В отлавливаем транзакцию 

TRADE_TRANSACTION_DEAL_ADD

Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета. 

и следим, чтобы эта сделка была входом в рынок:

DEAL_ENTRY_IN

Вход в рынок


//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

 

Эта транзакция произойдёт после того, как отложенный ордер сработает и сделка будет записана в историю.

Как только мы словили эту транзакцию, нам останется удалить все оставшиеся отложенные ордера:

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Общий код советника (только здесь я указал магик равный "0" - Вы должны выставить свой магик):

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   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)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+
Файлы:
 

еще вопрос по событию OnDeinit:

такой код работать будет:

void OnDeinit(const int reason)

{

if(reason==REASON_REMOVE)

{

код закрывающий позицию(если есть) 

вообщем нужно узнать возможно-ли закрыть позицию в обработке события OnDeinit