Come codificare? - pagina 100

 

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;

Motivazione: