Perguntas de um "boneco" - página 200

 

Assim, existe uma função de calendarização da abertura de um bar (incluindo se o bar estiver no 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);
     }
  }

O problema com o Shift é que agora ele muda não pelo número de barras mas pelo número de dias (não importa em D1 ou D1; o principal é compreender D1). Por isso acho que tenho na minha cabeça que posso verificar o número de diasTotal por turno (número de dias da semana) e o dia actual da semana, mas qual a fórmula a utilizar - não consigo determinar.

Nota: na Unidade=3 a tentar fazê-lo (até agora sem sucesso)

Ajude, por favor.

 
victorva: o pedido comercial dá erro 10016 ("paragens erradas"). Em que é que eles estão errados?

1. Inserir o código correctamente (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. Comecemos pelo facto de o seu pedido não conter o campo request.price obrigatório (a ausência de tal campo só é aceitável para o modo Market Execution). Assim, acontece que desde que o request.price==0.
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • 2010.02.23
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
 
victorva:

a consulta comercial dá erro 10016 ("paragens erradas"). O que é que eles têm de errado?


request.sl=Bid-300*_Point; // Nível de Stop Loss da encomenda
request.tp=Bid+1000*_Point; // Nível da ordem Take Profit

Na medida em que não são normalizadas. (usar o botão SRC para inserir o código).

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

Verificação da funcionalidade da inserção automática da ligação

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

 
Yedelkin:

1. Inserir o código correctamente (Ctrl+Alt+M).

2. Comecemos pelo facto de o seu pedido não especificar o campo request.price obrigatório (a ausência de tal campo só é permitida para o modo Market Execution). Assim, acontece que desde que o request.price==0.

Obrigado. Colocou o preço, funcionou.

 

Por favor, ajudem-me, não consigo compreender uma coisa.

|9|8|7|6|5|4|3|2|1|0| <-- taxas de séries cronológicas

CopyRates(Símbolo(),Período(),Tempo,2,Resultado);

Por exemplo, especifiquei o tempo de candelabro #3. Neste caso, recebo de volta as Tarifas dos castiçais #3 e #4. Mas como obter as taxas de candelabros #3 e #2, tendo um tempo aberto de castiçal #3. O número negativo não é digerido.

Tive a ideia de encontrar uma espécie de índice, mas para o fazer preciso de copiar todos os elementos do actual, mas, meu Deus, se eu tiver M1 e um bar com 10 anos de idade, então o conjunto é demasiado grande.

Obrigado de antemão

 

Bom dia!

Pode explicar em que unidades é medido o tráfego no separador "Serviços" do MetaTrader 5 Strategy Tester (MetaTester 5 Agents Managers build 712)? É medido em kiloBytes|megaBytes ou kiloBytes|megaBytes?

Obrigado.

 

Rapazes, podem dizer-me se existe um indicador ou objecto na base que vos permita exibir os gráficos de outras moedas no gráfico principal?

p.s. Escrevi o meu para o mt4, mas talvez haja aqui um já pronto...

 
storm:

Rapazes, podem dizer-me se existe um indicador ou objecto na base que vos permita exibir os gráficos de outras moedas no gráfico principal?

p.s. Escrevi o meu para o mt4, mas talvez haja aqui um já pronto...

Encontrei-o, eles já o escreveram, z**** , não preciso de ser eu a escrevê-lo pelo menos. https://www.mql5.com/ru/code/1055
MultiCurrency
MultiCurrency
  • votos: 9
  • 2012.09.14
  • Nikolay Kositsin
  • www.mql5.com
Индикатор MultiCurrency позволяет анализировать одновременно до восьми графиков валют.
 
storm:
Encontrou-o, já está escrito, z**** , não precisa de ser você a escrevê-lo. https://www.mql5.com/ru/code/1055
A inversão nela foi pretendida pelo autor, mas não foi implementada, tive de a afinar, mas o mérito é do autor!