Domande da un "manichino" - pagina 78

 
Interesting:

Penso che sarebbe più facile rifare l' Expert Advisor o lavorarci sopra con un file.

Penso che sarebbe più facile descrivere in modo completo ciò che vuoi dall'Expert Advisor e fornire tutto il codice creato da VISARD.

Per esempio, ho bisogno di un Expert Advisor che apra i trade incrociando il prezzo di un indicatore Envelopes. Questo è quello che ho ottenuto:

//+------------------------------------------------------------------+
//|                                                    envelopes.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalEnvelopes.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title              ="envelopes"; // Document name
ulong                    Expert_MagicNumber        =28572;       // 
bool                     Expert_EveryTick          =false;       // 
//--- inputs for main signal
input int                Signal_ThresholdOpen      =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose     =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel         =0.0;         // Price level to execute a deal
input double             Signal_StopLevel          =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel          =50.0;        // Take Profit level (in points)
input int                Signal_Expiration         =4;           // Expiration of pending orders (in bars)
input int                Signal_Envelopes_PeriodMA =240;         // Envelopes(240,0,MODE_LWMA,...) Period of averaging
input int                Signal_Envelopes_Shift    =0;           // Envelopes(240,0,MODE_LWMA,...) Time shift
input ENUM_MA_METHOD     Signal_Envelopes_Method   =MODE_LWMA;   // Envelopes(240,0,MODE_LWMA,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_Envelopes_Applied  =PRICE_CLOSE; // Envelopes(240,0,MODE_LWMA,...) Prices series
input double             Signal_Envelopes_Deviation=0.15;        // Envelopes(240,0,MODE_LWMA,...) Deviation
input double             Signal_Envelopes_Weight   =1.0;         // Envelopes(240,0,MODE_LWMA,...) Weight [0...1.0]
//--- inputs for money
input double             Money_FixLot_Percent      =10.0;        // Percent
input double             Money_FixLot_Lots         =0.01;        // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),PERIOD_H4,Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalEnvelopes
   CSignalEnvelopes *filter0=new CSignalEnvelopes;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
   filter0.PatternsUsage(2);
//--- Set filter parameters
   filter0.PeriodMA(Signal_Envelopes_PeriodMA);
   filter0.Shift(Signal_Envelopes_Shift);
   filter0.Method(Signal_Envelopes_Method);
   filter0.Applied(Signal_Envelopes_Applied);
   filter0.Deviation(Signal_Envelopes_Deviation);
   filter0.Weight(Signal_Envelopes_Weight);
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Set trailing parameters
//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(-8);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-9);
     }
//--- ok
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+
 
Compagni sviluppatori, per favore spiegatemi cosa dovrei cambiare nel codice, in modo che dopo un segnale di acquisto/vendita una posizione venga aperta e chiusa una volta e basta, l'Expert Advisor non apre posizioni fino al prossimo segnale. Soprattutto succede quando il sistema è composto da più indicatori. L'Expert Advisor è sempre in posizione. Ne chiude uno al momento della presa o dell'arresto, e ne apre immediatamente un altro.
 

Domanda sugli indicatori.

C'è una tale costruzione di parametri di input in OnCalculate:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
     ...
  }

Tutto questo divertimento è legato strettamente al timeframe corrente, quindi per arrivare ai dati simili di un altro timeframe, si può, per esempio, chiamare l'handle dell'indicatore standard incorporato richiesto sul timeframe desiderato:

handle=iGator(_Symbol, PERIOD_W1);

e poi copiare i dati necessari nei buffer attraverso le variazioni di Copy-functions.

Tutto questo andrebbe bene, ma c'è la necessità di usare tassi_totali e prev_calcolati su tempi diversi da quelli attuali. E non ce ne sono, per quanto ne so. Dove e come possiamo ottenerli se ovviamente non corrispondono al tempo attuale?

Naturalmente, c'è una chiara spiegazione nella guida:

"Dobbiamo notare la relazione tra il valore restituito da OnCalculate() e il secondo parametro di input prev_calculate. Il parametro prev_calculated, quando la funzione viene chiamata, contiene il valorerestituito da OnCalculate() nella chiamata precedente. Questo permette algoritmi economici per il calcolo dell 'indicatore personalizzato al fine di evitare calcoli ripetuti per quelle barre che non sono cambiate dalla precedente chiamata di questa funzione.

Per questo, di solito è sufficiente restituire il valore del parametro rates_total, che contiene il numero di barre nella chiamata di funzione corrente. Se dall'ultima chiamata di OnCalculate() i dati di prezzo sono stati cambiati (è stata pompata una storia più profonda o sono stati riempiti gli spazi vuoti della storia), allora il valore del parametro di input prev_calculate sarà impostato a zero dal terminale".

Quindi, dobbiamo davvero implementare manualmente i nostri analoghi di rates_total e prev_calculated per altri timeframes usando il principio descritto sopra? O c'è qualcosa pronto per essere usato? Beh, per esempio, così:

rates_total = BarsCalculated(handle);
o prendere il valore restituito dalla funzione Copy. Ma con prev_calculato ci sarebbe, per usare un eufemismo, non così facile... Come implementarlo correttamente?
 

Ho letto l'articolo di Rosh sulla matematicasu https://www.mql5.com/ru/articles/1492.

C'è la possibilità di collegare tale analisi per esempio in OnTester() ?

Ci sono soluzioni già pronte e liberamente disponibili?

Математика в трейдинге. Оценка результатов торговых сделок - Статьи по MQL4
  • www.mql5.com
Математика в трейдинге. Оценка результатов торговых сделок - Статьи по MQL4: автоматическая торговля
 
Karlson:

Ho letto l'articolo di Rosh sulla matematicasu https://www.mql5.com/ru/articles/1492.

C'è la possibilità di collegare tale analisi per esempio in OnTester() ?

Ci sono soluzioni già pronte e liberamente disponibili?

Sì - Statistiche di test
 
Grazie.
 

Puoi consigliare?

Ho selezionato una transazione dalla storia, ladirezione della transazione è "pivot" (in/out), poi determino il volume della transazione HistoryDealGetDouble(ticket,DEAL_VOLUME).
Ottengo il volume totale, ma come sapere quale volume ho chiuso e quale aperto? Voglio sapere quale volume ho chiuso e quale volume ho aperto, grazie.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 

Ho scritto una regressione lineare. Avete intenzione di aggiungere una cosa del genere al terminale, e anche di visualizzarla sul grafico nel tester?

E come si è capito per calcolare il conteggio Z è necessario calcolare indipendentemente il numero totale di serie positive e negative?

 
MetaTrader 5 può essere collegato a questo scambiohttps://mtgox.com/ ?
 
Karlson:

E ho anche capito che per calcolare il conteggio Z bisogna calcolare da soli il numero totale di serie positive e negative?

Sì, da solo. Fondamentalmente, posso postare il codice in MQL5 per calcolarlo.
Motivazione: