Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 983

 

Salve colleghi.

Domanda: In mql4, per calcolare il numero di posizioni, si può scrivere la funzione così

//+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
int OrderCount(int type)
{
  int count = 0;
  for (int trade = OrdersTotal() -1; trade >=0; trade--)
  {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
    {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == type)
      count++;
    }
  }
  return(count);
}

Come è implementato in mql5? Come posso calcolare il numero di posizioni per magik o per tipo?

 
I commenti non relativi a questo argomento sono stati spostati in "Domande dai principianti di MQL4 MT4 MetaTrader 4".
 
Nikita Chernyshov:

Salve colleghi.

Domanda: In mql4, per calcolare il numero di posizioni, si può scrivere la funzione così

Come è implementato in mql5? Come possiamo calcolare il numero di posizioni con un numero magico o con un tipo?

Esempio nel codiceEhlers_CG EA, funzione CalculateAllPositions.

 
Vladimir Karputov:

Esempio nel codiceEhlers_CG EA, funzione CalculateAllPositions.

Grazie mille. Ho cercato di cambiarlo in una forma più comprensibile. Ma restituisce 0 e apre ordini infiniti, per favore consigliatemi, dove ho sbagliato? Non voglio prestare attenzione alla mia idea di trading, voglio solo imparare in generale.


#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo  m_position;                   // trade position object
CTrade         trade;                      // trading object
CSymbolInfo    symbol_info;                     // symbol info object
CAccountInfo   m_account;                    // account info wrapper
CDealInfo      m_deal;                       // deals object
COrderInfo     m_order;                      // pending orders object
CMoneyFixedMargin *m_money;


input double lot = 0.01;
input int    TakeP = 300;
input int    StopL = 300;
input int    Magic = 123;
input int    Slip  = 50;

input int    MA    = 50;

double ma[];
int    handle;
int    digits;
double point;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   handle = iMA(NULL,0,MA,0,MODE_SMA,PRICE_CLOSE);
   
   trade.SetExpertMagicNumber(Magic);
   trade.SetDeviationInPoints(Slip);
   trade.SetTypeFilling(ORDER_FILLING_FOK);
   trade.SetAsyncMode(false);
   
   digits=(int)SymbolInfoInteger(NULL,SYMBOL_DIGITS);
   point=SymbolInfoDouble(NULL,SYMBOL_POINT);
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CopyBuffer(handle,0,0,50,ma);
   ArraySetAsSeries(ma,true); 
   
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);
   
   if(Ask > ma[1] && CalculateAllPositions(POSITION_TYPE_BUY) == 0)
     {
       double tp = NormalizeDouble(Ask+TakeP*point,digits);
       double sl = NormalizeDouble(Ask-StopL*point,digits);
       
       if(!trade.Buy(lot,NULL,Ask,sl,tp))
          {
      //--- сообщим о неудаче
      Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
          } else
               {
                 Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                 " (",trade.ResultRetcodeDescription(),")");
               }
     }
     
   if(Bid < ma[1] && CalculateAllPositions(POSITION_TYPE_SELL) == 0)
     {
       double tp = NormalizeDouble(Bid-TakeP*point,digits);
       double sl = NormalizeDouble(Bid+StopL*point,digits);
       
       if(!trade.Sell(lot,NULL,Bid,sl,tp))
          {
      //--- сообщим о неудаче
      Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
          } else
               {
                 Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                 " (",trade.ResultRetcodeDescription(),")");
               }
     }     
   Comment(CalculateAllPositions(POSITION_TYPE_BUY));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Счетчик ордеров                                                  |
//+------------------------------------------------------------------+
int CalculateAllPositions(const ENUM_POSITION_TYPE type)
  {
   int count=0;   
  
   for(int i=PositionsTotal()-1;i>=0;i--)
      {
      if(m_position.SelectByIndex(i)) 
        {
         if(m_position.Symbol()==NULL && m_position.Magic()==Magic && m_position.PositionType()==type)
         count++;
       }
         
     }
    return(count);
  }
 
Nikita Chernyshov:

Grazie mille. Ho provato a cambiarlo in una forma che ha più senso per me. Ma restituisce 0 e apre ordini infiniti, per favore consigliatemi, dove ho sbagliato? Per favore non prestate attenzione alla mia idea di trading, sto solo cercando di familiarizzare con essa.


Laparola chiave del tuo errore è che non ho scritto tanto codice di verifica nei miei EAs per niente. Hai tralasciato quasi tutti i meccanismi interni, in particolare OnTradeTransaction.

 

Ho affrontato un problema, l'EA basato sull'indicatore funziona correttamente su un conto reale, ma si trova nel tester, in modalità di generazione di tick sia per OHLC che per tutti i tick - il risultato è lo stesso. Il risultato dell'errore è il buffer vuoto dell'indicatore alla barra zero (solo quando c'è una nuova barra al TF superiore, che viene utilizzato per il calcolo dell'indicatore). Tuttavia, sono riuscito a far calcolare l'indicatore aggiungendo Sleep al mio Expert Advisor. Ma ho scoperto che a seconda del modo di generazione dei ticks questo Sleep dovrebbe essere diverso - per la generazione da tutti i ticks Sleep(15000) è sufficiente, mentre per OHLC Sleep(30000) è necessario.

Quindi la domanda sorge - la situazione con Sleep è normale, perché logicamente sembra che lì siano modellati diversi tempi di ritardo a seconda del modo di generazione dei tick!

Cari sviluppatori, vi chiedo di spiegare la situazione con l'indicatore, perché io stesso non riesco a capire quale sia la ragione - un bug nel codice o nel tester!

Sono pronto a dare l'indicatore e l'Expert Advisor nel PM, ma ditemi a chi.

 
Aleksey Vyazmikin:

Ho affrontato un problema, l'EA basato sull'indicatore funziona correttamente sul conto reale, ma si trova nel tester, in modalità di generazione di tick sia per OHLC che per tutti i tick - il risultato è lo stesso. Il risultato dell'errore è il buffer vuoto dell'indicatore alla barra zero (solo quando c'è una nuova barra al TF superiore, che viene utilizzato per il calcolo dell'indicatore). Ma sono riuscito a fare in modo che l'indicatore sia calcolato aggiungendo Sleep, e si è scoperto che a seconda del modo di generazione dei ticks questo Sleep dovrebbe essere diverso - per la generazione da tutti i ticks Sleep(15000) è sufficiente, ma per OHLC Sleep(30000) è necessario.

Quindi la domanda sorge - la situazione con Sleep è normale, perché logicamente risulta che lì sono modellati diversi tempi di ritardo a seconda della modalità di generazione dei tick!

Cari sviluppatori, vi chiedo di spiegare la situazione con l'indicatore, perché io stesso non riesco a capire quale sia la ragione - un bug nel codice o nel tester!

Sono pronto a darti l'indicatore e l'EA nel PM, ma dimmi a chi.

Il sonno non funziona in questo indicatore. Inoltre, viene ignorato anche nell'Expert Advisor, se stiamo parlando del tester.

 
Ihor Herasko:

Il sonno non funziona nell'indicatore. Inoltre, viene ignorato anche nell'Expert Advisor, se stiamo parlando del tester.

Ho già scritto che Sleep è nell'Expert Advisor, e se viene ignorato, e tu ne sei sicuro al 100%, allora questa è una conferma in più che l'errore è nel tester.

Il ritardo può non verificarsi in tempo, ma può essere emulato per il programma.

Aggiunto: Sleep funziona nel tester, ecco un semplice codice che lo conferma

   Print(iClose(Symbol(),PERIOD_CURRENT,0));
   Sleep(15000);
   Print(iClose(Symbol(),PERIOD_CURRENT,0));

Risultato

2019.01.22 08:28:24.661 2019.01.21 23:49:00   66920.0
2019.01.22 08:28:24.661 2019.01.21 23:49:15   66928.0
 
Ihor Herasko:

Il sonno non funziona nell'indicatore. Inoltre, viene ignorato anche nell'EA quando si tratta del tester.

Non lo è.

 
Aleksey Vyazmikin:

Ho già scritto che Sleep è nell'EA, e se viene ignorato, e tu ne sei sicuro al 100%, allora è una conferma in più che l'errore è nel tester.

Il ritardo può non verificarsi in tempo, ma può essere emulato per il programma.

Aggiunto: Sleep funziona nel tester, ecco un semplice codice che lo conferma

Risultato

Questo era originariamente il caso nel tuo post:

Tuttavia, sono riuscito a far leggere l'indicatore aggiungendo Sleep, ed ecco che si è rivelato...

Ecco perché ho reagito a Sleep in the indicator.

E riguardo a Sleep nell'EA, non capisco perché hai dovuto farlo comportare diversamente nel 4 e nel 5. Nel 4, è così:

void OnTick()
{
   Print("Before: ", TimeCurrent());
   Sleep(100000);
   Print("After: ", TimeCurrent());
}
2019.01.22 07:38:19.432 2018.11.08 00:02:05  Test AUDUSD,M5: After: 2018.11.08 00:02:05
2019.01.22 07:38:19.432 2018.11.08 00:02:05  Test AUDUSD,M5: Before: 2018.11.08 00:02:05
Per quanto riguarda il fatto della domanda. Il sonno non dovrebbe avere alcun effetto sul ricalcolo dei dati nell'indicatore. C'è qualcosa che non va nel riempimento del buffer. Forse c'è un pezzo di codice riproducibile?
Motivazione: