Come codificare? - pagina 287

 

...

Dai un'occhiata a questo post: https: //www.mql5.com/en/forum/174385/page12

Si trattava di un problema simile e potete usare la stessa funzione countOpenedOnACurrentBar

per limitare l'apertura di un solo trade per crossover

dipu:
Ciao amici, sono un principiante. Ho una semplice strategia. Faccio solo scalping quando l'EMA si incrocia. Prendo solo un trade in ogni crossover. Ho bisogno di un codice che possa fare solo un trade per ogni crossover EMA. Per favore......
 

Semplicemente EMA crossover codice bisogno........

Grazie mille, MLADEN...

Ho appena controllato la tua funzione. Sembra buono. Ho anche bisogno di aiuto. Ho bisogno di aggiungere il valore RSI(50) con EMA crossover.... come posso...?

Coppie: GBP/USD & EUR/USD

Timeframe: 15min,1 ora e oltre;

-------------------------------

COMPRARE: EMA 5 incrocia EMA 12 al rialzo, RSI maggiore di 50

VENDERE: EMA 5 incrocia EMA 12 al ribasso, RSI inferiore a 50

(solo un trade per ogni crossover EMA)

Aspetto una risposta. Per favore.......

 

Puoi farlo in un paio di modi.

Un modo (direttamente in EA) potrebbe essere qualcosa come questo:

double macdc = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,0)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,0);

double macdp = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,1)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,1);

double rsi = iRSI(NULL,0,RsiPeriod,RsiPrice,0);

if (macdc*macdp<0) // change of sign, signal for a new order

{

if (macdc>0 && rsi>50) ... code for buy

if (macdc<0 && rsi<50) ... code for sell

}

[/PHP]

The good thing about it is that it is small (the code) and does not take any significant process time. The bad thing when using conditions like that in an EA is that you have to imagine (and test, test, test ...) what is it going to perform like. I prefer making a "binary" indicator with which the it is very easy to visually inspect if the condition has any logic in it and if it is going to be profitable or not and then call that indicator (using iCustom()) from the EA.

Here is how would the indicator with the above conditions look like in "binary" form :

Hai tutte le informazioni necessarie: la linea grigia è il "trend". Le linee verde e rossa possono essere usate come punti di entrata e di rientro. Puoi "ottimizzarlo" visivamente in un istante, e poi usare quei parametri nell'EA (una "ottimizzazione" visivamente molto più veloce del doloroso "cambia i parametri, esegui, vedi cosa ottieni e poi la stessa cosa ancora e ancora". Ed è piuttosto facile chiamarlo dall'EA. Andrebbe così:

[PHP] double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

se (trendc!=trendp)

{

se (trendc== 1) ... segnale di acquisto

se (trendc==-1) ... segnale di vendita

}

Quindi, tutto sommato, raccomando sempre di usare un utilizzo dell'indicatore da un Ea. Puoi anche cambiare la logica dell'Ea senza toccarlo solo alterando e raffinando il codice dei tuoi indicatori, nel qual caso l'EA è "solo" un framework per gli ordini e la gestione del denaro (dato che i segnali provengono dall'indicatore) che a mio parere è il modo più efficiente di usare gli EA. Allegando anche l'indicatore, in modo da decidere quale modo (quello diretto o quello "da indicatore") vuoi usare nel tuo EA

PS: negli esempi precedenti, i test sono condotti sulla barra corrente (ancora aperta). Se volete testare la barra chiusa, sostituite lo 0 e l'1 con 1 e a nelle chiamate a iCustom(),iMa() e iRSI()

dipu:
Grazie mille, MLADEN...

Ho appena controllato la tua funzione. Sembra buona. Ho anche bisogno di aiuto. Ho bisogno di aggiungere il valore RSI(50) con EMA crossover.... come posso...?

Coppie: GBP/USD & EUR/USD

Timeframe: 15min,1 ora e oltre;

-------------------------------

COMPRARE: EMA 5 incrocia EMA 12 al rialzo, RSI maggiore di 50

VENDERE: EMA 5 incrocia EMA 12 al ribasso, RSI inferiore a 50

(solo un trade per ogni crossover EMA)

Sto aspettando una risposta. Per favore.......
File:
 

Saldo del 1° del mese?

Buongiorno, sono stato qui seduto a cercare di capire se c'è un modo per estrarre il saldo iniziale del 1° del mese per una visualizzazione sullo schermo.

Quello che sto cercando di fare è ottenere la differenza percentuale tra il saldo del 1° e il saldo attuale.

Ho la differenza percentuale complessiva.

(Saldo - Deposito)/Deposito*100

Vorrei aggiungere una differenza mensile.

(Saldo - 1°)/1°*100

Qualsiasi suggerimento o codice effettivo sarebbe fantastico.

Grazie

Beno

 

Grazie ancora, MALADEN...

Grazie per il tuo indicatore e i tuoi consigli. Ho provato a seguire le tue istruzioni. Ma siccome sono inesperto su mq4, non sono riuscito a farlo................

ECCO IL MIO ..............

------------------------------------

-----------------------------------

#proprietà indicator_separate_window

#proprietà indicator_buffers 3

#proprietà indicator_color1 LimeGreen

#proprietà indicator_color2 PaleVioletRed

#proprietà indicator_color3 DarkGray

#proprietà indicator_width1 2

#proprietà indicator_width2 2

#proprietà indicator_minimum -1.1

#proprietà indicator_maximum +1.1

extern int EmaFast = 5;

extern int EmaSlow = 12;;

extern int EmaPrice = PRICE_CLOSE;

extern int RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

double signup[];

doppio signdn[];

double trend[];

extern double TakeProfit=15.0;

extern double Lots=0.1;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

return(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted();

if(counted_bars < 0) return(-1);

if(counted_bars>0) counted_bars--;

int limit = MathMin(Bars-counted_bars,Bars-1);

int cnt, ticket, totale;

double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

se (trendc!=trendp)

totale = OrdiniTotali();

se(totale < 1)

{

if (trendc== 1) //... segnale di acquisto

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if (trendc==-1) //... segnale di vendita

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

}

return(0);

}

---------------------------------------

---------------------------------------

Ho bisogno del tuo aiuto....

Mi sono scusato con u se aspetto di più a u come sei caduto disturbato. Ma sono davvero impotente...

Sto aspettando una risposta. Per favore.......

 

...

Provate a usare qualcosa come questo :

double balanceAtStartOfMonth(int forMonth)

{

double current = AccountBalance();

datetime startTime = iTime(NULL,PERIOD_MN1,forMonth);

//

//

//

//

//

for (int k=OrdersHistoryTotal()-1; k>=0; k--)

{

if (!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;

if (OrderCloseTime()<startTime) continue;

current -= (OrderProfit()+OrderSwap());

}

return(current);

}

forMonth è il mese all'indietro per il quale volete vedere il saldo 0 essendo il mese corrente. Poi calcola qual era il saldo il primo giorno del mese richiesto. La funzione terrà conto anche dei depositi e dei prelievi (OrderType() == 6) quindi dovrebbe funzionare bene.

Beno:
Buongiorno, sono stato seduto qui cercando di capire se c'è un modo per estrarre il saldo iniziale per il 1° del mese per una visualizzazione sullo schermo.

Quello che sto cercando di fare è ottenere la differenza percentuale tra il saldo del primo giorno e il saldo attuale.

Ho la differenza percentuale complessiva.

(Saldo - Deposito)/Deposito*100

Vorrei aggiungere una differenza mensile.

(Saldo - 1°)/1°*100

Qualsiasi suggerimento o codice effettivo sarebbe fantastico.

Grazie

Beno
 

...

Non è possibile gestire gli ordini dall'indicatore. Puoi gestire gli ordini solo da script o EA (che è il caso che stai cercando). Il codice del tuo post è un indicatore.

Gli esempi che ho postato sono da utilizzare da un EA (per quanto ho capito tu hai già un EA in cui vuoi limitare il numero di ordini e volevi testare le condizioni ema e rsi per le entrate).

dipu:
Grazie ancora, MALADEN...

Grazie per il tuo indicatore e i tuoi consigli. Provo a seguire le tue istruzioni. Ma siccome sono poco esperto di mq4, non sono riuscito a farlo................

QUI C'E' IL MIO..............

------------------------------------

-----------------------------------

#proprietà indicator_separate_window

#proprietà indicator_buffers 3

#proprietà indicator_color1 LimeGreen

#proprietà indicator_color2 PaleVioletRed

#proprietà indicator_color3 DarkGray

#proprietà indicator_width1 2

#proprietà indicator_width2 2

#proprietà indicator_minimum -1.1

#proprietà indicator_maximum +1.1

extern int EmaFast = 5;

extern int EmaSlow = 12;;

extern int EmaPrice = PRICE_CLOSE;

extern int RsiPeriod = 14;

extern int RsiPrice = PRICE_CLOSE;

double signup[];

doppio signdn[];

double trend[];

extern double TakeProfit=15.0;

extern double Lots=0.1;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

return(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted();

if(counted_bars < 0) return(-1);

if(counted_bars>0) counted_bars--;

int limit = MathMin(Bars-counted_bars,Bars-1);

int cnt, ticket, totale;

double trendc = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

double trendp = iCustom(NULL,0, "ema + rsi binary",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

se (trendc!=trendp)

totale = OrdiniTotali();

se(totale < 1)

{

if (trendc== 1) //... segnale di acquisto

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if (trendc==-1) //... segnale di vendita

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

}

return(0);

}

---------------------------------------

---------------------------------------

Ho bisogno del tuo aiuto....

Mi sono scusato con u se aspetto di più a u come sei caduto disturbato. Ma sono davvero impotente...

Sto aspettando una risposta. Per favore.......
 

Grazie per la risposta, MLADEN,

Scusa, credo che tu mi abbia detto di mettere quel codice in un nuovo EA.

Solo che non ho capito la tua risposta....

SÌ. Hai ragione....

Ho l'EA e volevo modificarlo. Con alcune nuove condizioni.......

la mia condizione è :

------------------------------------------------------

COMPRARE: EMA 5 incrocia EMA 12 al rialzo, RSI maggiore di 50

VENDERE: EMA 5 incrocia EMA 12 al ribasso, RSI inferiore a 50

Uscire: con un piccolo Take-Profit

(solo un trade per ogni crossover EMA)

qui il mio EA.....

---------------------

---------------------

extern double Lots=0.1;

extern int TakeProfit=5;

extern int StopLoss=5;

extern int RSIPos=50;

extern int RSINeg=50;

extern int Slippage=2;

extern int abandon=101;

datetime bartime=0;

int bartick=0;

double p;

int cnt=0;

int OrdersPerSymbol=0;

double bullMA3=0;

double bearMA7=0;

double RSI=0;

bool RSIPOS=0;

bool RSINEG=0;

doppio TP;

doppio SL;

int init()

{

if (Symbol()=="AUDUSD") {TakeProfit= 60; StopLoss= 23; abandon=103;}

if (Symbol()=="EURAUD") {TakeProfit= 95; StopLoss=141; abandon=33;}

if (Symbol()=="EURCHF") {TakeProfit= 81; StopLoss= 77; abandon=97;}

if (Symbol()=="EURGBP") {TakeProfit= 11; StopLoss= 77; abandon=108;}

if (Symbol()=="EURJPY") {TakeProfit= 38; StopLoss= 75; abandon=183;}

if (Symbol()=="EURUSD") {TakeProfit=35; StopLoss= 35; abandon=5;}

if (Symbol()=="GBPCHF") {TakeProfit= 79; StopLoss= 98; abandon=113;}

if (Symbol()=="GBPJPY") {TakeProfit= 13; StopLoss= 98; abandon=117;}

if (Symbol()=="GBPUSD") {TakeProfit= 55; StopLoss=100; abandon=69;}

if (Symbol()=="USDCAD") {TakeProfit= 66; StopLoss= 76; abandon=106;}

if (Symbol()=="USDCHF") {TakeProfit=117; StopLoss= 78; abandon=111;}

if (Symbol()=="USDJPY") {TakeProfit= 53; StopLoss= 74; abandon=110;}

}

int deinit()

{

}

int start()

{

p=Point;

// Controllo degli errori e conteggio delle barre

if(AccountFreeMargin()<(200*Lots)) {Print("-----NO MONEY"); return(0);}

if(Bars<100) {Print("-----NO BARS "); return(0);}

if(bartime!=Time[0]) {bartime=Time[0]; bartick++;}

bullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1);

bearMA7=iMA(Symbol(),0,7,0,0,MODE_EMA,PRICE_CLOSE,1);

RSI=iRSI(Symbol(),0,2,PRICE_CLOSE,2);

if(RSI>RSIPos) {RSIPOS=vero; RSINEG=falso;}

if(RSI<RSINeg) {RSIPOS=falso; RSINEG=vero;}

OrdersPerSymbol=0;

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

OrdersPerSymbol++;

}

}

se(OrdiniPerSimbolo==0)

{

if(bullMA3>(bearMA7+p) && RSINEG)

{

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick=0;

}

se(bullMA3<(bearMA7-p) && RSIPOS)

{

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

bartick=0;

}

}

if(OrdersPerSymbol==1 && bartick==abbandono)

{

if(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),Lots,Bid,Slippage,White);

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

bartick++;

}

if(OrderType()==OP_SELL)

{

OrderClose(OrderTicket(),Lots,Ask,Slippage,Red);

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick++;

}

}

for(cnt=0;cnt<OrdersTotal();cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

if(OrderType()==OP_BUY)

{

if (OrderMagicNumber()==0)

{

if( Bid-OrderOpenPrice() > 3*Point )

{

OrderClose(OrderTicket(),Lots,Bid,0,White);

return(0);

}

}

}

if(OrderType()==OP_SELL)

{

if (OrderMagicNumber()==0)

{

if( OrderOpenPrice()-Ask > (3*Point) )

{

OrderClose(OrderTicket(),Lots,Ask,0,Red);

return(0);

}

}

}

}

}

return(0);

}

-------------------

---------------------

Come posso modificarlo....? In attesa di risposta. Per favore.......

 

dipu

Per quanto riguarda le entrate, questo funziona bene

Ora prenditi cura delle uscite, dato che nel modo in cui l'hai scritto stai chiudendo gli ordini troppo presto Anche il broker a 5 cifre è curato ora, e le entrate funzionano come dovrebbero. Il periodo predefinito per l'rsi è impostato a 14 (non ho capito quale vuoi usare, nel codice usi il periodo 2 ma probabilmente è troppo corto). I periodi Ema sono di default 5 e 12. Inoltre, ora sta testando una barra chiusa (aspetta che la barra si chiuda e se il segnale di acquisto o vendita esiste, inserisce l'ordine)

File:
dipu.mq4  5 kb
 

Grazie per la risposta, MLADEN,

scusate se non sono chiare le informazioni.......

COMPRARE: EMA 5 incrocia EMA 12 al rialzo, RSI[14] maggiore di 50

VENDERE: EMA 5 incrocio EMA 12 al ribasso, RSI[14] inferiore a 50

Uscita: con piccolo TP/Sl....(5pip)

(solo un trade per ogni incrocio EMA)

L'ho appena provato e vi informerò del risultato....

Può anche modificare... o no...

Grazie ancora per il tuo aiuto.....