Domande di base ... - pagina 8

 

Guarda questo thread: https://www.mql5.com/en/forum/178677

 
newdigital:
Guarda questo thread: https://www.mql5.com/en/forum/178677

davvero grazie, per le istruzioni di apertura del file e il link di download

 

10punti3

PLEAASEEE, PROGRAMMATORI!

Abbiamo bisogno in 10points3 EA, che quando il terzo trade si apre, il primo si chiude, ci sto provando ma sta ancora chiudendo tutte le posizioni.

In realtà abbiamo:

if (PreviousOpenOrders>OpenOrders)

{

for(cnt=OrdiniTotali();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

mode=OrderType();

if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)

{

if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Blue); }

se (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Red); }

return(0);

}

Stavo pensando di fare così

1. cambiare il numero magico per la prima operazione quando si apre la seconda, per esempio magicnumber+1

2. quando si apre il terzo trade, chiudere il primo, con il magicnumber+1 assegnato.

Ho ragione?

o in quale altro modo posso identificare il primo trade aperto per chiuderlo in seguito?

Se potete guidarmi o fare le modifiche, meglio perché non sono un programmatore, sto solo imparando.

Questa modifica sarebbe l'inizio del Santo Graal!!!

 

10punti3

Scusa, l'EA.

Ed è in questo thread:

https://www.mql5.com/en/forum/174975

Grazie!

File:
10p3v0.03_1.mq4  12 kb
 

aiuto di programmazione - operatore di ritorno

ciao

sono un principiante della programmazione mt4 e ora spesso cerco di trovare una soluzione per commettere le variabili da una funzione void al programma principale "start()".

qui sotto potete vedere un esempio e la domanda è, come posso commettere il valore dalla variabile "CountOpenSell", "CountOpenBuy", "ProfitSell " e "ProfitBuy" alla funzione start() - mainprogram.........

Ho aggiunto il mio suggerimento (ritorno in GRASSETTO) ma non so se è corretto e come è il codice giusto per il programma principale "start()"?

scusa per il mio cattivo inglese e per tutto l'aiuto

grazie mille

saluti

forex2006

void CallBuySellProfit()

{ ProfitBuy=0;

ProfitSell=0;

CountOpenSell=0;

CountOpenBuy=0;

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

{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if (OrderType()==OP_SELL) {ProfitSell = ProfitSell + OrderProfit();CountOpenSell++;}

if (OrderType()==OP_BUY) {ProfitBuy = ProfitBuy + OrderProfit();CountOpenBuy++;}

}

else Print("Errore durante la selezione dell'ordine", GetLastError());

}

return(CountOpenSell);

return(CountOpenBuy);

return(ProfitSell);

return(ProfitBuy);

}

 

aiuto programmazione forex2006 - operatore di ritorno

Ciao forex2006,

Se vuoi davvero imparare mql, ti consiglio di provare i tutorial di codersguru, è da lì che ho iniziato. Per quanto riguarda la tua domanda, una funzione void non può restituire un valore, se vuoi ottenere valori dalle funzioni void, devi usare le variabili globali. Il modo migliore per far uscire i valori è usare una funzione che restituisce un valore usato con parametri per indicare quali valori volete. C'è un semplice esempio qui sotto. Cercate di evitare di usare le variabili globali nelle funzioni perché questo potrebbe rendervi le cose difficili in seguito.

Spero che sia d'aiuto

int start()

{

double ProfitBuy = CallBuySellProfit(OP_BUY,false);

double ProfitSell = CallBuySellProfit(OP_SELL,false);

int CountOpenBuy = CallBuySellProfit(OP_BUY,true);

int CountOpenSell = CallBuySellProfit(OP_SELL,true);

Comment("ProfitBuy: "+DoubleToStr(ProfitBuy,2) +"\n "+

"ProfitSell: "+DoubleToStr(ProfitSell,2) +"\n "+

"CountOpenBuy: "+DoubleToStr(CountOpenBuy,2)+"\n "+

"CountOpenSell: "+DoubleToStr(CountOpenSell,2)+"\n "+

"");

ritorno;

}

double CallBuySellProfit(int iOrderType, bool bCount)

{

double dProfit = 0;

int iCount = 0;

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if(OrderType()==iOrderType)

{

dProfit = dProfit + OrderProfit();

iCount++;

}

}

else

{

Print("Errore durante la selezione dell'ordine", GetLastError());

}

}//fine per

if(bCount)return(iCount);

else return(dProfit);

}//end CallBuySellProfit

 

Fermare il trading dell'EA sulla stessa barra

Ciao, c'è modo di mettere del codice in modo che l'EA controlli se i trade sono già stati piazzati su quella barra e poi non piazzi più trade fino ad una nuova barra?

Grazie per l'aiuto.

 

matrixebiz, hai considerato la possibilità che un trade si apra e si chiuda nella stessa candela prima che questa si sia chiusa? probabilmente dovresti controllare anche la lista della cronologia.

Ho sempre portato questa piccola funzione che ho scritto in tutti i miei EA, forse la puoi trovare utile anche tu.

bool DecideToOpenTrade()

{

int total = OrdersTotal();

if (total > 0)

{

for(int cnt=0;cnt<total;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS))

{

if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)

{

return (false);

}

}

}

}

// in case trades has already opened and closed within the candle

int histotal = OrdersHistoryTotal();

if (histotal > 0)

{

for(cnt=0;cnt<histotal;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)

{

if (Time[0] <= OrderOpenTime()) // don't open a new position if we're still on the same candle

{

return (false);

}

}

}

}

}

return (true);

}

int start()

{

// some time check codes first.. blah blah

// ...

// ...

// ...

// check signals

if (Should_Buy())

{

if (DecideToOpenTrade())

{

//... trade opening codes here

}

}

if (Should_Sell())

{

if (DecideToOpenTrade())

{

//... trade opening codes here

}

}

}

nota: questa funzione presuppone che tu abbia impostato un valore unico a EA_MAGIC_NUM. In questo modo il controllo non guarderà i trade aperti da altri EA.

Should_Buy() e Should_Sell() sono funzioni che creo in tutti i miei EA per determinare se si è verificato un segnale di acquisto o di vendita.

Spero che questo aiuti. Scrivimi un PM se hai bisogno di ulteriori chiarimenti.

saluti,

Zen

 

post aggiornato qui sotto...

 

Questo sembra funzionare per me Grazie

void DesideToOpen()

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

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

{

int total = OrdersTotal();

if (total > 0)

{

for(int cnt=0;cnt<total;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS))

{

if(OrderComment() == EA_Name + MagicNumber) DecideToOpenTrade = false;

}

}

}

// in case trades has already opened and closed within the candle

int histotal = OrdersHistoryTotal();

if (histotal > 0)

{

for(cnt=0;cnt<histotal;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderComment() == EA_Name + MagicNumber)

{

if (Time[0] <= OrderOpenTime()) DecideToOpenTrade = false; // don't open a new position if we're still on the same candle

}

}

}

}

}