Aiuto per la codifica - pagina 238

 

C'è la possibilità di aggiungere opzioni da scegliere?

Per esempio,

Separatamente, acquisto e vendita separatamente

Modifica: BE tutti comprare 0, o +1, o +2 pips o vendere tutti BE 0, 1 o 2 pips?

È possibile?

be.mq4

File:
be.mq4  1 kb
 

Ciao Mladen,

Qualcuno può per favore dirmi cosa sto facendo di sbagliato, io per lo più scrivo il mio ea usando FX Gen con snippets e codici usando esempi dal compilatore mq4 e forum online. sto cercando di codificare la mia strategia per un trading più facile, sono stato in grado di selezionare l'ultimo ordine con successo usando questo codice.

void OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Nessuno aperto.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket);

}

else

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

Puoi dare un'occhiata a questo codice sto cercando di eliminare l'ordine più vecchio prima usando datetime e biglietto d'ordine, ad esempio se l'ordine aperto >2 elimina l'ordine più vecchio.

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

// Etasoft Inc. Forex EA e Script Generator versione 4.1 EA

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

// Parole chiave: MT4, Forex EA builder, creare EA, expert advisor developer

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"

#proprietà link

#include

#include

// variabili esportate

extern int OrderId = 1;

extern int Slippage = 2

extern double Lots = 0.01;

extern int MaxOrdersAllowed = 2; // op buy e op sell consentiti

extern int Grid = 10; // distanza totale in pip agli ordini aperti

extern string EAComment = "564 test";

// variabili locali

double PipValue=1; // questa variabile è qui per supportare i broker a 5 cifre

bool Terminated = false;

string LF = "\n"; // usa questo in blocchi personalizzati o di utilità dove hai bisogno di avanzamenti di linea

int NDigits = 4; // usato soprattutto per NormalizeDouble nei blocchi di tipo Flex

int ObjCount = 0; // conta di tutti gli oggetti creati sul grafico, permette la creazione di oggetti con nomi unici

int current = 0;

int init()

{

NDigits = Digits;

if (false) ObjectsDeleteAll(); // cancella il grafico

Comment(""); // cancella il grafico

}

// Inizio esperto

int start()

{

se (Bars < 10)

{

Comment("Non ci sono abbastanza barre");

return (0);

}

if (Terminato == true)

{

Comment("EA Terminato");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

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

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

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MassimoOrdine();

}

void IfOrderDoesNotExist2()

{

bool exists = false;

for (int i=OrdiniTotali()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

esiste = true;

}

}

else

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

if (exists == false)

{

BuyPendingOrder();

}

}

void IfOrderDoesNotExist4()

{

bool exists = false;

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

esiste = true;

}

}

else

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

if (exists == false)

{

SellPendingOrder();

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

doppio SL = prezzo - 0*PipValue*Point;

se (0 == 0) SL = 0;

doppio TP = prezzo + 0*PipValue*Point;

se (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

if (ticket == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError());

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

doppio SL = prezzo + 0*PipValue*Point;

se (0 == 0) SL = 0;

doppio TP = prezzo - 0*PipValue*Point;

se (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lotti, prezzo, Slippage, SL, TP, EAComment, OrderId, expire, Red);

se (ticket == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError());

}

}

void MaximumOrder()

{

if (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

void OrderCount()

{

int count = 0;

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol())

se (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

else

{

Print("OrderSend() error - ", ErrorDescription(GetLastError());

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // Nessuno aperto.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

return(lastTicket);

}

else

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

int deinit()

{

if (false) ObjectsDeleteAll();

}

 
sulaimoney:
Ciao Mladen ,

Qualcuno può per favore dirmi cosa sto facendo di sbagliato, io per lo più scrivo il mio ea usando FX Gen con snippets e codici usando esempi dal compilatore mq4 e forum online. sto cercando di codificare la mia strategia per un trading più facile, sono stato capace di selezionare l'ultimo ordine con successo usando questo codice.

void OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Nessuno aperto.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY || OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket);

}

else

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

Puoi dare un'occhiata a questo codice sto cercando di eliminare l'ordine più vecchio prima usando datetime e biglietto d'ordine, ad esempio se l'ordine aperto >2 elimina l'ordine più vecchio.

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

// Etasoft Inc. Forex EA e Script Generator versione 4.1 EA

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

// Parole chiave: MT4, Forex EA builder, creare EA, expert advisor developer

#property copyright "Copyright © 2011, Etasoft Inc. Forex EA Generator v4.1"

#proprietà link

#include

#include

// variabili esportate

extern int OrderId = 1;

extern int Slippage = 2

extern double Lots = 0.01;

extern int MaxOrdersAllowed = 2; // op buy e op sell consentiti

extern int Grid = 10; // distanza totale in pip agli ordini aperti

extern string EAComment = "564 test";

// variabili locali

double PipValue=1; // questa variabile è qui per supportare i broker a 5 cifre

bool Terminated = false;

string LF = "\n"; // usa questo in blocchi personalizzati o di utilità dove hai bisogno di avanzamenti di linea

int NDigits = 4; // usato soprattutto per NormalizeDouble nei blocchi di tipo Flex

int ObjCount = 0; // conta di tutti gli oggetti creati sul grafico, permette la creazione di oggetti con nomi unici

int current = 0;

int init()

{

NDigits = Digits;

if (false) ObjectsDeleteAll(); // cancella il grafico

Comment(""); // cancella il grafico

}

// Inizio esperto

int start()

{

se (Bars < 10)

{

Comment("Non ci sono abbastanza barre");

return (0);

}

if (Terminato == true)

{

Comment("EA Terminato");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

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

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

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MassimoOrdine();

}

void IfOrderDoesNotExist2()

{

bool exists = false;

for (int i=OrdiniTotali()-1; i >= 0; i--)

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

esiste = true;

}

}

else

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

if (exists == false)

{

BuyPendingOrder();

}

}

void IfOrderDoesNotExist4()

{

bool exists = false;

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

esiste = true;

}

}

else

{

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

if (exists == false)

{

SellPendingOrder();

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

doppio SL = prezzo - 0*PipValue*Point;

se (0 == 0) SL = 0;

doppio TP = prezzo + 0*PipValue*Point;

se (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

if (ticket == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError());

}

}

void SellPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Bid+((Ask-Bid)/2)), NDigits) - Grid*PipValue*Point;

doppio SL = prezzo + 0*PipValue*Point;

se (0 == 0) SL = 0;

doppio TP = prezzo - 0*PipValue*Point;

se (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lotti, prezzo, Slippage, SL, TP, EAComment, OrderId, expire, Red);

se (ticket == -1)

{

Print("OrderSend() error - ", ErrorDescription(GetLastError());

}

}

void MaximumOrder()

{

if (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

void OrderCount()

{

int count = 0;

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

else

{

Print("OrderSend() error - ", ErrorDescription(GetLastError());

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // Nessuno aperto.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY || OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

return(lastTicket);

}

else

Print("OrderSelect() error - ", ErrorDescription(GetLastError());

}

int deinit()

{

if (false) ObjectsDeleteAll();

}

Prova a usare una funzione come questa:

void DeleteOldestOrder()

{

datetime lastTime = Time[0]+Period()*60;

int lastTicket = -1; // None open.

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

{

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() <= lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

}

if (lastTicket>-1)

if (OrderSelect(lastTicket,SELECT_BY_TICKET,MODE_TRADES))

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}
 

Grazie Mladen

ha funzionato perfettamente, btw mi scuso per aver postato un pezzo di codice così lungo sul forum. Mi sto ancora abituando all'interfaccia. Grazie.

 

L'indicatore non si aggiorna automaticamente.

Qui ho un indicatore che è molto adatto al mio trading.

Purtroppo non si aggiorna da solo. Devo sempre aggiornare manualmente che sia rinnovato.

C'è un modo per risolvere questo problema?

Sarebbe molto utile!

Grazie in anticipo.

P.S.: In allegato tutto quello che ho.

File:
 

Vuole l'sms di notifica. Come appare il codice?

 
popej30:
Vuole l'sms di notifica. Come appare il codice?

papaj30

Fai così :

SendNotification("messaggio di notifica che vuoi inviare");

 

E dove inserisci il tuo numero di telefono? Il mio numero 0039 555-23-45. Dove inserire ?

Esempio:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}
 
popej30:
E dove inserisci il tuo numero di telefono? Il mio numero 0039 555-23-45. Dove inserire ?

Esempio:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

for (li_96 = 0; li_96 <= limit; li_96++) {

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

for (li_96 = 0; li_96 <= limit; li_96++) {

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}

Qui c'è una buona spiegazione su come si può fare:

 
Jim Clark:
L'indicatore non si aggiorna automaticamente.

Qui ho un indicatore che è molto adatto al mio trading.

Purtroppo non si aggiorna da solo. Devo sempre aggiornare manualmente che si rinnova.

C'è un modo per risolvere questo problema?

Sarebbe molto utile!

Grazie in anticipo.

P.S.: In allegato tutto quello che ho.

Jim

Invece di riscrivere l'intera cosa aggiungi un limite per calcolare le barre e poi tutte quelle barre vengono ricalcolate. Questo dovrebbe risolvere il problema del refresh (basta mantenere il BarsTocalculate ad un valore ragionevole - non troppo grande e non troppo piccolo. Ho usato 1000 come valore predefinito e sembra andare bene così). Provalo

File: