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
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]
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.
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.
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 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
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 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
BenoProbabilmente 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)
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.
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);
},,,,,,,,,,,,,.,,,,,,,,,