Puoi mandarmi un pezzo di log dal momento della richiesta al momento in cui viene ricevuto il ping fallito (è importante controllare i timeout)? E questo è su un conto reale o demo?
Puoi inviare un pezzo del log dal momento in cui viene fatta la richiesta fino alla ricezione del ping fallito (è importante controllare i timeout)? E questo è su un conto reale o demo?
Questo è su un conto demo. Diario... Ho chiuso e aperto MT, quindi la voce della scheda "log" è stata aggiornata. Lo copierò la prossima volta, poi lo riavvierò, sembra che ci vorranno un paio di giorni, voglio dire che il problema si ripresenta. Posso solo suggerire un log dalla directory experts\logs. È questo che avevi in mente?
Nella storia del conto questa transazione corrisponde alla riga seguente (a proposito, perché non c'è la copia riga per riga nel buffer in questa scheda?)
1728130 2005.08.31 15:00 comprare 0,10 eurusd 1,2223 1,2183 0 2005.08.31 20:07 1,2330 0 107,00 Venerdì
Sono a Mosca, può essere necessario nell'analisi dei tempi di scambio.
Si noti che l'Expert Advisor ha chiuso il trade alle 20:07. In realtà, la condizione di chiusura era alle 20:01, ma la posizione non è stata chiusa. Ho chiuso e aperto MT, e a 20.07, cioè immediatamente, in pochi secondi dal riavvio la posizione si è chiusa.
Ora ho guardato il log (tutto il log), ma è 147Kb. Se vuoi te lo allego, ma credimi, ci sono solo due entrate per questo affare:
17:00:18 _Friday_Expert EURUSD,H1: open #1728130 buy 0.10 EURUSD at 1.2223 sl: 1.2183 ok
...
22:07:24 _Friday_Expert EURUSD,H1: close #1728130 buy 0.10 EURUSD at 1.2223 sl: 1.2183 at price 1.2330
Quindi non sembra esserci un tentativo di chiudere la posizione a 20.01. "Più o meno" perché a) la scheda "log" (non mi aspettavo che MT la resettasse) ha mostrato una nota sul tentativo di ping e sul fallimento e b) dato che questo non è il primo problema con questo EA, vedere come appare dall'interno:
for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) { SaveComment("\r\n\t" + MathFloor(CurTime() / 3600) + " - " + MathFloor(OrderOpenTime() / 3600) + " >= " + nHoursToHold); int nCurHour = TimeHour(CurTime()); int nOrderOpenHour = TimeHour(OrderOpenTime()); if(nOrderOpenHour > nCurHour) nCurHour += 24; // if(MathFloor(CurTime() / 3600) - MathFloor(OrderOpenTime() / 3600) >= nHoursToHold) if(nCurHour - nOrderOpenHour >= nHoursToHold) { if(OrderType() == OP_BUY) { CloseBuy("Friday"); SaveComment(", nbuy closed"); } else if(OrderType() == OP_SELL) { CloseSell("Friday"); SaveComment(", sell closed"); } } } } ... void CloseBuy(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket); int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } } // ------ void CloseSell(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket); int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } } // ------
SaveComment scrive semplicemente del testo in un file.
Quindi, tutte le voci del file che erano appropriate per il tentativo di chiusura della posizione sono apparse, ma l'avviso non è stato chiamato, cioè OrderClose ha restituito il codice di completamento con successo.
C'è un errore: ping fallito nel log.
Forse dopo un ping fallito il tuo sistema non dovrebbe permettere l'esecuzione di OrderSend, quindi verrebbe generato un messaggio di errore.
In questo caso non c'è nessun messaggio di errore, solo una voce di registro. Il programma si comporta come se fosse riuscito a chiudere il trade, solo che il trade non viene chiuso.
Quindi, nel log:
2005.09.05 16:01:35 TradeContext: ping failed
2005.09.05 16:01:35 TradeContext: ping error
2005.09.05 16:01:14 '142605': close order #1775545 sell 0.10 EURUSD at 1.2535 sl: 0.0000 tp: 0.0000 al prezzo 1.2542
2005.09.05 16:01:14 '142605': login (4.00, #27FFBBD7)
A proposito, mi sto davvero chiedendo perché sl: 0.0000, non invio zero.
Allo stesso tempo, la funzione di avvio si presenta così:
int start() { if(Bars < 5) return(0); Report("Friday", nMagic, bReportDone); // ------ if(!IsBarEnd()) return(0); CheckTradeSemaphore(); // ------ if(bUseMm == true) { dProfit = 0; for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY); if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL) { dProfit += OrderProfit(); } } } int nSignal = GetSignal(); SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); switch(nSignal) { case -1: SaveComment(", Signal: none"); break; case OP_BUY: SaveComment(", Signal: buy"); break; case OP_SELL: SaveComment(", Signal: sell"); break; default: SaveComment(", Signal: ????"); break; } for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) { SaveComment("\r\n\t" + MathFloor(CurTime() / 3600) + " - " + MathFloor(OrderOpenTime() / 3600) + " >= " + nHoursToHold); int nCurHour = TimeHour(CurTime()); int nOrderOpenHour = TimeHour(OrderOpenTime()); if(nOrderOpenHour > nCurHour) nCurHour += 24; // if(MathFloor(CurTime() / 3600) - MathFloor(OrderOpenTime() / 3600) >= nHoursToHold) if(nCurHour - nOrderOpenHour >= nHoursToHold) { if(OrderType() == OP_BUY) { CloseBuy("Friday"); SaveComment(", buy closed"); } else if(OrderType() == OP_SELL) { CloseSell("Friday"); SaveComment(", sell closed"); } } } } int nNumOfOpenedOrders = 0; for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) nNumOfOpenedOrders++; } if(nNumOfOpenedOrders == 0) { if(nSignal == OP_BUY) { SaveComment("\r\n\tAsk: " + Ask + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit); Buy("Friday"); SaveComment("\r\n\tbuy opened"); } else if(nSignal == OP_SELL) { SaveComment("\r\n\tBid: " + Bid + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit); Sell("Friday"); SaveComment("\r\n\tsell opened"); } } SaveComment("\r\n"); // ------ // ModifyOrders(); // ------ if(!IsTesting()) GlobalVariableSet(strTradeSemaphore, 0.0); // ------ return(0); }
SaveComment è una funzione per emettere la stringa in un file.
Ecco la funzione di chiusura della posizione chiamata dall'inizio. Come potete vedere, prova a chiudere la posizione 5 volte (l'ho fatto solo a scopo di test), e se non viene restituito nessun codice di errore (cioè MT pensa che la posizione sia chiusa), cerca tra gli ordini ancora aperti quello che ha il ticket richiesto.
void CloseSell(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket); for(int nTry = 0; nTry < 5; nTry++) { int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else SaveComment("\r\n\tOrder with this ticket still present, trying again"); } }
Il log qui sotto mostra che tutti i 5 tentativi di chiudere un ordine sono falliti (il ticket non è scomparso), con MT che crede che la posizione sia chiusa.
5.9.2005 14:1:29, Signal: none
312758.00000000 - 312754.00000000 >= 4
Attempting to close short position, ticket: 1775545
Order with this ticket still present, trying again
Order with this ticket still present, trying again
Order with this ticket still present, trying again
Order with this ticket still present, trying again, sell closed
Nota: non aver paura di "Signal: none" - dovrebbe essere così. Questo è un segnale per aprire una nuova posizione. Il segnale per chiudere una posizione è generato se la disuguaglianza "312758.00000000 - 312754.00000000 >= 4" è soddisfatta,
Cari sviluppatori!
Spero molto che riusciremo a curare questo problema insieme.
Quark
P.S. Come al solito, avendo riavviato MT, ottengo la chiusura della posizione da esperto, senza problemi di k.l.
Aggiunto codice che scrive i risultati in un file quando si cerca di aprire e chiudere un affare in tutti i miei EA. Il risultato è deludente. Circa ogni volta, per tutti gli EA, un tentativo di aprire - chiudere un ordine non è sufficiente. In media, ne ha bisogno di due (vedi codice sopra, c'è un ciclo di cinque tentativi). A volte cinque tentativi non sono sufficienti. Allo stesso tempo, MT funziona come se l'ordine fosse aperto con successo - chiuso, non viene dato alcun messaggio di errore.
Tutti i semafori suggeriti nel ramo "Errore numero 6" (che, a proposito, a volte succede ancora), io uso, più il timer di Expert Advisors garantisce che ogni EA inizia nei suoi 10 secondi dedicati, cioè, non ci dovrebbero essere conflitti tra EA.
Suggerisco agli altri sviluppatori di usare il codice qui sotto negli EA dal vivo per controllare se tutti gli ordini funzionano come ci si aspetta. Dal punto di vista del trading, è solo un normale OrderSend, circondato da funzioni di output su un file.
Senza offesa, ma sembra che MT debba mettere a punto l'interazione con il server commerciale.
double GetLotSize(double dInitFraction = 0.1, double dProfitFraction = 0.1) { double dLot = 0.1; if(bUseMm) { dLot = (dInitFraction * dInitAmount + dProfitFraction * dProfit) / 1000; dLot = MathFloor(dLot * 10) / 10; if(dLot < 0.1) dLot = 0.1; } return(dLot); } // ------ void Sell(string strExpertName) { dLotSize = GetLotSize(); if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500) return; double dTp; if(dTakeProfit == 0) dTp = 0; else dTp = Bid - dTakeProfit; int nResult; for(int nTry = 0; nTry < 5; nTry++) { SaveComment("Trying to sell, attempt " + nTry + "\r\n"); nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, dTp, strExpertName, nMagic, 0, OrangeRed); if(nResult != -1) { SaveComment(" successfull\r\n"); break; } else SaveComment(" failed, error " + GetLastError() + "\r\n"); } if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + " sell error: " + nError + "\r\n" + Bid + ", " + dStopLoss + ", " + dTp); SaveComment(strExpertName + " sell error: " + nError + "\r\n" + Bid + ", " + dStopLoss + ", " + dTp); } } // ------ void Buy(string strExpertName) { dLotSize = GetLotSize(); if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500) return; double dTp; if(dTakeProfit == 0) dTp = 0; else dTp = Ask + dTakeProfit; int nResult; for(int nTry = 0; nTry < 5; nTry++) { SaveComment("Trying to buy, attempt " + nTry); nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, dTp, strExpertName, nMagic, 0, Aqua); if(nResult != -1) { SaveComment(" successfull\r\n"); break; } else SaveComment(" failed, error " + GetLastError() + "\r\n"); } if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + " buy error: " + nError + "\r\n" + Ask + ", " + dStopLoss + ", " + dTp); SaveComment(strExpertName + " buy error: " + nError + "\r\n" + Ask + ", " + dStopLoss + ", " + dTp); } } // ------ void CloseBuy(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket); for(int nTry = 0; nTry < 5; nTry++) { int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else SaveComment("\r\n\tOrder with this ticket still present, trying again"); } } // ------ void CloseSell(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket); for(int nTry = 0; nTry < 5; nTry++) { int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else SaveComment("\r\n\tOrder with this ticket still present, trying again"); } } // ------ void SaveComment(string strComment) { if(!IsTesting()) { int hFile = FileOpen("__test_" + strExpert + "_" + Symbol() + ".txt", FILE_BIN | FILE_READ | FILE_WRITE, '\t'); FileSeek(hFile, 0, SEEK_END); FileWriteString(hFile, strComment, StringLen(strComment)); // FileFlush(hFile); FileClose(hFile); } } // ------
Poi ho bisogno di trovare il limite dell'intervallo ammissibile sul conto demo.
Dalle 00:00 alle 12:00
commerci - 141
3 errori ("1" e due "6").
Quark, puoi gettarmi in komposterius email ru l'ultima versione glitchy del tuo EA (che è su M1)? Appenderò altre 8 finestre - vediamo cosa succede ;)
Gli esperti aspettano (usando semafori) per una coda, inoltre, l'EA con numero magico uguale a, per esempio 10, aspetta 10 * 10 = 100 secondi dall'inizio di una barra, e solo allora fa trading. Quindi le possibilità di incontrare un EA con magic 11 sono vicine allo 0 anche senza semafori.
L'impressione è che se MT fallisce una volta (ping fallito, errore 6, ecc.) qualcosa va male nel suo sistema e i successivi trade di questo EA falliscono.
Esempio di un registro (codice mostrato sopra):
Cercando di comprare, tentativo 0 fallito, errore 6
Cercando di comprare, tentativo 1 fallito, errore 129
Cercando di comprare, tentativo 2 fallito, errore 129
Cercando di comprare, tentativo 3 fallito, errore 129
Cercando di comprare, tentativo 4 fallito, errore 129
Errore di acquisto a zig zag: 4050
2.28000000, 0.02700000, 0.00000000
Cosa abbiamo qui? Prima c'è stato un fallimento (nel log - errore di connessione con il server). Poi 5 tentativi (ne ho 5 nel mio ciclo) danno 129 - prezzo sbagliato. Sotto c'è il prezzo - abbastanza normale. Dopo aver riavviato MT a questo prezzo l'ordine è stato aperto con successo. Allora otteniamo 4050, un numero sbagliato di argomenti. Questo viene da una funzione che funziona bene in altre chiamate. C'è un chiaro fallimento del sistema di segnalazione degli errori.
Citando un esperto, anche se ho il sospetto che bisogna averne molti perché il problema si verifichi frequentemente. Si spera che il compositore, Roche e gli sviluppatori diano un'occhiata al codice e consigliano qualcosa. Tuttavia, penso che sia una questione di MT qui.
Esperto:
extern double dZigzagSize; extern int nMa1; extern int nMa2; extern int nBuySell; // ------ double dTrailingStop; double dStopLoss; double dTakeProfit; bool bUseMm = false; string strExpert = "Zigzag"; // ------ #include "mylib.mq4" // ------ int init () { nBars = 0;//Bars; if(!IsTesting() && !GlobalVariableCheck(strTradeSemaphore)) GlobalVariableSet(strTradeSemaphore, 0.0); // ------ if(IsTesting() && nMa1 >= nMa2) return(-1); if(Symbol() == "EURUSD" && Period() == 60) { if(!IsTesting()) { dZigzagSize = 210; // 210,60,108,3: 2397, 614 nMa1 = 48; // 210,48,120,1: 2016, 332 nMa2 = 120; nBuySell = 1; } nMagic = 23; } else if(Symbol() == "EURJPY" && Period() == 60) { if(!IsTesting()) { // 240,24,132,1: 1987, 387 dZigzagSize = 240; nMa1 = 24; nMa2 = 132; nBuySell = 3; } nMagic = 2; } else if(Symbol() == "USDCHF" && Period() == 60) { if(!IsTesting()) { // 260,36,204,2: 2219, 262 dZigzagSize = 260; nMa1 = 36; nMa2 = 204; nBuySell = 2; } nMagic = 3; } else if(Symbol() == "GBPUSD" && Period() == 60) { if(!IsTesting()) { // 270,48,84,3: 5515, 679 dZigzagSize = 270; nMa1 = 48; nMa2 = 84; nBuySell = 3; } nMagic = 4; } else if(Symbol() == "GBPCHF" && Period() == 60) { if(!IsTesting()) { // 270,96,108,1: 2854,292 dZigzagSize = 270; nMa1 = 96; nMa2 = 108; nBuySell = 1; } nMagic = 5; } else if(Symbol() == "USDCAD" && Period() == 60) { if(!IsTesting()) { // 220,60,300: 1906, 213 dZigzagSize = 220; nMa1 = 60; nMa2 = 300; nBuySell = 2; } nMagic = 7; } else if(Symbol() == "EURAUD" && Period() == 60) { if(!IsTesting()) { // 210,24,36,3: 3921, 545 dZigzagSize = 230; // 230,24,60,3: 3397, 453 nMa1 = 24; // 230,24,132,3: 2819, 292 nMa2 = 60; nBuySell = 3; } nMagic = 9; } dStopLoss = dZigzagSize * Point; dTrailingStop = dZigzagSize * Point; dTakeProfit = 0; return(0); } ////////////////// int deinit() { if(!IsTesting()) GlobalVariableSetOnCondition(strTradeSemaphore, 0.0, nMagic); return(0); } //////////////////// int start() { if(Bars < MathMax(nMa1, nMa2)) return(0); if(IsTesting() && nMa1 >= nMa2) return(0); Report("Zigzag", nMagic, bReportDone); // ------ if(!IsBarEnd()) return(0); CheckTradeSemaphore(); // ------ int nSignal = 0; double dMa1; double dMa2; nSignal = iCustom(NULL, 0, "_Zigzag_Ind", dZigzagSize, 0, 1); dMa1 = iMA(NULL, 0, nMa1, 0, MODE_EMA, PRICE_CLOSE, 1); dMa2 = iMA(NULL, 0, nMa2, 0, MODE_EMA, PRICE_CLOSE, 1); if(bUseMm == true) { dProfit = 0; for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY); if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL) { dProfit += OrderProfit(); } } } for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) { int nMode = OrderType(); if(nMode == OP_BUY && nSignal == 1) { CloseBuy("Zigzag"); break; } else if(nMode == OP_SELL && nSignal == -1) { CloseSell("Zigzag"); break; } } } int nNumOfOpenedOrders = 0; for(nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) nNumOfOpenedOrders++; } if(!nNumOfOpenedOrders) { if(nSignal == -1 && dMa1 >= dMa2) { if(nBuySell == 1 || nBuySell == 3) Buy("Zigzag"); } else if((nSignal == 1 && dMa1 <= dMa2)) { if(nBuySell == 2 || nBuySell == 3) Sell("Zigzag"); } } // ------ ModifyOrders(); // ------ if(!IsTesting()) GlobalVariableSet(strTradeSemaphore, 0.0); // ------ return(0); } // ------
Indicatore:
#property copyright "Quark" #property link "" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red #property indicator_minimum -1 #property indicator_maximum 1 // indicator parameters extern int nMinMaxPoints = 50; // indicator buffers double arrExtMapBuffer[]; int nExtCountedBars = 0; int nLastMinMaxBar; int nLastMinMaxType; double dLastMin, dLastMax; //////////////////////// int init() { string strIndicatorShortName; // drawing settings SetIndexStyle(0, DRAW_HISTOGRAM); SetIndexShift(0, 0); SetIndexEmptyValue(0,0.0); IndicatorDigits(4); strIndicatorShortName = "Zigzag(" + nMinMaxPoints + ")"; IndicatorShortName(strIndicatorShortName); // indicator buffers mapping SetIndexBuffer(0, arrExtMapBuffer); dLastMin = Low[Bars - 1]; dLastMax = High[Bars - 1]; nLastMinMaxBar = Bars - 1; nLastMinMaxType = 0; int nPos = Bars - 1; int nLastPos = nPos; while(nPos >= 0) // Looking for a first min or max { if(dLastMax <= High[nPos]) { dLastMax = High[nPos]; nLastMinMaxBar = nPos; } if(dLastMin >= Low[nPos]) { dLastMin = Low[nPos]; nLastMinMaxBar = nPos; } if(Low[nPos] < dLastMax - nMinMaxPoints * Point) // Maximum found { nLastMinMaxType = 1; dLastMin = Low[nPos]; dLastMax = High[nPos]; nLastMinMaxBar = nPos; break; } else if(High[nPos] > dLastMin + nMinMaxPoints * Point) // Minimum found { nLastMinMaxType = -1; dLastMax = High[nPos]; dLastMin = Low[nPos]; nLastMinMaxBar = nPos; break; } nPos--; } return(0); } //////////////////// int start() { nExtCountedBars = IndicatorCounted(); if(nExtCountedBars < 0) return(-1); // last counted bar will be recounted if(nExtCountedBars > 0) nExtCountedBars--; Zigzag(); return(0); } /////////////////// void Zigzag() { int nPos = Bars - nExtCountedBars - 2; while(nPos > 0) { arrExtMapBuffer[nPos] = 0.0; double dLastMaxTmp = dLastMax; double dLastMinTmp = dLastMin; if(nLastMinMaxType != 1) // Expecting maximum { if(dLastMax <= High[nPos]) { dLastMax = High[nPos]; nLastMinMaxBar = nPos; } if(Low[nPos] < dLastMax - nMinMaxPoints * Point) // Maximum found { if(High[nPos] - Low[nPos] <= nMinMaxPoints * Point) { arrExtMapBuffer[nPos] = 1;//High[nLastMinMaxBar]; nLastMinMaxType = 1; dLastMin = Low[nPos]; dLastMax = High[nPos]; nLastMinMaxBar = nPos; } else { arrExtMapBuffer[nPos] = 0; arrExtMapBuffer[nPos + 1] = 0; dLastMax = dLastMaxTmp; dLastMin = dLastMinTmp; } } } if(nLastMinMaxType != -1) // Expecting minimum { if(dLastMin >= Low[nPos]) { dLastMin = Low[nPos]; nLastMinMaxBar = nPos; } if(High[nPos] > dLastMin + nMinMaxPoints * Point) // Maximum found { if(High[nPos] - Low[nPos] <= nMinMaxPoints * Point) { arrExtMapBuffer[nPos] = -1;//Low[nLastMinMaxBar]; nLastMinMaxType = -1; dLastMax = High[nPos]; dLastMin = Low[nPos]; nLastMinMaxBar = nPos; } else { arrExtMapBuffer[nPos] = 0; arrExtMapBuffer[nPos + 1] = 0; dLastMax = dLastMaxTmp; dLastMin = dLastMinTmp; } } } nPos--; } } /////////////////// /* if(IsTesting()) { FileDelete("__zigzag_test.txt"); hFile = FileOpen("__zigzag_test.txt", FILE_BIN | FILE_WRITE, '\t'); } void SaveComment(string strComment) { if(IsTesting()) { FileWriteString(hFile, strComment, StringLen(strComment)); } } if(IsTesting()) FileClose(hFile); */
Library, deve trovarsi nella directory Expert:
double dTp = 0; //double dStop; datetime timePrev = 0; int nBars; int nDelaySeconds = 10; int nSlip = 5; double dProfit = 0; double dInitAmount = 1000; double dLotSize = 0.1; int nMagic = 0; bool bReportDone = false; string strTradeSemaphore = "TradeSemaphore"; // ------ void Report(string strFileName, int nMagic, bool& bReportDone) { if(IsTesting()) return; if(Hour() == 0 && Minute() >= nMagic / 2 && IsTesting() == false) { if(bReportDone == false) { int hFile = FileOpen(strFileName + "_" + Symbol() + "_" + Period() + ".rpt", FILE_BIN | FILE_WRITE, ','); string str = "CloseDateTime,Buy,Sell\r\n"; FileWriteString(hFile, str, StringLen(str)); for(int nCnt = 0; nCnt < HistoryTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_HISTORY); if(OrderMagicNumber() == nMagic && OrderType() <= OP_SELL && OrderSymbol() == Symbol()) { str = TimeToStr(OrderCloseTime(), TIME_DATE|TIME_MINUTES); if(OrderType() == OP_BUY) str = str + "," + OrderProfit() + ",0"; else str = str + ",0," + OrderProfit(); str = str + "\r\n"; FileWriteString(hFile, str, StringLen(str)); } } FileFlush(hFile); FileClose(hFile); bReportDone = true; } } else if(Hour() != 0) bReportDone = false; } // ------ double GetLotSize(double dInitFraction = 0.1, double dProfitFraction = 0.1) { double dLot = 0.1; if(bUseMm) { dLot = (dInitFraction * dInitAmount + dProfitFraction * dProfit) / 1000; dLot = MathFloor(dLot * 10) / 10; if(dLot < 0.1) dLot = 0.1; } return(dLot); } // ------ void Sell(string strExpertName) { dLotSize = GetLotSize(); if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500) return; double dTp; if(dTakeProfit == 0) dTp = 0; else dTp = Bid - dTakeProfit; int nResult; for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); SaveComment(" Trying to sell, attempt " + nTry + "\r\n"); SaveComment("Ask: " + Ask + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit + "\r\n"); nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, dTp, strExpertName, nMagic, 0, OrangeRed); if(nResult != -1) { SaveComment(" successfull\r\n"); break; } else SaveComment(" failed, error " + GetLastError() + "\r\n"); } if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + " sell error: " + nError + "\r\n" + Bid + ", " + dStopLoss + ", " + dTp); SaveComment(strExpertName + " sell error: " + nError + "\r\n" + Bid + ", " + dStopLoss + ", " + dTp); } } // ------ void Buy(string strExpertName) { dLotSize = GetLotSize(); if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500) return; double dTp; if(dTakeProfit == 0) dTp = 0; else dTp = Ask + dTakeProfit; int nResult; for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); SaveComment(" Trying to buy, attempt " + nTry + "\r\n"); SaveComment("Bid: " + Bid + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit); nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, dTp, strExpertName, nMagic, 0, Aqua); if(nResult != -1) { SaveComment(" successfull\r\n"); break; } else SaveComment(" failed, error " + GetLastError() + "\r\n"); } if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + " buy error: " + nError + "\r\n" + Ask + ", " + dStopLoss + ", " + dTp); SaveComment(strExpertName + " buy error: " + nError + "\r\n" + Ask + ", " + dStopLoss + ", " + dTp); } } // ------ void ModifyOrders() { for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) { if(OrderType() == OP_BUY) { if(OrderStopLoss() < Bid - dTrailingStop - 5 * Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - dTrailingStop, OrderTakeProfit(), 0, Aqua); break; } } if(OrderType() == OP_SELL) { if(OrderStopLoss() > Ask + dTrailingStop + 5 * Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + dTrailingStop, OrderTakeProfit(), 0, OrangeRed); break; } } } } } // ------ /* void ModifyOrders(double dTrailingConvergence = 1) { for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++) { OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == nMagic) { if(dTrailingConvergence != 1) { dStop *= dTrailingConvergence; dStop = NormalizeDouble(dStop, MarketInfo(Symbol(), MODE_DIGITS)); if(dStop < 10 * Point) dStop = 10 * Point; } if(OrderType() == OP_BUY) { if(OrderStopLoss() < Bid - dStop - 5 * Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - dStop, OrderTakeProfit(), 0, Aqua); break; } } if(OrderType() == OP_SELL) { if(OrderStopLoss() > Ask + dStop + 5 * Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + dStop, OrderTakeProfit(), 0, OrangeRed); break; } } } } } */ // ------ bool IsBarEnd() { bool bIsBarEnd = false; if(nBars != Bars) { if(IsTesting() || (!IsTesting() && CurTime() > Time[0] + nMagic * nDelaySeconds)) { bIsBarEnd = true; nBars = Bars; } } return(bIsBarEnd); } // ------ void CheckTradeSemaphore() { if(!IsTesting()) { // int n = 1; while(!IsStopped()) { GlobalVariableSetOnCondition(strTradeSemaphore, nMagic, 0.0); // if(GlobalVariableGet(strTradeSemaphore) == 0.0) // GlobalVariableSet(strTradeSemaphore, nMagic); if(GlobalVariableGet(strTradeSemaphore) == nMagic) break; // Comment(GlobalVariableGet(strTradeSemaphore) + ": " + n); // n++; Sleep(1000); } RefreshRates(); } } // ------ /* void CloseBuy(string strExpertName) { int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + nError); } } // ------ void CloseSell(string strExpertName) { int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert("Noc_1 close: " + nError); } } */ // ------ void CloseBuy(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket + "\r\n"); for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else SaveComment("\r\n\tOrder with this ticket still present, trying again"); } } // ------ void CloseSell(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket + "\r\n"); for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else SaveComment("\r\n\tOrder with this ticket still present, trying again"); } } // ------ void SaveComment(string strComment) { if(!IsTesting()) { int hFile = FileOpen("__test_" + strExpert + "_" + Symbol() + ".txt", FILE_BIN | FILE_READ | FILE_WRITE, '\t'); FileSeek(hFile, 0, SEEK_END); FileWriteString(hFile, strComment, StringLen(strComment)); // FileFlush(hFile); FileClose(hFile); } } // ------
È ora che gli sviluppatori pensino a un lavoro per voi dello staff per trovare ogni sorta di cattiveria.
Forse è il ping, non ho cicli per riprovare a fare ordini, forse dovrei chiamare Refresh a questo punto e infilare prezzi più freschi.
Mi perdo...:)
Forse è il ping, non ho cicli per riprovare a fare ordini, forse devo chiamare Refresh a questo punto e infilare prezzi più freschi.
Mi sto perdendo...:)
Buona idea... Lo farà ora...
void Sell(string strExpertName) { dLotSize = GetLotSize(); if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500) return; double dTp; if(dTakeProfit == 0) dTp = 0; else dTp = Bid - dTakeProfit; int nResult; for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); SaveComment(" Trying to sell, attempt " + nTry + "\r\n"); SaveComment("Ask: " + Ask + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit + "\r\n"); nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, dTp, strExpertName, nMagic, 0, OrangeRed); if(nResult != -1) { SaveComment(" successfull\r\n"); break; } else { SaveComment(" failed, error " + GetLastError() + "\r\n"); RefreshRates(); } } if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + " sell error: " + nError + "\r\n" + Bid + ", " + dStopLoss + ", " + dTp); SaveComment(strExpertName + " sell error: " + nError + "\r\n" + Bid + ", " + dStopLoss + ", " + dTp); } } // ------ void Buy(string strExpertName) { dLotSize = GetLotSize(); if(AccountFreeMargin() < dLotSize * dInitAmount || AccountFreeMargin() < 500) return; double dTp; if(dTakeProfit == 0) dTp = 0; else dTp = Ask + dTakeProfit; int nResult; for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); SaveComment(" Trying to buy, attempt " + nTry + "\r\n"); SaveComment("Bid: " + Bid + ", StopLoss: " + dStopLoss + ", TakeProfit: " + dTakeProfit); nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, dTp, strExpertName, nMagic, 0, Aqua); if(nResult != -1) { SaveComment(" successfull\r\n"); break; } else { SaveComment(" failed, error " + GetLastError() + "\r\n"); RefreshRates(); } } if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + " buy error: " + nError + "\r\n" + Ask + ", " + dStopLoss + ", " + dTp); SaveComment(strExpertName + " buy error: " + nError + "\r\n" + Ask + ", " + dStopLoss + ", " + dTp); } } void CloseBuy(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket + "\r\n"); for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); SaveComment(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else { SaveComment("\r\n\tOrder with this ticket still present, trying again"); RefreshRates(); } } } // ------ void CloseSell(string strExpertName) { int nTicket = OrderTicket(); SaveComment("\r\n\tAttempting to close short position, ticket: " + nTicket + "\r\n"); for(int nTry = 0; nTry < 5; nTry++) { SaveComment(Day() + "." + Month() + "." + Year() + " " + Hour() + ":" + Minute() + ":" + Seconds()); int nResult = OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed); if(nResult == -1) { int nError = GetLastError(); Alert(strExpertName + ", error: " + nError); SaveComment(strExpertName + ", error: " + nError); } bool bClosed = true; for(int nOrderNo = OrdersTotal() - 1; nOrderNo >= 0; nOrderNo--) { OrderSelect(nOrderNo, SELECT_BY_POS, MODE_TRADES); if(OrderTicket() == nTicket) { bClosed = false; break; } } if(bClosed == true) { SaveComment("\r\n\tNo more orders with this ticket No"); break; } else { SaveComment("\r\n\tOrder with this ticket still present, trying again"); RefreshRates(); } } }
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Cos'è e come affrontarlo?
Quando si riavvia MT (la condizione di chiusura è ancora valida) l'affare si chiude con successo.
Non ci sono errori nel log, l'output nel file, che ho messo letteralmente a cavallo di una riga, mostra che OrderSend ha funzionato, nessun errore, ma ecco il problema: a) l'ordine nella lista degli aperti è rimasto e b) si è chiuso al riavvio di MT, quindi non era solo nella lista, ma anche nella realtà.
Nel caso in cui Meta voglia riconciliare i log con Alpari, account 142605, ticket 1728130
Spero di ottenere ancora una risposta, questo non è il mio primo post su questo errore.
Saluti,
Quark