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

 
mila.com:

Lettura, ma non avrebbe mai immaginato di aprire il file prima del ciclo )

Forse non l'ho letto con attenzione )
C'è anche un esempio di lettura di un file riga per riga dall'inizio alla fine...
 

C'è un Expert Advisor, che è guidato dalla Pinbar durante il trading. Il robot funziona correttamente sulle valute e completamente imprevedibile sui CFD.

Potete per favore dirmi come questo può accadere?

 
RichLux:

Ho scritto un robot che si basa su Pinbar nel trading. Il robot funziona correttamente sulle valute e completamente imprevedibile sui CFD.

Potete per favore dirmi come questo può accadere?

Qui c'è tutto per il tuo caso.
 

Ecco la funzione di definizione di Pinbar

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Quando la inserisco nell'Expert Advisor, la funzione funziona bene (cioè l'Expert Advisor imposta le operazioni sulla barra successiva a quella corrispondente alle condizioni della funzione) per le coppie di valute. Tuttavia, le transazioni su CFD sono aperte ovunque.

Qual è la differenza tra CFD e coppie di valute per questa funzione?

 
RichLux:

Ecco la funzione di definizione di Pinbar

Quando la inserisco nell'Expert Advisor, la funzione funziona bene (cioè l'Expert Advisor imposta le operazioni sulla barra successiva a quella corrispondente alle condizioni della funzione) per le coppie di valute. Tuttavia, le transazioni su CFD sono aperte ovunque.

Qual è la differenza tra CFD e coppie di valute per questa funzione?

Prima di tutto, sostituisci tutti i && con {} in modo che ciascuna delle condizioni sia nel proprio blocco - poi puoi togliere la stampa del risultato testato in ogni blocco - vedi quali valori ottieni nel log.
 
Artyom Trishkin:
Prima di tutto sostituisci tutti i && con {} in modo che ogni condizione fosse nel proprio blocco - poi puoi in ogni blocco srotolare il risultato testato - vedi nel log quali valori ottieni.

Grazie, ho seguito il consiglio e ho capito dove stavo sbagliando. Perché il mio EA si stava muovendo su 5 cifre e il CFD è solo 2 cifre e mi aspettavo che l'EA reagisse a 50 pips minimo e ho ottenuto la reazione da 5 pips. Ho fatto un casino.

Per favore, aiutatemi con questo aspetto.

C'è una parte simile nel codice:

MathAbs(Close1-Open1)/(High1-Low1)

A volte succede che High1=Low1. Il tester genera quindi l'errore critico dicendo che non può dividere per zero.

Come aggirare il problema?

 
RichLux:

Grazie, ho seguito il consiglio e ho capito dove stavo sbagliando. Perché il mio EA si stava muovendo su 5 cifre e il CFD è solo 2 cifre e mi aspettavo che l'EA reagisse a 50 pips minimo e ho ottenuto la reazione da 5 pips. Ho fatto un casino.

Per favore, aiutatemi con questo aspetto.

C'è una parte simile nel codice:

A volte succede che High1=Low1. Il tester genera quindi l'errore critico dicendo che non può dividere per zero.

Come aggirare il problema?

Puoi farlo senza pensare:

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

Ciao, ho riscontrato un problema durante la compilazione:


void OnTick()

{

doppio minprice=999999, mp, maxprice=-99999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

se (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

se (mp > maxprice)

maxprice = mp;

}

Comment("Minprice: " + DoubleToString(minprice, 5) + "\n "+

"Prezzo massimo: " + DoubleToString(maxprice, 5))

}


Il codice sorgente contiene funzioni che il compilatore giura con iLow e iHigh e la variabile Simbol() lì in modalità stringa, ma risolve un altro problema nell'esempio. Cosa devo correggere nel codice di cui sopra. Sono bloccato e non posso compilare il ciclo per controllarlo.

DAL LIBRO DI TESTO

Se volete ottenere il valore corrispondente alla barra incompleta corrente, allora

potete usare la prima forma della chiamata, specificando start_pos=0 e count=1.

Esempio:

#proprietà copyright "2009, MetaQuotes Software Corp."

#proprietà link "https://www.mql5.com"

#proprietà versione "1.00"

#property description "Esempio di output dei valori High[i] e Low[i]"

#property description "per barre scelte a caso"

doppio High[],Low[];

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

//| Ottenere il minimo per un dato numero di barra

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

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doppio basso=0;

ArraySetAsSeries(low,true);

int copied=CopyLow(simbolo,timeframe,0,Bars(simbolo,timeframe),Low);

if(copied>0 && index<copied) low=Low[index];

ritorno(basso);

}

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

//| Ottenere il massimo per il numero di barra dato

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

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doppio alto=0;

ArraySetAsSeries(high,true);

int copied=CopyHigh(simbolo,timeframe,0,Bars(simbolo,timeframe),High);

if(copied>0 && index<copied) high=High[index];

ritorno(alto);

}

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

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Ciao, ho riscontrato un problema durante la compilazione:


void OnTick()

{

doppio minprice=999999, mp, maxprice=-99999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

se (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

se (mp > maxprice)

maxprice = mp;

}

Comment("Minprice: " + DoubleToString(minprice, 5) + "\n "+

"Prezzo massimo: " + DoubleToString(maxprice, 5))

}


Il codice sorgente contiene funzioni che il compilatore giura di iLow e iHigh b variabile Simbol() è in modalità stringa lì, ma risolve un altro problema nell'esempio. Cosa devo correggere nel codice di cui sopra. Sono bloccato e non posso compilare il ciclo per controllarlo.

DAL LIBRO DI TESTO

Se volete ottenere il valore corrispondente alla barra incompleta corrente, allora

potete usare la prima forma della chiamata, specificando start_pos=0 e count=1.

Esempio:

#proprietà copyright "2009, MetaQuotes Software Corp."

#proprietà link "https://www.mql5.com"

#proprietà versione "1.00"

#property description "Esempio di output dei valori High[i] e Low[i]"

#property description "per barre scelte a caso"

doppio High[],Low[];

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

//| Ottenere il minimo per un dato numero di barra

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

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doppio basso=0;

ArraySetAsSeries(low,true);

int copied=CopyLow(simbolo,timeframe,0,Bars(simbolo,timeframe),Low);

if(copied>0 && index<copied) low=Low[index];

ritorno(basso);

}

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

//| Ottenere il massimo per il numero di barra dato

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

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)

{

doppio alto=0;

ArraySetAsSeries(high,true);

int copied=CopyHigh(simbolo,timeframe,0,Bars(simbolo,timeframe),High);

if(copied>0 && index<copied) high=High[index];

ritorno(alto);

}

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


c'è un errore in questa parolaSimbol() si dovrebbe scrivere Symbol() o _Symbol
 
Sergey Gritsay:

Avete un errore in questa parolaSimbol() - Symbol() o _Symbol dovrebbe essere scritto

Grazie, l'errore su Simbol è stato corretto scrivendo Symbol correttamente. Ho qualcosa che non va con le funzioni iLow e iHigh.

Ladifferenza in % tra MQL4 e MQL5 ? altrimenti dovrò grattarmi la testa ogni volta che ripasso i video tutorial di MQL4.

File:
1.png  64 kb
Motivazione: