Aiuto per la codifica - pagina 143

 
arroganzmaschine:
Ciao mladen, un'altra domanda:

Come posso controllare tutti gli ordini aperti, se il loro profitto è inferiore a -20 e poi chiuderli?

Qualcosa del genere?

//int currentTicket;

for(int i0=OrdiniTotali()-1; i0>=0; i0--) {

//currentTicket = OrderSelect(i0, SELECT_BY_POS, MODE_TRADES);

if(OrderProfit() <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

arroganzmaschine

Sì, questo dovrebbe farlo.

Potresti cambiare solo la linea dove controlli il profitto in questo:

if ((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

per essere sicuro che sia un profitto "puro" quello che stai controllando

 

Devo impostare un Bid o Ask al OrderClose? O la linea è corretta?

 

Hm, c'è qualcosa di sbagliato. Il backtest non chiude gli ordini che sono in meno profitto. Alla fine del test ci sono ordini aperti con -230 di profitto.

 

int start()

{

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Questo non funziona.

 
arroganzmaschine:
int start()

{

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Questo non funziona.

Hai dimenticato la funzione OrderSelect() (devi sempre selezionare l'ordine prima di fare qualcosa con esso). Inoltre sarebbe una buona idea aggiungere la parte che controlla che tipo di ordine stai cercando di chiudere

Qualcosa del genere:

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if (OrderSelect(u0,SELECT_BY_POS,MODE_TRADES))

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

{

if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);

if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);

}

 

qualcuno potrebbe aiutarmi a convertire l'istogramma in barre nell'indicatore TrendHistogram? Vorrei ottenere le stesse barre di quelle dell'indicatore TrendFilter allegato

TrendHistogram ha bisogno dell'indicatore EMA_Adaptive per funzionare correttamente

 
freakout:
qualcuno potrebbe aiutarmi a convertire l'istogramma in barre nell'indicatore TrendHistogram? Vorrei ottenere le stesse barre di quelle dell'indicatore TrendFilter allegato TrendHistogram ha bisogno dell'indicatore EMA_Adaptive per funzionare correttamente

freakout

Ecco qui

Impostate il DrawAsBars a true e disegnerà nel modo che avete descritto. Se lasci quel parametro a false funzionerà come l'originale

File:
 

Ciao,

Qualcuno può aiutarmi a modificare questo codice, il back-testing è buono ma l'EA non funziona sul conto demo/reale.

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

//| Hans123Trader v1 |

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

#include

#proprietà copyright "hans123"

#proprietà link ""

// programmato da fukinagashi

extern int BeginSession1=6;(durante il backtest ho modificato e impostato 0 per tutte le sessioni ottenendo così i risultati finali)

extern int EndSession1=10;

extern int BeginSession2=10;

extern int EndSession2=14;

extern double TrailingStop = 0;

extern double TakeProfit = 452;

extern double InitialStopLoss=40;

double Lots = 0.1;

datetime bartime = 0;

double Slippage=3;

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

//| |

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

int start()

{

int cnt, ticket, err, i, j, cmd;

int MagicNumber;

double ts, tp, LowestPrice, HighestPrice, Price;

bool Order[5];

stringa setup;

datetime Validity=0;

if(IsTesting() && Bars<100) return(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Symbol();

if (bartime == Time[0]) {

return(0);

} else {

bartime = Time[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICHE SUGLI ORDINI APERTI ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0]) {

Stampa(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Errore nella chiusura dell'ordine di acquisto [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Errore nella modifica dell'ordine Buy [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

se (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0]) {

Stampa(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Errore nella chiusura dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

se (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// IMPOSTAZIONE DEGLI ORDINI ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0);

Validity=StrToTime(TimeYear(Time[0]) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + " 23:59");

se (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//// il seguente è necessario, per evitare un prezzo BUYSTOP/SELLSTOP troppo vicino a Bid/Ask,

//// nel qual caso otteniamo un 130 stop non valido.

//// Ho provato a cambiare in modo corretto OP_BUY e OP_SELL, ma i risultati non sono stati soddisfacenti

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

// Prezzo=Ask;

//} else {

cmd=OP_BUYSTOP;

Prezzo=HighestPrice+5*Point;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

// Prezzo=Bid;

//} else {

cmd=OP_SELLSTOP;

Prezzo=LowestPrice-5*Point;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

// Price=Ask;

//} else {

cmd=OP_BUYSTOP;

Prezzo=HighestPrice+5*Point;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

// Prezzo=Bid;

//} else {

cmd=OP_SELLSTOP;

Prezzo=LowestPrice-5*Point;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSE SUBROUTINE /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("Simbolo inatteso"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime;

int timeout=30;

int ticket;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Errore in OrderSendExtended(): Timeout incontrato");

return(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // imposta l'indicatore di blocco

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // cancella l'indicatore di blocco

return(ticket);

}

 
ccd:
Ciao,

Qualcuno può aiutarmi a modificare questo codice, il back-testing è buono ma l'EA non funziona su un conto demo/reale.

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

//| Hans123Trader v1 |

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

#include

#proprietà copyright "hans123"

#proprietà link ""

// programmato da fukinagashi

extern int BeginSession1=6;(durante il backtest ho modificato e impostato 0 per tutte le sessioni ottenendo così i risultati finali)

extern int EndSession1=10;

extern int BeginSession2=10;

extern int EndSession2=14;

extern double TrailingStop = 0;

extern double TakeProfit = 452;

extern double InitialStopLoss=40;

double Lots = 0.1;

datetime bartime = 0;

double Slippage=3;

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

//| |

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

int start()

{

int cnt, ticket, err, i, j, cmd;

int MagicNumber;

double ts, tp, LowestPrice, HighestPrice, Price;

bool Order[5];

stringa setup;

datetime Validity=0;

if(IsTesting() && Bars<100) return(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Symbol();

if (bartime == Time[0]) {

return(0);

} else {

bartime = Time[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICHE SUGLI ORDINI APERTI ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0]) {

Stampa(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Errore nella chiusura dell'ordine di acquisto [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Errore nella modifica dell'ordine Buy [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

se (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0]) {

Stampa(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Errore nella chiusura dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

se (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// IMPOSTAZIONE DEGLI ORDINI ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0);

Validity=StrToTime(TimeYear(Time[0]) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + " 23:59");

se (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//// il seguente è necessario, per evitare un prezzo BUYSTOP/SELLSTOP troppo vicino a Bid/Ask,

//// nel qual caso otteniamo un 130 stop non valido.

//// Ho provato a cambiare in modo corretto OP_BUY e OP_SELL, ma i risultati non sono stati soddisfacenti

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

// Prezzo=Ask;

//} else {

cmd=OP_BUYSTOP;

Prezzo=HighestPrice+5*Point;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

// Prezzo=Bid;

//} else {

cmd=OP_SELLSTOP;

Prezzo=LowestPrice-5*Point;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

// Price=Ask;

//} else {

cmd=OP_BUYSTOP;

Prezzo=HighestPrice+5*Point;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

// Prezzo=Bid;

//} else {

cmd=OP_SELLSTOP;

Prezzo=LowestPrice-5*Point;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Print("Errore nella modifica dell'ordine Sell [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSE SUBROUTINE /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("simbolo inatteso"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime;

int timeout=30;

int ticket;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Errore in OrderSendExtended(): Timeout incontrato");

return(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // imposta l'indicatore di blocco

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // cancella l'indicatore di blocco

return(ticket);

}

Prova a moltiplicare l'InitialStopLoss con 10 su un conto live. Questo EA è scritto per broker a 4 cifre

______________________

PS: dovresti anche moltiplicare il TakeProfit con 10 per essere coerente e averlo come pip, ma se lo hai testato con quei numeri, non otterrai gli stessi risultati di quando hai fatto il back test (semplicemente perché il back test ti ha permesso di usare valori per quei due che né il conto demo né il conto live ti permettono)

 
mladen:
zigflip Ultimi due psar come "ultima coppia superiore/inferiore di psar" o "ultime 2 barre"?

scusa per il ritardo nella risposta mladen, pensavo di avere l'abbonamento alla posta elettronica ma...

Intendo l'ultima coppia di psar!

Voglio principalmente monitorare l'ultimo psar, ma quando si verifica il cambiamento superiore/inferiore avrei bisogno degli ultimi due livelli, hmm forse dovrebbe essere x barre indietro... agh ho capito cosa stai dicendo ora, sui secondi pensieri forse l'ultima serie di superiori/inferiore, che riflette l'ultimo cambiamento all'arrivo della prima nuova direzione psar!

Grazie per il tuo aiuto su questo,