Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 712
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Diversi EAs devono lavorare in diverse finestre sullo stesso strumento.
Possiamo in qualche modo fare in modo che PositionsTotal() conti solo le nostre posizioni? Ma non appena un EA apre una posizione, anche gli altri considerano che sono già in posizione.
Ho impostato diversi MagicNumbers, ma non aiuta.
Diversi EAs devono lavorare in diverse finestre sullo stesso strumento.
Possiamo in qualche modo fare in modo che PositionsTotal() conti solo le nostre posizioni? Ma non appena un EA apre una posizione, anche gli altri considerano che sono già in posizione.
Ho impostato diversi MagicNumbers, ma non aiuta.
Non ci sono miracoli. Se i maghi sono diversi, gli Expert Advisors dovrebbero distinguere le posizioni. Ci sarà un codice?
La prima (una prova, solo per un esperimento comune):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Il secondo (lo stesso, con un altro mago):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Non appena chiudo una posizione manualmente, gli EAs lo vedono immediatamente e ne aprono di nuove - allo stesso tempo. Se uno si è aperto mentre l'altro non è attivo, il secondo non si apre più.
Diversi EAs devono lavorare in diverse finestre sullo stesso strumento.
Possiamo in qualche modo fare in modo che PositionsTotal() conti solo le nostre posizioni? Ma non appena un EA apre una posizione, anche gli altri considerano che sono già in posizione.
Ho impostato diversi MagicNumbers, ma questo non aiuta.
Esempio di EA che passa attraverso tutte le posizioni e chiude solo il proprio simbolo e il suo 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());
}
//+------------------------------------------------------------------+
Aggiunto: spero che tu stia lavorando su un conto di hedge trading?
E non appena chiudo una posizione manualmente, gli Expert Advisors ne aprono immediatamente una nuova.
E, naturalmente,PositionsTotal non distingue le posizioni per numero magico o altro, dà il numero totale di posizioni nel conto. Dovremmo fare un ciclo attraverso le posizioni da 0 aPositionsTotal()-1, guardare il numero magico e contare.
Oh, mentre scrivevo, mi hanno già mostrato esattamente come farlo (:Diversi EAs devono lavorare in diverse finestre sullo stesso strumento.
Possiamo in qualche modo fare in modo che PositionsTotal() conti solo le nostre posizioni? Ma non appena un EA apre una posizione, anche gli altri considerano che sono già in posizione.
Ho impostato diversi MagicNumbers, ma non aiuta.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
No, non Hedge. Quindi, PositionTotal() non può contare solo le proprie posizioni?
La classe CTrade può quindi considerare le proprie posizioni separatamente dalle altre?
No, non Hedge. Quindi, PositionTotal() non può contare solo le proprie posizioni?
E la classe CTrade sarà in grado di considerare le sue posizioni separatamente?
Forum sul trading, sistemi di trading automatico e test di strategia
Numero magico
Vladimir Karputov, 2016.12.25 12:38
Sul netting, chi è l'ultimo a saperlo - cioè il numero magico della posizione sarà lo stesso che era sull'ultimo trade con questo strumento...
Controllo:
//| 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()));
}
}
}
//+------------------------------------------------------------------+