Qual è l'errore? Quando viene eseguita nel tester, la funzione cancella l'ordine pendente e a volte no. Perché? Il principio di funzionamento è il seguente: quando l'ordine Buy viene chiuso da TP, il BuyLimit viene rimosso. Si prega di consigliare
Qual è l'errore? Quando viene eseguita nel tester, la funzione cancella l'ordine pendente e a volte no. Perché? Il principio di funzionamento è il seguente: quando l'ordine Buy viene chiuso da TP, il BuyLimit viene rimosso. Si prega di consigliare.
Ho fatto un semplice Expert Advisor basato su Stochstick (vende sul picco superiore, compra sul picco inferiore), e il compilatore dà un errore sul posto.
Qualcuno può dirmi qual è la ragione e cosa significa questo errore? All'inizio pensavo di aver dimenticato di mettere una parentesi da qualche parte.
Ma no, ho controllato alcune volte e tutto sembra essere a posto. Vi sarò molto grato per l'aiuto.
Ecco gli errori che il compilatore genera: ')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 177 3
')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 210 3
Ecco l'Expert Advisor stesso e un file mq4 allegato:
Si prega di consigliare come allegare l'Expert Advisor a questo file (nell'editor con lettere colorate)
if(B_Flag==true) // Se la posizione Buy è aperta, allora...
return; // Esci da start()
// Se nessuna posizione Buy è aperta, allora...
B_Flag=true; // Flag positivo per posizione Buy aperta
S_Flag=false; // controlla che non ci sia un segnale SELL
if(ORD_Sell==true) // Se c'è un ordine di vendita aperto,...
{
if(Tip!=1) // Controllo: l'ordine TYPE non corrisponde all'ordine aperto...
{
Work=false; //L'Expert Advisor non funzionerà
Alert("Il TIPO di ordine non corrisponde al FLAG dell'ordine aperto. Esci."); // Se la corrispondenza non esiste, l'Expert Advisor smette di funzionare
return; // Esci dall'inizio
}
Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip); // Chiudi l'ordine di vendita aperto
if(Ans_Close==false) // Se non è riuscito a chiudere
{
Alert("Impossibile chiudere l'ordine. L'Expert Advisor smette di funzionare.\n Numero di errore critico ", Crit_Error);
return; // uscire
}
}
Ans_Open=Open_Order(Symb,Lts,SL,TP,0); // OPEN LONG POSITION
if(Ans_Open==false) // se non è riuscito ad aprire Buy
{
Alert("Impossibile aprire l'ordine. L'Expert Advisor smette di funzionare.\n Numero di errore critico ", Crit_Error);
return; // Esci dall'inizio
} // Se l'ordine Buy è stato aperto con successo
ORD_Sell=false; // controlla che non ci sia una posizione corta
Skander: Ciao a tutti.Fatto un semplice esperto basato su Stochstic (in alto picco vende, in basso compra), e il compilatore dà un errore su un punto piatto. Qualcuno può dirmi qual è la ragione e cosa significa questo errore? All'inizio pensavo di aver dimenticato di mettere una parentesi da qualche parte. Ma no, ho controllato diverse volte e sembra che tutto sia a posto con le staffe. Vi sarò molto grato per l'aiuto. Ecco gli errori che il compilatore genera: ')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 177 3 ')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 210 3 //--------------------------------------------------------------- 8 -- bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip) // Chiusura ordine { double Close_Price=0; // Prezzo di chiusura dell'ordine mentre(vero) { RefreshRates();// Aggiorna i dati se(F_Tip==0)// Se(ordine di acquisto, ... Close_Price=Bid; // Prezzo di chiusura Bid Close_Price=Ask;// Se ordine di vendita, prezzo di chiusura Ask bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage); // Chiudi acquisto o vendita se (Ans_Close==true)// Ha funzionato:) return(true);// Uscire dalla funzione di chiusura Crit_Error=GetLastError();// commettere un numero di errore if (Fun_Error(Crit_Error)==1) // Gestione degli errori continuare;// riprova return(false);// Uscire dalla funzione } }
Premi il pulsante Compile in MetaEditor e leggi il messaggio di errore - c'è un numero di linea e un numero di posizione
//--------------------------------------------------------------- 8 --bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip) // Ф-ия закрытия ордера
{
double Close_Price=0; // Цена закрытия ордера while(true)
{
....................................
continue; // Повторная попыткаreturn(false); // Выход из функции
}
returnfalse; // Компилятор хочет return в конце функции
}
Inserisci il codice del programma con il pulsante SRC - ai lettori locali piace di più in questo modo!!! e il tuo lungo sproloquio è BRRRR
Il pulsante serve per inserire il codice sorgente nel testo del messaggio. Una volta cliccato, apparirà una finestra vuota dove è necessario incollare il codice e poi cliccare sul pulsante Insert.
Premi il pulsante Compile in MetaEditor e leggi il messaggio di errore - c'è un numero di linea e un numero di posizione
Inserisci il codice del programma con il pulsante SRC - ai lettori locali piace di più così!!! e il tuo lungo sproloquio è BRRRRR
Il pulsante serve per inserire il codice sorgente nel testo del messaggio. Quando si clicca, appare una finestra vuota dove è necessario incollare il codice e poi cliccare il pulsante Insert.
Evento click del mouse su oggetto grafico
CLIC SULL'OGGETTO
Coordinata X
Coordinata Y
Nome dell'oggetto grafico in cui si è verificato l'evento
Ugh, penso di aver capito tutto)
Grazie per l'aiuto!
Non so come collegare il risultato "r" a un buffer per visualizzarlo su un grafico, per favore consigliatemi.
Non riesco a capire gli esempi nei libri di testo, ho chiesto alla gente
Scrivono - "Scrivi il valore di "r" nel buffer, e apparirà sul grafico" e "Di solito si scrive nel buffer attraverso un ciclo for. "
ma questo non mi dice niente!
Un risultato è solo la lettera "r" e basta, non riesco a trovarlo da nessuna parte.
E un'altra cosa
come smussare il risultato "r" per esempio.
Grazie per l'attenzione!Qual è l'errore? Quando viene eseguita nel tester, la funzione cancella l'ordine pendente e a volte no. Perché? Il principio di funzionamento è il seguente: quando l'ordine Buy viene chiuso da TP, il BuyLimit viene rimosso. Si prega di consigliare
Qual è l'errore? Quando viene eseguita nel tester, la funzione cancella l'ordine pendente e a volte no. Perché? Il principio di funzionamento è il seguente: quando l'ordine Buy viene chiuso da TP, il BuyLimit viene rimosso. Si prega di consigliare.
OrdiniTotale() != OrdiniStoriaTotale()
Grazie.
Ciao a tutti.
Ho fatto un semplice Expert Advisor basato su Stochstick (vende sul picco superiore, compra sul picco inferiore), e il compilatore dà un errore sul posto.
Qualcuno può dirmi qual è la ragione e cosa significa questo errore? All'inizio pensavo di aver dimenticato di mettere una parentesi da qualche parte.
Ma no, ho controllato alcune volte e tutto sembra essere a posto. Vi sarò molto grato per l'aiuto.
Ecco gli errori che il compilatore genera: ')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 177 3
Ecco l'Expert Advisor stesso e un file mq4 allegato:
Si prega di consigliare come allegare l'Expert Advisor a questo file (nell'editor con lettere colorate)
//+------------------------------------------------------------------+
//| Stohastic-Signals-33.mq4
//| Copyright 2017, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#proprietà link "https://www.mql5.com"
#proprietà versione "1.00"
#proprietà rigorosa
//+------------------------------------------------------------------+
bool New_Bar=false; // bandiera di una nuova barra.
extern double H_line=80; // linea stocastica superiore (ipercomprato)
extern double L_line=20; // Linea inferiore (ipervenduto) dello stocastico
extern inttern Slippage=2; // Slippage
extern int SL; // SL dell'ordine da impostare
extern int TP; // TP dell'ordine che viene impostato
extern double Lts; //dimensione del lotto dell'ordine da impostare
bool B_Flag=false; // segnale di flag per BUY
S_Flag=false, // Flag per un segnale SELL
ORD_Buy=false, // Flag posizione Buy aperta
ORD_Sell=false; // Flag open Sell position
bool Work=true; // Flag che permette all'esperto di lavorare. true-nessun errore critico, false-esistente.
string Symb; // Nome dello strumento finanziario
int Crit_Error=1111111111; // Numero di errore critico
//+------------------------------------------------------------------+
//| funzione tick esperto |
//+------------------------------------------------------------------+
void OnTick()
{
int
Totale, // Numero di ordini nella finestra
Tip=-1, // Tipo di ordine selezionato (B=0,S=1)
Biglietto; // Numero d'ordine
doppio
M_1, M_2, M_3, // valore MAIN su 1, 2 e 3 barre
Lot; // Numero di lotti nell'ordine selezionato
bool Ans_Close; // Flag di chiusura riuscita dell'ordine (1-chiuso, 0-non chiuso)
bool Ans_Open; // Flag se l'ordine è stato aperto con successo (1-chiuso, 0-non aperto)
//--------------------------------------------------------------- 1 --
// Controlla se c'è un errore critico
if(Work==false) // Errore critico
{
Alert("Errore critico. Expert Advisor non funziona;)
return; // Esci da start()
}
//--------------------------------------------------------------- 2 --
// Nuovo bar
Fun_New_Bar(); // chiamata della funzione
if (New_Bar==false) // Se la barra non è nuova
return; // ...poi uscire
//------------------------------------------------------------- 3 --
// 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
Ticket=OrderTicket(); // Numero d'ordine selezionato.
Tip =OrderType(); // Tipo di ordine selezionato.
Lot=OrderLots(); // Numero di lotti
}
else
{
Alert("OrderSelect() ha restituito un errore - ",GetLastError()); // Se l'ordine non può essere selezionato, allora .
return; // uscire
}
}
//------------------------------------------------------------- 4 --
// Criteri commerciali Analisi della situazione
M_1=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,1); // 1 barra
M_2=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,2); // 2 bar
M_3=iStochastic(NULL,0,8,3,3,MODE_EMA,0,MODE_MAIN,3); // 3 bar
//------------------------------------------------------------- 5 --
if(M_2>=H_line) // se lo stocastico ha attraversato la linea di ipercomprato
{
if(M_3 <= M_2 && M_2 > M_1) // Lo stocastico ha attraversato la linea di ipercomprato {...
{
if(S_Flag==true) // Se (posizione di vendita aperta, allora ...
return; // Esci da start()
// Se la posizione Sell non è aperta, allora ...
S_Flag=true; // impostiamo un flag che indica che il segnale per vendere è apparso
B_Flag=false; // controlla che il segnale di COMPRA non sia apparso
if(ORD_Buy==true) // Se è stato aperto un ordine di acquisto,...
{
if(Tip!=0) // Controllo: l'ordine TYPE non corrisponde all'ordine aperto...
{
Work=false; //L'Expert Advisor non funzionerà
Alert("L'ordine TYPE non corrisponde al FLAG dell'ordine aperto. Esci."); // Se la corrispondenza non esiste, l'Expert Advisor smette di funzionare
return; // Esci dall'inizio
}
Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip); // Chiudi l'ordine di acquisto aperto
if(Ans_Close==false) // Se la chiusura non è riuscita, allora...
{
Alert("Impossibile chiudere l'ordine. L'Expert Advisor smette di funzionare.\n Numero di errore critico ", Crit_Error);
return; // uscire
}
}
Ans_Open=Open_Order(Symb,Lts,SL,TP,1); // OPEN POINTS
if(Ans_Open==false) // se non è riuscito ad aprire Sell
{
Alert("Impossibile aprire l'ordine. L'Expert Advisor smette di funzionare.\n Numero di errore critico ", Crit_Error);
return; // Esci dall'inizio
} // Se Sell è stato aperto con successo
ORD_Sell=true; // mettiamo una bandiera che una posizione SHORT è stata aperta
ORD_Buy=false; // Segnala la posizione LONG come andata
}
return; // Esci dall'inizio
}
//------------------------------------------------------------------------ 6 --
if(M_2<=L_line) // Se lo stocastico ha attraversato la linea di ipervenduto
{
if(M_3 >= M_2 && M_2 < M_1) // Appare il picco inferiore (BUY CALL)
{
if(B_Flag==true) // Se la posizione Buy è aperta, allora...
return; // Esci da start()
// Se nessuna posizione Buy è aperta, allora...
B_Flag=true; // Flag positivo per posizione Buy aperta
S_Flag=false; // controlla che non ci sia un segnale SELL
if(ORD_Sell==true) // Se c'è un ordine di vendita aperto,...
{
if(Tip!=1) // Controllo: l'ordine TYPE non corrisponde all'ordine aperto...
{
Work=false; //L'Expert Advisor non funzionerà
Alert("Il TIPO di ordine non corrisponde al FLAG dell'ordine aperto. Esci."); // Se la corrispondenza non esiste, l'Expert Advisor smette di funzionare
return; // Esci dall'inizio
}
Ans_Close=Close_Order(Ticket,Lot,Slippage,Tip); // Chiudi l'ordine di vendita aperto
if(Ans_Close==false) // Se non è riuscito a chiudere
{
Alert("Impossibile chiudere l'ordine. L'Expert Advisor smette di funzionare.\n Numero di errore critico ", Crit_Error);
return; // uscire
}
}
Ans_Open=Open_Order(Symb,Lts,SL,TP,0); // OPEN LONG POSITION
if(Ans_Open==false) // se non è riuscito ad aprire Buy
{
Alert("Impossibile aprire l'ordine. L'Expert Advisor smette di funzionare.\n Numero di errore critico ", Crit_Error);
return; // Esci dall'inizio
} // Se l'ordine Buy è stato aperto con successo
ORD_Sell=false; // controlla che non ci sia una posizione corta
ORD_Buy=true; // Flag aprire posizione LONG
}
return; // Esci dall'inizio
}
}
//+------------------------------------------------------------------ 7 --
void Fun_New_Bar() // Il rilevamento fie .
{ // ... nuova barra.
static datetime New_Time=0; // tempo della barra corrente
New_Bar=false; // Nessuna nuova barra
if(New_Time!=Time[0]) // confronta il tempo
{
New_Time=Time[0]; // Ora il tempo è
New_Bar=true; // La nuova barra è catturata
}
}
//--------------------------------------------------------------- 8 --
bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip) // Chiusura ordine
{
double Close_Price=0; // Prezzo di chiusura dell'ordine
mentre(vero)
{
RefreshRates(); // Aggiorna i dati
if(F_Tip==0) // Se l'ordine è Buy, ...
Close_Price=Bid; // Prezzo di chiusura Bid
Close_Price=Ask; // Se l'ordine è Sell, chiudere il prezzo Ask
bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage); // Chiudi acquisto o vendita
if (Ans_Close==true) // Ha funzionato :)
return(true); // Esci dalla funzione di chiusura
Crit_Error=GetLastError(); // Fissa il numero di errore
if (Fun_Error(Crit_Error)==1) // Gestione degli errori
continue; // Retry; // Prova di nuovo.
return(false); // Esci dalla funzione
}
}
//--------------------------------------------------------------- 9 --
//Apertura dell'ordine
bool Open_Order(string F_Symb,double F_Lts,int F_SL,int F_TP,int F_Tip)
{
double Open_Price; //prezzo aperto
stringa Tip_Deal; // direzione del trade(comprare o vendere)
double f_sl; // ordine Stop Loss
double f_tp; // Take Profit
int Ticket; // biglietto dell'ordine aperto
while(true) // Gli ordini chiudono il ciclo.
{
RefreshRates(); // Aggiorna i dati
if(F_Tip==1) // Aprire SELL...
{
Open_Price=Bid;
Tip_Deal="OP_SELL";
f_sl=NormalizeDouble(Bid+F_SL*Point,Digits);
f_tp=NormalizeDouble(Bid-F_TP*Point,Digits);
}
//-------------------------------- Se vuoi aprire BUY, allora...
Open_Price=Chiedi;
Tip_Deal="OP_BUY";
f_sl=NormalizeDouble(Bid+F_SL*Point,Digits);
f_tp=NormalizeDouble(Bid-F_TP*Point,Digits);
Ticket=OrderSend(F_Symb,Tip_Deal,F_Lts,Open_Price,2,f_sl,f_tp);//open ORDER
if (Ticket > 0) // ha funzionato :)
return(true); //uscita dalla funzione
Crit_Error=GetLastError(); // numero di errore commesso
if (Fun_Error(Crit_Error)==1) // Gestione degli errori
continue; // Retry; // Prova di nuovo.
return(false); // Esci dalla funzione
}
}
//--------------------------------------------------------------- 10 --
int Fun_Error(int Error) //Errore di gestione delle funzioni
{
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 --
Qualcuno può dirmi qual è la ragione e cosa significa questo errore? All'inizio pensavo di aver dimenticato di mettere una parentesi da qualche parte.
Ma no, ho controllato diverse volte e sembra che tutto sia a posto con le staffe. Vi sarò molto grato per l'aiuto.
Ecco gli errori che il compilatore genera: ')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 177 3
')' - non tutti i percorsi di controllo restituiscono un valore Stohastic-Signals-33.mq4 210 3
//--------------------------------------------------------------- 8 --
bool Close_Order(int F_Ticket,double F_Lot,int F_Slippage,int F_Tip) // Chiusura ordine
{
double Close_Price=0; // Prezzo di chiusura dell'ordine
mentre(vero)
{
RefreshRates();// Aggiorna i dati
se(F_Tip==0)// Se(ordine di acquisto, ...
Close_Price=Bid; // Prezzo di chiusura Bid
Close_Price=Ask;// Se ordine di vendita, prezzo di chiusura Ask
bool Ans_Close=OrderClose(F_Ticket,F_Lot,Close_Price,F_Slippage); // Chiudi acquisto o vendita
se (Ans_Close==true)// Ha funzionato:)
return(true);// Uscire dalla funzione di chiusura
Crit_Error=GetLastError();// commettere un numero di errore
if (Fun_Error(Crit_Error)==1) // Gestione degli errori
continuare;// riprova
return(false);// Uscire dalla funzione
}
}
Premi il pulsante Compile in MetaEditor e leggi il messaggio di errore - c'è un numero di linea e un numero di posizione
Inserisci il codice del programma con il pulsante SRC - ai lettori locali piace di più in questo modo!!! e il tuo lungo sproloquio è BRRRR
Il pulsante
serve per inserire il codice sorgente nel testo del messaggio. Una volta cliccato, apparirà una finestra vuota dove è necessario incollare il codice e poi cliccare sul pulsante Insert.
Premi il pulsante Compile in MetaEditor e leggi il messaggio di errore - c'è un numero di linea e un numero di posizione
Inserisci il codice del programma con il pulsante SRC - ai lettori locali piace di più così!!! e il tuo lungo sproloquio è BRRRRR
Il pulsante serve per inserire il codice sorgente nel testo del messaggio. Quando si clicca, appare una finestra vuota dove è necessario incollare il codice e poi cliccare il pulsante Insert.
Grazie.