![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
dettaglio ultima candela
Ciao,
ho bisogno di un indicatore che mostri il valore dell'ultima candela alta, bassa, aperta e chiusa...
Perché non usare un trailing stop allora? Voglio dire che farebbe quasi il 100% (quasi) di quello che è la tua idea originale ed è molto, molto più facile da codificare
Il fatto è che (non credo di essermi espresso correttamente o di non essere stato corretto al 100%) gli stop (per ora comunque) rimarranno gli stessi per tutto il trade. Che ne dite di un approccio come questo, quando due trade sono aperti, un codice può controllare il numero di ordini aperti, se è superiore a 1 (in pratica 2) allora entrambi i trade hanno i loro take profit modificati ad un certo importo che era più alto di prima. Essenzialmente una sorta di copertura va avanti qui.
Grazie,
madmax3
[langtitle=pl]Proszę o pomoc w napisaniu EA działającego n[/langtitle]
[lang=pl]Witam czy bugł by ktoś mi to dopracować był rym wdzięczny : Chciałbym rzeby kupywał LevelRSIbuy=20; a sprzeawał jak dojdzie LevelRSIsell=80; i żeby dało się ustawiać pozostałe żeczy kt�re są pod extern int MagicNumber
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#proprietà copyright "Expert Advisor Builder"
#proprietà link "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;;
extern double Lots = 0.1;
extern int Slippage = 1;
extern bool UseStopLoss = True;
extern int StopLoss = 10;
extern bool UseTakeProfit = True;
extern int TakeProfit = 5;
extern bool UseTrailingStop = Falso;
extern int TrailingStop = 30;
extern int LevelRSIbuy=20;
extern int LevelRSIsell=80;
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| funzione di inizializzazione esperto |
//+------------------------------------------------------------------+
int init() {
BarCount = Bars;
se (EachTickMode) Current = 0; altrimenti Current = 1;
return(0);
}
//+------------------------------------------------------------------+
//| funzione di deinizializzazione esperto |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| funzione di avvio esperto |
//+------------------------------------------------------------------+
int start() {
int Ordine = SIGNAL_NONE;
int Total, Ticket;
doppio StopLossLevel, TakeProfitLevel;
if (EachTickMode && Bars != BarCount) TickCheck = False;
Totale = OrdiniTotali();
Ordine = SIGNAL_NONE;
//+------------------------------------------------------------------+
//| Variabile Inizio |
//+------------------------------------------------------------------+
double Var1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);
double Buy1_1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);
double Sell1_1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);
//+------------------------------------------------------------------+
//| Fine della variabile |
//+------------------------------------------------------------------+
//Controlla la posizione
bool IsTrade = Falso;
for (int i = 0; i < Totale; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {
IsTrade = True;
if(OrderType() == OP_BUY) {
//Chiudere
//+------------------------------------------------------------------+
//| Segnale Inizio(Esci Compra) |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Segnale Fine(Esci dall'Acquisto) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
if (!EachTickMode) BarCount = Bars;
IsTrade = Falso;
continuare;
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if(Bid - OrderOpenPrice() > Punto * TrailingStop) {
if(OrderStopLoss() < Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
if (!EachTickMode) BarCount = Bars;
continua;
}
}
}
} else {
//Chiudi
//+------------------------------------------------------------------+
//| Segnale Inizio(Esci Vendi) |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Segnale Fine(Esci Vendi) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
if (!EachTickMode) BarCount = Bars;
IsTrade = Falso;
continuare;
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
se((OrderOpenPrice() - Ask) > (Punto * TrailingStop)) {
if((OrderStopLoss() > (Ask + Punto * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
if (!EachTickMode) BarCount = Bars;
continuare;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Signal Begin(Entry) |
//+------------------------------------------------------------------+
if (False) Ordine = SIGNAL_BUY;
se (Falso) Ordine = SIGNAL_SELL;
//+------------------------------------------------------------------+
//| Segnale Fine |
//+------------------------------------------------------------------+
//Compra
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(!IsTrade) {
//Controlla il margine libero
if (AccountFreeMargin() < (1000 * Lotti)) {
Print("Non abbiamo soldi. Margine libero = ", ContoFreeMargin());
return(0);
}
if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; altrimenti StopLossLevel = 0,0;
if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; altrimenti TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
se(Biglietto > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("Ordine BUY aperto : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
} else {
Print("Errore nell'apertura dell'ordine BUY: ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
//Vendere
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(!IsTrade) {
//Controlla il margine libero
if (AccountFreeMargin() < (1000 * Lotti)) {
Print("Non abbiamo soldi. Margine libero = ", ContoFreeMargin());
return(0);
}
if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; altrimenti StopLossLevel = 0,0;
if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; altrimenti TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
se(Biglietto > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("Ordine SELL aperto : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
} else {
Print("Errore nell'apertura dell'ordine SELL: ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
if (!EachTickMode) BarCount = Bars;
return(0);
}
//+------------------------------------------------------------------+[/lang]
Sto cercando di usare questo codice per aumentare il take profit dei trade aperti (se ci sono due trade aperti).
if(OrderType()==OP_BUY)
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
if(OrderType()==OP_SELL)
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);total=OrdersTotal(); btw.
Non riesco ancora a farlo funzionare, qualche suggerimento?
Grazie,
madmax3
Aiuto per limitare il numero di compravendite giornaliere a 1
Sono nuovo nella programmazione e ho bisogno di aiuto in MQL4. Ho studiato alcune guide per codificatori e ho capito come aprire e chiudere le operazioni in base alla mia strategia di trading. La mia difficoltà è limitare il numero di trade giornalieri a 1. Voglio aprire non più di 1 trade al giorno (secondo l'orario del server). Quindi vorrei controllare gli ordini aperti e chiusi per vedere se un ordine è stato aperto oggi. Se un ordine è stato aperto oggi, allora non aprire altri ordini per la giornata.
Per favore aiutatemi.
PS: presuppone che il tuo EA abbia un parametro MagicNumber (quel nome esatto)
PPS: funzionerà su time frame fino a daiy. Non funzionerà bene su grafici settimanali e mensili
Sono nuovo nella programmazione e ho bisogno di aiuto in MQL4. Ho studiato alcune guide per codificatori e ho capito come aprire e chiudere le operazioni in base alla mia strategia di trading. La mia difficoltà è limitare il numero di operazioni giornaliere a 1. Voglio aprire non più di 1 operazione al giorno (secondo l'ora del server). Quindi vorrei controllare gli ordini aperti e chiusi per vedere se un ordine è stato aperto oggi. Se un ordine è stato aperto oggi, allora non aprire altri ordini per la giornata. Per favore, aiutatemi.
[langtitle=pl]Convertire la funzione Tema in Tema(close,period)[/langtitle]
Witam
Jeszcze raz bo cos sie zle wkleilo. Jak przekazac wartosc funkcji Tema do Var1. Jak robie tak jak w kodzie ponizej to Var1 jest puste.
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DarkBlue
#property indicator_width1 2
//---- input parameters
extern int EMA_period=4;
//---- buffers
string txt;
double TemaBuffer[];
double Ema[];
double EmaOfEma[];
double EmaOfEmaOfEma[];
double Var1;
int Var2;
int i,limit,limit2,limit3;
extern int Apply_To_Price=1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(5);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Var1);
SetIndexBuffer(1,TemaBuffer);
SetIndexBuffer(2,Ema);
SetIndexBuffer(3,EmaOfEma);
SetIndexBuffer(4,EmaOfEmaOfEma);
IndicatorShortName("TEMA("+EMA_period+")");
switch(Apply_To_Price)
{
case 1:
{txt="Open";break;}
case 2:
{txt="High";break;}
case 3:
{txt="Low"; break;}
case 4:
{txt="Median"; break;}
case 5:
{txt="Typical"; break;}
case 6:
{txt="WghtdClose"; break;}
default:
{txt="Close";}
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
//----
int counted_bars=IndicatorCounted();
if (counted_bars==0)
{
limit=Bars-1;
limit2=limit-EMA_period;
limit3=limit2-EMA_period;
}
if (counted_bars>0)
{
limit=Bars-counted_bars-1;
limit2=limit;
limit3=limit2;
}
for (i=limit3;i>=0;i--)
{
Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?
// Alert(Var1);
}
Var2 = dodawanie (2,3);
return(0);
}
double Tema(int Cena, int cykl)
{
//----
for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);
for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);
for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);
for (i=limit3;i>=0;i--)
{
TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEmaOfEma;
//Alert(TemaBuffer);
}
return(TemaBuffer);
}
int dodawanie (int a, int b)
{
int c;
c=a+b;
return(c);
}
Come questo (TEMA) ...
Se lo vuoi come funzione, allora dovrebbe essere qualcosa come questo:Allego anche un indicatore di esempio. Il vantaggio di passare un valore invece del tipo di prezzo è che in questo modo si può applicare il tema a qualsiasi valore (non deve essere necessariamente un tema di un prezzo, può essere tema di un altro indicatore per esempio)
Witam
Jeszcze raz bo cos sie zle wkleilo. Jak przekazac wartosc funkcji Tema do Var1. Jak robie tak jak w kodzie ponizej to Var1 jest puste.
[PHP]
#property indicator_chart_window
#proprietà indicator_buffers 1
#property indicator_color1 DarkBlue
#proprietà indicator_width1 2
//---- parametri di input
extern int EMA_period=4;
//---- buffer
stringa txt;
doppio TemaBuffer[]
doppio Ema[]
double EmaOfEma[]
double EmaOfEmaOfEma[]
doppio Var1;
int Var2;
int i, limite, limite2, limite3;
extern int Apply_To_Price=1;
//+------------------------------------------------------------------+
//|Funzione di inizializzazione dell'indicatore personalizzata
//+------------------------------------------------------------------+
int init()
{
//---- indicatori
IndicatorBuffers(5);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Var1);
SetIndexBuffer(1,TemaBuffer);
SetIndexBuffer(2,Ema);
SetIndexBuffer(3,EmaOfEma);
SetIndexBuffer(4,EmaOfEmaOfEma);
IndicatoreShortName("TEMA("+EMA_periodo+")");
switch(Apply_To_Price)
{
caso 1:
{txt="Open";break;}
caso 2:
{txt="High";break;}
caso 3:
{txt="Low"; break;}
caso 4:
{txt="Mediana"; break;}
caso 5:
{txt="Tipico"; break;}
caso 6:
{txt="WghtdClose"; break;}
default:
{txt="Close";}
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'indicatore personalizzato |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzato |
//+------------------------------------------------------------------+
int start()
{
//----
int counted_bars=IndicatorCounted();
se (counted_bars==0)
{
limit=Bars-1;
limit2=limit-EMA_periodo;
limit3=limit2-EMA_periodo;
}
se (counted_bars>0)
{
limit=Bars-counted_bars-1;
limit2=limit;
limit3=limit2;
}
for (i=limit3;i>=0;i--)
{
Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?
// Alert(Var1);
}
Var2 = dodawanie (2,3);
return(0);
}
doppio Tema(int Cena, int cykl)
{
//----
for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);
for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);
for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);
for (i=limit3;i>=0;i--)
{
TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEma;
//Alert(TemaBuffer);
}
return(TemaBuffer);
}
int dodawanie (int a, int b)
{
int c;
c=a+b;
return(c);
}
Aiuto con il codice HAMMER per favore
Salve,
Sto iniziando da poco in mql4. Sto cercando di scegliere i martelli bianchi e neri nelle candele con il seguente indicatore. Tuttavia, nel grafico a volte le candele ottengono un testo di identificazione sbagliato (la candela bianca del martello è identificata come candela nera del martello e viceversa). Per favore aiutatemi con questa situazione, grazie in anticipo.
#proprietà indicator_chart_window
limite int;
//---- buffer
stringa hammer[200000];
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore CuStom
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'indicatore CuStor |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectsDeleteAll(hammer,OBJ_TEXT);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore CuStom |
//+------------------------------------------------------------------+
int start()
{
int N;
int N1;
int N2;
stringa di testo;
int counted_bars=IndicatorCounted();
limite=Bars_contate;
for(N = 1; N < limite; N++) {
martello[N]= CharToStr(N);
N1 = N + 1;
N2 = N + 2;
//----
//---- controllare eventuali errori
if(counted_bars<0) {
Alert("NO Bars..");
return(-1);
}
// Controlla per il martello bianco
se (((Close[N1]>Open[N1]) && ((Open[N1]-Low[N1])>=2*(Close[N1]-Open[N1])) && ((High[N1]-Close[N1])<=(Open[N1]-Low[N1])*0.10)) {
ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);
ObjectSetText(hammer[N], "WHmr", 9, "Times New Roman", LawnGreen);
}
// Controlla il martello nero
if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))) {
ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);
ObjectSetText(hammer[N], "BHmr", 9, "Times New Roman", LawnGreen);
}
//----
} // Fine del ciclo for
return(0);
}
//+------------------------------------------------------------------+
Ciao,
Sto iniziando da poco in mql4. Sto cercando di scegliere i martelli bianchi e neri nelle candele con il seguente indicatore. Tuttavia, nel grafico a volte le candele hanno un testo di identificazione sbagliato (la candela bianca a martello viene identificata come candela nera a martello e viceversa). Per favore aiutatemi con questa situazione, grazie in anticipo.
#proprietà indicator_chart_window
limite int;
//---- buffer
stringa hammer[200000];
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'indicatore CuStom
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'indicatore CuStor |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectsDeleteAll(hammer,OBJ_TEXT);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore CuStom |
//+------------------------------------------------------------------+
int start()
{
int N;
int N1;
int N2;
stringa di testo;
int counted_bars=IndicatorCounted();
limite=Bars_contate;
for(N = 1; N < limite; N++) {
martello[N]= CharToStr(N);
N1 = N + 1;
N2 = N + 2;
//----
//---- controllare eventuali errori
if(counted_bars<0) {
Alert("NO Bars..");
return(-1);
}
// Controlla per il martello bianco
se (((Close[N1]>Open[N1]) && ((Open[N1]-Low[N1])>=2*(Close[N1]-Open[N1])) && ((High[N1]-Close[N1])<=(Open[N1]-Low[N1])*0.10)) {
ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);
ObjectSetText(hammer[N], "WHmr", 9, "Times New Roman", LawnGreen);
}
// Controlla il martello nero
if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))) {
ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);
ObjectSetText(hammer[N], "BHmr", 9, "Times New Roman", LawnGreen);
}
//----
} // Fine del ciclo for
return(0);
}
//+------------------------------------------------------------------+Ciao Svezir,
Ho questo indicatore per i modelli di candela forse ti aiuterà.