Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 697
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.
Ситуация такая:
выставляем 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
Доброго времени знатоки, поделитесь опытом.
Есть массив значений, он отражает некий объект/поле, то есть если стоит задача как то обозначить это объект/поле, то какие возможны действия.
Например будет ли уместным засунуть этот массив в сеть карт Кохонена, если объем массива может достигать тысячи ячеек по х и у?
Может подскажете как засунуть один из двумерных массивов(с большой размерностью) в сеть Кохонена.
И подойдет ли Кохон для анализа - рекурсии массивов(масивы в массиве)
Или возможно кто то поможет поставить правильные вопросы
Есть несколько путей. Один из них - использование 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());
}
//+------------------------------------------------------------------+
Спасибо, но как для MQL4 это оформить? Прошу прощения что не уточнил сразу.
Спасибо, но как для MQL4 это оформить? Прошу прощения что не уточнил сразу.
Почему ловлю ошибку на фондовом и срочном рынке, а на форексе и комодис все нормально?
failed sell limit 1.00 USDRUB_TOM at 63.8679 sl: 63.8829 tp: 63.8329 [Invalid expiration]
Почему ловлю ошибку на фондовом и срочном рынке, а на форексе и комодис все нормально?
failed sell limit 1.00 USDRUB_TOM at 63.8679 sl: 63.8829 tp: 63.8329 [Invalid expiration]
нужно добавить параметр
Здравствуйте коллеги, такой вопрос по mql5:
Как подсчитать профит по позициям(сделкам) открытым сегодня(если позиция была открыта вчера, а закрылась сегодня, то эту позицию в расчет не берем)????
Здравствуйте коллеги, такой вопрос по mql5:
Как подсчитать профит по позициям(сделкам) открытым сегодня(если позиция была открыта вчера, а закрылась сегодня, то эту позицию в расчет не берем)????
Очевидно, сравнивая время открытия позиции с временем начала суток.