Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1285

 
Valeriy Yastremskiy:

Se houver 1440 pedidos por dia, deve haver um cheque no início do minuto, ou mais simplesmente na aparência da barra de minutos. E neste ponto, para abrir. Você não a tem, então a EA abre uma posição a cada tic, o que é uma condição estrita em si, de acordo com a condição em nosso símbolo na citação atual. Esta condição pode não ser cumprida, e os carrapatos não serão cumpridos. E em algum momento, um erro crítico ocorrerá.

Além disso, o tipo de execução da ordem (ordem para realizar uma negociação para criar uma posição) tudo ou nada.

Eu entendo. Obrigado pela ajuda.

Eu também achei difícil para minha EA abrir tantas encomendas. Eu tentei limitar o número de pedidos com este código

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

Ou seja, abrir um pedido somente às 10:00 horas. Mas o resultado é o mesmo.

2020.10.27 10:25:17.548 Core 1 272 Mb de memória utilizada incluindo 36 Mb de dados históricos, 64 Mb de dados de tick


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

O que eu estou fazendo de errado?

Eu colori o código que adicionei e mudei

Isto é o que diz no arquivo de registro

FD 0 10:57:05.453 Processo do agente Core 1 iniciado em 127.0.0.0.1:3000

CS 0 10:57:05.453 Core 1 conectando a 127.0.0.0.1:3000

JD 0 10:57:05.953 Core 1 conectado

OD 0 10:57:05.975 Core 1 autorizado (agente build 2650)

JL 0 10:57:05.980 Testador EURUSD,M1 (Alpari-MT5-Demo): teste de especialistas\GRAAL.ex5 de 2020.09.01 00:00 até 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 sincronização comum concluída

CJ 0 10:57:06.223 Testador a qualidade da história analisada é 100%

LM 0 10:57:06.248 Core 1 MetaTester 5 iniciado em 127.0.0.1:3000

EJ 0 10:57:06.248 Core 1 inicialização concluída

LS 0 10:57:06.248 Core 1 login (build 2650)

KO 0 10:57:06.248 Core 1 4372 bytes de informação de conta carregada

LI 0 10:57:06.248 Core 1 1482 bytes de parâmetros de teste carregados

FN 0 10:57:06.248 Core 1 1724 bytes de parâmetros de entrada carregados

OK 0 10:57:06.248 Core 1 423 bytes de lista de símbolos carregados (72 símbolos)

HO 0 10:57:06.248 Core 1 arquivo de especialista adicionado: Experts\GRAAL.ex5 13680 bytes carregados

CP 0 10:57:06.248 Core 1 4077 Mb disponível, conjunto de 50 blocos para geração de carrapatos

DI 0 10:57:06.248 Core 1 calcular lucro em pips, depósito inicial 10000, alavancagem 1:100

LP 0 10:57:06.248 Core 1 inicializado com sucesso

RI 0 10:57:06.248 Core 1 15 Kb de dados totais de inicialização recebidos

DN 0 10:57:06.248 Core 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD: símbolo a ser sincronizado

RS 0 10:57:06.248 Core 1 EURUSD: símbolo sincronizado, 3720 bytes de informações do símbolo recebido

OL 0 10:57:06.248 Core 1 EURUSD: carregar 27 bytes de dados históricos para sincronizar em 0:00:00.003

EK 0 10:57:06.248 Core 1 EURUSD: história sincronizada de 2019.01.02 a 2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1: cache histórico alocado para 628432 barras e contém 619175 barras de 2019.01.02 06:00 a 2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1: a história começa a partir de 2019.01.02 06:00

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): OHLC bar states generating. OnTick execução na barra começa apenas

JM 0 10:57:06.248 Core 1 EURUSD,M1: teste de especialistas\GRAAL.ex5 de 2020.09.01 00:00 até 2020.09.10 00:00 começou com insumos:

LS 0 10:57:06.248 Core 1 StopLoss=30

PL 0 10:57:06.248 Core 1 TakeProfit=100

FJ 0 10:57:06.248 Core 1 Lote=0,1

DP 0 10:57:06.248 Core 1 balanço final 10000.00 pips

EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 carrapatos, 10068 barras geradas. Ambiente sincronizado às 0:00:00.031. Teste aprovado em 0:00:00.247 (incluindo pré-processamento de carrapatos 0:00:00.016).

DE 0 10:57:06.248 Core 1 EURUSD,M1: tempo total desde o login até a interrupção dos testes 0:00:00.278 (incluindo 0:00:00.031 para sincronização dos dados do histórico)

NQ 0 10:57:06.248 Core 1 272 Mb de memória utilizada incluindo 36 Mb de dados históricos, 64 Mb de dados de tick

KE 0 10:57:06.248 Core 1 log file "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" escrito

OS 0 10:57:06.260 Núcleo 1 conexão fechada


 
Denis Diakonov:

Por favor, avise!

Por que o tempo do servidor não é atualizado quando novos tiquetaques chegam?

No momento em que a EA começa, tudo funciona como deveria, mas depois o tempo passa, mas o novo valor do minuto atual não entra na variável.

Ou seja, o Expert Advisor trabalha dependendo do número obtido na variável int M = TimeMinute(TimeCurrent());

Na verdade, esta linha de código é da referência e não funciona.

Por exemplo, eu o inicio às 12-o tempoatual retornado pelo servidor corresponde ao tempo na variável, mas então a variável permanece às 12, embora já esteja de 15-20 minutos no relógio

O código é completamente melhor, mais precisamente onde você cria a função e em qual função (OnInit, OnTick, OnTime) obtém o valor dos minutos e chama a função de impressão. Se no OnInit ou fora dos campos de função do terminal, é assim que deve ser. Se no OnTick, ele imprimirá em cada tick e atualizará o valor com um novo minuto.

 

Exemplo claro de tempo de servidor e valor variável

Valeriy Yastremskiy:

O código é completamente melhor, ou melhor, onde você cria a função e em qual função (OnInit, OnTick, OnTime) você obtém o valor dos minutos e chama a função de impressão. Se no OnInit ou fora dos campos de função do terminal, é assim que deve ser. Se no OnTick, ele imprimirá em cada tick e atualizará o valor com um novo minuto.

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

Bem, aqui está o código completo. Na função OnTick() vazia é acionada logo no início pela primeira linha a ser executada.

Ele é acionado somente no momento da recompilação ou anexado ao campo de programação/apagamento/apagamento. Durante o restante do tempo, a variável M detém o valor do minuto obtido durante a primeira execução da EA.

 
Denis Diakonov:

Bem, há todo um código aqui, é tudo o que há para isso. O OnTick() vazio é acionado logo no início pela primeira linha a ser executada.

Ele é acionado somente no momento da recompilação ou da junção ao campo gráfico/deleção/ . Durante o restante do tempo, a variável M detém o valor do minuto obtido durante a primeira execução da EA.

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

Entendi, obrigado!

Eu deveria ter

int M = TimeMinute(TimeCurrent());

colocá-lo no corpo da função, e não na frente dele, atribuindo-lhe o valor M

 
Denis Diakonov:

Entendi, obrigado!

Eu deveria ter

colocá-lo no corpo da função, em vez de atribuir o valor M antes dele.

Você pode fazer isso de diferentes maneiras. Leia as variáveis globais e locais e sua visibilidade.

 

Boa tarde. Tentando obter o ângulo da linha de tendência a partir do ângulo. Aqui está o código:

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

ângulo é sempre 0. Independentemente do uso de métodos de biblioteca padrão ou funções incorporadas. Ao mesmo tempo, a linha é traçada. O que está errado? Como obter o ângulo?

 
leonerd:

Boa tarde. Tentando obter o ângulo da linha de tendência a partir do ângulo. Aqui está o código:

ângulo é sempre 0. Independentemente do uso de métodos de biblioteca padrão ou funções incorporadas. Ao mesmo tempo, a linha é traçada. O que está errado? Como faço para obter o ângulo?

https://www.mql5.com/ru/forum/103591

Estou vendo, mas como você calcula o ângulo?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

Estou vendo, mas como você calcula o ângulo?

Você é um comediante.

Quem eu estou enganando?

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de novatos sobre MQL4 e MQL5, qualquer ajuda e discussão de algoritmos e códigos

Nikolai Semko, 2020.10.26 00:34

Você não deve ter medo da velocidade. É apenas uma condicionalidade para a conversão do tipo.
Como uma variante da função de definição de ângulos:

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

Depois do MT5, a sensação do MT4 é simplesmente horrível. O acesso ao histórico é de alguma forma emasculado. Não estou nem mesmo falando dos carrapatos.




 

Você pode me dizer se esta seleção de fonte é possível no indicador?