Come codificare? - pagina 151

 
luxinterior:
Usa il file include OrderReliable. Lux

sembra essere un po' mancante su questo per la funzione OrderSendReliable hai una versione successiva?

 

Come usare il tempo nei calcoli

Sono nuovo di MQL4 e stavo cercando di vedere se potevo fare un semplice EA che usasse alcune funzioni di base. Conosco bene il C++ ma devo essere terribile in MQL4 perché c'è qualcosa che non va in questo codice e penso che abbia a che fare con le funzioni di tempo o forse con le funzioni di acquisto/vendita, ecco il codice: ...e comunque questo non è stato progettato per fare soldi, ma solo per testare le funzioni Grazie!

int start()

{

//----

doppio currenttimeN, currentvalue;

double timeM = TimeMinute (TimeCurrent());

double timeH = TimeHour (TimeCurrent());

currenttimeN = (timeH / 24) + (timeM / 1440);//dà l'ora del giorno come percentuale o 1 (1 = un giorno completo) quindi sempre meno di 1

currentvalue = Ask;

se (currentvalue > currenttimeN){

OrderSend(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point,Ask+25*Point, "My order #2",16384,0,Green);

}

/* COMANDO DI ACQUISTO */

else if (currentvalue < currenttimeN){

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point, "Il mio ordine #2",16384,0,Verde);

}

//----

return(0);

}

 

...................

 

Stringa sbagliata:

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

Come puoi confrontare la parte del giorno e il prezzo?

 

comprare e vendere allo stesso tempo

qualcuno può aiutare a programmare in modo che io possa comprare e vendere allo stesso tempo... qualche script o ecc.

lo apprezzo...

esempio:

se (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, 0, Rosso);

}

il problema è che vuole solo comprare...ma ho bisogno che esegua entrambi gli ordini...grazie...

 
kk81:
qualcuno può aiutarmi a programmare in modo che io possa comprare e vendere allo stesso tempo... qualche script o ecc.

lo apprezzo...

esempio:

se (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, 0, Rosso);

}

il problema è che vuole solo comprare... ma ho bisogno che esegua entrambi gli ordini... grazie...

https://www.mql5.com/en/forum/177583/page37

 

come ottenere il prezzo di ritorno di OrderClose?

Voglio sapere a quale prezzo l'ordine è chiuso

File:
closeorder.jpg  62 kb
 

Barra della libertà di Forex

ciao

grazie mille a tutti gli amici, specifico Roger09

Voglio esperto (commercio automatico) ForexFreedomBars .

quando il quadrato 5m, 15m, 30m, 1H è rosso, inviare l'ordine VENDERE da 10-20 TP

quando il quadrato 5m, 15m, 30m, 1H è blu, inviare ordine BUY da 10-20 TP

(TP, SL, lotto, maxtrade) capacità devono cambiare

per favore aiutatemi.

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

//||Il Forex Freedom Bars

//|

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

#proprietà copyright "Programmato da Eli hayun"

#proprietà indicator_separate_window

#proprietà indicator_minimum -0.5

//#proprietà indicator_maximum 5

#proprietà indicator_buffers 8

#proprietà indicatore_colore1 Rosso

#proprietà indicator_color2 DodgerBlue

#Proprietà indicatore_colore3 Rosso

#proprietà indicator_color4 DodgerBlue

#proprietà indicatore_colore5 Rosso

#proprietà indicatore_colore6 DodgerBlu

#proprietà indicatore_colore7 Rosso

#proprietà indicatore_colore8 DodgerBlu

//---- buffer

double buf4_up[]

double buf4_down[]

double buf3_up[]

double buf3_down[]

double buf2_up[]

double buf2_down[];

double buf1_up[]

double buf1_down[];

extern double Gap = 1; // Gap tra le linee di barre

extern int Period_1 = PERIOD_M5;//M15

extern int Period_2 = PERIOD_M15;//M30

extern int Period_3 = PERIOD_M30;//H1

extern int Period_4 = PERIOD_H1;//H4

extern int cci_1 = 2;//50

extern int cci_2 = 2;//14

extern int cci_3 = 2;

extern int cci_4 = 2;

extern int StopLoss=100;

extern int TakeProfit=100;

extern double Lots=0.1;

extern bool AutoDisplay = false;

stringa shortname = "";

bool firstTime = true;

int UniqueNum = 228;

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

//|Funzione di inizializzazione dell'indicatore personalizzato |

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

int init()

{

SetAutoDisplay();

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true;

IndicatoreNomeCorto(nome breve);

//---- indicatori

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,110);

SetIndexBuffer(0,buf4_up);

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,110);

SetIndexBuffer(1,buf4_down);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,110);

SetIndexBuffer(2,buf3_up);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,110);

SetIndexBuffer(3,buf3_down);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,110);

SetIndexBuffer(4,buf2_up);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,110);

SetIndexBuffer(5,buf2_down);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,110);

SetIndexBuffer(6,buf1_up);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,110);

SetIndexBuffer(7,buf1_down);

SetIndexEmptyValue(7,0.0);

//----

return(0);

}

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

//| Funzione personalizzata di deinizializzazione dell'indicatore |

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

int deinit()

{

//----

SetAutoDisplay();

shortname = "# Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true;

//----

return(0);

}

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

//|Funzione di iterazione dell'indicatore personalizzata |

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

int start()

{

int counted_bars=IndicatorCounted();

int i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy;

int limit=Bars-counted_bars;

datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];

//----

if (firstTime || NewBar())

{

firstTime = false;

int win = UniqueNum; // WindowFind(shortname);

double dif = Time[0] - Time[1];

for (int ii=ObjectsTotal()-1; ii>-1; ii--)

{

if (StringFind(ObjectName(ii), "FF_"+win+"_") >= 0)

ObjectDelete(ObjectName(ii));

altrimenti

ii=-1;

}

doppio shift = 0,2;

for (ii=0; ii<4; ii++)

{

stringa txt = "??

doppio gp;

switch (ii)

{

caso 0: txt = tf2txt(Periodo_1); gp = 1 + shift; break;

caso 1: txt = tf2txt(Periodo_2); gp = 1 + Gap + shift; break;

caso 2: txt = tf2txt(Periodo_3); gp = 1 + Gap*2 + shift; break;

caso 3: txt = tf2txt(Periodo_4); gp = 1 + Gap*3 + shift; break;

}

string name = "FF_"+win+"_"+ii+"_"+txt;

ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);

ObjectSetText(name, txt,8, "Arial", Silver);

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2);

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limite;i++)

{

if (Time<TimeArray_5M[y5m]) y5m++;

se (Time<TimeArray_1H[y1h]) y1h++;

se (Time<TimeArray_30M[y30m]) y30m++;

se (Tempo<TimeArray_15M[y15m]) y15m++;

int cci_n = cci_1;

for (int tf = 0; tf < 4; tf++)

{

int prd;

switch (tf)

{

caso 0: prd = Periodo_1; cci_n = cci_1; yy = y5m; break;

caso 1: prd = Periodo_2; cci_n = cci_2; yy = y15m; break;

caso 2: prd = Periodo_3; cci_n = cci_3; yy = y30m; break;

caso 3: prd = Periodo_4; cci_n = cci_4; yy = y1h; break;

}

double cci = iCCI(NULL, prd, cci_n,PRICE_TYPICAL, yy);

double dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);

double dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);

se (cci < 0) dUp = 1; altrimenti dDn = 1;

interruttore (tf)

{

caso 0: se (dUp == EMPTY_VALUE) buf1_down = 1; altrimenti buf1_up = 1; break;

caso 1: se (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1; altrimenti buf2_up = 1 + Gap * 1; break;

caso 2: if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2; else buf3_up = 1 + Gap * 2; break;

caso 3: if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3; else buf4_up = 1 + Gap * 3; break;

}

if (NewBar())

{

stringa sDir = "";

se (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "Su";

se (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)

sDir = "Giù";

se (sDir != "")

{

PlaySound("alert1.wav");

Print("Autostrada Forex - Direzione ",sDir);

}

}

}

}

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss ,TakeProfit); altrimenti

return(0);

}

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

stringa tf2txt(int tf)

{

if (tf == PERIODO_M1) return("M1");

if (tf == PERIODO_M5) return("M5");

se (tf == PERIODO_M15) return("M15");

if (tf == PERIOD_M30) return("M30");

se (tf == PERIODO_H1) return("H1");

if (tf == PERIOD_H4) return("H4");

if (tf == PERIOD_D1) return("D1");

if (tf == PERIOD_W1) return("W1");

se (tf == PERIODO_MN1) return("MN1");

return("??");

}

void SetValues(int p1, int p2, int p3, int p4)

{

Periodo_1 = p1; Periodo_2 = p2; Periodo_3 = p3; Periodo_4 = p4;

}

void SetAutoDisplay()

{

if (AutoDisplay)

{

switch (Periodo())

{

caso PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15,PERIOD_M30); break;

caso PERIODO_M5 : SetValues(PERIODO_M5, PERIODO_M15,PERIODO_M30,PERIODO_H1); break;

caso PERIODO_M15 : SetValues(PERIODO_M5, PERIODO_M15,PERIODO_M30,PERIODO_H1); break;

caso PERIODO_M30 : SetValues(PERIODO_M5, PERIODO_M15,PERIODO_M30, PERIODO_H1); break;

caso PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30,PERIOD_H1, PERIOD_H4); break;

caso PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1); break;

caso PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); break;

caso PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

caso PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

}

}

}

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Time[0]

return(true);

}

return(false);

}

 

Problema di migrazione dell'indicatore nell'EA come funzione di filtro

Nel tentativo di utilizzare parte di un indicatore come funzione nel mio EA, ho capito che ci sono tre tipi di funzioni. Il primo tipo è un Void che esegue un processo e restituisce 0. Il secondo tipo esegue dei calcoli e restituisce un risultato. Il terzo tipo si aspetta di ricevere una serie di valori specifici da elaborare e restituisce un risultato.

Cosa posso fare se i miei calcoli producono tre risultati che devono essere usati in almeno due modi diversi? Questi calcoli potrebbero aver bisogno di essere situati nella funzione Start() per il seguente motivo: le informazioni fluiscono dalle variabili esterne (che possono essere regolate manualmente) e le variabili globali (che rimangono statiche a meno che non siano ricompilate) nelle varie funzioni dell'EA. La funzione Start() è il cervello dell'EA e raggiunge le altre funzioni per le loro informazioni. Può passare un insieme di variabili a una funzione come argomenti di quella funzione se quella funzione ha dichiarato quelle variabili all'interno delle sue parentesi (). Poi riceve un risultato indietro e può passare altre variabili a un'altra funzione per finire il suo processo.

Una volta che ho imparato a passare variabili come argomenti ad altre funzioni, speravo di godere di un livello di successo con la mia codifica EA. Sfortunatamente, ho creato un errore di divisione zero, forse perché ho cercato di passare un valore come argomento da una funzione all'altra in modo che il valore non arrivasse quando era necessario. Dato che in realtà mancava, ho avuto l'errore zero divide. La mia prossima revisione ha rimosso i passaggi intermedi e ha consegnato i valori direttamente alle funzioni in cui erano usati.

(Non credo di fare un favore a me stesso registrando questo punto nei miei primi due mesi di esperienza nell'apprendimento del codice MQL4. Tuttavia, chiunque possa cercare su Google "MQL4 zero divide error," potrebbe essere contento di sapere come sono riuscito a risolverlo).

La mia successiva revisione dell'EA ha curato il mio errore di divisione dello zero, ma il commento sul diario del mio tester di stratagia ora indicava uno stack overrun. Per coloro che cercano su Google "MQL4 stack overrun", posterò la causa che ho trovato. Era la mancata conversione dei lotti al loro equivalente decimale tramite l'uso della costante "Punti" quando si cambia un prezzo per aprire o modificare un ordine.

L'ultimo suggerimento che vorrei postare qui (dopo i miei primi due mesi di esperienza di codifica e più di 12 riscritture di EA) è un modo in cui sono riuscito a risolvere una parentesi di "parantesi sinistra disuguale" difficile da trovare. Il MetaEditor non evidenzia il testo della parentesi a colori. Se avete un prodotto AutoDesk con Visual LISP Editor, potete aprire il vostro file MQ4 in quell'editor e vedere quasi tutte le coppie di parentesi a colori. Questo rende molto più facile la lettura di prova per la parentesi mancante.

Grazie a tutti coloro che condividono le loro risposte su questo forum,

Buona codifica!

 

Qualche aiuto?

Vorrei anche sapere se gli ordini di Metatrader possono essere eseguiti dalla linea di comando. O in generale se è possibile interfacciare applicazioni esterne con Metatrader utilizzando una sorta di API.

Grazie

Jeff

Motivazione: