V-Force: 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?
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.
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)
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à.
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?
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!
luxinterior: 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
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.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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
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