[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 182

 
 
dent:
Come ordinare un consulente
Puoi ordinare qui: https://www.mql5.com/ru/job
 
NaVolne:


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.

double OpenBar=0; 
 
int start()
   {
    //Проверка на начало нового бара
    if (OpenBar==Time[0]) {return;} else {OpenBar=Time[0];}
    //ваш код
   }
 
dent:
Come ordinare un consulente
 
OlegTs:
double OpenBar=0; 

 

int start()
   {
    //Проверка на начало нового бара
    double CurOpenBar=iOpen(NULL,PERIOD_M15,0);  
    if (OpenBar==CurOpenBar) {return;} else {OpenBar=CurOpenBar;}
    //ваш код
   }


qualcosa del genere...

Un cattivo esempio. Perché il prezzo di apertura delle candele può essere ripetuto. Ma il tempo non lo fa.
 
MaxZ:
Un cattivo esempio. Perché il prezzo di apertura delle candele può essere ripetuto. Ma il tempo non lo fa.

Sono d'accordo:)))
 
Grazie mille ragazzi, comincia a funzionare :)
 

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 --



 
neisseria:

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.

Motivazione: