} //+------------------------------------------------------------------+ //| 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がポジションを開く と同時に、他のEAもすでにポジションを持ったとみなします。
別のMagicNumbersを設定しましたが、役に立ちません。
複数のEAが同じ商品で異なるウィンドウで動作する必要があります。
どうにかして、PositionsTotal()が自分のポジションだけをカウントするようにできないでしょうか?しかし、あるEAがポジションを開く と同時に、他のEAもすでにポジションを持ったとみなします。
別のMagicNumbersを設定しましたが、役に立ちません。
奇跡は起きない。マジコンが異なる場合、Expert Advisorはポジションを区別する必要があります。コードはあるのでしょうか?
最初の1枚(共同実験のためだけのテスト用)。
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
2回目(同じもので、別のマジシャンがいる)。
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
私が手動でポジションを閉じると、EAがそれを見て、同時に新しいポジションを開くのです。片方がアクティブでないときにもう片方が開いた場合、2つ目は開きません。
複数のEAが同じ商品で異なるウィンドウで動作する必要があります。
どうにかして、PositionsTotal()が自分のポジションだけをカウントするようにできないでしょうか?しかし、あるEAがポジションを開く と同時に、他の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がポジションを開く と同時に、他のEAもすでにポジションを持ったとみなします。
別のMagicNumbersを設定しましたが、役に立ちません。
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
いいえ、Hedgeではありません。では、PositionTotal()は自分のポジションだけをカウントすることはできないのでしょうか?
その場合、CTradeクラスは 自身のポジションを他と区別して考慮することができますか?
いいえ、Hedgeではありません。では、PositionTotal()は自分のポジションだけをカウントすることはできないのでしょうか?
また、CTradeクラスは、そのポジションを個別に考慮できるようになるのでしょうか?
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
マジックナンバー
ウラジミール・カルプトフ 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()));
}
}
}
//+------------------------------------------------------------------+