Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 99
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Dratuti. Come si fa un pannello come questo?
Dratuti. Come si fa un pannello come questo?
Dratuti. Come si fa un pannello come questo?
Vitaly Muzichenko,Artyom Trishkin grazie.
Continuando a scrivere un altro piggybacking su martingala, perdendo anche nel tester, altrimenti come facciamo a crescere un alce.
Al momento c'è un parametro desiderato, che dovrebbe essere responsabile della possibilità di aprire l'ordine successivo dopo che il precedente è chiuso
ci sono 2 scenari
1) se il valore è vero
aprire l'ordine
processo
chiudere
e riaprire
2) se falso
Aprire l'ordine
Processo
Chiudere
e poi fare ExpertRemove
l'intero problema è che queste due condizioni si escludono a vicenda, ma devono essere combinate in 1 EA poiché
1) il valore è impostato all'inizio
2) il valore è impostato nelle condizioni di input e di elaborazione e accettato per l'elaborazione (se vero, aperto)
3) dopo la chiusura, impostiamo false
Se qualcuno è interessato a queste cose, sarei felice di sentire le mie varianti.È semplice:
Abbiamo problemi con la logica.
Tutto è semplice:
Qualcosa non sembra giusto, se è vero - dovresti tagliare i cavoli, non nei cespugli)
Si prega di avvisare. L'Expert Advisor non apre ordini nel terminale. La compilazione è in corso, secondo i grafici gli ordini dovrebbero essere aperti. Ma non lo sono. Sto allegando il codice.
double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//determina il numero di lotti
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//i parametri MACD della barra corrente
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);//i parametri MACD della barra precedente
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);//i parametri MACD della linea principale spostati di 2 barre
double StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Parametri Trailing Stop da parametri ParabolicSAR della barra corrente
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);/parametri StopLoss per parametri ParabolicSAR della barra precedente
double PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//parametri ParabolicSAR della barra corrente
double PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//ParabolicSAR parametri della barra precedente
//+------------------------------------------------------------------+
//| Funzione tick esperto|
//+------------------------------------------------------------------+
void OnTick()
{
static datetime New_Time=TimeCurrent();// Tempo della barra corrente
bool New_Bar=false; // Flag nuova barra
int biglietto,totale,cnt;
//---------------------------------------------------------------------------
{
New_Bar=false; // Nessuna nuova barra
if(Time[0]==New_Time) // Confronta i tempi
{
New_Bar=true; // New_Bar è catturato
if(New_Bar==false) // Se una barra non è nuova
return; // ...poi uscire
}
}
total=OrdersTotal();// Determinazione del numero di ordini
se(totale<1)
{
//---nessun ordine aperto
if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
//Controlla la disponibilità di fondi per aprire il lotto minimo
{
Print("Non ci sono abbastanza fondi. Fondi liberi = ",AccountFreeMargin());
ritorno;
}
//-condizione per l'apertura di una posizione lunga (BUY)
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//controlla la posizione aperta
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order open : ",OrderOpenPrice());
else
Print("BUY order open error : ",GetLastError());
ritorno;
}
}
//-condizione per aprire una posizione corta (SELL)
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red);
if(ticket>0)//controlla la posizione aperta
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order open : ",OrderOpenPrice());
else
Print("Error opening SELL order : ",GetLastError());
ritorno;
}
}
//- uscire dal blocco "nessun ordine aperto"
}
//--è importante entrare nel mercato correttamente ma è più importante uscirne correttamente
for(cnt=0;cnt<totale;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICNUMBER && // controlla il numero magico dell'ordine
OrderSymbol()==Symbol()) // controlla il simbolo dell'ordine
{
//--- posizione lunga aperta
if(OrderType()==OP_BUY)
{
//--- deve essere chiuso?
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
//- ordine di chiusura e uscita
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
ritorno;
}
//------------------Modificare l'ordine per StopLoss
if(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("Errore di modifica dell' ordine. Codice di errore=",GetLastError());
else
Stampa("Il prezzo di Stop Loss dell'ordine è stato modificato con successo;)
ritorno;
}
}
altrimenti // vai corto
if(OrderType()==OP_SELL)
{
//--- deve essere chiuso?
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
//- ordine di chiusura e uscita
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
ritorno;
}
//-----------------Modificare l'ordine per StopLoss
if(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("Errore di modifica dell'ordine. Codice di errore=",GetLastError());
else
Stampa("Il prezzo di Stop Loss dell'ordine è stato modificato con successo;)
ritorno;
}
}
}
//-------------------------------------------------------------------------------------------------------
Sì, è più semplice di così.
ma cosa succede se teniamo questo come ripiego e facciamo quanto segue
controllare la condizione e...cioè come bloccare l'ingresso per ulteriori operazioni