Come codificare? - pagina 111

 
MrPip:
Fate attenzione quando usate OrderComment() per identificare i trade. A volte il broker aggiunge dei caratteri al commento.

È meglio usare

if (StringFind(OrderComment(), UserComment, 0) > 0)

{

// ordine identificato da UserComment trovato in OrderComment

}

invece di

if (OrderComment() == UserComment)

{

// l'ordine potrebbe essere identificato da UserComment

// se OrderComment non è stato modificato dal broker

}

Robert

Esattamente ... E inoltre, a volte il commento originale codificato nel EA è troppo lungo e sarà troncato dalla piattaforma (non so se il resto del commento è nella "memoria", ma non viene visualizzato nella colonna dei commenti).

FerruFx

 

bisogno di aiuto con il mio EA

Ciao,

sto lavorando su un EA che apre posizioni long e short simultaneamente e sto affrontando questo problema...quando entrambi i tipi di posizioni sono aperte, diciamo che la prima è short e la seconda è long...l'EA non chiuderà la posizione long se la short è ancora aperta, aspetterà che la short sia chiusa e poi chiuderà la long quando le condizioni sono soddisfatte e viceversa. qui sotto è la parte dell'EA dove dovrebbe chiudere le posizioni aperte:

//---- Chiudere le posizioni aperte

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

{

OrderSelect(cnt, SELECT_BY_POS);

{

//-- Chiudere posizioni lunghe

if(OrderSymbol() == Symbol() && OrderType()==OP_BUY && rsi1>75 && rsi<75)

{

OrderClose(OrderTicket(),OrderLots(),Bid,5,Green);

LotL=Lotto;

}

//-- Chiudere Short

if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && rsi125)

{

OrderClose(OrderTicket(),OrderLots(),Ask,5,Red);

LotS=Lot;

}

}

}

*dove rsi1 è l'rsi precedente e rsi è la lettura attuale

*LotL & LotS è un moltiplicatore del lotto originale, l'ho impostato per aprire un massimo di 3 posizioni per lato, quindi quando si chiude un tipo di posizioni aperte, LotL & LotS saranno riportati alla dimensione originale

l'EA funziona come previsto quando si aprono le posizioni ma il problema è con la chiusura delle posizioni aperte, penso che l'EA nella parte del loop non stia leggendo tutte le posizioni aperte ma solo la prima... qualsiasi aiuto per risolvere questo problema è davvero apprezzato!

grazie!

pete

 

Sto cercando di aggiungere la funzione "Pips to activate Trailing stop". Quello che ho cambiato è in rosso. Cos'altro deve essere aggiunto?

extern string Remark1 = "== Main Settings ==";

extern int MagicNumber = 54321;

extern bool SignalMail = False;

extern bool EachTickMode = true;

extern double Lots = 4;

extern int Slippage = 2;

extern bool UseStopLoss = false;

extern int StopLoss = 100;

extern bool UseTakeProfit = false;

extern int TakeProfit = 15;

extern bool UseTrailingStop = true;

extern int TrailingStop = 45;

extern double Pips_Activate_TS = 5;

extern bool MoveStopOnce = False;

extern int MoveStopWhenPrice = 50;

extern int MoveStopTo = 1;

extern int MaxConcurrentTrades = 2;

//Version 2.01

int BarCount;

int Current;

bool TickCheck = False;

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

//| expert initialization function |

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

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

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

//| expert deinitialization function |

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

int deinit() {

return(0);

}

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

//| expert start function |

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

int start()

{

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

if (EachTickMode && Bars != BarCount) TickCheck = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

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

//| Variable Begin |

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

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

//| Variable End |

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

//Check position

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

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

//| Signal Begin(Exit Buy) |

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

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

//| Signal End(Exit Buy) |

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

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//MoveOnce

if(MoveStopOnce && MoveStopWhenPrice > 0) {

if(Bid - OrderOpenPrice() >= Point * MoveStopWhenPrice) {

if(OrderStopLoss() < OrderOpenPrice() + Point * MoveStopTo) {

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

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

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

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

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

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

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

//| Signal End(Exit Sell) |

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

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//MoveOnce

if(MoveStopOnce && MoveStopWhenPrice > 0) {

if(OrderOpenPrice() - Ask >= Point * MoveStopWhenPrice) {

if(OrderStopLoss() > OrderOpenPrice() - Point * MoveStopTo) {

OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - Point * MoveStopTo, OrderTakeProfit(), 0, Red);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

//Trailing stop

if(UseTrailingStop && TrailingStop > 0) {

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

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

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

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

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

//| Signal Begin(Entry) |

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

if(Open[0] > Open[0+1] &&

Open[0+1] >= Open[0+2] &&

Open[0+2]>= Open[0+3] &&

Open[0+3] >= Open[0+4] &&

Open[0+4] >= Open[0+5] &&

Open[0+5] >= Open[0+6]) Order = SIGNAL_SELL;

if(Open[0] < Open[0+1] &&

Open[0+1] <= Open[0+2] &&

Open[0+2]<= Open[0+3] &&

Open[0+3] <= Open[0+4] &&

Open[0+4] <= Open[0+5] &&

Open[0+5] <= Open[0+6]) Order = SIGNAL_BUY;

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

//| Signal End |

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

//Buy

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(DecideToOpenTrade(OP_BUY) && TradeSlotsAvailable()) {

//Check free margin

if (AccountFreeMargin() < (1000 * Lots)) {

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("BUY order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

Print("Error opening BUY order : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Sell

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(DecideToOpenTrade(OP_SELL) && TradeSlotsAvailable()) {

//Check free margin

if (AccountFreeMargin() < (1000 * Lots)) {

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("SELL order opened : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

} else {

Print("Error opening SELL order : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

 
 
mifiglo:
Ciao colleghi trader,

Ho questo piccolo problema nello sviluppo di un Expert Advisor da un indicatore Custom, ho provato la funzione "iCustom" ma il mio indicatore restituisce sempre lo stesso valore.

Restituisce qualcosa come 21473..., così

Voglio che l'EA sia in grado di riconoscere quando vengono generati i segnali delle frecce di vendita e di acquisto e dovrebbe eseguire l'azione di trading corrispondente (cioè comprare quando l'indicatore dice su e vendere quando dice giù)

Ecco il codice dell'indicatore che apprezzerei molto se qualcuno potesse trovare una soluzione al più presto.

Si prega di postare anche le linee di codice con la tua funzione iCustom()

FerruFx

 

Mi dispiace, questo è tutto quello che ho...

 
 

Rsi Ea

Questo è il mio primo EA. Utilizza 2 rsi che si incrociano in 3 time frame. Ho un problema con l'EA che fa trading contro gli incroci. Compra quando dovrebbe vendere, vende quando dovrebbe comprare. Qualcuno potrebbe per favore guardare il codice e dirmi dove ho sbagliato. Non sono stato in grado di vedere nulla di sbagliato.

Ho allegato l'ea e una foto del problema.

File:
 

Bisogno di aiuto per il codice EA!

Ciao a tutti,

Come sapete il mercato fx è di 24 ore, non mi è comodo fare trading durante la notte senza stare seduto davanti al PC. Quindi sto pensando che il modo migliore è un programma per proteggere il commercio se il prezzo si muove verso la mia direzione preferita. Per esempio, se ho aperto 5 lotti in totale, quando il profitto è superiore a 50 pips, si sposta automaticamente lo stop loss al break even. Quando il profitto è superiore a 100 pips, si muove per proteggere 30 pips, quando il profitto è superiore a 200 pips, si muove per proteggere 50 pips e così via.

Ho provato a codificare da solo. Ma non funziona quando lo trascino nel mio grafico e lo imposto nel trading live. Qualcuno potrebbe aiutarmi a dare un'occhiata al mio codice e sistemarlo? Molte grazie.

#proprietà copyright "x li"

#proprietà link ""

#proprietà show_confirm

//---- parametri di ingresso

extern int target1 =50;

extern int target2 =100;;

extern int target3 =150;;

extern int target4 =200;;

extern int target5 =300;

extern int protect1 =0;

extern int protect2 =5;

extern int protect3 =50;

extern int protect4 =100;

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

//| script "sposta lo stoploss su protect(50->0;100->5;150->50;200->50;300->100)" |

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

int start()

{

bool risultato;

double stop_loss,point,EntryPrice,profit;

int cmd,total,error,i;

//----

total=OrdersTotal();

point=MarketInfo(Symbol(),MODE_POINT);

//----

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

cmd=OrderType();

EntryPrice=OrderOpenPrice();

//---- ordini di acquisto sono considerati

if(cmd==OP_BUY)

{

profit=Bid-EntryPrice;

if(profit>target1*point && profit<target2*point)

{

stop_loss=EntryPrice+protezione1*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target2*point && profit<target3*point)

{

stop_loss=EntryPrice+protect2*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target3*point && profit<target4*point)

{

stop_loss=EntryPrice+protect3*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target4*point && profit<target5*point)

{

stop_loss=EntryPrice+protect3*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profitto>target5*punto)

{

stop_loss=EntryPrice+protezione4*punto;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

}

//---- ordini di vendita sono considerati

if(cmd==OP_SELL)

{

profit=EntryPrice-Ask;

if(profit>target1*point && profit<target2*point)

{

stop_loss=EntryPrice-protect1*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target2*point && profit<target3*point)

{

stop_loss=EntryPrice-protect2*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target3*point && profit<target4*point)

{

stop_loss=EntryPrice-protect3*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

if(profit>target4*point && profit<target5*point)

{

stop_loss=EntryPrice-protect3*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

se(profitto>target5*punto)

{

stop_loss=EntryPrice-protect4*point;

result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);

}

}

}

else { Print("Error when order select ", GetLastError()); break; }

}

//----

return(0);

}

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

 

Rsi Ea

Non capisco perché usi la stessa variabile per aprire e chiudere i trade, ma potrebbe funzionare.

Questo potrebbe essere il problema:

"Order" è una variabile globale. Quindi alla fine di ogni esecuzione attraverso la funzione Start sarà impostata all'ultimo valore che le è stato assegnato, e userà quel valore per l'inizio della prossima esecuzione. Se la rendete locale (spostandola all'interno di Start) potrebbe risolvere il problema. Altrimenti dovrete resettarlo dopo l'ultimo utilizzo.

Buona caccia,

Big Be

Motivazione: