Chiedete! - pagina 88

 
 

grazie Ralph, ho provato questo ma poi ha dato un'altra lista di errori - ha detto che tutte le variabili nel file include non sono definite - ma lo sono

Farò un altro tentativo durante il fine settimana, mi sta frustrando un po' al momento.

@faqcya - Ho il sospetto che tu abbia ragione a metterlo in uno script, ma non so come altro gestire la chiamata a meno che non abbia una shell EA in cui metterlo.

Forse darò un'occhiata ai modelli e vedrò se posso chiamarlo da quello o meglio ancora trasformarlo in un EA, lo voglio solo così com'è, non per fare altro.

Grazie per il tuo aiuto,

Kevin

ralph.ronnquist:
@pgtips: cambia la seconda riga in modo che sia solo
#define MAGIC 20051120
cioè senza segno uguale e senza virgola.
 

Cercando di imparare la programmazione

Prima di tutto, ho letto l'intero corso di Corder's Guru e l'ho trovato molto interessante. Sono giunto alla conclusione che l'unico modo ragionevole per provare una strategia è scrivere un programma per assicurarsi che sia completamente accurato. Sfortunatamente, sono un principiante totale quando si tratta di questo.

Ho provato a scrivere un programma di base e non riesco nemmeno a farlo funzionare. Almeno non ricevo più errori, ma non prende nessun ordine. Sono persistente e continuerò a provare ma apprezzerei un aiuto da chiunque veda il mio errore

Tutto quello che sto cercando di fare a questo punto è di tracciare il prezzo più basso (CurrentLow) e poi quando ritraccia di una certa quantità (Ret1), piazzare un ordine di vendita con TP del punto più basso.

Per favore non ridete, ma il seguente è ciò che ho scritto finora:

//---- parametri di input

extern double TP1=75.0;

extern double Ret1=75.0;

extern double SL1=150.0;

extern double Lots=0.1;

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

//| funzione di inizializzazione esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di avvio esperto |

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

int start()

{

int ticket=0;

se(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

doppio CurrentLow,CurrentHigh;

if(Bid < CurrentLow)

{

CurrentLow = Bid;

if(Bid > CurrentHigh)

{

CurrentHigh = Bid;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

ritorno (0);

}

return (0);

}

return(0);

}

}

 
Putz:
Prima di tutto, ho letto l'intero corso di Corder's Guru e l'ho trovato molto interessante. Sono giunto alla conclusione che l'unico modo ragionevole per provare una strategia è scrivere un programma per assicurarsi che sia completamente accurato. Sfortunatamente, sono un principiante totale quando si tratta di questo.

Ho provato a scrivere un programma di base e non riesco nemmeno a farlo funzionare. Almeno non ricevo più errori ma non prende nessun ordine. Sono persistente e continuerò a provare ma apprezzerei un aiuto da chiunque veda il mio errore

Tutto quello che sto cercando di fare a questo punto è di tracciare il prezzo più basso (CurrentLow) e poi quando ritraccia di una certa quantità (Ret1), piazzare un ordine di vendita con TP del punto più basso.

Per favore non ridete, ma il seguente è ciò che ho scritto finora:

//---- parametri di input

extern double TP1=75.0;

extern double Ret1=75.0;

extern double SL1=150.0;

extern double Lots=0.1;

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

//| funzione di inizializzazione esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di avvio esperto |

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

int start()

{

int ticket=0;

if(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

doppio CurrentLow,CurrentHigh;

if(Bid < CurrentLow)

{

CurrentLow = Bid;

if(Bid > CurrentHigh)

{

CurrentHigh = Bid;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

ritorno (0);

}

return (0);

}

return(0);

}

}

Sembra sbagliato controllare se Bid > CurrentHigh all'interno della condizione vera che Bid < CurrentLow; penso che dovresti avere test indipendenti come questo:

double CurrentLow,CurrentHigh;

int start()

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid > CurrentHigh) CurrentHigh = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point),"Albatross_v1",757575,0,Green);

return(0);

}

Ora, tre osservazioni:

- Devi dichiarare CurrentHigh e CurrentLow su uno scoop globale, cioè fuori da qualsiasi funzione (e start() è una funzione) altrimenti quelle variabili saranno inizializzate a 0 ad ogni chiamata della funzione.

- Non avete bisogno di CurrentHigh perché non viene usato.

- Devi implementare una logica per resettare/aggiornare il valore di CurrentLow, e probabilmente per limitare l'apertura degli ordini ad ogni tick sopra CurrentLow+(Point*Ret1))

 

Ciao Michel,

Grazie mille per la tua pronta risposta e il tuo aiuto.

Ho eliminato CurrentHigh e ora capisco molto meglio. Ho anche definito CurrentLow nella parte superiore del programma e ora piazza effettivamente gli ordini.

Ho anche aggiunto un secondo ordine basato su un ritracciamento più grande e questo sembra funzionare. Ora devo capire come impedirgli di creare un nuovo ordine ad ogni tick, ma ci lavorerò da solo per ora, perché così imparerò meglio.

Sono sicuro che tornerò qui con altre domande.

Grazie ancora.

Putz

 
Putz:
Ciao Michel,

Grazie mille per la tua pronta risposta e il tuo aiuto.

Ho eliminato CurrentHigh e ora capisco molto meglio. Ho anche definito CurrentLow nella parte superiore del programma e ora piazza effettivamente gli ordini.

Ho anche aggiunto un secondo ordine basato su un ritracciamento più grande e questo sembra funzionare. Ora devo capire come impedirgli di creare un nuovo ordine ad ogni tick, ma ci lavorerò da solo per ora, perché così imparerò meglio.

Sono sicuro che tornerò qui con altre domande.

Grazie ancora.

Putz

Non dimenticare di inizializzare CurrentLow con un valore grande (come 1000); se è inizializzato con 0, non avrai mai un Bid < 0

 

Quale linguaggio di programmazione devo imparare?

codersguru:
Ciao gente,

Ho molti messaggi privati che mi chiedono aiuto per alcuni pezzi di codice.

Qui potete postare le vostre domande relative a MQL4, e io farò del mio meglio per rispondere.

Caro codersguru,

Se voglio imparare a scrivere codici MQL4, quale linguaggio di programmazione devo imparare? Visual basic o C++? Grazie per la tua risposta.

 

Più aiuto per favore

Ciao,

Sono tornato per chiedere altro aiuto. Ho letto e guardato molti altri EA per cercare di capirlo, ma non riesco ancora a farlo funzionare correttamente.

Quello che sto cercando di fare è piazzare due ordini.

1) Vendere 0,1 lotti una volta che il prezzo ritraccia di Ret1 (75 pips) con TP1 (75) e SL1 (150)

2) Vendere 0,2 lotti una volta che il prezzo ritraccia di Ret2 (150 pip) con TP1 (75) e SL1 (75)

A lungo termine, voglio ottenere un ordine di acquisto come sopra da piazzare in base alla direzione del trend. Non ho ancora determinato quale indicatore userò per determinare la tendenza, ma ci arriverò ad un certo punto.

Il seguente è quello che ho attualmente. Sembra posizionare correttamente il primo ordine ma il secondo non viene mai attivato. Qualsiasi aiuto sarà molto apprezzato.

extern string Expert_Name = "Albatross v1";

extern int MagicNumber = 757575;

extern int Slippage = 3.0;

//---- parametri di ingresso

extern double TP1=75.0;

extern double TP2=75.0;

extern double Ret1=75.0;

extern double Ret2=150.0;

extern double SL1=150.0;

extern double SL2=75.0;

extern double Lots=0.1;

double CurrentLow=1000;

/double CurrentHigh=0;

int OpenOrders=0,cnt=0;

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

//|funzione di inizializzazione dell'indicatore personalizzata |

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

//int init()

// {

//---- indicatori

//----

// return(0);

// }

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

//|Funzione di deinizializzazione dell'indicatore personalizzata |

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

// int deinit()

// {

//---- TODO: aggiungete il vostro codice qui

//----

// return(0);

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

//|Funzione di iterazione dell'indicatore personalizzata

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

// int start()

// {

//---- TODO: aggiungete il vostro codice qui

//----

// return(0);

// }

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

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| Controlla i controlli di posizione aperti |

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

int CheckOpenTrades()

{

int cnt;

int NumTrades; // Numero di compravendite in questo simbolo

NumTrades = 0;

for(cnt=OrdiniTotali()-1;cnt>=0;cnt--)

{

OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);

se ( OrderSymbol() != Symbol()) continua;

se ( OrderMagicNumber() != MagicNumber) continua;

se(OrderType() == OP_BUY ) NumTrades++;

if(OrderType() == OP_SELL ) NumTrades++;

}

return (NumTrades);

}

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

//| funzione di avvio esperto |

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

int start()

{

int cnt, ticket, totale;

doppio TP;

se(Bars<100)

{

Stampa("barre inferiori a 100");

return(0);

}

totale = CheckOpenTrades();

se(totale < 1)

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",MagicNumber,0,Green);

}

se(totale < 2)

{

if(Bid >= CurrentLow+(Point*Ret2))

OrderSend(Symbol(),OP_SELL,Lots*2,Bid+(Point*Ret2),3,Bid+(SL2*Point),Bid-(TP2*Point), "Albatross_v1",MagicNumber,0,Green);

return(0);

}

}

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

 

Scusa se ti disturbo con questa domanda

Come si crea un oggetto che viene riempito con un colore?

Dave

<<<

 

Ciao a tutti, sono un codificatore e ho codificato per molto tempo in C++ ma la mia conoscenza di FX e MQL4 è molto basilare. Sto esaminando un EA che qualcuno ha scritto e sto cercando di capire il codice...

potete spiegarmi in parole povere cos'è il parametro SHIFT nel metodo iMA?

double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

secondo l'aiuto di MT4, è "Indice del valore preso dal buffer dell'indicatore (spostamento relativo alla barra corrente di un dato numero di periodi precedenti)". - cos'è il buffer dell'indicatore?

sta anche facendo il seguente...

int RealTime = 0;

if( UseCompletedBars )

{

if(timeprev==Time[0]){return(0);} timeprev = Time[0];

RealTime = 1;

}

double MA11 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,0+RealTime);

double MA12 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,1+RealTime);

double MA21 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,0+RealTime);

double MA22 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,1+RealTime);

if( MA11 > MA21 && MA12 < MA22 ) { EnterLong = True; }

if( MA11 MA22 ) { EnterShort = True; }

Che cosa restituisce? Dato che non conosco lo spostamento, penso che sia per questo che non riesco a capirlo ...

la tua risposta sarà molto apprezzata.

per favore aiutatemi.