Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.
Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:
enum opp_mode {
DoClose, // Close and reverse with initial lot
DoReverse, // Close and reverse (continue Martingale last lot)
DoHedge, // No closing reversal (Hedge mode)
};
// Trade & MM Sectioninput opp_mode Mode_opp = DoHedge; // Trading Mode//+------------------------------------------------------------------+//| Check for Open function |//+------------------------------------------------------------------+void CheckForOpen() {
if (!IsBarNew) return;
double lot=0;
positions=Positions();
if (Signal==OP_BUY) {
if (longs>0) return;
if (shorts==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (shorts>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode SELL by opposite signal.");
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing SELL by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_SELL);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_SELL);
PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging SELL by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
}
}
}
if (Signal==OP_SELL) {
if (shorts>0) return;
if (longs==0) { // First Order PlacingPrint(" *** MSG *** "+msg);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (longs>0) {
if (Mode_opp==DoClose) { // Closing by Opposite SignalPrint(" *** MSG *** "+msg);
Print(" *** Close mode BUY by opposite signal.");
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
}
if (Mode_opp==DoReverse) { // Reverse by Opposite SignalPrint("Reversing BUY by opposite signal.");
lot=GetMaxLot(ORDER_TYPE_BUY);
if (IsMartingale) lot=lot*LotMult;
ClosePositions(OP_BUY);
PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
}
if (Mode_opp==DoHedge) { // Hedging by Opposite SignalPrint("Hedging BUY by opposite signal.");
MartinCounterB=50; MartinCounterS=50;
PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
}
}
}
}
//+------------------------------------------------------------------+
La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.
//+------------------------------------------------------------------+//| Place Market Order function |//+------------------------------------------------------------------+bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) { // mn - Magic Numberdouble d_sl=0, d_tp=0;
MqlTick stTick;
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));
if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
if (oper==OP_BUY) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_ask=stTick.ask;
d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
if (oper==OP_SELL) {
for (int i=0; i<5; i++) {
if (SymbolInfoTick(_Symbol,stTick)==false) {
Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
}
_bid=stTick.bid;
d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
else {PlaySound("disconnect.wav"); Sleep(5000);}
}
}
return(false);
}
//+------------------------------------------------------------------+
La funzione di controllo dell'apertura di una nuova barra:
//+------------------------------------------------------------------+//| Global Variables |//+------------------------------------------------------------------+bool IsBarNew=false;
//+------------------------------------------------------------------+//| Bar refreshing function |//| true - new bar opened, false - not opened |//+------------------------------------------------------------------+bool IsNewBar() {
staticdatetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
datetime curTime =iTime(NULL,PERIOD_CURRENT,0);
if (curTime>SavedTime) {
SavedTime=curTime;
return(true);
}
elsereturn(false);
}
//+------------------------------------------------------------------+
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.
Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.
La funzione OnTick()
Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:
La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.
La funzione di controllo dell'apertura di una nuova barra:
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.
L'intera EA.
Uso questa funzione per controllare la nuova barra - a volte ci sono errori quando si copia la data della barra.
//+------------------------------------------------------------------------------------------------------------------+//| Возвращает TRUE, если появился новый бар на текущем ТФ//+------------------------------------------------------------------------------------------------------------------+bool isNewBar()
{
datetime tm[];
staticdatetime prevBarTime=0;
if(CopyTime(_Symbol,0,0,1,tm)<0)
{
Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
}
else
{
if(prevBarTime!=tm[0])
{
prevBarTime=tm[0];
returntrue;
}
returnfalse;
}
returntrue;
}
Uso tale funzione per controllare una nuova barra - ci sono volte in cui ci sono errori quando si copia la data della barra.
Grazie. Cercherò di sostituirlo. Anche se finora la funzione che ho usato ha funzionato bene. Ho un'idea per stampare il tempo di apertura della barra e il prezzo, poi si vedrebbe chiaramente che l'errore è in questo caso particolare.
Tuttavia, sono confuso dal fatto che i duplots appaiono solo all'apertura della prima posizione mentre le posizioni successive vengono aperte correttamente e l'EA lavora per ore generandone decine. E la funzione di controllo dell'apertura della barra funziona sempre. E secondo le condizioni l'Expert Advisor apre la prima posizione quando non ce n'è nessuna e le successive si aprono solo quando il prezzo si è mosso abbastanza lontano dopo che la prima è stata aperta.
Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.
La funzione OnTick()
Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:
La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.
La funzione di controllo dell'apertura di una nuova barra:
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.
Se si è aperta una nuova barra, con il suo primo tick si può aprire una posizione,
Se non ci sono posizioni, la prima posizione può essere aperta.
In altre parole, per qualche motivo due posizioni si aprono contemporaneamente al primo tick di una nuova barra. E solo le prime posizioni sono aperte. Inoltre un tale fenomeno non viene osservato.
Se si è aperta una nuova barra, con il suo primo tick si può aprire una posizione,
Se non ci sono posizioni, la prima posizione può essere aperta.
Cioè, per qualche motivo, due posizioni si aprono contemporaneamente al primo tick di una nuova barra. E solo le prime posizioni sono aperte. Inoltre un tale fenomeno non viene osservato.
Non ho tempo per analizzare quello che sta succedendo lì. Ma prova a controllare il numero di posizioni aperte sulla nuova barra. In caso contrario - aprire.
......
EA funziona, ma quando provo ad aprirlo nell'editor
......
non è un eseguibile, è un file mq5...
questo è il mio codice...
Quindi formate le vostre frasi correttamente.
In tema. Di solito apro questi problemi in Notepad++. Aiuta. Ma non sempre )))
Quindi formate le vostre frasi correttamente.
In tema. Di solito apro questi problemi in Notepad++. Aiuta. Ma non sempre ))))
Ho anche deciso di guardarlo con Notepad++ ed era quasi tutto a zero, anche se il file era di dimensioni normali come dovrebbe essere...
Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.
La funzione OnTick()
Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:
La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.
La funzione di controllo dell'apertura di una nuova barra:
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.
L'intera EA.
Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.
La funzione OnTick()
Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:
La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.
La funzione di controllo dell'apertura di una nuova barra:
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.
L'intera EA.
Uso questa funzione per controllare la nuova barra - a volte ci sono errori quando si copia la data della barra.
Uso tale funzione per controllare una nuova barra - ci sono volte in cui ci sono errori quando si copia la data della barra.
Grazie. Cercherò di sostituirlo. Anche se finora la funzione che ho usato ha funzionato bene. Ho un'idea per stampare il tempo di apertura della barra e il prezzo, poi si vedrebbe chiaramente che l'errore è in questo caso particolare.
Tuttavia, sono confuso dal fatto che i duplots appaiono solo all'apertura della prima posizione mentre le posizioni successive vengono aperte correttamente e l'EA lavora per ore generandone decine. E la funzione di controllo dell'apertura della barra funziona sempre. E secondo le condizioni l'Expert Advisor apre la prima posizione quando non ce n'è nessuna e le successive si aprono solo quando il prezzo si è mosso abbastanza lontano dopo che la prima è stata aperta.
Ho scritto un EA. La persona a cui l'ho scritto, al primo giro, apre due posizioni una dopo l'altra. Non riesco a riprodurre questo problema con me stesso. Vorrei chiedervi aiuto.
La funzione OnTick()
Solo la funzione CheckForOpen() è responsabile dell'apertura delle posizioni:
La funzione che invia una richiesta di aprire una posizione dal mercato. Ho aggiunto un replay ritardato quando il server si blocca perché spesso ottengo requotes/offquotes durante i test con MetaQuotes MT5 demo.
La funzione di controllo dell'apertura di una nuova barra:
La seconda posizione si apre immediatamente dopo la prima, nello stesso secondo, i tick differiscono di uno. Inizialmente ho pensato che ci fosse una seconda copia dell'EA sul secondo grafico. Ho chiesto di chiuderli tutti e lasciare un solo grafico ed eseguire l'EA, ma secondo il cliente e a giudicare dallo screenshot, non è questo il motivo. Le posizioni successive sono aperte una alla volta, non ci sono più duplicati. Non posso riprodurlo, mi sono già scervellato. L'ho testato sul mio MT5 demo ICMarkets hedge e sull'ordinatore. Screenshot del doppietto.
L'intera EA.
E come controllate che una posizione non sia già stata aperta su questa barra?
E come si controlla che nessuna posizione sia stata ancora aperta su questa barra?
No, non c'è questo controllo.
Ci sono questi controlli:
- Se si è aperta una nuova barra, con il suo primo tick si può aprire una posizione,
- Se non ci sono posizioni, la prima posizione può essere aperta.
In altre parole, per qualche motivo due posizioni si aprono contemporaneamente al primo tick di una nuova barra. E solo le prime posizioni sono aperte. Inoltre un tale fenomeno non viene osservato.No, non c'è un tale controllo.
Ci sono questi controlli:
- Se si è aperta una nuova barra, con il suo primo tick si può aprire una posizione,
- Se non ci sono posizioni, la prima posizione può essere aperta.
Cioè, per qualche motivo, due posizioni si aprono contemporaneamente al primo tick di una nuova barra. E solo le prime posizioni sono aperte. Inoltre un tale fenomeno non viene osservato.Non ho tempo per analizzare quello che sta succedendo lì. Ma prova a controllare il numero di posizioni aperte sulla nuova barra. In caso contrario - aprire.