![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
Sono nuovo di mq4 e sto cercando di creare una visualizzazione sullo schermo quando c'è un crossover per il MACD. Di seguito il mio codice, ma gli avvisi continuano a comparire ogni pochi minuti.
Come posso codificarlo per visualizzare gli avvisi solo una volta ogni ora? O un avviso per barra?
int start()
{
stringa MACD1="";
colore colt9;
double MACDM_S10 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_MAIN, 0);
double MACDS_S10 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_SIGNAL,0);
double MACDM_S11 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_MAIN, 1);
double MACDS_S11 = iCustom(NULL, PERIOD_H1, "MACD", 8,17,9, MODE_SIGNAL,1);
if ((MACDM_S11 < MACDS_S11 && MACDM_S10 < MACDS_S10)) { MACD1="IN UPTREND"; colt9=LimeGreen; }
if ((MACDM_S11 > MACDS_S11 && MACDM_S10 > MACDS_S10)) { MACD1="IN DOWNTREND"; colt9=Rosso; }
if ((MACDM_S11 > MACDS_S11 && MACDM_S10 < MACDS_S10)) { MACD1="NUOVO INCROCIO ALTO"; colt9=VerdeLime; }
if ((MACDM_S11 MACDS_S10)) { MACD1="NUOVO INCROCIO DOWN"; colt9=Rosso; }
stringa MACD2="";
colore colt14;
double MACDM_L10 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_MAIN, 0);
double MACDS_L10 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_SIGNAL,0);
double MACDM_L11 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_MAIN, 1);
double MACDS_L11 = iCustom(NULL, PERIOD_H1, "MACD", 12,26,9, MODE_SIGNAL,1);
if ((MACDM_L11 < MACDS_L11 && MACDM_L10 < MACDS_L10)) { MACD2="IN UPTREND"; colt14=LimeGreen; }
if ((MACDM_L11 > MACDS_L11 && MACDM_L10 > MACDS_L10)) { MACD2="IN DOWNTREND"; colt14=Rosso; }
if ((MACDM_L11 > MACDS_L11 && MACDM_L10 < MACDS_L10)) { MACD2="NUOVO INCROCIO IN SU"; colt14=LimeGreen; }
if ((MACDM_L11 MACDS_L10)) { MACD2="NUOVO INCROCIO DOWN"; colt14=Rosso; }
if(MACD1=="NUOVO INCROCIO ALTO"&&MACD2=="IN UPTREND")
Alert(Symbol()," - ", "H1:"," MACD MAIN UPTREND MOVEMENT"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD1=="NEW DOWN CROSSING"&&MACD2=="IN DOWNTREND")
Alert(Symbol()," - ", "H1:"," MACD MAIN DOWNTREND MOVEMENT"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD2=="NUOVO INCROCIO ALTO"&&MACD1=="IN UPTREND")
Alert(Symbol()," - ", "H1:"," MACD," MAIN TREND CHANGE TO UPTREND"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
if(MACD2=="NEW DOWN CROSSING"&&MACD1=="IN DOWNTREND")
Alert(Symbol()," - ", "H1:"," MACD," MAIN TREND CHANGE TO DOWNTREND"," at ", Bid, " - ",TimeToStr(CurTime(),TIME_SECONDS));
return(0);
}Provare a USARE Minute()==1; nella condizione
Trend Alexcud per modificare
se (MaH11v < MaH1pr1v){H11v = " V "; co11v = Rosso; u1x5v = 0; d1x5v = 1;}
se (MaH11v > MaH1pr1v){H11v = " /\\"; co11v = Blu; u1x5v = 1; d1x5v = 0;}
if (MaH11v == MaH1pr1v){H11v = " 0 "; co11v = Verde; u1x5v = 0; d1x5v = 0;}
ciao a tutti, sto cercando di modificare il trend alexcud (allegato)
voglio solo 2 segnali su e giù invece di 3 con "0"...
così il calcolo potrebbe essere più accurato...
Qualche idea?
Qualcuno può aiutarmi a capire queste linee di programmazione? In parole povere![](https://c.mql5.com/forextsd/smiles/biggrin.png)
Si tratta di un EA che inizia qualcosa dopo che una barra è finita.
Il codice è come questo:
datetime timeprev=0;
// Esegue solo una volta per ogni barra completata
if(timeprev==Time[0]) return(0);
timeprev = Time[0];
Se guardo il manuale dell'MQ4, Time[0] serve per estrarre il tempo di apertura della barra [0]. È indicato come secondi dal 1Gennaio1970.
Non capisco come funziona. Prima abbiamo "timeprev=0".
Poi la linea successiva "if (timeprev==Time[0]) return(0).
Qual è il valore di Time[0] in questo momento? Come mai può diventare 0 (il valore di "timeprev"?
La linea successiva è "timeprev=Time[0]".
Come mai l'intera linea fa sì che l'EA non faccia nulla finché una barra non è finita?
Prova a USARE Minute()==1; nella condizione
Questo continuerà a far scattare ogni tick nel primo minuto di ogni barra. Questo può ridurre significativamente il numero, ma avviserà ancora più volte.
La cosa migliore da fare è impostare una variabile globale (o un oggetto) e impostarla al Time[] dell'ultima barra.
if (Time[0]!=lastTime) {
... alert, whatever...
lastTime=Time[0];
}
Ciao,
Non posso evitare l'errore 1 di OrderModify: si presenta sempre anche provando a controllare che i dati prima di modificare siano diversi! Ho provato anche con doublenormalize...non funziona...
Questo è il codice:
se (Bid-OrderOpenPrice() >= VPoint*BreakEvenAtProfit)
{
se (OrderStopLoss() != OrderOpenPrice() + BreakEvenShift*VPoint)
{
Vresult = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+ BreakEvenShift*VPoint,OrderTakeProfit(),0,Green);
Qualche suggerimento?
Grazie.Controllo veloce... assicurati di non aver impostato la distanza di pareggio troppo breve. Controlla con MarketInfo(Symbol(),MODE_STOPLEVEL) per essere sicuro che sia abbastanza grande.
Qual è lo scopo di VPoint? Se quel numero è sbagliato, si incasinerà tutto. "Punto" da solo sarà sempre corretto. Se quel numero non è corretto, questo potrebbe sicuramente causare il problema. Cioè è accidentalmente 0 o meno di quello che POINT è in realtà.
Domanda di codifica semplice
OrderSelect(5555, SELECT_BY_TICKET);
RefreshRates();
if (Ask >= (OrderOpenPrice()+ (5 * Point)) && OrderLots() == 2 && (OrderType() == OP_BUY)) {
OrderClose(5555,1,Ask,10,Rosso); }
if (Bid <= (OrderOpenPrice()- (5 * Point)) && OrderLots() == 2 && (OrderType() == OP_SELL)) {
OrderClose(5555,1,Bid,10,Blue); }
Sto ancora cercando di imparare...
Questo funzionerebbe per chiudere fondamentalmente la metà (2 lotti fino a 1) di una posizione quando il prezzo colpisce 5 pip di distanza dal prezzo aperto?
GRAZIE!!!!!!
Sembra giusto. Però è un po' disordinato. Potresti anche usare OrderProfit a seconda di ciò che vuoi effettivamente ottenere.
Lux
PS: Ho dimenticato di menzionare di fare attenzione ai broker con 5 decimali. Tutto deve essere moltiplicato per 10, quindi nel tuo esempio 5 sarebbe 50. Buona fortuna!
Sembra giusto. Però è un po' disordinato. Potresti anche usare OrderProfit a seconda di ciò che vuoi effettivamente ottenere.
Lux
PS: Ho dimenticato di menzionare di fare attenzione ai broker con 5 decimali. Tutto deve essere moltiplicato per 10, quindi nel tuo esempio 5 sarebbe 50. Buona fortuna!Grazie LUX
Il problema è che l'ho eseguito solo per eseguire il debug su un grafico GBP/USD a 1 minuto con Windsor direct e non chiude 1 lotto quando colpisce i 5 pips, quindi non so quale sia il problema.
INOLTRE,
Sto cercando di chiudere un acquisto e aprire immediatamente una vendita e neanche questo va bene.
Funziona e poi non funziona...
Vorrei che questo fosse molto più facile da programmare
if (*******************) {
RefreshRates();
OrderSelect(5555,SELECT_BY_TICKET);
if (OrdersTotal() > 0 && OrderType()==OP_BUY) {OrderClose(5555, OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");}
Sleep(1500);
RefreshRates();
se (OrdiniTotali() ==0) Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 10, 0, 0, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket<0)Print("OrderSend failed with error #",GetLastError());
}
Debug degli indicatori
Sono nuovo di questo linguaggio e sto cercando di scrivere un indicatore. Sto avendo problemi poiché non c'è un debugger. Ho provato a usare la funzione Print() ma non viene stampato nulla. Usando Alert() ottengo ZERO come output per il buffer[1]. Qualcuno può spiegarmi questo, per favore? Come posso usare Print() e Alert() per eseguire il debug senza ottenere tutti ZERO. Se qualcuno ha qualche idea mi faccia sapere. Grazie mille.
tigger.longtail@gmail.com
ExtMapBuffer1 = iMA(NULL,0,ExtParam1,0,MODE_EMA,PRICE_CLOSE,i);
ExtMapBuffer2 = iMA(NULL,0,ExtParam2,0,MODE_EMA,PRICE_CLOSE,i);
CurrentBar = Tempo;
if( ExtMapBuffer1 >= ExtMapBuffer2 && CurrentBar == Time && Flag == 0)
{
Alert("ExtMapBuffer1 =", ExtMapBuffer1," Short is Above. ",Hour()," Minute ",Minute());
Alert("ExtMapBuffer2 =", ExtMapBuffer2," Short is Above. ",Hour()," Minute ",Minute());
Stampa("ExtMapBuffer1 =", ExtMapBuffer1);
Stampa("ExtMapBuffer2 = ", ExtMapBuffer2);
non c'è modo comunque