} //+------------------------------------------------------------------+ //| 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())); } } } //+------------------------------------------------------------------+
여러 Expert Advisors는 서로 다른 창에서 하나의 기기에서 작업해야 합니다.
PositionTotal()이 자신의 위치만 계산하도록 하는 방법이 있습니까? 그런 다음 한 고문 이 포지션을 열 자마자 다른 고문도 이미 포지션에 있다고 믿습니다.
MagicNumber를 다르게 넣어도 도움이 되지 않습니다.
여러 Expert Advisors는 서로 다른 창에서 하나의 기기에서 작업해야 합니다.
PositionTotal()이 자신의 위치만 계산하도록 하는 방법이 있습니까? 그런 다음 한 고문 이 포지션을 열 자마자 다른 고문도 이미 포지션에 있다고 믿습니다.
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 );
}
}
게다가 내가 수동으로 포지션을 청산하자마자 어드바이저는 즉시 이것을 보고 동시에 새로운 포지션을 엽니다. 두 번째가 활성화되지 않은 상태에서 하나가 열리면 두 번째는 더 이상 열리지 않습니다.
여러 Expert Advisors는 서로 다른 창에서 하나의 기기에서 작업해야 합니다.
PositionTotal()이 자신의 위치만 계산하도록 하는 방법이 있습니까? 그런 다음 한 고문 이 포지션을 열 자마자 다른 고문도 이미 포지션에 있다고 믿습니다.
MagicNumber를 다르게 넣어도 도움이 되지 않습니다.
모든 포지션을 거치고 자신의 포지션만 닫는 어드바이저의 예 - 오직 심볼과 매직에 의해서만:
//| 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());
}
//+------------------------------------------------------------------+
추가: 헤지 거래 계정에서 일하고 있기를 바랍니다???
게다가 내가 수동으로 포지션을 청산하자마자 어드바이저는 즉시 새로운 포지션을 엽니다.
그리고 물론, PositionTotal 은 마법이나 다른 것으로 위치를 구별하지 않고 계정에 총계를 제공합니다. 0에서 PositionsTotal() -1까지 위치를 반복하고 마술을 보고 계산해야 합니다.
아, 제가 글을 쓰는 동안, 그들은 그것이 어떻게 되어야 하는지 이미 정확히 보여주었습니다(:여러 Expert Advisors는 서로 다른 창에서 하나의 기기에서 작업해야 합니다.
PositionTotal()이 자신의 위치만 계산하도록 하는 방법이 있습니까? 그런 다음 한 고문 이 포지션을 열 자마자 다른 고문도 이미 포지션에 있다고 믿습니다.
MagicNumber를 다르게 넣어도 도움이 되지 않습니다.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
아니, 헤지가 아닙니다. 따라서 PositionTotal()은 자신의 위치만 고려할 수 없습니까?
이 경우 CTrade 클래스 가 다른 클래스와 별도로 자신의 위치를 고려할 수 있습니까?
아니, 헤지가 아닙니다. 따라서 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()));
}
}
}
//+------------------------------------------------------------------+