Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 712
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
На одном инструменте в разных окнах должно работать несколько советников.
Можно ли как-то сделать так, чтобы PositionsTotal() считал только свои позиции? А то как только один советник открывает позицию, другие тоже считают, что уже в позиции.
MagicNumber поставил разные, не помогает.
На одном инструменте в разных окнах должно работать несколько советников.
Можно ли как-то сделать так, чтобы PositionsTotal() считал только свои позиции? А то как только один советник открывает позицию, другие тоже считают, что уже в позиции.
MagicNumber поставил разные, не помогает.
Чудес не бывает. Раз магики разные, то и позиции различать советникик должны. Код будет?
Первый (тестовый, именно для совместного эксперимента):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Второй (такой же, с другим магиком):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Причем, как только позицию закрываю вручную, советники моментально видят это и открывают новые - одновременно. Если один открылся, пока второй не активен - второй уже не открывается.
На одном инструменте в разных окнах должно работать несколько советников.
Можно ли как-то сделать так, чтобы PositionsTotal() считал только свои позиции? А то как только один советник открывает позицию, другие тоже считают, что уже в позиции.
MagicNumber поставил разные, не помогает.
Пример советника, который перебирает все позиции и закрывает только СВОИ - только по своему символу и своему Magic:
//| CloseALL.mq5 |
//| Copyright © 2017, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
CTrade m_trade; // trading object
CPositionInfo m_position; // trade position object
//--- input parameter
input ulong m_magic=159753698; // magic number
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
CloseAll();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Close All |
//+------------------------------------------------------------------+
void CloseAll()
{
Print(__FUNCTION__);
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
m_trade.PositionClose(m_position.Ticket());
}
//+------------------------------------------------------------------+
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
Причем, как только позицию закрываю вручную, советники моментально открывают новую.
А, ну так конечно же, PositionsTotal не различает позиции по магику или ещё как-то, она выдаёт общее их количество на счёте. Надо в цикле перебирать позиции от 0 до PositionsTotal()-1, смотреть магик и считать.
О, пока писал, уже и показали как именно надо (:На одном инструменте в разных окнах должно работать несколько советников.
Можно ли как-то сделать так, чтобы PositionsTotal() считал только свои позиции? А то как только один советник открывает позицию, другие тоже считают, что уже в позиции.
MagicNumber поставил разные, не помогает.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
Нет, не Hedge. Значит, PositionTotal() не сможет учитывать только свои позиции?
А класс CTrade в таком случае сможет учитывать свои позиции отдельно от других?
Нет, не Hedge. Значит, PositionTotal() не сможет учитывать только свои позиции?
А класс CTrade в таком случае сможет учитывать свои позиции отдельно от других?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Magic number
Vladimir Karputov, 2016.12.25 12:38
На netting кто последний того и тапки - то есть magic у позиции будет такой, какой был у последней сделки по этому инструменту..
Проверяем:
//| ReplacementMagic.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"
#property description "Что происходит с magic на netting"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo m_position; // trade position object
CTrade m_trade; // trading object
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
Print("Этот пример только для netting!");
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
static int counter=-10;
if(counter%300==0)
{
//--- генерируем Magic
ulong m_magic=MathRand();
Print("new Magic: ",IntegerToString(m_magic));
//--- устанавливаем новый Magic
m_trade.SetExpertMagicNumber(m_magic);
//--- определим лот
double lots=0.0;
if(MathRand()%2==0)
lots=0.01;
else
lots=0.02;
//--- определяем, что открывать: Buy или Sell
if(MathRand()%2==0) // значит Buy
{
m_trade.Buy(lots);
}
else // значит Sell
{
m_trade.Sell(lots);
}
}
counter++;
}
//+------------------------------------------------------------------+
//| 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)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol())
{
//string text=ChartGetString(0,CHART_COMMENT)+"\n"+
// "Magic: "+IntegerToString(m_position.Magic());
//Comment(text);
Print("Обнаружена позиция с Magic: "+IntegerToString(m_position.Magic()));
}
}
}
//+------------------------------------------------------------------+