[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 182
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Come ordinare un consulente
Perché questo è il caso?
L'EA elabora ogni tick, e su ogni tick c'è un controllo e l'apertura di un ordine.... È necessario ricordare il tempo dell'ultima posizione aperta e fare una pausa di 15 minuti, oppure si può lavorare in base all'apertura o alla chiusura di una barra. È meglio essere legati al tempo del bar nel codice.
Come ordinare un consulente
qualcosa del genere...
Un cattivo esempio. Perché il prezzo di apertura delle candele può essere ripetuto. Ma il tempo non lo fa.
Sono d'accordo:)))
Sto cercando di imparare mcl4 e scrivere un EA per i test. Sono sorte alcune domande.
1) C'è una procedura per controllare la storia analizzata per le candele a minuti mancanti per questa o quella coppia? Forse la procedura è già scritta e disponibile in rete?
2) Se ci sono lacune o solo una piccola quantità di storia, come può l'EA scaricare l'intero minuto di candele per questa o quella coppia dalla data necessaria o riempire le lacune?
L'idea è che l'EA controllerà la correttezza della storia mentre lavora e correggerà le lacune o il piccolo numero di barre se necessario.Sto imparando un linguaggio di programmazione e ho difficoltà a capire il comportamento del programma. Ho scritto un EA basato sul libro di testo, ma l'ho stravolto secondo un principio di funzionamento leggermente diverso.
L'Expert Advisor si basa su una media di 2 muwings. L'idea è semplice, le medie mobili si incrociano, l'ordine viene chiuso e quello opposto viene aperto. Ho scritto un EA e funziona bene. Naturalmente è in leggero svantaggio, ma in accordo con l'idea. L'intero problema è il seguente (in grassetto):
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA, PRICE_CLOSE,1); // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D
Se cambio il modo di calcolare le medie mobili (può mostrare il segno più) e metto il metodo esponenziale( MODE_SMA) invece di quello semplice(MODE_EEMA ) e un altro(MODE_SMMA), il cosiddetto metodo lisciato, tutto va male. Il principio di funzionamento diventa ancora più divertente (nel tester della strategia) poiché l'EA apre un ordine all'inizio del periodo impostato e lo chiude alla fine. Cioè, per un anno apre un solo trade all'inizio del periodo e lo chiude alla fine. Di conseguenza, l'Expert Advisor mi ha mostrato un plus, ma non ho bisogno di tale plus. Io stesso posso lanciare una moneta e aprire un ordine di acquisto o di vendita e guardare se sto vincendo o perdendo in un anno. A proposito, se imposto MODE_SMA a MODE_LWMA (Linear Weighted Moving Average), il programma funziona bene.
Per favore, consigliatemi, cosa c'è di sbagliato? Il principio è lo stesso; solo il modo in cui le medie mobili sono calcolate è stato cambiato un po'.
Ecco l'intero codice del programma:
//+------------------------------------------------------------------+
//| basato su due medie mobili.mq4
//| Copyright © 2011, MetaQuotes Software Corp.
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp.
#proprietà link "http://www.metaquotes.net"
//--------------------------------------------------------------- 1 --
// Valori numerici per M15
extern int int Period_MA_1=6; // Periodo MA1
extern int Period_MA_2=15; // Periodo MA 2
extern double Lots =0.1; // Numero fisso di lotti
bool Work=true; // Expert Advisor funzionerà.
string Symb; // nome dello strumento finanziario
//--------------------------------------------------------------- 2 --
int start()
{
int
Totale, // Numero di ordini nella finestra
Tip=-1, // Tipo di ordine selezionato (B=0,S=1)
Biglietto; // Numero d'ordine
doppio
A, //Valore. Valore MA_1 per la prima barra dalla fine
Valore MA_2 per la prima barra dalla fine
Prezzo, // Prezzo dell'ordine selezionato
C, //Valore. MA_1 per la seconda barra dalla fine
D, // Significato. Valore MA_2 per la seconda barra dalla fine
Lot; // Numero di lotti nell'ordine selezionato
bool
Ans =false, // Risposta del server dopo la chiusura
Cls_B=false, // Criterio di chiusura di Buy
Cls_S=false, // Criterio di chiusura Vendi
Opn_B=false, // Criterio di apertura di Buy
Opn__S=false; // criterio di apertura di Sell
//--------------------------------------------------------------- 3 --
//Preelaborazione
if(Bars < Period_MA_2) // Non ci sono abbastanza barre
{
Alert("Non ci sono abbastanza barre nella finestra, l'Expert Advisor non funziona");
return; // Esci da start()
}
if(Work==false) // Errore critico.
{
Alert("Errore critico. Expert Advisor non funziona");
return; // Esci da start()
}
//--------------------------------------------------------------- 4 --
// Conteggio degli ordini
Symb=Symbol(); // Nome dello strumento finanziario.
Total=0; // Numero di ordini
for(int i=1; i<=OrdersTotal(); i++) // ciclo degli ordini
{
if(OrderSelect(i-1,SELECT_BY_POS)==true) // Se
{ // Analisi dell'ordine:
if (OrderSymbol()!=Symb)continue; // Non è il nostro strumento finanziario
if (OrderType()>1) // Abbiamo un ordine in sospeso
{
Alert("Ordine in sospeso rilevato. Expert Advisor non funziona;)
return; // Exit()
}
Totale++; // Contatore degli ordini di mercato
if (Totale>1) // Non più di un ordine
{
Alert("Diversi ordini di mercato. L'Expert Advisor non funziona;)
return; // Exit()
}
Ticket=OrderTicket(); // Numero d'ordine selezionato.
Tip =OrderType(); // Tipo di ordine selezionato.
Price =OrderOpenPrice(); // Prezzo dell'ordine selezionato.
Lot =OrderLots(); // Numero di lotti
}
}
//--------------------------------------------------------------- 5 --
// Criteri commerciali
A=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,1); // A
B=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,1); // B
C=iMA(NULL,0,Period_MA_1,0,MODE_SMA,PRICE_CLOSE,2); // C
D=iMA(NULL,0,Period_MA_2,0,MODE_SMA,PRICE_CLOSE,2); // D
se (A<C&C>D&B>=A) // la linea МА1 va verso il basso,
{ // MA1 incrocia MA2
Opn_B=true; // dall'alto verso il basso
Cls_S=true; //
}
se (B<D&D>C&&A>=B) // la linea MA2 va verso il basso
{ // MA2 incrocia MA1
Opn_S=true; // dall'alto verso il basso
Cls_B=true; //
}
//--------------------------------------------------------------- 6 --
// Chiudere gli ordini
while(true) //Ordine di chiusura del ciclo.
{
if (Tip==0 && Cls_B==true) //Open Buy order.
{ //c'è un criterio di chiusura
Avviso("Cercando di chiudere l'acquisto ",Biglietto,";)
RefreshRates(); // Aggiorna i dati
Ans=OrderClose(Ticket,Lot,Bid,2); // Chiudi Acquisto
if (Ans==true) // Ha funzionato :)
{
Avviso ("Ordine di acquisto chiuso",Biglietto;)
break; // Esci dal ciclo di chiusura
}
if (Fun_Error(GetLastError())==1) // Gestione degli errori
continuare; // riprovare
return; // Esci da start()
}
if (Tip==1 && Cls_S==true) // Ordine di vendita aperto.
{ // c'è un criterio di chiusura
Avviso("Cercando di chiudere la vendita ",Biglietto,";)
RefreshRates(); // Aggiorna i dati
Ans=OrderClose(Ticket,Lot,Ask,2); // Chiudi Vendi
if (Ans==true) // Ha funzionato :)
{
Avviso ("Ordine di vendita chiuso",Biglietto;)
break; // Esci dal ciclo di chiusura
}
if (Fun_Error(GetLastError())==1) // Gestione degli errori
continuare; // riprovare
return; // Esci da start()
}
break; // Esci mentre
}
//--------------------------------------------------------------- 7 --
//--------------------------------------------------------------- 8 --
//Apertura degli ordini
while(true) //Ordine di chiusura del ciclo.
{
if (Total==0 && Opn_B==true) // Nessun ordine aperto
{ //open Criterio di acquisto.
RefreshRates(); // Aggiorna i dati
Alert("Cercando di aprire Buy. In attesa di risposta...");
Ticket=OrderSend(Symb,OP_BUY,Lots,Ask,20,0,0, "EA 2xMA"); //Open Buy
if (Ticket > 0) // ha funzionato :)
{
Avviso ("Ordine di acquisto aperto",Biglietto;)
return; //Esci dall'ordine
}
if (Fun_Error(GetLastError())==1) // Gestione degli errori
continuare; // riprovare
return; // Esci da start()
}
if (Total==0 && Opn_S==true) // nessun ordine aperto
{ //aprire il criterio di vendita.
RefreshRates(); // Aggiorna i dati
Alert("Tentativo di aprire Vendere. In attesa di risposta...");
Ticket=OrderSend(Symb,OP_SELL,Lots,Bid,20,0,0, "EA 2xMA");//Open Sel.
if (Ticket > 0) // ha funzionato :)
{
Avviso ("Ordine di vendita aperto ",Biglietto;)
return; // Esci da start()
}
if (Fun_Error(GetLastError())==1) // Gestione degli errori
continuare; // riprovare
return; // Esci da start()
}
break; // Esci mentre
}
//--------------------------------------------------------------- 9 --
return; //uscita da start()
}
//-------------------------------------------------------------- 10 --
int Fun_Error(int Errore) // Gestione degli errori fie
{
interruttore(Errore)
{ // Errori insormontabili.
caso 4: Avviso("Il server commerciale è occupato. Riprova...");
Sleep(3000); // Soluzione semplice.
return(1); // Esci dalla funzione.
caso 135:Alert("Prezzo cambiato. Riprova...");
RefreshRates(); // Aggiorna i dati.
return(1); // Uscire dalla funzione.
caso 136:Alert("Nessun prezzo. In attesa di un nuovo tick...");
while(RefreshRates()==false) // Effettua un nuovo tick
Sleep(1); // Ritardo nel ciclo
return(1); // Esci dalla funzione
caso 137:Alert("Broker is busy. Try again...");
Sleep(3000); // Soluzione semplice.
return(1); // Uscire dalla funzione.
caso 146:Alert("Il sottosistema di trading è occupato. Riprova...");
Sleep(500); // Semplice decisione
return(1); // Esci dalla funzione
// Errori critici
caso 2: Avviso("Errore generale;)
return(0); // Esci dalla funzione.
caso 5: Alert("Versione più vecchia del terminale");
Lavoro=falso; // Non funziona più
return(0); // Esci dalla funzione
caso 64: Avviso("Account bloccato.");
Lavoro=falso; // Non funziona più
return(0); // Esci dalla funzione
caso 133:Alert("Commercio proibito.");
return(0); // Esci dalla funzione
caso 134:Alert("Non ci sono abbastanza soldi per eseguire la transazione.");
return(0); // Esci dalla funzione
default: Alert("Si è verificato un errore ",Error); // Altre opzioni
return(0); // Esci dalla funzione
}
}
//-------------------------------------------------------------- 11 --
Sto imparando un linguaggio di programmazione e ho difficoltà a capire il comportamento del programma. Ho scritto un EA basato sul tutorial, ma l'ho cambiato secondo un principio leggermente diverso.
Quando si chiude l'ordine sarebbe bello diminuire il Totale, o meglio ancora, non preoccupiamoci di questo e facciamo una funzione che restituisca il numero di ordini aperti per il simbolo e il numero magico.
Quattro medie mobili sono troppe ed è meglio mostrarle in due periodi e a diversi offset. Si raccomanda di visualizzarli sullo schermo e vedere come si comportano.