Aiuto per la codifica - pagina 469

 

Ciao Trader.

Qualcuno può aiutarmi e sa quali sono gli indicatori in questi due file .ex4?

I migliori saluti, oink!

File:
 
oink!:
Ciao Trader.

Qualcuno può aiutarmi e sa quali sono gli indicatori in questi due file .ex4?

Cordiali saluti, oink!

Segnali di allarme è un semplice zigzag fatto per mostrare le frecce:

File:
zz.gif  76 kb
 

Graziemladen, conosco il tuo nome da circa 10000 Indikator! ;-)

Allora cerco su Google l'indicatore zigzag+frecce.

L'altro è indefinito?

Cordiali saluti, oink!

 
oink!:
Graziemladen, conosco il tuo nome da circa 10000 indikatori! ;-)

Poi cerco su Google l'indicatore zigzag+frecce.

L'altro è indefinito?

Cordiali saluti, oink!

Francamente, non potrei riconoscere l'altro. Scusa

 

Ciao, non capisco perché questo ea non funziona,

Non capisco perché questo ea non funziona, compilazione OK, niente nel diario né scheda esperto, ma non qualsiasi commercio.

Grazie in anticipo.

Jo

extern int magicNum=200;

extern double TakeProfit = 50;

extern double Lots = 0.01;

extern double TrailingStop = 30;

//extern double MACDOpenLevel=3;

//extern double MACDCloseLevel=2;

extern double MATrendPeriod=5;

int start()

{

double MaCurrent,MaPrevious,MavPrevious;

double close=iClose(Symbol(),0,0);

double vclose=iClose(Symbol(),0,1);

double vvclose=iClose(Symbol(),0,2);

// double MacdCurrent, MacdPrevious, SignalCurrent;

// double SignalPrevious, MaCurrent, MaPrevious;

// double RSIj,RSIv;

int cnt, ticket, total;

// controlli dati iniziali

// è importante assicurarsi che l'esperto lavori con un normale

// grafico e che l'utente non abbia commesso errori nell'impostare variabili esterne

// variabili esterne (Lotti, StopLoss, TakeProfit,

// TrailingStop) nel nostro caso, controlliamo TakeProfit

// su un grafico con meno di 100 barre

if(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

se(TakeProfit<10)

{

Print("TakeProfit inferiore a 10");

return(0); // controlla TakeProfit

}

// per semplificare la codifica e velocizzare l'accesso

// i dati sono messi in variabili interne

// MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

// MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);

// SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

// SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,1);

MavPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,2);

double PlusHaut =Alto

double PlusBas =Basso

double TiersHaut =PlusBas +((PlusHaut-PlusBas)*0.66);

double TiersBas =PlusBas +((PlusHaut-PlusBas)*0.33);

// RSIj= iRSI(NULL,0,9,PRICE_CLOSE,0);

// RSIv= iRSI(NULL,0,9,PRICE_CLOSE,1);

total=OrdersTotal();

if(totale<1)

{ // nessun ordine aperto identificato

if(ContoFreeMargin()<(1000*Lotti))

{

Print("Non abbiamo soldi. Margine libero = ", AccountFreeMargin());

return(0);

}

// verificare la possibilità di una posizione lunga (BUY)

se

// (RSIv30)

( MaCurrent >MaPrevious)

// && (MaPreviousvclose || vclose>vvclose))

// (MacdCurrentSignalCurrent && MacdPrevious<SignalPrevious &&

// MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

{

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

se(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

// verificare la possibilità di una posizione corta (SELL)

// se (RSIv>70 && RSIj<70)

if ( MaCurrent <MaPrevious)

// && (MaPrevious>MavPrevious) && (close<vclose || vclose<vvclose))

// (MacdCurrent>0 && MacdCurrentSignalPrevious &&

// MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "MA",magicNum,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

// è importante entrare nel mercato correttamente,

// ma è più importante uscirne correttamente...

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && // controlla la posizione aperta

OrderSymbol()==Symbol()) // controlla il simbolo

{

if(OrderType()==OP_BUY) // la posizione lunga è aperta

{

// deve essere chiusa?

// if(MacdCurrent>0 && MacdCurrentSignalPrevious &&

// MacdCurrent>(MACDCloseLevel*Point))

// se (RSIv>70 && RSIj<70)

se ( MaCurrent <MaPrevious)

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiude la posizione

return(0); // uscire

}

// controlla il trailing stop

se(TrailingStop>0)

{

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else // passa alla posizione short

{

// deve essere chiusa?

// if(MacdCurrentSignalCurrent &&

// MacdPrevious(MACDCloseLevel*Point))

if

// (RSIv30)

( MaCurrent >MaPrevious)

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // chiude la posizione

return(0); // uscire

}

// controlla il trailing stop

se(TrailingStop>0)

{

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))

{

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

return(0);

}

// la fine.

 
Jovager:
Ciao,

Non capisco perché questo ea non funziona, la compilazione è OK, niente nel diario né nella scheda esperto, ma non c'è nessun trade.

Grazie in anticipo.

Jo

extern int magicNum=200;

extern double TakeProfit = 50;

extern double Lots = 0.01;

extern double TrailingStop = 30;

//extern double MACDOpenLevel=3;

//extern double MACDCloseLevel=2;

extern double MATrendPeriod=5;

int start()

{

double MaCurrent,MaPrevious,MavPrevious;

double close=iClose(Symbol(),0,0);

double vclose=iClose(Symbol(),0,1);

double vvclose=iClose(Symbol(),0,2);

// double MacdCurrent, MacdPrevious, SignalCurrent;

// double SignalPrevious, MaCurrent, MaPrevious;

// double RSIj,RSIv;

int cnt, ticket, total;

// controlli dati iniziali

// è importante assicurarsi che l'esperto lavori con un normale

// grafico e che l'utente non abbia commesso errori nell'impostare variabili esterne

// variabili esterne (Lotti, StopLoss, TakeProfit,

// TrailingStop) nel nostro caso, controlliamo TakeProfit

// su un grafico con meno di 100 barre

if(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

se(TakeProfit<10)

{

Print("TakeProfit inferiore a 10");

return(0); // controlla TakeProfit

}

// per semplificare la codifica e velocizzare l'accesso

// i dati sono messi in variabili interne

// MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);

// MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);

// SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

// SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);

MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,0);

MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,1);

MavPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,2);

double PlusHaut =Alto

double PlusBas =Basso

double TiersHaut =PlusBas +((PlusHaut-PlusBas)*0.66);

double TiersBas =PlusBas +((PlusHaut-PlusBas)*0.33);

// RSIj= iRSI(NULL,0,9,PRICE_CLOSE,0);

// RSIv= iRSI(NULL,0,9,PRICE_CLOSE,1);

total=OrdersTotal();

if(totale<1)

{ // nessun ordine aperto identificato

if(ContoFreeMargin()<(1000*Lotti))

{

Print("Non abbiamo soldi. Margine libero = ", AccountFreeMargin());

return(0);

}

// verificare la possibilità di una posizione lunga (BUY)

se

// (RSIv30)

( MaCurrent >MaPrevious)

// && (MaPreviousvclose || vclose>vvclose))

// (MacdCurrentSignalCurrent && MacdPrevious<SignalPrevious &&

// MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)

{

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

se(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

// verificare la possibilità di una posizione corta (SELL)

// se (RSIv>70 && RSIj<70)

if ( MaCurrent <MaPrevious)

// && (MaPrevious>MavPrevious) && (close<vclose || vclose<vvclose))

// (MacdCurrent>0 && MacdCurrentSignalPrevious &&

// MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "MA",magicNum,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

// è importante entrare nel mercato correttamente,

// ma è più importante uscirne correttamente...

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && // controlla la posizione aperta

OrderSymbol()==Symbol()) // controlla il simbolo

{

if(OrderType()==OP_BUY) // la posizione lunga è aperta

{

// deve essere chiusa?

// if(MacdCurrent>0 && MacdCurrentSignalPrevious &&

// MacdCurrent>(MACDCloseLevel*Point))

// se (RSIv>70 && RSIj<70)

se ( MaCurrent <MaPrevious)

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiude la posizione

return(0); // uscire

}

// controlla il trailing stop

se(TrailingStop>0)

{

if(Bid-OrderOpenPrice()>Point*TrailingStop)

{

if(OrderStopLoss()<Bid-Point*TrailingStop)

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);

return(0);

}

}

}

}

else // passa alla posizione short

{

// deve essere chiusa?

// if(MacdCurrentSignalCurrent &&

// MacdPrevious(MACDCloseLevel*Point))

if

// (RSIv30)

( MaCurrent >MaPrevious)

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // chiude la posizione

return(0); // uscire

}

// controlla il trailing stop

se(TrailingStop>0)

{

if((OrderOpenPrice()-Ask)>(Point*TrailingStop))

{

if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);

return(0);

}

}

}

}

}

}

return(0);

}

// la fine.

Funziona nei miei test posteriori:

File:
jo.gif  90 kb
 

Ciao mladen,

Voglio fare una vendita parziale del mio profitOrder con lo stesso valore della mia variabile "LossValue".

Ho provato a calcolare la dimensione del lotto nei seguenti passi:

-Leggere il Profitto attuale dal profitOrder

-Calcolare il ProfitPerLotstep

-Calcolare il LossValue/ProfitPerLotstep e arrotondare il risultato del lotto

-Ma se vendo questo lotto il valore del profitto è troppo piccolo (penso a causa dello spread)

Qual è il modo corretto di calcolo?

 

Ecco una domanda aggiuntiva.

Se faccio una chiusura parziale, il resto della posizione viene automaticamente aperta dal Broker. Prima ho dato alla posizione un commento per differenziare la posizione. Come posso riconoscerlo ora?

 
sunshineh:
Ecco un'altra domanda: se faccio una chiusura parziale, il resto della posizione viene automaticamente aperta dal Broker. Prima ho dato alla posizione un commento per differenziarla. Come posso riconoscerla ora?

sunshineh

Non puoi fare nulla

Solo il broker può cambiare il campo del commento di un ordine. Forse un broker cambia il commento nel modo in cui dice qualcosa come "da nnnn" dove nnnn è il numero del ticket precedente, ma nella maggior parte dei casi non lo fanno, quindi non ti rimane nessuna soluzione che possa identificare univocamente l'ordine precedente in casi come questo

 

Grazie mladen! Hai una soluzione al mio post di prima con il calcolo dalla dimensione del lotto secondo un valore definito come 100 EUR?

Motivazione: