Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 1063

 
mould:
ma come si fa ad attivare questa modalità?

Spunta la casella nella finestra del tester, in basso a sinistra:

 

Ciao Guru.

Potete dirmi se sono sulla strada giusta?

Obiettivo: introdurre una dimensione del lotto variabile in funzione della distanza dalla MA.

Nei parametri di input:

extern double Lot1 = 0.01; // prima variante del lotto
extern double Lot2 = 0.03; // seconda variante del lotto
extern int Distan = 20; // distanza da SlowMA

Ma è stato definito nel corpo di Expert Advisor:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Inoltre abbiamo bisogno di una condizione: se il prezzo corrente (Bid o Ask a seconda della direzione) è fino alla dimensione Distant, usiamo la prima dimensione del lotto, se è più, usiamo la seconda.

La prima cosa che mi è venuta in mente:

se (Ask-SlowMA<Distan) Lot == Lot1;
se (SlowMA-Bid<Distan) Lot == Lot1;
se (Ask-SlowMA>Distan) Lot == Lot2;
se (SlowMA-Bid>Distan) Lot == Lot2;

Ma non funziona. L'errore è o nelle connessioni del lotto o nella logica generale.

Grazie in anticipo.

 
delf699:

Ciao Guru.

Potete dirmi se sono sulla strada giusta?

Obiettivo: introdurre una dimensione del lotto variabile in funzione della distanza dalla MA.

Nei parametri di input:

extern double Lot1 = 0.01; // dimensione del primo lotto
extern double Lot2 = 0.03; // seconda variante di lotto.
extern int Distan = 20; // distanza dallo SlowMA

Nel corpo dell'Expert Advisor definito Ma:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Inoltre abbiamo bisogno di una condizione: se il prezzo corrente (Bid o Ask a seconda della direzione) è fino alla dimensione Distant, usiamo la prima dimensione del lotto, se è più, usiamo la seconda.

La prima cosa che mi è venuta in mente:

se (Ask-SlowMA<Distan) Lot == Lot1;
if (SlowMA-Bid<Distan) Lot == Lot1;;
se (Ask-SlowMA>Distan) Lot == Lot2;
se (SlowMA-Bid>Distan) Lot == Lot2;

Ma non funziona. È un errore in combinazione con Lot, o nella logica generale.

Grazie in anticipo.

Che importanza hanno Ask, Bid e SlowMA quando Ask-SlowMA può essere maggiore di Distan?
 

Bid e Ask sono gli ultimi prezzi bid e ask conosciuti, cioè il prezzo corrente.

SlowMA è il mio rinominato Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

La deviazione del prezzo attuale (Bid o Ask) dal Ma (SlowMA) può essere più o meno di Distans. In base a questo dovreste impostare o la prima o la seconda dimensione del lotto.

Ho trovato delle varianti per cambiare il lotto in base al deposito o al numero di ordini aperti, ma non riesco a ottenere nessuna risposta da un termine così lineare.

Qualcosa mi dice che abbiamo bisogno di una funzione che restituisca un valore assoluto. Cioè, se lo applichiamo a un numero negativo, il risultato sarà positivo.

 
delf699:

Bid e Ask sono gli ultimi prezzi bid e ask conosciuti, cioè il prezzo corrente.

SlowMA è il mio rinominato Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

La deviazione del prezzo attuale (Bid o Ask) dal Ma (SlowMA) può essere più o meno di Distans. In base a questo dovreste impostare o la prima o la seconda dimensione del lotto.

Ho trovato delle varianti per cambiare il lotto in base al deposito o al numero di ordini aperti, ma non riesco a ottenere nessuna risposta da un termine così lineare.

Qualcosa mi dice che abbiamo bisogno di una funzione che restituisca un valore assoluto. Cioè, se lo applichiamo a un numero negativo, il risultato sarà positivo.


Il valore assoluto della differenza di Bid e MA può essere necessario un po' più tardi; ora, visto che non hai capito l'antifona, calcoliamo insieme

Offerta = 1,12730;

MA = 1,12530;

Distans = 20;

Domanda:

Quando e se 1,1273 a 1,1253 sarà più di 20???

Per qualche motivo la mia calcolatrice mostra solo 0,002. Ma questo è molto lontano da 20...

 

Grazie, capisco. Oppure si può fare così:

dist=Distan*Point;

se (Ask-SlowMA<dist) Lot == Lot1;
se (SlowMA-Bid<dist) Lot == Lot1;
se (Ask-SlowMA>dist) Lot == Lot2;
se (SlowMA-Bid>dist) Lot == Lot2;

Quindi come faccio a farlo correttamente?

 
delf699:

Grazie, capisco. Oppure si può fare così:

dist=Distan*Point;

se (Ask-SlowMA<dist) Lot == Lot1;
se (SlowMA-Bid<dist) Lot == Lot1;
se (Ask-SlowMA>dist) Lot == Lot2;
se (SlowMA-Bid>dist) Lot == Lot2;

Quindi come faccio a farlo correttamente?

E ora possiamo usare MathAbs() per non pensare troppo alla nostra testa tenendo traccia di cosa viene sottratto da cosa. E c'è un altro interessante operatore condizionale

Lot = MathAbs(Ask-SlowMA) < dist ? Lot1 : Lot2;


Il che significa: alla variabile Lot verrà assegnato il valore di Lot1 se Ask- SlowMA è inferiore a dist, altrimenti verrà assegnato il valore di Lot2.

Un'altra raccomandazione: dimenticate la variabile Punto. Usare _Point o la funzione Point()

 
Grazie, una bella soluzione.
 
Mi sono già rotto gli occhi, non riesco a trovare dove mancano le parentesi, ottengo errori come '(' - parentesi sinistra sbilanciata test.mq4 31 8 (a partire dalla linea dove viene chiamata TrendDetection())

Ho bisogno di aiuto, sto ancora imparando...


#define BULL 1;
#define BEAR 2;

//--------------------------------------------------------------------
extern int SL = 200;
extern int TP = 200;
extern double Lots = 0,01;
extern double SarStep = 0.02;
extern double SarMaximum = 0.2;
extern int slippage = 5;
extern int Magic = 1;
extern int MaxOrder = 1;
stringa OrderComments = "Bargain 1.0;
int Cnt=0;
datetime PreviousBar;

int start()
{
Cnt=OrdiniTotali();
{
se (Cnt<MaxOrder)
{
if(NewBar() == true)
{
if(TrendDetection() == BULL){
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),slippage,NormalizeDouble(Ask,Digits)-(SL*Point),NormalizeDouble(Ask,Digits)+(TP*Point),OrderComments,Magic,0,CLR_NONE);}
if(TrendDetection() == BEAR){
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),slippage,NormalizeDouble(Bid,Digits)+(SL*Point),NormalizeDouble(Bid,Digits)-(TP*Point),OrderComments,Magic,0,CLR_NONE);}
}
}
else
{return(0);}
}
ritorno(0);
}

int TrendDetection()
{
doppio Sar = iSAR(NULL,0,SarStep,SarMaximum,1);
if(Close[1] > Sar) {return(BULL);}
if(Close[1] < Sar) {return(BEAR);}
return(0);}
bool NewBar()
{
if(PreviousBar<Time[0])
{
PreviousBar = Time[0];
return(true);
}
else
{
return(false);
}
return(false);
}
 
AlexeyVik:

E ora potete applicare MathAbs() in modo da non dover tenere traccia di cosa sottrarre da cosa. E un altro interessante operatore condizionale


Il che significa: alla variabile Lot verrà assegnato il valore di Lot1 nel caso in cui Ask- SlowMA sia inferiore a dist, altrimenti verrà assegnato il valore di Lot2.

Un'altra raccomandazione: dimenticate la variabile Punto. Usare _Point o la funzione Point()

E Point, tutto sembra funzionare?
Motivazione: