quando si avvia la Metatrader l'EA deve scoprire se c'è una negoziazione aperta
Faccio solo il conto alla rovescia per controllare i trade se c'è un trade
Se lo imposto all'inizio su uno e OrdersTotal() >0 allora lo faccio controllare i trade if(.......> || .......> ){fare il loop....
sei sicuro di avermi dato il codice che ti ha dato i risultati mostrati sopra? l'ho testato sul periodo 1440 (1 DAY) e nessun trade è stato eseguito. tuttavia quando l'ho cambiato a 1M molti trade sono stati eseguiti
cyxstudio: sei sicuro di avermi dato il codice che ti ha dato i risultati mostrati sopra? l'ho testato sul periodo 1440 (1 GIORNO) e nessun trade è stato eseguito. tuttavia quando l'ho cambiato a 1M molti trade sono stati eseguiti
quanti giorni indietro vanno i tuoi dati se controlli di nuovo il mio test troverai il periodo del test e il timeframe su cui è stato testato
Come potete vedere questa impostazione di spostamento non esiste sull'RSI ... viene visualizzata nella sua propria finestra... questo è un indizio.
Se lasciate una media mobile sul vostro grafico, vedrete ciò che equivale al Ma_Shift come impostazione nella casella Shift.
Notate anche che l'ordine dei parametri 200,8,sma,close. è lo stesso quando chiamate l'indicatore
come l'ordine in cui sono elencati nel riquadro ... il NULL e il timeframe sono qualsiasi cosa su cui si lascia cadere la Ma
quindi non sono necessari qui. e nemmeno l'impostazione dell'ultimo spostamento... poiché questa ma cambierà costantemente sulla
candela corrente.... lo capirete tra un attimo.
se vai a guardare le impostazioni dell'indicatore iAlligator vedrai le impostazioni per lo spostamento della mascella, lo spostamento dei denti e lo spostamento delle labbra... questo è il MaShift di ciascuna di queste medie mobili.
Possono essere tutte spostate sul grafico a sinistra o a destra di quante barre vuoi.
che si visualizza così............
Questo fa una differenza di 3 pip nel valore di questa candela delle 08:00 come mostrato qui nella finestra dei dati.
Il che ci porta alla domanda: a cosa serve l'impostazione "Shift" alla fine?
Bene, quando passate il mouse sul vostro grafico con la finestra dei dati aperta e vi spostate da candela a candela
vedrete i numeri cambiare per la 5 SMA mentre passate da candela a candela...
Questo è il significato dell'ultimo valore SHIFT... tenendo presente che la candela attuale che viene
disegnata è la candela zero... l'ultima candela completata è la candela 1 quindi se ci sono 1000 candele totali sul
sul vostro grafico sono numerate all'indietro da 999 sul bordo sinistro del vostro grafico a 0 dove vi trovate attualmente.
Quindi se vuoi sapere quale era il valore della 5 SMA 5 candele completate fa
metti un 5 in quell'ultimo punto... naturalmente con il passare del tempo... la candela 5 passerà alla candela successiva.
Ora, come è stato menzionato... se si ottiene sempre il valore della candela 0... allora quel valore è costantemente
cambiare con il prezzo. Così si può prendere un segnale e poi l'indicatore si ridisegna su di voi .. ma se si sono
sempre chiedendo le informazioni dalla candela 1 è fatto e non cambierà....
Ho rifatto tutto e sistemato il loop, lo slippage, sistemato la media mobile e i valori RSI, fatto in modo che ogni posizione aperta sia chiusa prima di iniziare una nuova posizione. ma quando faccio il backtest, non succede niente, nessun acquisto/vendita è stato eseguito... qual è il problema ancora?
la funzione init() viene eseguita solo all'avvio e non ad ogni tick come la funzione start()... dovrai rimettere le medie mobili nella funzione start invece che nella init() solo per farlo funzionare in modo che continui a ricevere numeri freschi...
Aggiungere una funzione in cui l'EA controlla se ci sono ordini in sospeso prima di decidere di aprire una nuova posizione. Se c'è un ordine pendente o aperto, allora non tenterà di aprirne altri.
vedo che tutti usano un ciclo per controllare se c'è una posizione aperta prima di comprare, non riesco a vedere la logica di questo. finché OrdersTotal è > 0 ci sono ordini aperti e il mio EA non cercherà di aprire altre posizioni.
Ho corretto il ciclo decrescente.
Questa volta mi dà l'errore OrderClose 138 che non può essere risolto aggiungendo refreshrates()
e finisco ancora per perdere soldi che non dovrei avere.
Non riesco a pensare a nient'altro da correggere...
//+------------------------------------------------------------------+//| RSI_strategy_cyxstudio.mq4 |//| Copyright 2013, Tjipke de Vries |//| https://forum.mql4.com/53695/ |//+------------------------------------------------------------------+#property copyright "Copyright 2013, MetaQuotes Software Corp."#property link "http://www.metaquotes.net"externint RSIPeriod = 3; //number of periods for RSIexterndouble UpperBound = 90; //set upper bound value for RSIexterndouble LowerBound = 5; //set lower bound value for RSIexternint MASlowPeriod = 200;
externint MAFastPeriod = 5;
externdouble Lots = 0.1;
externdouble StopLoss = 60; //Set the stop loss levelexterndouble TakeProfit = 120; //Set the take profit levelexterndouble TrailingStop = 40;
//extra settings for OrderSendexternint MagicNumber = 54333;
externstring CommentEA = "RSI strategy";
externint Slippage.Pips = 3;
int BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.int pips2points; // slippage 3 pips 3=points 30=pointsdouble pips2dbl; // Stoploss 15 pips 0.015 0.0150intDigits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips)//---//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//---- if(Digits % 2 == 1) // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
{pips2dbl = Point*10; pips2points = 10; Digits.pips = 1;}
else {pips2dbl = Point; pips2points = 1; Digits.pips = 0;}
// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //---- //----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//----int Ticket;
double SL,TP;
int Total;
double MagicNo;
double Slippage;
double pAsk = MarketInfo(Symbol(), MODE_ASK);
double pBid = MarketInfo(Symbol(), MODE_BID);
double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Averagedouble CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
int Ticket2;
int cnt;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (OrdersTotal() == 0 ) {
if (CurrentRSI < LowerBound && pAsk > MA200) { //Condition to execute buy entry
Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy orderif(Ticket>0)
{
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
if (Ticket < 0) {
Print("Error opening BUY order : ",GetLastError());
return(0);
}
}
if (CurrentRSI > UpperBound && pBid < MA200) { //Condition to execute sell entry
Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow) ; //execute sell orderif(Ticket2>0)
{
if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
if (Ticket2<0) {
Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
}
if (OrdersTotal() > 0 ) {
int PositionIndex; // <-- this variable is the index used for the loopint TotalNumberOfOrders; // <-- this variable will hold the number of orders currently in the Trade pool
TotalNumberOfOrders = OrdersTotal(); // <-- we store the number of Orders in the variablefor(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO !
{
RefreshRates();
if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndexif( OrderMagicNumber() == MagicNo // <-- does the Order's Magic Number match our EA's magic number ?
&& OrderSymbol() == Symbol() // <-- does the Order's Symbol match the Symbol our EA is working on ?
&& ( OrderType() == OP_BUY // <-- is the Order a Buy Order ?
|| OrderType() == OP_SELL ) ) // <-- or is it a Sell Order ?if (pAsk > MA5){ //condition to close long position
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long positionreturn(0); // exitif(TrailingStop>0)
{
if(pBid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<pBid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
if(pBid < MA5){ //condition to close short position
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short positionreturn(0); // exitif(TrailingStop>0)
{
if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
{
if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) ) // <-- try to close the orderPrint("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() ); // <-- if the Order Close failed print some helpful information
} // end of For loop
}
return(0);
}
Aggiungere una funzione in cui l'EA controlla se ci sono ordini in sospeso prima di decidere di aprire una nuova posizione. Se c'è un ordine pendente o aperto, allora non tenterà di aprirne altri.
vedo che tutti usano un ciclo per controllare se c'è una posizione aperta prima di comprare, non riesco a vedere la logica di questo. finché OrdersTotal è > 0 ci sono ordini aperti e il mio EA non cercherà di aprire altre posizioni.
Ho corretto il ciclo decrescente.
Questa volta mi dà l'errore OrderClose 138 che non può essere risolto aggiungendo refreshrates()
e finisco ancora per perdere soldi che non dovrei avere.
Non riesco a pensare a nient'altro da correggere...
Perché hai messo la logica di apertura di un acquisto prima di controllare i trade che il tuo EA ha aperto sul tuo conto ????
Cosa succederà ora ???? con la programmazione che hai fatto finora?
Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.
quanti trade sono OrdersTotal() con quel trade??
Il tuo codice.... per BUY
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (OrdersTotal() == 0 ) {
if (CurrentRSI < LowerBound && pAsk > MA200) { //Condition to execute buy entry
Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy orderif(Ticket>0)
{
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
if (Ticket < 0) {
Print("Error opening BUY order : ",GetLastError());
return(0);
}
cosa sta facendo ora e per quale motivo lo sta facendo?
siete stati aiutati molto bene(RaptorUK e WHRoeder grazie per la spiegazione, penso che sia stata fatta molto bene)
.
Un'altra domanda che ho per voi è
Perché hai cambiato il Timeframe in questo calcolo della media mobile
Questo non è lo stesso che ho dato,
Non sta calcolando il giusto valore su altri grafici giornalieri
.
Quindi prendi tempo per imparare e fare pratica e leggi attentamente l'aiuto che ricevi qui su questo forum
o pagate qualcuno che programmi per voi in un sito come Jobs
OrdersTotal() dovrebbe rivelare l'ammontare totale degli ordini pendenti e degli ordini a mercato, indipendentemente dal fatto che siano stati aperti tramite EA o manualmente?
Stavo pensando in questo modo. Il mio EA controllerà sempre se ci sono ordini aperti e se ci sono, non aprirà più ordini e aprirà nuovi ordini solo quando non ci sono ordini aperti.
if (OrdersTotal() == 0 )
Penso che funzioni bene perché la mia sezione dei risultati mi mostra la sequenza di ordini 1,1,2,2,3,3,4,4 che significa che un ordine viene chiuso prima che un nuovo ordine venga aperto.
le variabili per la media mobile e l'RSI sono cambiate per motivi di test. Lo stavo sperimentando su diversi time frame/periodo ma non l'ho cambiato di nuovo quando l'ho postato qui.
e il più bizzarro di tutti, il mio codice eseguirà SOLO l'ordine di acquisto. non ha mai eseguito nemmeno un ordine di vendita,
in poche parole, i problemi che sto affrontando ancora adesso.
1. esegue solo l'acquisto ma non esegue mai la vendita nonostante il fatto che ho codificato la vendita
2. ancora facendo profitto negativo che io sono la fiducia che questa strategia non è supposto per.
quando si avvia la Metatrader l'EA deve scoprire se c'è una negoziazione aperta
Faccio solo il conto alla rovescia per controllare i trade se c'è un trade
Se lo imposto all'inizio su uno e OrdersTotal() >0 allora lo faccio controllare i trade if(.......> || .......> ){fare il loop....
sei sicuro di avermi dato il codice che ti ha dato i risultati mostrati sopra? l'ho testato sul periodo 1440 (1 GIORNO) e nessun trade è stato eseguito. tuttavia quando l'ho cambiato a 1M molti trade sono stati eseguiti
OK qui va..... Cercherò di aiutare qui se posso.
Questa domanda su Ma_Shift è una che ho avuto per qualche tempo e non sono mai stato in grado di ottenere una risposta chiara.
Se noti nel tuo codice stai usando uno shift di 8 sulle tue medie mobili.... cosa significa?
Questo fa una differenza di 3 pip nel valore di questa candela delle 08:00 come mostrato qui nella finestra dei dati.

Il che ci porta alla domanda: a cosa serve l'impostazione "Shift" alla fine?
Bene, quando passate il mouse sul vostro grafico con la finestra dei dati aperta e vi spostate da candela a candela
vedrete i numeri cambiare per la 5 SMA mentre passate da candela a candela...
Questo è il significato dell'ultimo valore SHIFT... tenendo presente che la candela attuale che viene
disegnata è la candela zero... l'ultima candela completata è la candela 1 quindi se ci sono 1000 candele totali sul
sul vostro grafico sono numerate all'indietro da 999 sul bordo sinistro del vostro grafico a 0 dove vi trovate attualmente.
Quindi se vuoi sapere quale era il valore della 5 SMA 5 candele completate fa
metti un 5 in quell'ultimo punto... naturalmente con il passare del tempo... la candela 5 passerà alla candela successiva.
Ora, come è stato menzionato... se si ottiene sempre il valore della candela 0... allora quel valore è costantemente
cambiare con il prezzo. Così si può prendere un segnale e poi l'indicatore si ridisegna su di voi .. ma se si sono
sempre chiedendo le informazioni dalla candela 1 è fatto e non cambierà....
Spero che questo aiuti...
Ho rifatto tutto e sistemato il loop, lo slippage, sistemato la media mobile e i valori RSI, fatto in modo che ogni posizione aperta sia chiusa prima di iniziare una nuova posizione. ma quando faccio il backtest, non succede niente, nessun acquisto/vendita è stato eseguito... qual è il problema ancora?
la funzione init() viene eseguita solo all'avvio e non ad ogni tick come la funzione start()... dovrai rimettere le medie mobili nella funzione start invece che nella init() solo per farlo funzionare in modo che continui a ricevere numeri freschi...
Rielaborato
Aggiungere una funzione in cui l'EA controlla se ci sono ordini in sospeso prima di decidere di aprire una nuova posizione. Se c'è un ordine pendente o aperto, allora non tenterà di aprirne altri.
vedo che tutti usano un ciclo per controllare se c'è una posizione aperta prima di comprare, non riesco a vedere la logica di questo. finché OrdersTotal è > 0 ci sono ordini aperti e il mio EA non cercherà di aprire altre posizioni.
Ho corretto il ciclo decrescente.
Questa volta mi dà l'errore OrderClose 138 che non può essere risolto aggiungendo refreshrates()
e finisco ancora per perdere soldi che non dovrei avere.
Non riesco a pensare a nient'altro da correggere...
Rielaborato
Aggiungere una funzione in cui l'EA controlla se ci sono ordini in sospeso prima di decidere di aprire una nuova posizione. Se c'è un ordine pendente o aperto, allora non tenterà di aprirne altri.
vedo che tutti usano un ciclo per controllare se c'è una posizione aperta prima di comprare, non riesco a vedere la logica di questo. finché OrdersTotal è > 0 ci sono ordini aperti e il mio EA non cercherà di aprire altre posizioni.
Ho corretto il ciclo decrescente.
Questa volta mi dà l'errore OrderClose 138 che non può essere risolto aggiungendo refreshrates()
e finisco ancora per perdere soldi che non dovrei avere.
Non riesco a pensare a nient'altro da correggere...
Perché hai messo la logica di apertura di un acquisto prima di controllare i trade che il tuo EA ha aperto sul tuo conto ????
Cosa succederà ora ???? con la programmazione che hai fatto finora?
Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.
quanti trade sono OrdersTotal() con quel trade??
Il tuo codice.... per BUY
cosa sta facendo ora e per quale motivo lo sta facendo?
Perché hai messo la logica per aprire un acquisto prima di controllare i trade che il tuo EA ha aperto sul tuo conto ????
Cosa succederà ora ???? con la programmazione che hai fatto finora?
Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.
quanti trade sono OrdersTotal() con quel trade??
Il tuo codice.... per BUY
cosa sta facendo ora e per quale motivo lo sta facendo?
comprare solo se le condizioni di acquisto sono state soddisfatte e se non sono state aperte posizioni
comprare solo se le condizioni di acquisto sono state soddisfatte e se nessuna posizione è stata aperta
Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Aprite manualmente un trade per GBPUSD.
la condizione sarà vera
Per favore, mi fareste dare un'occhiata ai vostri codici?
Voglio sapere perché ho fallito e come ottenerlo correttamente.
.
Il tuo messaggio a me posso darti il codice completo direttamente.....
Non sarà gratis. Per questo devi usare la sezioneJobs e pagare per ottenerlo...
Lo otterrai allora lì
.
Un altro modo è leggere bene i vostri argomenti
Ti stiamo aiutando qui per imparare a programmare da solo. Questo è un aiuto gratuito
Vi mostriamo i vostri errori e vi aiutiamo nella direzione come risolvere.
Mostro il codice che ho nel momento in cui hai imparato un modo per scriverlo ....
Non c'è bisogno di pagare allora e puoi in quel momento confrontarlo con il codice che hai fatto qui con l'aiuto di questo forum
....
la mia ultima domanda qui non ha ancora una risposta
Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Apri manualmente un trade per GBPUSD.
la condizione sarà vera
.
. In altro argomentoOrderClose errore 138
siete stati aiutati molto bene(RaptorUK e WHRoeder grazie per la spiegazione, penso che sia stata fatta molto bene)
.
Un'altra domanda che ho per voi è
Perché hai cambiato il Timeframe in questo calcolo della media mobile
Questo non è lo stesso che ho dato,
Non sta calcolando il giusto valore su altri grafici giornalieri
.
Quindi prendi tempo per imparare e fare pratica e leggi attentamente l'aiuto che ricevi qui su questo forum
o pagate qualcuno che programmi per voi in un sito come Jobs
Per favore, mi faresti dare un'occhiata ai tuoi codici?
Voglio sapere perché ho fallito e come ottenerlo correttamente.
.
Il tuo messaggio a me posso darti il codice completo direttamente.....
Non sarà gratis. Per questo devi usare la sezioneJobs e pagare per ottenerlo...
Lo otterrai allora lì
.
Un altro modo è leggere bene i vostri argomenti
Ti stiamo aiutando qui per imparare a programmare da solo. Questo è un aiuto gratuito
Vi mostriamo i vostri errori e vi aiutiamo nella direzione come risolvere.
Mostro il codice che ho nel momento in cui hai imparato un modo per scriverlo ....
Non c'è bisogno di pagare allora e puoi in quel momento confrontarlo con il codice che hai fatto qui con l'aiuto di questo forum
....
la mia ultima domanda qui non ha ancora una risposta
Supponiamo che tu abbia un conto in esecuzione con il tuo EA. Apri manualmente un trade per GBPUSD.
la condizione sarà vera
.
. In altro argomentoOrderClose errore 138
siete stati aiutati molto bene(RaptorUK e WHRoeder grazie per la spiegazione, penso che sia stata fatta molto bene)
.
Un'altra domanda che ho per voi è
Perché hai cambiato il Timeframe in questo calcolo della media mobile
Questo non è lo stesso che ho dato,
Non sta calcolando il giusto valore su altri grafici giornalieri
.
Quindi prendi tempo per imparare e fare pratica e leggi attentamente l'aiuto che ricevi qui su questo forum
o pagate qualcuno che programmi per voi in un sito come Jobs
OrdersTotal() dovrebbe rivelare l'ammontare totale degli ordini pendenti e degli ordini a mercato, indipendentemente dal fatto che siano stati aperti tramite EA o manualmente?
Stavo pensando in questo modo. Il mio EA controllerà sempre se ci sono ordini aperti e se ci sono, non aprirà più ordini e aprirà nuovi ordini solo quando non ci sono ordini aperti.
Penso che funzioni bene perché la mia sezione dei risultati mi mostra la sequenza di ordini 1,1,2,2,3,3,4,4 che significa che un ordine viene chiuso prima che un nuovo ordine venga aperto.
le variabili per la media mobile e l'RSI sono cambiate per motivi di test. Lo stavo sperimentando su diversi time frame/periodo ma non l'ho cambiato di nuovo quando l'ho postato qui.
e il più bizzarro di tutti, il mio codice eseguirà SOLO l'ordine di acquisto. non ha mai eseguito nemmeno un ordine di vendita,
in poche parole, i problemi che sto affrontando ancora adesso.
1. esegue solo l'acquisto ma non esegue mai la vendita nonostante il fatto che ho codificato la vendita
2. ancora facendo profitto negativo che io sono la fiducia che questa strategia non è supposto per.