Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 85

 

Um par de outras questões surgiram ao longo do caminho:

1. há um fio:

datatime ProvTimeX1=ObjectGetInteger(0, "Y="+IntegerToString(y,0,''),OBJPROP_TIME);

O compilador não se apercebe disso, escrevendo"possível perda de dados devido à conversão do tipo". O que está errado aqui?

2. Como é que o mql5 coloca os dados em arrays e os distribui, em que direcção?

 
WindSW:

Um par de outras questões surgiram ao longo do caminho:

1. há um fio:

datatime ProvTimeX1=ObjectGetInteger(0, "Y="+IntegerToString(y,0,''),OBJPROP_TIME);

O compilador não se apercebe disso, escrevendo"possível perda de dados devido à conversão do tipo". O que está errado aqui?

Bem, é verdade, está a tentar escrever na variável de data e hora um valor há muito retornado pela ObjectGetInteger. Fazer conversão de tipo.

datetime ProvTimeX1=(datetime)ObjectGetInteger(0,"Y="+IntegerToString(y,0,' '),OBJPROP_TIME);
2. Como são os dados em mql5 colocados em matrizes e atribuídos, em que direcção?

A direcção é sempre a mesma - desde o início (o índice é zero) até ao fim, MAS se não especificar a indexação com a função ArraySetAsSeries. Se a questão for sobre indexação.

 

Boa tarde, não posso dividir os números, o resultado é 0,0

Porquê?

   double res =  8000/16000 * 100;
   Print(res);
 
ryzhak.vladimir:

Boa tarde, não posso dividir os números, o resultado é 0,0

Porquê?



   double res=((double)8000/16000)*100;
   Print(res);
Documentação >>> Conversão de tipo
 

É estúpido, claro, que tenha de acrescentar algo para mudar alguma coisa, alguma calculadora sem pontos está bem e não precisa de especificar que tipo de dados, mas está bem, a segunda maneira é acrescentar ".0" ao fim do número inteiro

por isso a expressão correcta seria a seguinte.

double res =8000.0/16000.0*100;
Print(res);
A propósito, nalguma linguagem de programação viu uma variável para que o terminal seleccionasse o seu tipo, talvez fosse apenas para dados numéricos, mas ainda assim confortável, será que não está implementado aqui, tentei encontrar na documentação - não consegui encontrar?
 
obrigado a todos)
 

Na versão 4: datetime TimeX2=Time[0]+18000; - aumentou o valor do tempo em 5 velas para a frente

Agora em 5 ao escrever:

datetime Topen[];
ArraySetAsSeries(Topen,true);
CopyTime(_Symbol,_Period,0,3,Topen);
datetime TimeX2=Topen[0]+18000;

Ao depurar, dá erro de transbordamento da matriz e pontos para a linhaTimeX2=Topen[0]+18000;

Aconselha-se como obter o mesmo resultado em 5 como em 4?

Adenda: Está escrito correctamente, acabei de cometer um erro - no OnInit a matriz estava vazia.

 
WindSW:

Na versão 4: datetime TimeX2=Time[0]+18000; - aumentou o valor do tempo em 5 velas para a frente

Agora em 5 ao escrever:

Ao depurar, dá erro de transbordamento da matriz e pontos para a linhaTimeX2=Topen[0]+18000;

Aconselha-se como obter o mesmo resultado em 5 como em 4?

datetime b=TimeTradeServer()+60*min; //min - кол-во минут от текущего времени
 

Encontrei um problema com o desenho de níveis.

void OnInit()
  {
   ObjectCreate(0,oPP,OBJ_TREND,0,0,0,0,0);
   ObjectSetInteger(0,oPP,OBJPROP_COLOR,clrDeepSkyBlue);
   ObjectSetInteger(0,oPP,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,oPP,OBJPROP_WIDTH,2);
   ObjectSetInteger(0,oPP,OBJPROP_RAY,false);
   ObjectCreate(0,oRes1,OBJ_TREND,0,0,0,0,0);
   ObjectSetInteger(0,oRes1,OBJPROP_COLOR,clrDeepSkyBlue);
   ObjectSetInteger(0,oRes1,OBJPROP_STYLE,STYLE_DASH);
   ObjectSetInteger(0,oRes1,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,oRes1,OBJPROP_RAY,false);
   ObjectCreate(0,oSup1,OBJ_TREND,0,0,0,0,0);
   ObjectSetInteger(0,oSup1,OBJPROP_COLOR,clrDeepSkyBlue);
   ObjectSetInteger(0,oSup1,OBJPROP_STYLE,STYLE_DASH);
   ObjectSetInteger(0,oSup1,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,oSup1,OBJPROP_RAY,false);
   PPlevel();
  }
//+------------------------------------------------+
//| Пивот поинт                                    |
//+------------------------------------------------+
void PPlevel()
   {
    double iH=iHigh(Symbol(),PERIOD_D1,1);
    double iL=iLow(Symbol(),PERIOD_D1,1);
    double iC=iClose(Symbol(),PERIOD_D1,1);
    double iO=iOpen(Symbol(),PERIOD_D1,1);
    int New_candle=0;
    New_candle=NBar(); // функция появления новой свечи
    if(New_candle==1)
      {
       double range=NormalizeDouble(iH-iL,_Digits);
       double PP=NormalizeDouble((iH+iL+iC)/3,_Digits);
       double R1=NormalizeDouble((2*PP)-iL,_Digits);
       double S1=NormalizeDouble((2*PP)-iH,_Digits);
       TimeStart=iTime(Symbol(),PERIOD_D1,0)-7200;
       TimeFinish=Topen[0]+64000;
       ObjectSetInteger(0,oPP,OBJPROP_TIME,TimeStart);                 // отрисовка PP
       ObjectSetDouble(0,oPP,OBJPROP_PRICE,PP);
       ObjectSetInteger(0,oPP,OBJPROP_TIME,1,TimeFinish);
       ObjectSetDouble(0,oPP,OBJPROP_PRICE,1,PP);
       ObjectSetInteger(0,oRes1,OBJPROP_TIME,TimeStart);               // отрисовка сопротивления
       ObjectSetDouble(0,oRes1,OBJPROP_PRICE,R1);
       ObjectSetInteger(0,oRes1,OBJPROP_TIME,1,TimeFinish);
       ObjectSetDouble(0,oRes1,OBJPROP_PRICE,1,R1);
       ObjectSetInteger(0,oSup1,OBJPROP_TIME,TimeStart);               // отрисовка поддержки
       ObjectSetDouble(0,oSup1,OBJPROP_PRICE,S1);
       ObjectSetInteger(0,oSup1,OBJPROP_TIME,1,TimeFinish);
       ObjectSetDouble(0,oSup1,OBJPROP_PRICE,1,S1);
      }
   }
Verifiquei com Print() e obtive resultados normais de cálculo "Exemplo: (GBPUSD,H1) 0,0152 i 1,5911 i 1,59682 i 2013.01.20 22:00:00 i 2013.01.22 09:46:40" mas não desenha estes níveis. Verificando no terminal via"Lista de Objectos", eles não estão lá. Por favor, informe qual é o problema? Onde é que estou errado?
 
WindSW:

Estou a ter dificuldade em desenhar os níveis.

Verifiquei com Print() e obtive resultados normais de cálculo "Exemplo: (GBPUSD,H1) 0,0152 i 1,5911 i 1,59682 i 2013.01.20 22:00:00 i 2013.01.22 09:46:40" mas não desenha estes níveis. Verificando no terminal via"Lista de Objectos", eles não estão lá. Por favor, informe qual é o problema? Onde é que estou errado?
Imprimir os resultados de ObjectCreate, talvez haja aí um erro.