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

 
Sergey Likho:

Potete dirmi come calcolare il collaterale di una transazione?


Provato due approcci

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


E questo

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



Il primo dà strani risultati su EURJPY se la mia valuta di deposito è USD. Devo aggiungere qualcosa alla formula?

Anche il secondo funziona solo una volta, a volte dà il valore giusto, a volte dà delle sciocchezze (dipende dal deposito)

La seconda variante è il modo corretto di calcolare il deposito. Per essere più precisi, la variabile val mostra il valore dei fondi liberi dopo che l'ordine è stato effettuato e la variabileFreeMarginCheck mostra il valore del deposito stesso

 
Igor Makanu:

La seconda opzione è il modo corretto di calcolare il margine, ovvero si ottiene il valore dei fondi liberi nella variabile val dopo aver piazzato un ordine, e la variabileFreeMarginCheck è il valore del margine stesso

Sei sicuro?

AccountFreeMarginCheck

Restituisce la quantità di fondi liberi che rimarrà dopo l' apertura dell'ordine specificato al prezzo corrente nel conto corrente.


C'è anche una sottigliezza:

Se le contrattazioni sono aperte, cioè c'è un blocco completo o incompleto sul conto, la funzione può dare valori errati.


 
Sergey Likho:

Sei sicuro?

Sì, hai ragione, è proprio così:

Restituisce la quantità di fondi liberirimanenti dopo aver aperto l'ordine specificato al prezzo corrente nel conto corrente.

per quanto riguarda gli scambi aperti, bisogna controllare, non ricordo, ma molto probabilmente quello che il terminale scrive, dovrebbe essere d'accordo con i dati calcolati: il numero totale di lotti in ogni direzione degli scambi (BAY/SELL) per tutti i simboli poi chiamare per ogni simbolo

AccountFreeMarginCheck() passando i lotti in ogni direzione e sommando questi risultati

Il mercato funziona oggi, è facile controllarlo, come questo

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

Saluti, potreste dirmi cosa c'è di sbagliato nella funzione? La funzione esegue una pausa di trading per tempo, i parametri sono inizio pausa e fine pausa.
La funzione legge l'ora non dal server del broker, ma dal computer, nonostante il fatto che TimeCurrent sia prescritto. In generale, i trade sono chiusi durante la pausa, cioè la funzione non funziona.

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

Saluti, potreste dirmi cosa c'è di sbagliato nella funzione? La funzione esegue una pausa di trading per tempo, i parametri includono l'inizio della pausa e la fine della pausa.
La funzione legge l'ora non dal server del broker, ma dal computer, nonostante il fatto che TimeCurrent sia prescritto. In generale, i trade sono chiusi durante una pausa, significa che la funzione non funziona.

StampeTimeStart eStrToTime(TimeStart);

poi unprintTimeCurrent()

iltuoTimeStart non è in formato datetime completo, cioè l'ora sarà sempre il giorno, il mese e l'anno corrente quando lanci l'EA, e poi cambierà?

E globalmente ... per determinare le ore e i minuti di trading le ore e i minuti devono essere confrontati con l'ora e i minuti del server, si confronta solo il fatto che il tempo del server è più lungo di quello specificato

SZZ: per risparmiare confusione, potetepensare a datetime come a un int, che è e confrontando 2datetime, state confrontando 2 int

PSPS:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

il tuo codice probabilmente funzionerà, dovresti provare così:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


Di solito conto il tempo in questo modo:

int h = TimeHour(TimeCurrent());

int m = TimeMinute(TimeCurrent());

e poi confrontarlo con le impostazioni EA

 
Igor Makanu:

Grazie, cercherò di capirlo, sono solo un principiante), con l'opzione && invece di ||| non ho ancora provato online, comunque in tester questo codice funziona, legge il tempo dal terminale, nessuna chiusura di ordini durante la pausa, ma online è diverso.

 

Ciao, il terminale non si avvia nel tester di strategia. Imposto la data, per esempio (2017,04,01 a 2018,05,29), premo start, dà subito uno stop. Nel registro c'è scritto quanto segue,

TestGenerator: nessun dato storico 'EURUSD30' dal 2017.04.01 al 2018.05.29. E così su qualsiasi segmento. Il mio computer funziona, ho pensato che potrebbe non avere abbastanza RAM. Stessa cosa sul computer di casa, il riavvio non aiuta, ma funziona per un po'. Ho scaricato Expert Advisor dal mercato, in prova. Se qualcuno ne conosce la ragione, per favore consigliatelo.


 
danil77783:

Ciao, il terminale non si avvia nel tester di strategia. Imposto la data, per esempio (2017,04,01 a 2018,05,29), premo start, dà subito uno stop. Nel registro c'è scritto quanto segue,

TestGenerator: nessun dato storico 'EURUSD30' dal 2017.04.01 al 2018.05.29. E così su qualsiasi segmento. Il mio computer funziona, ho pensato che potrebbe non avere abbastanza RAM. Stessa cosa sul computer di casa, il riavvio non aiuta, ma funziona per un po'. Ho scaricato l'Expert Advisor dal Market, in prova. Se ho un'idea della ragione, potete darmi un suggerimento?


Credo che il tester dica che non ci sono dati storici, premere F2 e scaricare la storia, poi riavviare il terminale

 
danil77783:

Ciao, il terminale non si avvia nel tester di strategia. Imposto la data, per esempio (2017,04,01 a 2018,05,29), premo start, dà subito uno stop. Nel registro c'è scritto quanto segue,

TestGenerator: nessun dato storico 'EURUSD30' dal 2017.04.01 al 2018.05.29. E così su qualsiasi segmento. Il mio computer funziona, ho pensato che potrebbe non avere abbastanza RAM. Stessa cosa sul computer di casa, il riavvio non aiuta, ma funziona per un po'. Ho scaricato Expert Advisor dal mercato, in prova. Se conosco la ragione, per favore consigliatemi?


L'assenza di dati storici significa qualcosa?

 
Igor Makanu:

Penso che il tester ti stia dicendo che non ci sono dati storici, premi F2 e scarica la storia, poi ricarica il terminale

Grazie! Farò un tentativo. L'aggiornamento del terminale lo influenza in qualche modo? Che sia aggiornato o meno, anche se ve lo dirà lui stesso......

Motivazione: