Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 712
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.
Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.
Eu defini números MagicNumbers diferentes, isso não ajuda.
Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.
Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.
Eu defini números MagicNumbers diferentes, isso não ajuda.
Não há milagres. Se os mágicos forem diferentes, os Conselheiros Especialistas devem distinguir as posições. Haverá um código?
O primeiro (um teste, apenas para uma experiência conjunta):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
O segundo (o mesmo, com outro mágico):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Assim que fecho uma posição manualmente, as EAs vêem isto instantaneamente e abrem novas posições - ao mesmo tempo. Se um tiver aberto enquanto o outro não estiver activo, o segundo não abrirá.
Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.
Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.
Estabeleci diferentes números MagicNumbers, mas isso não ajuda.
Exemplo de EA que passa por todas as posições e fecha apenas o seu próprio símbolo e a sua Magia:
//| 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());
}
//+------------------------------------------------------------------+
Adicionado: Espero que esteja a trabalhar numa conta de negociação de cobertura????
E assim que eu fecho uma posição manualmente, os Conselheiros Especialistas abrem imediatamente uma nova posição.
E, claro,PositionsTotal não distingue as posições por número mágico ou qualquer outra coisa, ele dá o número total de posições na conta. Devemos percorrer as posições de 0 aPosiçõesTotal()-1, olhar para o número mágico e contar.
Oh, enquanto eu escrevia, já me mostraram exactamente como o fazer (:Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.
Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.
Eu defini números MagicNumbers diferentes, isso não ajuda.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
Não, não Hedge. Então, PositionTotal() não pode contar apenas as suas próprias posições?
Pode então a classe CTrade considerar as suas próprias posições separadamente das outras?
Não, não Hedge. Então, PositionTotal() não pode contar apenas as suas próprias posições?
E a classe CTrade poderá considerar as suas posições separadamente?
Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos
Número mágico
Vladimir Karputov, 2016.12.25 12:38
Na netting, quem é o último a saber - ou seja, o número mágico de posição será o mesmo que foi na última troca com este instrumento...
Verificação:
//| 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()));
}
}
}
//+------------------------------------------------------------------+