Domande da un "manichino" - pagina 200

 

Quindi, c'è una funzione per determinare il tempo di apertura di una barra (incluso se la barra è nel futuro)

//+---------------------------------------------------------------------------+
//| Получение точного времени открытия                                        |
//|Input:                                                                     |
//|1) Время, которое необходимо округлить до ближайшего времени открытия бара |
//|2) Переменная для вывода результата                                        |
//|3) Период ТФ                                                               |
//|4) Отклонение влево-вправо                                                 |
//|Возврат: количество элементов(1), 0 если не скопировано, (-1) если ошибка  |
//+---------------------------------------------------------------------------+
int GetSingleBarOpenTime(datetime Time,datetime &Output,ENUM_TIMEFRAMES nPeriod,int Shift=0) export
  {
   datetime OpenTime[1];
   int Count=0;
// если бар существует то используем стандартную процедуру поиска времени открытия
   if(Time<=TimeCurrent() && Shift==0)
     {
      Count=CopyTime(Symbol(),nPeriod,Time,1,OpenTime);
      if(Count==0)
        {
         Print("GetCorrectOpenTime CopyTime elements=0");
         return(0);
        }
      else if(Count<0)
        {
         Print("GetCorrectOpenTime error "+(string)GetLastError());
         return(Count);
        }
      else
        {
         Output=OpenTime[0];
         return(Count);
        }
     }
//если бар находится в будущем то используем следующую процедуру
   else
     {
      MqlDateTime sTime;
      // NumOfUnits - количество стандартных единиц
      int NumOfUnits=0; 
      int ToRnd;
      TimeToStruct(Time,sTime);
      //Единица измерения(1-минута, 2 - час, 3 - день, 4 - неделя(но используются дни), 5 - месяц)
      short Unit=0;
      //в зависимости от ТФ инициализируются параметры
      switch(nPeriod)
        {
         case PERIOD_M1:   {Unit=1;NumOfUnits=1;break;}
         case PERIOD_M2:   {Unit=1;NumOfUnits=2;break;}
         case PERIOD_M3:   {Unit=1;NumOfUnits=3;break;}
         case PERIOD_M4:   {Unit=1;NumOfUnits=4;break;}
         case PERIOD_M5:   {Unit=1;NumOfUnits=5;break;}
         case PERIOD_M6:   {Unit=1;NumOfUnits=6;break;}
         case PERIOD_M10:  {Unit=1;NumOfUnits=10;break;}
         case PERIOD_M12:  {Unit=1;NumOfUnits=12;break;}
         case PERIOD_M15:  {Unit=1;NumOfUnits=15;break;}
         case PERIOD_M20:  {Unit=1;NumOfUnits=20;break;}
         case PERIOD_M30:  {Unit=1;NumOfUnits=30;break;}
         case PERIOD_H1:   {Unit=2;NumOfUnits=1;break;}
         case PERIOD_H2:   {Unit=2;NumOfUnits=2;break;}
         case PERIOD_H3:   {Unit=2;NumOfUnits=3;break;}
         case PERIOD_H4:   {Unit=2;NumOfUnits=4;break;}
         case PERIOD_H6:   {Unit=2;NumOfUnits=6;break;}
         case PERIOD_H8:   {Unit=2;NumOfUnits=8;break;}
         case PERIOD_H12:  {Unit=2;NumOfUnits=12;break;}
         case PERIOD_D1:   {Unit=3;NumOfUnits=1;break;}
         case PERIOD_W1:   {Unit=4;NumOfUnits=7;break;}
         case PERIOD_MN1:  {Unit=5;NumOfUnits=1;break;}
         default:         {Print("Period is unknown"); break;}
        }
      // Если ТФ - минуты, то
      if(Unit==1)
        {
         sTime.sec=0;
         //Остаток от деления
         ToRnd=(int)fmod(sTime.min,NumOfUnits);
         Time=StructToTime(sTime);
         // Округление до ближайшего времени открытия(пример: если сейчас 14:25, и тф 2min, то ближайщее время открытия бара - 14:24)
         Time-=(ToRnd*60);
         Time+=(NumOfUnits*Shift*60);

        }
      else if(Unit==2)
        {
         sTime.sec=0;
         sTime.min=0;
         ToRnd=(int)fmod(sTime.hour,NumOfUnits);
         Time=StructToTime(sTime);
         Time-=(ToRnd*60*60);
         Time+=(NumOfUnits*Shift*60*60);
        }
      else if(Unit==3)
        {
         sTime.hour=0;
         sTime.min=0;
         sTime.sec=0;
         ToRnd=(int)fmod(sTime.day,NumOfUnits);
         Time=StructToTime(sTime);
         int hds;
         hds=sTime.day_of_week;
         if (hds==0) hds=7;
         hds=floor((hds+Shift)/7)*2;
         int ti=Shift+hds;
         while (hds>7)
         {
            hds=(floor(hds/7))*2;
            ti+=hds;
         }
         Print(ti);
         Time-=(ToRnd*60*60*24);
         Time+=(NumOfUnits*Shift*60*60*24);
        }
      else if(Unit==4)
        {
         sTime.hour=0;
         sTime.min=0;
         sTime.sec=0;
         ToRnd=(int)fmod(sTime.day,NumOfUnits);
         Time=StructToTime(sTime);
         Time-=(ToRnd*60*60*24);
         Time+=(NumOfUnits*Shift*60*60*24);
        }
      else if(Unit==5)
        {
         sTime.sec=0;
         sTime.min=0;
         sTime.hour=0;
         sTime.day=1;
         sTime.mon=sTime.mon-(int)fmod(sTime.mon,NumOfUnits)+(NumOfUnits*Shift);
         while(sTime.mon<1)
           {
            sTime.year--;
            sTime.mon=12+sTime.mon;
           }
         while(sTime.mon>12)
           {
            sTime.year++;
            sTime.mon=sTime.mon-12;
           }
         if(sTime.sec<0)
            Print("GetSingleBarOpenTime seconds error");
         if(sTime.min<0)
            Print("GetSingleBarOpenTime minutes error");
         if(sTime.hour<0)
            Print("GetSingleBarOpenTime hours error");
         if(sTime.day<1)
            Print("GetSingleBarOpenTime days error");
         if(sTime.mon<0)
            Print("GetSingleBarOpenTime months error");
         if(sTime.year<1970)
            Print("Year < 1970");
         Time=StructToTime(sTime);
        }
      Output=Time;
      return(1);
     }
  }

Il problema con Shift è che ora si sposta non per il numero di barre ma per il numero di giorni (non importa su D1 o D1; l'importante è capire D1). Così penso di avere in testa che posso controllare il numero di daysTotal per turno (numero di giorni della settimana) e il giorno corrente della settimana, ma quale formula usare - non posso determinare.

Nota: in Unità=3 prova a farlo (finora senza successo)

Aiuto per favore.

 
victorva: la richiesta di trading dà errore 10016 ("stop errato"). In cosa si sbagliano?

1. Inserisci il codice correttamente (Ctrl+Alt+M).

void OnTick()
  {
   MqlTick last_tick={0};                       // предопределенная структура для получения текущих данных рынка
   SymbolInfoTick("EURUSD",last_tick);          // инструмент: указывать обязательно
   double Bid = last_tick.bid;                         // Текущая цена Bid
   MqlTradeRequest request={0};                 
   MqlTradeResult result={0};                 
   request.action=TRADE_ACTION_DEAL;           
   request.magic=555;                          
   request.symbol="EURUSD";
   request.volume=1.0;                  
   request.deviation=0;                 
   request.type=ORDER_TYPE_BUY;                        
   request.sl=Bid-300*_Point;                         // Уровень Stop Loss ордера
   request.tp=Bid+1000*_Point;                    // Уровень Take Profit ордера
   OrderSend(request,result);
   Comment("retcode = ",result.retcode);
  }
2. Cominciamo con il fatto che la tua richiesta non contiene il campo obbligatorio request.price (l'assenza di tale campo è accettabile solo per la modalità di esecuzione del mercato). Così si scopre che finché request.price==0.
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • 2010.02.23
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
 
victorva:

la query di trading dà l'errore 10016 ("stop sbagliati"). Che cosa hanno sbagliato?


request.sl=Bid-300*_Point; // livello di stop loss dell'ordine
request.tp=Bid+1000*_Point; // Livello dell'ordine Take Profit

Nel senso che non sono normalizzati. (usa il tasto SRC per inserire il codice).

  request.sl=NormalizeDouble(Bid-300*_Point,_Digits);   // Уровень Stop Loss ордера
  request.tp=NormalizeDouble(Bid+1000*_Point,_Digits);  // Уровень Take Profit ордера
 

Controllo della funzionalità dell'inserimento automatico dei link

1. Вставляйте код правильно (Ctrl+Alt+M).

 
Yedelkin:

1. Inserisci il codice correttamente (Ctrl+Alt+M).

2. Cominciamo con il fatto che la tua richiesta non specifica il campo obbligatorio request.price (l'assenza di tale campo è permessa solo per la modalità di esecuzione del mercato). Così si scopre che finché request.price==0.

Grazie. Messo il prezzo, ha funzionato.

 

Per favore aiutatemi, non riesco a capire una cosa.

|9|8|7|6|5|4|3|2|1|0| <-- serie temporale Tassi

CopyRates(Symbol(),Period(),Time,2,Result);

Per esempio ho specificato il tempo della candela #3. In questo caso, ottengo indietro i tassi di candele #3 e #4. Ma come ottenere i tassi di candele #3 e #2, avendo un tempo aperto della candela #3. Il numero negativo non viene digerito.

Ho avuto l'idea di trovare un indice di tipo, ma per farlo ho bisogno di copiare tutti gli elementi da quello corrente, ma, caspita, se ho M1 e una barra di 10 anni, allora l'array è troppo grande.

Grazie in anticipo

 

Buona giornata!

Potreste spiegare in quali unità viene misurato il traffico nella scheda "Servizi" di MetaTrader 5 Strategy Tester (MetaTester 5 Agents Managers build 712)? Si misura in kiloByte|megaByte o kiloByte|megaByte?

Grazie.

 

Ragazzi, potete dirmi se c'è un indicatore o un oggetto nella base che permette di visualizzare i grafici di altre valute sul grafico principale?

p.s. Ho scritto il mio per mt4, ma forse ce n'è uno già pronto qui...

 
storm:

Ragazzi, potete dirmi se c'è un indicatore o un oggetto nella base che permette di visualizzare i grafici di altre valute sul grafico principale?

p.s. Ho scritto il mio per mt4, ma forse ce n'è uno già pronto qui...

L'ho trovato, l'hanno già scritto, z**** , non ho bisogno di scriverlo io almeno. https://www.mql5.com/ru/code/1055
MultiCurrency
MultiCurrency
  • voti: 9
  • 2012.09.14
  • Nikolay Kositsin
  • www.mql5.com
Индикатор MultiCurrency позволяет анализировать одновременно до восьми графиков валют.
 
storm:
Trovato, è già scritto, z**** , non devi scriverlo tu. https://www.mql5.com/ru/code/1055
L'inversione in esso era prevista dall'autore, ma non è stata implementata, ho dovuto modificarla, ma il merito va all'autore!