Come codificare? - pagina 284

 

Ho trovato una soluzione per il filtro temporale Close All

Variabili esterne

extern string timefilter="Time Filter";

extern int gmtshift=1; // gmt offset of the broker

extern bool generalfilter=false; // enable time filter

extern int starthour=7; // start hour to trade after this hour

extern int startminutes=0; // minutes of the start hour

extern int endhour=21; // stop to trade after this hour

extern int endminutes=0; // minutes of the start hour

extern bool tradesunday=true; // trade on sunday

extern bool fridayfilter=false; // enable special time filter on friday

extern int fridayhour=21; // stop to trade after this hour

extern int fridayminutes=0; // minutes of the friday hour

[/CODE]

int nstarthour,nendhour,nfridayhour;

string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;

datetime tstart,tend,tfriday;[/CODE]

Place Code in Start,

[CODE] if(generalfilter){

nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;

if(nstarthour<10)istarthour="0"+nstarthour;

if(nstarthour>9)istarthour=nstarthour;

if(startminutes<10)istartminutes="0"+startminutes;

if(startminutes>9)istartminutes=startminutes;

tstart=StrToTime(istarthour+":"+istartminutes);

nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;

if(endhour<10)iendhour="0"+nendhour;

if(endhour>9)iendhour=nendhour;

if(endminutes<10)iendminutes="0"+endminutes;

if(endminutes>9)iendminutes=endminutes;

tend=StrToTime(iendhour+":"+iendminutes);

}

if(fridayfilter){

nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;

if(nfridayhour<10)ifridayhour="0"+nfridayhour;

if(nfridayhour>9)ifridayhour=nfridayhour;

if(fridayminutes<10)ifridayminutes="0"+fridayminutes;

if(fridayminutes>9)ifridayminutes=fridayminutes;

tfriday=StrToTime(ifridayhour+":"+ifridayminutes);

}

if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))

|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))

{

CloseAll();

Comment("Non-trading Hours All Positions Closed");

return(0);

}

and the CloseAll function.

[CODE]

void CloseAll(){

int total = OrdersTotal();

for(int i=total-1;i>=0;i--){

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type){

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );

} if(result == false){

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

grazie per i suggerimenti e le dritte Kalenzo

 

StopLoss

Gidday

Ho provato un esperimento per calcolare uno SL basato sul tickvalue, un max dd e una percentuale per trade.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

L'idea è che a seconda della coppia, del tickvalue individuale della coppia e della dimensione del lotto si possa impostare uno SL del 2%.

Penso che sia giusto, ma vorrei che qualcuno lo controllasse, se possibile.

 
Beno:
Buongiorno

Ho provato un esperimento per calcolare uno SL basato sul tickvalue, un max dd e una percentuale per trade.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

L'idea è che a seconda della coppia e del tickvalue individuale delle coppie e della dimensione del lotto si può impostare il 2% di sl.

Penso che sia giusto, ma vorrei che qualcuno lo controllasse, se possibile.

Buon lavoro Beno,

E' sempre meglio dare la canna da pesca che il pesce. Sono molto felice di averti potuto aiutare con alcuni commenti.

Per quanto riguarda lo stop loss, l'idea è buona, tuttavia prova anche a considerarlo al contrario:

prima impostare lo stop loss

in secondo luogo impostare la dimensione del trade

In questo modo adatterai l'entrata/uscita del sistema alle condizioni del mercato, e non rischierai più del X% del tuo conto, ma l'uscita dipenderà dalla logica del sistema invece che dalla percentuale di rischio.

 
Kalenzo:
Buon lavoro Beno,

È sempre meglio dare la canna da pesca che il pesce. Sono molto felice di poterti aiutare con alcuni commenti.

Per quanto riguarda lo stop loss, l'idea è buona, tuttavia prova anche a considerarlo al contrario:

prima imposta lo stop loss

in secondo luogo impostare la dimensione del trade

In questo modo adatterai l'entrata/uscita del sistema alle condizioni del mercato, e non rischierai più del X% dal tuo conto, ma l'uscita dipenderà dalla logica del sistema invece che dalla percentuale di rischio.

Buongiorno Kalenzo

Sto ottenendo un errore nell'apertura dell'ordine SELL: invalid stops con l'EA sia sul conto demo che su quello live e non si aprono operazioni. ma funziona bene sul tester e non ha messaggi di errore.

EURUSD,Daily: modifica #1 compra 0.01 EURUSD a 1.43348 sl: 1.43895 tp: 0.00000 ok

Lo SL 0,00547 punti di differenza

Ho controllato il

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Non mi sono mai imbattuto in questo prima d'ora.

Grazie

Beno

 

Funzione latch/unlatch

C'è un modo per codificare una funzione latch/unlatch in mq4. Si potrebbe fare il latch di un bit vero in base a una condizione e si memorizzerebbe questo valore fino a quando non viene sbloccato da un'altra condizione.

cmfxtrader

 
Beno:
Buongiorno Kalenzo

Sto ottenendo un errore nell'apertura dell'ordine SELL: fermate non valide con l'EA sia sul conto demo che sul conto live e nessun trade si sta aprendo. ma funziona bene sul tester e non ha messaggi di errore.

EURUSD,Daily: modifica #1 compra 0.01 EURUSD a 1.43348 sl: 1.43895 tp: 0.00000 ok

Lo SL 0,00547 punti di differenza

Ho controllato il

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Non mi sono mai imbattuto in questo prima d'ora.

Grazie

Beno

Probabilmente il tuo stop loss è troppo vicino. Prova a moltiplicare il valore dello stop loss per 10. E' un problema frequente quando stai testando il sistema su un broker a 4 cifre, e lo stai negoziando su un broker a 5 cifre. Potresti anche testarlo su un broker a 5 cifre, ma non connetterti mai al broker (in modalità offline) e quindi metatrader avrà le vecchie impostazioni (da 4 dig).

Prima da questa linea:

NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

Stampa questo valore => stopLoss*pips2dbl

allora saprete il valore reale dello stop loss.

se sarà come 20 o 10 allora significa che è necessario moltiplicarlo per il valore Point

NormalizeDouble(Ask - (stopLoss * pips2dbl) *Point, Digits);

se sarà come 0.00009 allora è necessario moltiplicare solo per 10 perché dovrebbe essere 0.0009 (naturalmente se si desidera impostare 9 pips di stop loss)

 
cmfxtrader:
C'è un modo per codificare una funzione latch/unlatch in mq4. Si tratterebbe di bloccare un bit vero in base a una condizione e di memorizzare questo valore fino a quando non viene sbloccato da un'altra condizione. cmfxtrader

Non sono sicuro di aver capito bene. Desiderate attivare/disattivare una parte specifica di ea(funzione) o desiderate disattivare la funzione di ea A tramite l'azione intrapresa in ea B? In questo modo o in un altro, entrambi sono possibili.

 

Convertire il valore monetario in prezzo (per il calcolo dell'obiettivo di profitto)

Vorrei programmare una funzione che restituisca un valore di prezzo per un dato obiettivo di profitto di un paniere di trade, ma ho delle difficoltà. L'obiettivo che vorrei raggiungere, è una semplice linea orizzontale da disegnare sullo schermo che indica l'obiettivo di profitto. Tuttavia, il target di profitto è una variabile definibile dall'utente sotto forma di un valore monetario e non di un valore di prezzo. (es. target = 100 € invece di target = 1.2000)

La routine che ho finora:

(Il mio conto è in EUR!)

1) Diciamo che apro diverse posizioni di acquisto per il USDJPY (a posizioni casuali per creare una situazione di esempio)

2) Calcolo il prezzo medio aperto del paniere (diciamo 1,1500, sempre ipoteticamente) e mostro una linea orizzontale per indicarlo

3) Ho una variabile con un obiettivo di profitto impostato: diciamo obiettivo = € 100

4) Posso chiudere con successo tutte le posizioni aperte quando basketprofit >= target

Manca il passo intermedio. Ho bisogno di una funzione: double targetPrice(){} che restituisca il targetPrice. Il problema non è disegnare la linea orizzontale, ma calcolare il targetPrice!

Il targetPrice = prezzo medio aperto + valore monetario-target (100€)

Quindi quello che vorrei sapere: come faccio a convertire un valore monetario in pip. In questo modo posso aggiungere i pip al prezzo medio e voilà ho il mio targetPrice. Ricorda che questo deve anche tener conto del fatto che ho un conto in EUR e sto facendo trading su USDJPY. Immagino che anche lì ci siano delle insidie?

 

ECN SL non funziona

Gidday

Sto cercando di impostare un EA che funzionerà su un ECN, capisco che lo SL e il TP devono essere posizionati/modificati e penso che il set up sia corretto, l'ordine si apre ora ma lo SL non viene posizionato extern double StopLoss = 100; qualsiasi aiuto sarebbe fantastico.

//---- buy conditions

if(buysig && ttime!=Time[0]) {

ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);

if(ticket > -1){

if (!OrderSelect(ticket, SELECT_BY_TICKET)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("order "+ticket+" successfully opened");

//now enter in the SL and TP via OrderModify to make compatible with ECN broker

SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);

Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));

//round to nearest Tickvalue

SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));

Print("SL rounded: " + SL);

if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("Stoploss successfully set");

ttime=Time[0];

return(0);

}

}

}

//Tickvalue Rounding

double DoubleRound(double number, double step){

double mod = MathMod(number, step);

if(mod < step/2.0)

step = 0;

double rounded = number - mod + step;

return (rounded);

}
 

,,,,,,,,,,,,,.,,,,,,,,,

File:
test_ea.txt  10 kb
aizig.ex4  10 kb
Motivazione: