solo acquisto, nessuna vendita

creando un ea redditizio, ma potrebbe essere due volte più buono (forse) per ora solo gli acquisti sono posti, mai ordini di vendita.

Qualcuno sa perché?

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

//| Segnale di inizio

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

se (sig_sell>0 && Sg<0 ) Ordine = SIGNAL_SELL;

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

//| Fine del segnale |

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

pubblicare il codice totale, c'è un'altra cosa sbagliata...

il secondo passo è forse le vostre funzioni iCustom().

panteraschoice:
creando un ea redditizio, ma potrebbe essere due volte meglio (forse) per ora vengono piazzati solo acquisti, mai ordini di vendita.

Qualcuno sa perché?

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

//| Segnale di inizio

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

se (sig_sell>0 && Sg<0 ) Ordine = SIGNAL_SELL;

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

//| Fine del segnale |

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

Posizionamento e visualizzazione di oggetti in date future?

Ciao, qualcuno sa se MQL4 supporta il posizionamento di un oggetto indicatore nel futuro e la visualizzazione dell'oggetto futuro? Ho provato ObjectMove a una data futura (nessun errore di ritorno), ma la visualizzazione si ferma alla data dell'ultimo tick. Grazie

Le MA hanno una funzione di spostamento... se è questo che intendi. +2 la farà scorrere in avanti di 2 barre TF. -2 scivolerà indietro di 2.

IN10TION:
pubblica il codice totale, c'è un'altra cosa sbagliata... il secondo passo è forse le tue funzioni iCustom().

#proprietà link "https://www.forex-tsd.com"

extern int MagicNumber = 1001;

extern bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

extern int StopLoss = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

extern double DecreaseFactor =3;

extern int MaxOrders = 3000;

extern bool UseHourTrade = False;

extern int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

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

//| funzione di inizializzazione esperto |

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

int init() {

BarCount = Bars;

se (EachTickMode) Current = 0; altrimenti Current = 1;

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit() {

return(0);

}

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

//| funzione di avvio esperto |

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

int start() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("L'ora per il commercio non è ancora arrivata!)

return(0);

}

}

int Ordine = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

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

Totale = OrdiniTotali();

Ordine = SIGNAL_NONE;

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

//| Segnale Inizio |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

se (sig_sell>0 && Sg<0 ) Ordine = SIGNAL_SELL;

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

//| Fine del segnale |

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

//Compra

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

if(ScanTrades() < MaxOrders) {

//Controlla il margine libero

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

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

return(0);

}

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit),

Slippage,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Biglietto > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordine BUY aperto: ", OrderOpenPrice()); altrimenti Print("Errore nell'apertura dell'ordine BUY: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Vendere

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

if(ScanTrades() < MaxOrders) {

//Controlla il margine libero

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

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

return(0);

}

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = Bid - TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit),

Slippage,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"Vendi(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

se(Biglietto > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordine SELL aperto : ", OrderOpenPrice()); altrimenti Print("Errore nell'apertura dell'ordine SELL: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Controlla la posizione

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

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

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

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//Chiude

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

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

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

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

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

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

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//Chiude

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

{

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

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//Trailing stop

if (TrailingStopMode && TrailingStop > 0)

{

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

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

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

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int totale = OrdiniTotali();

int numords = 0;

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

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {

// for (int i=0; i<OrdersTotal(); i++) {

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

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// return(True);

// }

// }

// }

// return(false);

//}

doppio LottiOttimizzati()

{

double lot=Lots;

int orders=HistoryTotal(); // totale degli ordini storici

int losses=0; // numero di ordini in perdita senza pausa

//---- selezionare la dimensione del lotto

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- calcolare il numero di ordini di perdite senza pausa

if(DecreaseFactor>0)

{

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Errore nella storia!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continua;

//----

se(OrderProfit()>0) break;

se(OrderProfit()<0) perdite++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- restituisce la dimensione del lotto

if(lot<0.1) lot=0.1;

return(lot);

}

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

Ottieni qualche codice di errore o qualcos'altro (nel backtesting) che ti dia un indizio di cosa sta andando storto?

panteraschoice:
#proprietà link "https://www.forex-tsd.com"

extern int MagicNumber = 1001;

extern bool EachTickMode = False;

extern double Lots = 0.01;

extern int Slippage = 4;

extern bool StopLossMode = True;

extern int StopLoss = 70;

extern bool TakeProfitMode = True;

extern int TakeProfit = 300;

extern bool TrailingStopMode = True;

extern int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

extern double DecreaseFactor =3;

extern int MaxOrders = 3000;

extern bool UseHourTrade = False;

extern int FromHourTrade = 8;

extern int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

int BarCount;

int Current;

bool TickCheck = False;

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

//| funzione di inizializzazione esperto |

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

int init() {

BarCount = Bars;

se (EachTickMode) Current = 0; altrimenti Current = 1;

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit() {

return(0);

}

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

//| funzione di avvio esperto |

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

int start() {

if (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comment("L'ora per il commercio non è ancora arrivata!)

return(0);

}

}

int Ordine = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

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

Totale = OrdiniTotali();

Ordine = SIGNAL_NONE;

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

//| Segnale Inizio |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

se (sig_sell>0 && Sg<0 ) Ordine = SIGNAL_SELL;

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

//| Fine del segnale |

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

//Compra

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

if(ScanTrades() < MaxOrders) {

//Controlla il margine libero

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

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

return(0);

}

StopLossLevel = Ask - StopLoss * Point;

TakeProfitLevel = Ask + TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDouble(Ask,digit),

Slippage,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Biglietto > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordine BUY aperto: ", OrderOpenPrice()); altrimenti Print("Errore nell'apertura dell'ordine BUY: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Vendere

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

if(ScanTrades() < MaxOrders) {

//Controlla il margine libero

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

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

return(0);

}

StopLossLevel = Bid + StopLoss * Point;

TakeProfitLevel = Bid - TakeProfit * Point;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDouble(Bid,digit),

Slippage,

NormalizeDouble(StopLossLevel,digit),

NormalizeDouble(TakeProfitLevel,digit),

"Vendi(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

se(Biglietto > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("Ordine SELL aperto : ", OrderOpenPrice()); altrimenti Print("Errore nell'apertura dell'ordine SELL: ", GetLastError());

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Controlla la posizione

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

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

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

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//Chiude

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

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

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

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

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

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

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

} else {

if(OrderType()==OP_SELL && OrderMagicNumber()==MagicNumber)

{

//Chiude

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

{

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

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

//Trailing stop

if (TrailingStopMode && TrailingStop > 0)

{

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

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

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

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

}

}}

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

int ScanTrades()

{

int totale = OrdiniTotali();

int numords = 0;

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

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

return(numords);

}

//bool ExistPositions() {

// for (int i=0; i<OrdersTotal(); i++) {

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

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// return(True);

// }

// }

// }

// return(false);

//}

doppio LottiOttimizzati()

{

double lot=Lots;

int orders=HistoryTotal(); // totale degli ordini storici

int losses=0; // numero di ordini in perdita senza pausa

//---- selezionare la dimensione del lotto

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- calcolare il numero di ordini di perdite senza pausa

if(DecreaseFactor>0)

{

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Errore nella storia!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continua;

//----

se(OrderProfit()>0) break;

se(OrderProfit()<0) perdite++;

}

if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

}

//---- restituisce la dimensione del lotto

if(lot<0.1) lot=0.1;

return(lot);

}

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

Sto facendo un backtest ora solo con l'RSIFilter, uso l'RSIMixFilter qualche post fa in questo thread, ho pubblicato quell'indicatore, e ottengo BUYS e SELLS, quindi la logica per fare gli ordini BUY e SELL sono ok, il problema è con i tuoi segnali iCustom...

RSIMixFilter, non è in questo thread, mi dispiace, è qui ASK

panteraschoice:
creando un ea redditizio, ma potrebbe essere due volte migliore (forse) per ora vengono piazzati solo acquisti, mai ordini di vendita.

Qualcuno sa perché?

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

//| Signal Begin |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

se (sig_sell>0 && Sg<0 ) Ordine = SIGNAL_SELL;

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

//| Fine del segnale |

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

Ho fatto un po' di backtesting, EURUSD H1 da aprile 2007 ad oggi, solo con questo RSIMixFilter...

Deve essere il 90% di qualità di modellazione, non so perché non si vede.

panteraschoice:
creando un ea redditizio, ma potrebbe essere due volte meglio (forse) per ora vengono piazzati solo acquisti, mai ordini di vendita.

Qualcuno sa perché?

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

//| Signal Begin |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Order = SIGNAL_BUY;

se (sig_sell>0 && Sg<0 ) Ordine = SIGNAL_SELL;

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

//| Fine del segnale |

//+------------------------------------------------------------------+
File:

Questo backtesting ha dato acquisti e vendite o solo uno di essi? Con me ho ottenuto solo acquisti (o solo vendite quando ho cambiato il codice).

In realtà non ho visto nulla che mostri un errore.

IN10TION:
Sto facendo ora un backtest solo con l'RSIFilter, uso l'RSIMixFilter qualche post fa in questo thread, ho pubblicato quell'indicatore, e ottengo BUYS e SELLS, quindi la logica per fare gli ordini BUY e SELL sono ok, il problema è con i tuoi segnali iCustom...

Quindi questo va bene?

double Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se ( Sg>0) Ordine = SIGNAL_BUY;

se (Sg<0) Ordine = SIGNAL_SELL;