Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 712

 

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.

 
dimnik:

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 c'è nessun miracolo. Se i MagicNumbers sono diversi, allora gli Expert Advisors dovrebbero distinguere le posizioni. Avrà il codice?
 
Vitalie Postolache:
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):

#include <Trade\Trade.mqh>

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):

#include <Trade\Trade.mqh>

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ù.

 
dimnik:

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?

 
dimnik:

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 (:
 
dimnik:

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.

PositionsTotal() non filtra per numeri magici. Per questo, dobbiamo passare attraverso le posizioni e calcolare solo le "proprie" posizioni con la nostra funzione.
 


Добавлено: я надеюсь Вы работает на торговом счетё 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?

 
dimnik:

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?

Non ci può essere più di una posizione per ogni simbolo sulla rete. La regola generale si applica a Magic:

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()));
              }
     }
  }
//+------------------------------------------------------------------+



File:
 
I commenti non relativi a questo argomento sono stati spostati in "Domande dai principianti di MQL4 MT4 MetaTrader 4".
 
Puoi dirmi come scoprire il risultato dell'ultimo o più trade?
Motivazione: