//+------------------------------------------------------------------+//| Ozero.mq4 |//| Copyright 2014, Vinin |//| http://vinin.ucoz.ru |//+------------------------------------------------------------------+#property copyright"Copyright 2014, Vinin"#property link"http://vinin.ucoz.ru"#property version"1.00"#property strict// -------- переменные --- Н -----externdouble gLot=0.1; // размер лота для покупки externdouble gPoint=0.001;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+// -------- переменные --- К ----- int init()
{
return(0);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start()
{
// Открытие позицииif(OrdersTotal()==0)
{
Print(" Открытие первой позиции ");
double _Ask=MarketInfo("GBPUSD",MODE_ASK);
int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
if(ticket>0)
{
Print(" ОРДЕР ОТКРЫТ ",ticket);
}
}
double _Bid=MarketInfo("GBPUSD",MODE_BID); //для ценыfor(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS))
{
if(OrderOpenPrice()+gPoint<_Bid)
{
OrderClose(OrderTicket(),OrderLots(),_Bid,15);
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
}
}
}
return(0);
}
Buongiorno.
Il programma si presenta così.
Quando si compila dà fuori:
Ozero.mq4'Ozero.mq4 1 1 il valore di ritorno di 'OrderClose' dovrebbe essere controllato Ozero.mq4 46 13 conversione implicita da 'numero' a 'stringa' Ozero.mq4 49 117 0 errore(i), 2 avviso(i) 1 3
La scheda "risultati" mostra che gli ordini si stanno aprendo e chiudendo.
2014.10.31 07:46:44.837 GBPUSD,M15: 4453 eventi tick (5608 barre, 340128 stati delle barre) elaborati entro 312876 ms (tempo totale 324436 ms) 2014.10.31 07:46:44.837 2014.08.26 13:13 Tester: ordine #4 è chiuso 2014.10.31 07:46:44.798 2014.08.26 13:13 Tester visivo fermato 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDINE APERTO 4 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: aperto #4 comprare 0,10 GBPUSD a 1,6590 ok 2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Aperto #4 comprare 0,10 GBPUSD a 1,6590 ok 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Non credo che abbia chiuso. Ecco qui: 4108 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Errore OrderClose 4108 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: ticket 3 sconosciuto per la funzione OrderClose 2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: chiudere #3 comprare 0,10 GBPUSD a 1,6576 al prezzo 1,6586 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: aperto #3 comprare 0,10 GBPUSD a 1,6576 ok 2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Aprire posizione #1 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Come va? Ecco qui: 4108 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Errore OrderClose 4108 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: ticket 2 sconosciuto per la funzione OrderClose 2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: chiudere #2 comprare 0,10 GBPUSD a 1,6564 al prezzo 1,6574 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok 2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Apertura della prima posizione 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Come va? Ecco qui: 4108 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Errore OrderClose 4108 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: ticket 1 sconosciuto per la funzione OrderClose 2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: chiudere #1 comprare 0,10 GBPUSD a 1,6550 al prezzo 1,6562 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDINE APERTO 1 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: aperto #1 comprare 0,10 GBPUSD a 1,6550 ok 2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: aperto #1 comprare 0,10 GBPUSD a 1,6550 ok 2014.10.31 07:41:31.958 Ingressi Ozero: gLot=0.1; gPoint=0.001;
Ora sono del tutto in perdita. Da un lato gli ordini vengono chiusi come si può vedere nel grafico e nei risultati, dall'altro il codice viene eseguito con errori come si vede nel log: (((((((((((
//ResetLastError();//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());
Buongiorno.
Eliminate due linee. Tutto funziona. E tutto viene visualizzato correttamente sul grafico, nei risultati e nei log.
Domanda: durante la compilazione, dà
Ozero.mq4'Ozero.mq4 1 1 Il valore di ritorno di 'OrderClose' dovrebbe essere controllato Ozero.mq4 46 13 0 errore(i), 1 avviso(i) 1 2
Di cosa mi avverte il compilatore? La 46esima linea è OrderClose(OrderTicket(),OrderLots(),_Bid,15);
Potete dirmi cosa potrebbe essere la causa del glitch che si è verificato oggi?
L'EA ha un'opzione per fermare il trading 15 minuti prima della chiusura del mercato il venerdì.
Quando appare un nuovo giorno l'EA controlla se è venerdì, allora oggi si ferma il trading in StringToTime("23:59")-15*60
Nel tester della strategia, questa funzione funziona correttamente. Tuttavia, nel trading reale, vedo una situazione completamente diversa - l'Expert Advisor ferma il trading al primo tick quando arriva il venerdì.
Ecco le stampe del diario di Expert Advisor:
Broker #1, demo:
0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00
Broker 2, reale:
0 03:00:11.999 Scalper EURUSD,M1: Finish In Friday = 2014.10.23 23:44:00
Cioè, quando appare la barra giornaliera di oggi (venerdì 24 ottobre) sul primo tick, l'EA
convertirà la linea "23:59" nell'ora di ieri invece di assegnare il giorno di oggi.
Tuttavia, se l'Expert Advisor viene riavviato il venerdì a metà giornata, determinerà correttamente il tempo di completamento.
Ho trovato la ragione di questo problema: https://forum.mql4.com/33023
Come previsto, è praticamente un bug nella funzione StringToTime. Tutti i sintomi sono simili. Questa funzione converte la stringa "23:59" in datetime con la data del PC locale ma non con la data di MT4. E nel tester, come sappiamo, la data del PC locale è emulata ed equiparata all'ora del terminale. Ecco perché tutto funziona correttamente nel tester, ma la demo/tempo reale provoca glitch e perdite. La documentazione, ovviamente, non dice da dove viene la data e il link sopra mostra che questo problema è stato segnalato 4 anni fa, ma apparentemente ai metacaratteri non importa.
RefreshRates(); // Обновим данные
_Bid=MarketInfo( "GBPUSD",MODE_BID);
if (_Bid>=gPoint1)
{
for(pos=OrdersTotal();pos>=0;pos--)
{
OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
}
}
Un'altra domanda. Ho capito bene che:
1. la numerazione dell'ordine inizia da "0".
2. Questo codice chiuderà assolutamente tutti gli ordini, indipendentemente dal fatto che io li apra manualmente o programmaticamente? Cioè, non troveremo mai un ordine che questa parte del programma non può chiudere?
//+------------------------------------------------------------------+// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журналvoid iPrint(string mess1, int sz=9, color color1=clrDarkGray,
string mess2="", color color2=clrDarkGray,
string mess3="", color color3=clrDarkGray,
string mess4="", color color4=clrDarkGray,
bool draws=true) {
string NameGrafText, message, nm;
int i, y, k, shift, Win_Num=-1, num=0;
color cl;
Win_Num=WindowFind("Win_Inform");
if (mess1=="") {
//Print("Func iPrint: Передана пустая строка, выходим");return;
}
if (!draws || Win_Num<0) {
message=mess1+mess2+mess3+mess4;
Print(message);
return;
}
k=ArraySize(Mass_Name_Message)-1;
if (StringLen(mess1)>0) num++;
if (StringLen(mess2)>0) num++;
if (StringLen(mess3)>0) num++;
if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений for (i=k; i>=0; i--) {
NameGrafText=Mass_Name_Message[i];
if (StringLen(NameGrafText)>0) {
if (ObjectFind(NameGrafText)==Win_Num) {
if (i+num>k) { // Удаляем самую верхнюю строчкуObjectDelete(NameGrafText);
Mass_Name_Message[i]="";
}
elseif (i+num<=k) { // Сдвигаем и перекрашиваем старые сообщения
Mass_Name_Message[i+num]=Mass_Name_Message[i];
y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE); // старая координата Y
ObjectSet (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
ObjectSet (NameGrafText, OBJPROP_COLOR, clrDimGray); // новый цвет
}
}
}
}
// Вывод новых сообщений
shift=num;
uint v=GetTickCount();
for (i=0; i<num; i++) {
shift--;
NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v); // Уникальное имя объектаint app=0;
while (ObjectFind(NameGrafText)==Win_Num) { // Если всё-таки такой объект есть
app++;
NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
}
Mass_Name_Message[num-1-i]=NameGrafText;
switch (i) {
case0: message=mess1; cl=color1; break;
case1: message=mess2; cl=color2; break;
case2: message=mess3; cl=color3; break;
case3: message=mess4; cl=color4; break;
default:message=mess1; cl=color1; break;
}
ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
ObjectSet (NameGrafText, OBJPROP_COLOR, cl); // цвет
ObjectSet (NameGrafText, OBJPROP_CORNER, 2); // угол
ObjectSet (NameGrafText, OBJPROP_XDISTANCE, 150); // координата Х
ObjectSet (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift); // координата Y
WindowRedraw();
}
}
//+------------------------------------------------------------------+
Come esempio di utilizzo di un messaggio a un colore (si possono avere 4 colori in una linea per parole diverse):
if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
iPrint(mess1,9,clrBlue);
trade.OpenS(sy,lots,mn,0.0,0.0,co);
}
Ci dovrebbe essere un indicatore vuoto chiamato Win_Inform sul grafico.
Ciao, potresti dirmi perché a volte ho un operatore ifle che non funziona.
Ecco un esempio:
Dove:
H3 è il valore del prezzo del livello
price è il prezzo corrente
Il risultato è che il prezzo raggiunge questo livello (a volte si ferma anche ad esso), ma Alert non si attiva.
Puoi dirmi qual è l'errore?
Buongiorno.
Il programma si presenta così.
Quando si compila dà fuori:
Ozero.mq4'Ozero.mq4 1 1
il valore di ritorno di 'OrderClose' dovrebbe essere controllato Ozero.mq4 46 13
conversione implicita da 'numero' a 'stringa' Ozero.mq4 49 117
0 errore(i), 2 avviso(i) 1 3
La scheda "risultati" mostra che gli ordini si stanno aprendo e chiudendo.
1 2014.08.25 00:00 comprare 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 chiudere 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 comprare 2 0,10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 chiudere 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 comprare 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 chiudere 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 comprare 4 0,10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 chiudere a stop 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18
8 - Ho interrotto il lavoro chiudendo il tester.
Poi guardiamo il "Journal":
2014.10.31 07:46:44.837 GBPUSD,M15: 4453 eventi tick (5608 barre, 340128 stati delle barre) elaborati entro 312876 ms (tempo totale 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Tester: ordine #4 è chiuso
2014.10.31 07:46:44.798 2014.08.26 13:13 Tester visivo fermato
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDINE APERTO 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: aperto #4 comprare 0,10 GBPUSD a 1,6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Aperto #4 comprare 0,10 GBPUSD a 1,6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Non credo che abbia chiuso. Ecco qui: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Errore OrderClose 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: ticket 3 sconosciuto per la funzione OrderClose
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: chiudere #3 comprare 0,10 GBPUSD a 1,6576 al prezzo 1,6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: aperto #3 comprare 0,10 GBPUSD a 1,6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Aprire posizione #1
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Come va? Ecco qui: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Errore OrderClose 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: ticket 2 sconosciuto per la funzione OrderClose
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: chiudere #2 comprare 0,10 GBPUSD a 1,6564 al prezzo 1,6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Apertura della prima posizione
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Come va? Ecco qui: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Errore OrderClose 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: ticket 1 sconosciuto per la funzione OrderClose
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: chiudere #1 comprare 0,10 GBPUSD a 1,6550 al prezzo 1,6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDINE APERTO 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: aperto #1 comprare 0,10 GBPUSD a 1,6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: aperto #1 comprare 0,10 GBPUSD a 1,6550 ok
2014.10.31 07:41:31.958 Ingressi Ozero: gLot=0.1; gPoint=0.001;
Ora sono del tutto in perdita. Da un lato gli ordini vengono chiusi come si può vedere nel grafico e nei risultati, dall'altro il codice viene eseguito con errori come si vede nel log: (((((((((((
Ozero.
Stai cercando di chiudere lo stesso ordine due volte. Rimuovere la parte superiore.
Buongiorno.
Eliminate due linee. Tutto funziona. E tutto viene visualizzato correttamente sul grafico, nei risultati e nei log.
Domanda: durante la compilazione, dà
Ozero.mq4'Ozero.mq4 1 1
Il valore di ritorno di 'OrderClose' dovrebbe essere controllato Ozero.mq4 46 13
0 errore(i), 1 avviso(i) 1 2
Di cosa mi avverte il compilatore? La 46esima linea è OrderClose(OrderTicket(),OrderLots(),_Bid,15);
Ozero.
Potete dirmi cosa potrebbe essere la causa del glitch che si è verificato oggi?
L'EA ha un'opzione per fermare il trading 15 minuti prima della chiusura del mercato il venerdì.
Quando appare un nuovo giorno l'EA controlla se è venerdì, allora oggi si ferma il trading in StringToTime("23:59")-15*60
Nel tester della strategia, questa funzione funziona correttamente. Tuttavia, nel trading reale, vedo una situazione completamente diversa - l'Expert Advisor ferma il trading al primo tick quando arriva il venerdì.
Ecco le stampe del diario di Expert Advisor:
Broker #1, demo:
0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00
Broker 2, reale:
0 03:00:11.999 Scalper EURUSD,M1: Finish In Friday = 2014.10.23 23:44:00
Cioè, quando appare la barra giornaliera di oggi (venerdì 24 ottobre) sul primo tick, l'EA
convertirà la linea "23:59" nell'ora di ieri invece di assegnare il giorno di oggi.
Tuttavia, se l'Expert Advisor viene riavviato il venerdì a metà giornata, determinerà correttamente il tempo di completamento.
Ho trovato la ragione di questo problema: https://forum.mql4.com/33023
Come previsto, è praticamente un bug nella funzione StringToTime. Tutti i sintomi sono simili. Questa funzione converte la stringa "23:59" in datetime con la data del PC locale ma non con la data di MT4. E nel tester, come sappiamo, la data del PC locale è emulata ed equiparata all'ora del terminale. Ecco perché tutto funziona correttamente nel tester, ma la demo/tempo reale provoca glitch e perdite. La documentazione, ovviamente, non dice da dove viene la data e il link sopra mostra che questo problema è stato segnalato 4 anni fa, ma apparentemente ai metacaratteri non importa.
Un'altra domanda. Ho capito bene che:
1. la numerazione dell'ordine inizia da "0".
2. Questo codice chiuderà assolutamente tutti gli ordini, indipendentemente dal fatto che io li apra manualmente o programmaticamente? Cioè, non troveremo mai un ordine che questa parte del programma non può chiudere?
Ozero.
Qualcuno ha fatto scorrere il testo sullo schermo? Per esempio - ordine così e così aperto/chiuso/modificato, ecc... Notizie lì così e così... ?
Se non ti dispiace, per favore mostrami un pezzo di codice.
Grazie!
Quello più basso è meglio. L'ordine deve essere scelto in anticipo.
È meglio così:
Qualcuno ha fatto scorrere il testo sullo schermo? Per esempio - ordine così e così aperto/chiuso/modificato, ecc... Notizie lì così e così... ?
Se non ti dispiace, per favore mostrami un pezzo di codice.
Senx!
Stava facendo lo scorrimento verticale nella finestra vuota dell'indicatore. Ecco la funzione:
Come esempio di utilizzo di un messaggio a un colore (si possono avere 4 colori in una linea per parole diverse):
Ci dovrebbe essere un indicatore vuoto chiamato Win_Inform sul grafico.