Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1516

 
MakarFX

Grazie per la risposta, stampella e non una cattiva soluzione, ma per quanto riguarda la mia idea funziona un po' male, perché il saldo è fluttuante, probabilmente non lo fa istantaneamente e in alcuni casi i miei ordini hanno iniziato a chiudere con meno per qualche motivo. Ma la crescita è stata come dovrebbe essere, ma è aumentato anche il drawdown con quelle minus. Ho rinunciato a tutto e ho deciso di impostare manualmente i limiti di pullback, in modo da doverli regolare quotidianamente.

 
Порт-моне тв:

Grazie per la risposta, stampella e non una cattiva soluzione, ma per quanto riguarda la mia idea funziona un po' male, perché il saldo è fluttuante, probabilmente non lo fa istantaneamente e in alcuni casi i miei ordini hanno iniziato a chiudere con meno per qualche motivo. Ma la crescita è stata come dovrebbe essere, ma è aumentato anche il drawdown con quelle minus. Ho deciso di rinunciare e di impostare manualmente i limiti di trading e di doverli regolare quotidianamente.

La funzione funziona correttamente.

Prova così

//+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0;
   if(AccountBalance()>0) {b = AccountBalance()-DayProfit();}
   return(b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0; datetime st=iTime(_Symbol,PERIOD_D1,0);
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol() == _Symbol)
           { 
            if(OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return(p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

e aggiungere l'aggiornamento del saldo alla funzione di chiusura dell'ordine

   if(OrderClose(бла бла бла))
     {
      StartBalance(); Print("Order Close");
     }
 
Maxim Kuznetsov:

catturare il cambiamento del giorno e calcolare il valore del saldo in quel momento.

Non per niente hanno detto "prendi l'indicatore giusto" - non ci sta in un paio di righe di codice. È un algoritmo abbastanza capiente.

catturare il cambiamento del giorno è facile, "il numero del giorno conosciuto non è uguale al numero del giorno prima", ma oltre è difficile


Alg. "calcola il saldo al momento D" (esclusi i prelievi/riempimenti e qualche bug su swap e commissioni)

Saldo:=saldo del conto corrente. Questo è AccountBalance().

Per tutti gli ordini di mercato chiusi nella storia:

se il tempo di chiusura cade tra D e corrente, Balance -= OrderProfit()+OrderSwap()+OrderCommision();

al completamento dell'enumerazione, il Saldo è il valore desiderato...

MA, la commissione viene addebitata (cioè incide sulla linea di bilancio) all'apertura, e la prendiamo in considerazione alla chiusura e gli swap vengono presi al cambio del giorno, e la prenderemo di nuovo in considerazione solo alla chiusura

e in caso di grande profondità D, c'è la possibilità di non ottenere tutti gli ordini richiesti in un overshoot

 
Порт-моне тв:

Grazie per la risposta, stampella e non una cattiva soluzione, ma per quanto riguarda la mia idea funziona un po' male, perché il saldo è fluttuante, probabilmente non lo fa istantaneamente e in alcuni casi i miei ordini hanno iniziato a chiudere con meno per qualche motivo. Ma la crescita è stata come dovrebbe essere, ma è aumentato anche il drawdown con quelle minus. Ho rinunciato e ho deciso di impostare manualmente i limiti di trading e ho dovuto regolarli quotidianamente.

Sono già perso nei vostri suggerimenti e consigli, quindi forse il mio consiglio è completamente fuori tema, ma scusate...

Capisco di cosa ho bisogno all'inizio della giornata per fissare il saldo e per il giorno per contare il profitto/perdita in base al quale devo prendere una decisione se continuare il trading...

Quindi ecco la decisione

datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if(dayTime != iTime(_Symbol, PERIOD_D1, 0);
 {
  dayBalance = AccountInfoDouble(ACCOUNT_BALANCE));
  dayTime = iTime(_Symbol, PERIOD_D1, 0);
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

Se l'Expert Advisor sarà riavviato durante il giorno, si dovrebbe considerare il calcolo dei profitti/perdite degli ordini di oggi tenendo conto degli swap e delle commissioni e calcolare il saldo di inizio giornata in OnInit().

Credo nelle capacità di Makar, può mostrare tutto questo già nel codice...

 

Salve. Potete dirmi come determinare il numero della barra attuale dall'inizio della giornata?

Come faccio a determinare il numero della barra attuale dall'inizio della giornata?

Grazie.

 
prom18:

Salve. Potete dirmi come determinare il numero della barra attuale dall'inizio della giornata?

Come faccio a determinare il numero della barra attuale dall'inizio della giornata?

Grazie.

      double BarNumber=NormalizeDouble((TimeCurrent()-iTime(_Symbol,PERIOD_D1,0))/60/Period()+0.5,0);

questa è la barra corrente, se l'ultima barra ha chiuso, allora -0,5

 
MakarFX:

è la barra corrente, se l'ultima barra ha chiuso, allora -0,5

Grazie. Farò un tentativo.

 
MakarFX:

questa è la barra corrente, se l'ultima chiusa, -0,5

su minuti ed esotici non funzionerà.

numero di barre != numero di_conti

le barre vengono saltate alla volta, in 15 minuti ci possono essere 12 barre di un minuto

meglio usare iBarShift()

 
Maxim Kuznetsov:

è meglio usare il nativo iBarShift()

Non so come.

 
MakarFX:

Non so come.

Funzione

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}