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
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; } } }
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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