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

 
Valeriy Yastremskiy:

Se ci sono 1440 ordini al giorno, ci dovrebbe essere un controllo all'inizio del minuto, o più semplicemente all'apparizione della barra dei minuti. E a questo punto per aprire. Tu non ce l'hai, quindi l'EA apre una posizione ad ogni tick, che è una condizione rigorosa in sé, secondo la condizione sul nostro simbolo alla quotazione corrente. Questa condizione può non essere soddisfatta, e le zecche non saranno prese in considerazione. E ad un certo punto, si verificherà un errore critico.

Inoltre, il tipo di esecuzione dell'ordine (ordine di eseguire un trade per creare una posizione) Tutto o niente.

Ho capito. Grazie per l'aiuto.

Ho anche pensato che fosse difficile per il mio EA aprire così tanti ordini. Ho provato a limitare il numero di ordini con questo codice

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

Cioè, aprire un ordine solo alle 10:00. Ma il risultato è lo stesso.

2020.10.27 10:25:17.548 Core 1 272 Mb di memoria utilizzata inclusi 36 Mb di dati storici, 64 Mb di dati di tick


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

Cosa sto facendo di sbagliato?

Ho colorato il codice che ho aggiunto e cambiato

Questo è ciò che dice il file di log

FD 0 10:57:05.453 Core 1 processo agente avviato su 127.0.0.1:3000

CS 0 10:57:05.453 Core 1 connessione a 127.0.0.1:3000

JD 0 10:57:05.953 Core 1 connesso

OD 0 10:57:05.975 Core 1 autorizzato (agent build 2650)

JL 0 10:57:05.980 Tester EURUSD,M1 (Alpari-MT5-Demo): test di espertiGRAAL.ex5 dal 2020.09.01 00:00 al 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 sincronizzazione comune completata

CJ 0 10:57:06.223 Tester la qualità della storia analizzata è al 100%

LM 0 10:57:06.248 Core 1 MetaTester 5 avviato su 127.0.0.1:3000

EJ 0 10:57:06.248 Core 1 inizializzazione finita

LS 0 10:57:06.248 Core 1 login (build 2650)

KO 0 10:57:06.248 Core 1 4372 byte di informazioni sul conto caricati

LI 0 10:57:06.248 Core 1 1482 byte di parametri del tester caricati

FN 0 10:57:06.248 Core 1 1724 byte di parametri di input caricati

OK 0 10:57:06.248 Core 1 423 byte di lista simboli caricati (72 simboli)

HO 0 10:57:06.248 Core 1 file esperto aggiunto: ExpertsGRAAL.ex5 13680 byte caricati

CP 0 10:57:06.248 Core 1 4077 Mb disponibili, 50 blocchi impostati per generare tick

DI 0 10:57:06.248 Core 1 calcolare il profitto in pip, deposito iniziale 10000, leva 1:100

LP 0 10:57:06.248 Core 1 inizializzato con successo

RI 0 10:57:06.248 Core 1 15 Kb di dati di inizializzazione totali ricevuti

DN 0 10:57:06.248 Core 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD: simbolo da sincronizzare

RS 0 10:57:06.248 Core 1 EURUSD: simbolo sincronizzato, 3720 byte di informazioni sul simbolo ricevuti

OL 0 10:57:06.248 Core 1 EURUSD: caricare 27 byte di dati storici per sincronizzare in 0:00:00.003

EK 0 10:57:06.248 Core 1 EURUSD: storia sincronizzata dal 2019.01.02 al 2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1: cache storica allocata per 628432 barre e contiene 619175 barre dal 2019.01.02 06:00 al 2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1: la storia inizia dal 2019.01.02 06:00

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC bar states generating. Esecuzione OnTick solo all'inizio della barra

JM 0 10:57:06.248 Core 1 EURUSD,M1: test di esperti\GRAAL.ex5 dal 2020.09.01 00:00 al 2020.09.10 00:00 iniziato con input:

LS 0 10:57:06.248 Core 1 StopLoss=30

PL 0 10:57:06.248 Core 1 TakeProfit=100

FJ 0 10:57:06.248 Core 1 Lot=0.1

DP 0 10:57:06.248 Core 1 saldo finale 10000.00 pips

EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 ticks, 10068 barre generate. Ambiente sincronizzato alle 0:00:00.031. Test superato in 0:00:00.247 (inclusi i tick di preelaborazione 0:00:00.016).

DE 0 10:57:06.248 Core 1 EURUSD,M1: tempo totale dal login allo stop test 0:00:00.278 (incluso 0:00:00.031 per la sincronizzazione dei dati storici)

NQ 0 10:57:06.248 Core 1 272 Mb di memoria utilizzata inclusi 36 Mb di dati storici, 64 Mb di dati di tick

KE 0 10:57:06.248 Core 1 file di log "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" scritto

OS 0 10:57:06.260 Core 1 connessione chiusa


 
Denis Diakonov:

Per favore, consigliatemi!

Perché l'ora del server non viene aggiornata quando arrivano nuove zecche?

Al momento dell'avvio dell'EA, tutto funziona come dovrebbe, ma poi il tempo passa, ma il nuovo valore del minuto corrente non entra nella variabile.

Cioè, l'Expert Advisor lavora in funzione del numero ottenuto nella variabile int M = TimeMinute(TimeCurrent());

In realtà questa linea di codice è dal riferimento e non funziona.

Per esempio, lo faccio partire alle 12-l'oracorrente restituita dal server corrisponde all'ora nella variabile, ma poi la variabile rimane alle 12, anche se sono già 15-20 minuti sull'orologio

Il codice è completamente migliore, più precisamente dove si crea la funzione e in quale funzione (OnInit, OnTick, OnTime) ottiene il valore dei minuti e chiama la funzione di stampa. Se in OnInit o fuori dai campi della funzione terminale, è così che dovrebbe essere. Se in OnTick, stamperà su ogni tick e aggiornerà il valore con un nuovo minuto.

 

Esempio chiaro di tempo del server e valore variabile

Valeriy Yastremskiy:

Il codice è completamente migliore, più precisamente dove si crea la funzione e in quale funzione (OnInit, OnTick, OnTime) si ottiene il valore dei minuti e si chiama la funzione di stampa. Se in OnInit o al di fuori dei campi della funzione terminale, è così che dovrebbe essere. Se in OnTick, stamperà su ogni tick e aggiornerà il valore con un nuovo minuto.

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

Bene, ecco il codice completo. Nella funzione void OnTick() viene attivata all'inizio dalla prima linea da eseguire.

Si attiva solo al momento della ricompilazione o dell'aggiunta al campo pianificazione/cancellazione/. Per il resto del tempo, la variabile M mantiene il valore del minuto ottenuto durante la prima esecuzione dell'EA.

 
Denis Diakonov:

Beh, qui c'è un intero codice, non c'è altro da dire. Il void OnTick() è attivato all'inizio dalla prima linea da eseguire.

Si attiva solo al momento della ricompilazione o dell'unione al grafico/campo di cancellazione/ . Per il resto del tempo, la variabile M mantiene il valore del minuto ottenuto durante la prima esecuzione dell'EA.

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

Capito, grazie!

Avrei dovuto

int M = TimeMinute(TimeCurrent());

metterlo nel corpo della funzione, invece di assegnare il valore M prima

 
Denis Diakonov:

Capito, grazie!

Avrei dovuto

metterlo nel corpo della funzione, invece di assegnare il valore M prima di esso.

Si può fare in diversi modi. Leggere le variabili globali e locali e la loro visibilità.

 

Pomeriggio. Cercando di ottenere l'angolo della linea di tendenza dall'angolo. Ecco il codice:

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

l'angolo è sempre 0. Indipendentemente dal fatto che si usino metodi della libreria standard o funzioni integrate. Allo stesso tempo, la linea è tracciata. Cosa c'è che non va? Come ottenere l'angolo?

 
leonerd:

Pomeriggio. Cercando di ottenere l'angolo della linea di tendenza dall'angolo. Ecco il codice:

l'angolo è sempre 0. Indipendentemente dal fatto che si usino metodi della libreria standard o funzioni integrate. Allo stesso tempo, la linea è tracciata. Cosa c'è che non va? Come posso ottenere l'angolo?

https://www.mql5.com/ru/forum/103591

Capisco, ma come si calcola l'angolo?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

Capisco, ma come si calcola l'angolo?

Sei un comico.

Chi voglio prendere in giro?

Forum sul trading, sistemi di trading automatico e test di strategia

Tutte le domande dei neofiti su MQL4 e MQL5, qualsiasi aiuto e discussione di algoritmi e codici

Nikolai Semko, 2020.10.26 00:34

Non bisogna avere paura della velocità. È solo una condizionalità per la conversione dei tipi.
Come variante della funzione di definizione degli angoli:

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

Dopo MT5 la sensazione di MT4 è semplicemente terribile. L'accesso alla storia è in qualche modo evirato. Non sto nemmeno parlando delle zecche.




 

Potete dirmi se questa selezione di caratteri è possibile nell'indicatore?