Minha abordagem. O núcleo é o motor. - página 92

 
Maxim Kuznetsov:

Os únicos e únicos GlobalVariables e arquivos para troca de dados entre EAs, indicadores e scripts são

Todos os 4 pontos acima são "hacks" locais por falta de peixe. Todos os 4 pontos acima usam mecanismos não projetados para o intercâmbio de dados arbitrários, muito menos conjuntos de dados.

Você pensaria que a GlobalVariables foi projetada especificamente para o envio de mensagens. Isso é uma coisa tola de se dizer. Na verdade, é o mesmo hack que qualquer outro item.

 
fxsaber:


...Grosso modo,um ciclo completo de leitura/escrita através de um recurso corre a uma taxa de 4 milhões de ticks por segundo.

A leitura/escrita ao recurso é muito rápida. Mas até que ponto isto é adequado para tal transmissão:

1. Linha A. Evento Temporizador. Coletar todos os valores de parâmetros que foram alterados no evento e traduzi-los em uma cadeia. Traduzir cadeia para Char, escrever para recurso. Enviar mensagem para o lado B.

2. Festa B. O evento OnChartEvent(), recebeu um sinal sobre a mensagem, abriu o recurso, leu-o, preencheu o kernel de parâmetros com novos valores, redesenhou os elementos necessários.

E se este evento for executado continuamente, na freqüência do temporizador?

A questão é como melhor utilizar os recursos para isso, se houver outras opções.

//---------------------------------------------------------------------------------------------------------------------

  • A opção EventChartCustom() tem dois inconvenientes.

  1. O pacote se torna na fila de eventos.
  2. O pacote não pode ter mais de 127 caracteres. Consequentemente, uma mensagem de 1000 caracteres tem que ser dividida e depois remontada. E cada parte da mensagem estará na fila do evento.
  • A variante com passagem por objetos gráficos, requer a divisão da mensagem em pacotes de 64 caracteres, escrevendo-os em descrições de objetos e depois remontando-os. É interessante que esta variante é a mais rápida, mas à medida que o comprimento da corda aumenta, sua velocidade diminui. Ou seja, cada chamada para ObjectSetString() leva 3 microssegundos. Mas se uma cadeia tem 1000 caracteres, precisamos dividi-la em 64 caracteres, o que significa que precisamos chamar ObjectSetString() cerca de 8 vezes. 8*3 = 24 ms. Depois, leva o mesmo tempo para montar o cordel. É por isso que se a corda tivesse 10 000 caracteres, este método se aproximaria definitivamente da velocidade do método de trabalho através dos recursos. (Estou falando de tempo de economia e leitura do recurso + transferência de cordas para uint e de volta).
A variante de recursos permanece sem testes até o final. Vou testá-lo no testador hoje e ficará finalmente claro se pode ser universal.
 
Реter Konow:

E se este evento for executado continuamente, na freqüência do temporizador?

A questão é como melhor utilizar os recursos para isso, se houver outras opções.

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

Intercâmbio de dados entre programas

fxsaber, 2018.11.21 13:12

Provavelmente, há muito tempo para descrever em tais detalhes as várias opções de interações. Infelizmente, eu não possuo tal recurso.

Aqui está um artigo sobre o assunto onde está ocorrendo uma interação completa. Cada edifício é construído a partir de tijolos e para tarefas específicas. Todos os tijolos possíveis são mostrados no início da linha. O resto é com o construtor.

 
fxsaber:

O artigo não testa a comunicação de dois programas através de recursos, um dos quais está no testador.

 

Qual é o problema com o sindicato? Por favor, um exemplo:

union UZ{
   double d;
   int i[2];
};

void OnStart(){

   UZ u1;
   UZ u2;
   
   u1.d=12345.678;
   
   ArrayCopy(u2.i,u1.i);
   
   Alert(u2.d);

}
 
Реter Konow:

O artigo não testa a comunicação de dois programas através de recursos, um dos quais está no testador.

Leia a frase sobre tijolos.

 
fxsaber:

...

Este artigo está disparando um canhão contra pardais. Como muitos artigos. Prefiro resolver o problema eu mesmo do que entender o artigo.

Tudo pode ser feito 10 vezes mais fácil e claro. Mas o artigo é muito mais fácil...


E de que serve o artigo se você diz não ter verificado o funcionamento dos recursos no testador?

 
Реter Konow:

E de que serve este artigo se você diz não ter verificado a operação de recursos no testador?

Saiu da discussão.

 

Há algo de errado com esta solução. Talvez eu esteja fazendo algo errado.

Para ser breve:

A função StringToCharArray() leva SOMENTE um conjunto de caracteres.

A função ResourceCreate() aceita SOMENTE um array uint.

Portanto, é necessário reescrever o conteúdo da matriz de caracteres (preenchido com o fio convertido), para a matriz de caracteres uint.

 
//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //----------------------------------------------
   ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   uchar Arr[];
   uint  Data[];
   //---------------------------
   string price = (string)Bid;
   //---------------------------
   int width = StringToCharArray(price,Arr);
   //---------------------------
   ArrayResize(Data,width);
   //---------------------------
   ArrayCopy(Arr,Data);
   //---------------------------
   if(!ResourceCreate("::Resource",Data,width,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //---------------------------
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+

Indicador em um gráfico normal:

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(25); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   uint Data[50],width,height;
   //-----------------------------
   if(!ResourceReadImage("::Resource",Data,width,height))Print("Failed to read resource!");
   else Print("Resource is readable!");
   //-----------------------------
   
  }
//+------------------------------------------------------------------+