} //+------------------------------------------------------------------+ //| 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()); } //+------------------------------------------------------------------+
//--- определяем, что открывать: Buy или Sell if(MathRand()%2==0) // значит Buy { m_trade.Buy(lots); } else// значит Sell { m_trade.Sell(lots); } } counter++; } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ voidOnTradeTransaction(constMqlTradeTransaction &trans, constMqlTradeRequest &request, constMqlTradeResult &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())); } } } //+------------------------------------------------------------------+
几个EA必须在同一个工具上的不同窗口工作。
我们能否以某种方式让PositionsTotal()只计算我们自己的头寸?但只要有一家EA开仓,其他的也会认为他们已经开仓了。
我设置了不同的MagicNumbers,但没有任何帮助。
几个EA必须在同一个工具上的不同窗口工作。
我们能否以某种方式让PositionsTotal()只计算我们自己的头寸?但只要有一个EA开仓,其他的也会认为他们已经开仓了。
我设置了不同的MagicNumbers,但没有任何帮助。
没有奇迹。如果魔术师是不同的,专家顾问应该区分位置。会不会有一个代码?
第一个(一个测试的,只是为了联合实验)。
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);
}
}
只要我手动关闭一个头寸,EA就会立即看到这一点,并打开新的头寸--在同一时间。如果一个已经打开,而另一个没有激活,第二个将不会打开。
几个EA必须在同一个工具上的不同窗口工作。
我们能否以某种方式让PositionsTotal()只计算我们自己的头寸?但只要有一家EA开仓,其他的也会认为他们已经开仓了。
我设置了不同的MagicNumbers,但这并没有帮助。
例子EA,通过所有的头寸,只关闭自己的符号和它的魔法。
//| 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());
}
//+------------------------------------------------------------------+
补充:我希望你是在做一个对冲交易账户?
而且,只要我手动关闭一个头寸,专家顾问系统就会立即打开一个新的头寸。
当然,PositionsTotal 并不以神奇数字或其他东西来区分头寸,它给出了账户中的头寸总数。 我们应该循环浏览从0到PositionsTotal()-1的 位置,查看神奇数字并计数。
哦,当我在写的时候,他们已经向我展示了具体的方法(。几个EA必须在同一个工具上的不同窗口工作。
我们能否以某种方式使PositionsTotal()只计算我们自己的头寸?但只要有一家EA开仓,其他的也会认为他们已经开仓了。
我设置了不同的MagicNumbers,但没有任何帮助。
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
不,不是Hedge。那么,PositionTotal()不能只计算自己的位置?
那么CTrade类 能否将其头寸与其他头寸分开考虑?
不,不是Hedge。那么,PositionTotal()不能只计算自己的位置?
而CTrade类 将能够单独考虑其头寸?
关于交易、自动交易系统和策略测试的论坛
神奇的数字
Vladimir Karputov, 2016.12.25 12:38
在净值方面,谁是最后一个知道的人--即神奇的头寸数量将与该工具最后一次交易时相同......
检查。
//| 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()));
}
}
}
//+------------------------------------------------------------------+