Come codificare? - pagina 199

 
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?

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?

File:
 

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?

 
crn:
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];

}

 
Jorged23:
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!

 
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

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