Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 759

 
Kapizdo4ka:

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?

L'errore è che il prezzo raramente coincide esattamente con il valore del livello. O prezzo >= H3 o definire un intervallo di errore.
 
//+------------------------------------------------------------------+
//|                                                        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
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double 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.

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.
 
Roger:
Stai cercando di chiudere lo stesso ordine due volte. Rimuovere la parte superiore.
Preferibilmente quello inferiore. L'ordine deve essere selezionato in anticipo.
 
            
//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);


Ozero.

 
tuner:

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?


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!

 
Vinin:
Quello più basso è meglio. L'ordine deve essere scelto in anticipo.

È meglio così:

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

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:

//+------------------------------------------------------------------+
// Если 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]="";
               }
            else if (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) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: 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.

Motivazione: