Come codificare? - pagina 293

 
lincoln2012:
Sto cercando di imparare MQ4. Il mio primo semplice programma dovrebbe far scattare un allarme quando 2 MA si incrociano. Non riesco a capire perché

questo codice non funziona.

Qualsiasi aiuto sarà molto apprezzato! Grazie in anticipo.

extern int Periodo_MA1 = 5;

extern int Periodo_MA2 = 1;

doppio MA1;

doppio MA2;

int init()

{

return(0);

}

//+------------------------------------------------------------------+

int deinit()

{

return(0);

}

//+------------------------------------------------------------------+

int start()

{

//--------------------------------------------------------------------

MA1=iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0);

MA2=iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0);

//--------------------------------------------------------------------

se (MA2 == MA1 )

Alert("Il prezzo è lo stesso(",Periodo_MA2,").");// Alert

ritorno;

}

Ciao Lincoln2012,

Potresti controllare il codice di questo Ma Cross

File:
macross-1.mq4  7 kb
 
lincoln2012:
Sto cercando di imparare MQ4. Il mio primo semplice programma dovrebbe far scattare un allarme quando 2 MA si incrociano. Non riesco a capire perché

questo codice non funziona.

}

La chiave per codificare un incrocio di 2 linee di indicatori qualsiasi è questo concetto:

1. Se la barra corrente line1>linea2, e la barra precedente line1<linea2, allora c'è un incrocio Up.

2. Se la barra corrente line1linea2, allora c'è un incrocio al ribasso.

 
mj10:
ciao

Beh, stavo facendo un po' di programmazione in Mt4, ma non sono un professionista, solo una semplice modifica di un vecchio indicatore. Ok voglio fare un semplice indicatore ma non so come farlo.

Il suo semplice indicatore controlla semplicemente il valore se il valore di tutte le variabili è lo stesso e disegna il punto in cui il valore di tutte le variabili corrisponde.

la mia semplice soluzione

supponiamo di avere delle variabili

doppio movingavg1;

doppio movingavg12

doppio movingavg13;

doppio movingavg14;

doppio movingavg15;

doppio movingavg16;

doppio movingavg17;

doppio movingavg18

doppio movingavg19;

doppio movingavg10;

doppio movingavgall;

dichiariamo la variabile, sto solo dando un esempio, sto usando iStochastic(1), ma possiamo usare qualsiasi indicatore.

movingavg12=iStochastic(1)

movingavg13=iStochastic(2)

.

.

.

così via

ora

se (movingavg12=movingavg13=movingavg14,....) (mettere il valore nella variabile "movingavgall") //mettere il valore che è uguale per vria

disegna movingavgall sulle barre

Applicazione

supponiamo che io voglia controllare dove la media mobile 3 e la media mobile 5 hanno lo stesso valore

anche questo indicatore può essere usato con RSI dove il valore di RSI 1 e RSI 2 = 80

e molti altri

anche se aggiungiamo MTF che sarà un bonus aggiunto

sembra semplice da scrivere ma non sono riuscito a trovare la soluzione, spero che qualcuno possa aiutarmi

spero che voi capiate cosa sto dicendo

grazie

Una volta che hai dei valori da confrontare useresti un codice simile al seguente.

Ilcontrollo dei valori uguali usa ==. Un singolo = è usato per assegnare un valore ad una variabile.

Il controllo di più di 1 set deve usare && per indicare AND

movingavgall = 0;

se ((a == b) && (b == c) && (c == d)) movingavgall = a;

Potete quindi controllare se movingavgall ha un valore con

se (movingavgall != 0)

{

// fai qualcosa qui

}

Fai una ricerca per la programmazione di metatrader usando Google.

Dovresti trovare diversi buoni tutorial per la programmazione in MT4.

Anche un buon libro sulla programmazione C ti aiuterà.

Robert Hill aka MrPip

 

semplificare questo codice

ciao a tutti!

Sto cercando di semplificare questo codice usando il comando stringconcatenate da questo:

ObjectSetText("uitog1v", StringConcatenate("/\\" ", uitog1v, "%"),12, hr1v, DodgerBlue );

a questo:

ObjectSetText("uitog1v", StringConcatenate("/\\\", uitog1v, "%","/\\", uitog2v, "%","/\\", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Spero che qualcuno possa aiutarmi.

I migliori saluti

doc

trend_alexcud_v_2men.mq4

File:
 

...

Doc

Se avete bisogno di tutti questi elementi, non c'è un modo più semplice di scriverlo

dr.house7:
ciao a tutti!

Sto cercando di semplificare questo codice usando il comando stringconcatenate da questo:

ObjectSetText("uitog1v", StringConcatenate("/\\" ", uitog1v, "%"),12, hr1v, DodgerBlue );

a questo:

ObjectSetText("uitog1v", StringConcatenate("/\\\", uitog1v, "%","/\\", uitog2v, "%","/\\", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Spero che qualcuno possa aiutarmi.

I migliori saluti

doc

trend_alexcud_v_2men.mq4
 

Come fare: Allarme ogni 60 secondi

Come posso creare un codice che ad esempio mi dia un allarme ogni 60 secondi?

Ho creato questo codice qui sotto, ma mi dà un allarme ogni minuto da quando lo attacco al grafico e voglio che segua il tempo del broker in modo che mi avvisi per esempio ogni 60 secondi.

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
Doc Se hai bisogno di tutti questi elementi, non c'è un modo più semplice per scriverlo

Uhm, sfortuna questa volta, grazie comunque.

Saluti

doc

 

C'è un problema con la seconda chiamata StringConcatenate.

Stai sommando 3 diversi nomi di font e non ci sarà un nome valido risultante.

Robert

dr.house7:
ciao a tutti!

Sto cercando di semplificare questo codice usando il comando stringconcatenate da questo:

ObjectSetText("uitog1v", StringConcatenate("/\\" ", uitog1v, "%"),12, hr1v, DodgerBlue );

a questo:

ObjectSetText("uitog1v", StringConcatenate("/\\\", uitog1v, "%","/\\", uitog2v, "%","/\\", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Spero che qualcuno possa aiutarmi.

I migliori saluti

doc

trend_alexcud_v_2men.mq4
 

Bisogno di aiuto con EA ... le compravendite non vengono chiuse nel tester

Sto lavorando su un EA, ma non importa cosa faccio, non riesco a fargli chiudere i trade. Le apre bene, ma quando voglio chiuderle, l'EA non le chiude.

Posterò parte del mio codice EA così forse uno di voi codificatori esperti può capire perché sto avendo questo problema. Le variabili 'buyTrade' e 'sellTrade' sono globali a tutto l'EA.

NOTA: Voglio solo UN trade aperto in qualsiasi momento, sia lungo che corto. I trade sono "sempre in" quindi quando arriva un segnale long, lo short esistente dovrebbe essere chiuso e viceversa.

Non sta facendo questo. Quello che sta facendo è aprire trade e poi apre altri thrades... e ne apre altri... e li tiene aperti fino a quando alla fine colpiscono tutti i loro stop.

Grazie in anticipo

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

Dato che questo è un codice parziale: provate a sostituire symBid con symAsk in chiusura di vendita e symAsk con symBid in chiusura di ordine di acquisto (invertite i prezzi di chiusura, non potete chiudere una vendita al prezzo di offerta e non potete chiudere un acquisto al prezzo di domanda)

outofdebt:
Sto lavorando ad un EA, ma qualunque cosa faccia, non riesco a fargli chiudere le operazioni. Le apre bene, ma quando voglio chiuderle, l'EA non le chiude.

Posterò parte del mio codice EA così forse uno di voi codificatori esperti può capire perché sto avendo questo problema. Le variabili 'buyTrade' e 'sellTrade' sono globali a tutto l'EA.

NOTA: Voglio solo UN trade aperto in qualsiasi momento, sia lungo che corto. I trade sono "sempre in" quindi quando arriva un segnale long, lo short esistente dovrebbe essere chiuso e viceversa.

Non sta facendo questo. Quello che sta facendo è aprire trade e poi apre altri thrades... e ne apre altri... e li tiene aperti fino a quando non colpiscono tutti i loro stop.

Grazie in anticipo

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
Motivazione: