Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 121

 
Ihor Herasko:

Escreva pelo menos um bloco e mostre-o. O próximo passo é sugerir isso aqui.

Em matrizes: aqui declarei 4 matrizes em nível global:

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Depois os zerei na função de abertura de posição:

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

Como preenchê-los agora? No exemplo com o qual estou tentando fazer isso, uma variável adicional é aplicada, mas eu não entendo como usá-la:

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

Embora não esteja bem claro porque preciso de todas estas matrizes quando posso obter os valores do bilhete, tipo de posição, preço aberto e tempo aberto com a função correspondente.

 
novichok2018:

Em matrizes: aqui declarei 4 matrizes em nível global:

Em seguida, eu os zerei na função de abertura de posição:

Como preenchê-los agora? O exemplo que estou tentando usar aplica uma variável adicional, mas eu não entendo como usá-la:

Embora não esteja bem claro por que todas estas matrizes, quando consigo obter os valores do bilhete, tipo de posição, preço aberto e tempo aberto com a função correspondente.

Tente escrever a partir do zero, emitindo todos os dados intermediários usando Alert(. Por exemplo

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

E se você pegar o exemplo de alguém, pegue-o completamente e estude-o. Quem sabe o que o autor do exemplo está usando arrays para

 
novichok2018:

Em matrizes: aqui declarei 4 matrizes em nível global:

Use uma variedade de estruturas. O acesso será muito mais fácil. Aqui está uma variante com uma matriz estática. É mais fácil de entender. Mas eu mesmo utilizo matrizes dinâmicas. Mas o código vai ficar um pouco maior com eles.

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Depois os zerei na função de abertura de posição:

Não, você não o fez. Porque são declaradas matrizes dinâmicas que têm tamanho zero por padrão. Portanto, neste caso, estas quatro linhas de código não fazem nada.

Agora, como preenchê-los? O exemplo que estou tentando usar tem uma variável adicional, mas eu não entendo como usá-la:

A seguir - um ciclo de pedidos é organizado, no qual cada "próprio" pedido é armazenado em uma matriz:

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

Embora, não tenho bem certeza para que servem todas essas matrizes, quando posso obter os valores do bilhete, tipo de posição, preço aberto e tempo aberto usando a função correspondente.

É muito mais rápido e conveniente trabalhar com matrizes, uma vez que, em geral, nem todas as ordens presentes na conta precisam ser processadas por esta EA em particular. E como resultado, economizaremos muito esforço e dinheiro.

Além disso, eu mencionei acima é um caso geral. O universalismo nem sempre é necessário, é claro. Normalmente, tais matrizes são criadas com base nas exigências de uma estratégia. Por exemplo, podemos dividir os pedidos por tipo imediatamente: Comprar, Vender, ComprarStop, VenderStop, ComprarLimit, VenderLimit. Então, precisaremos de quatro matrizes desse tipo. Mas então não precisaremos passar por toda a lista de pedidos abertos novamente quando tomarmos decisões comerciais. Só precisamos saber o número de pedidos de um determinado tipo e consultar a matriz necessária.

Há mais uma coisa importante a considerar: mudar o conjunto de pedidos durante o processamento de um tick. Pode muito bem acontecer que uma lista de pedidos tenha sido recebida na entrada da OnTick, e outra em algum lugar no meio. Isto levará a um erro na operação do programa que é difícil de ser capturado. E o conjunto de ordens que já foi formado ao entrar no OnTick não mudará (a menos, é claro, que você mesmo mude durante a execução do programa).

 
STARIJ:

string s=FileReadString(F1); // Ler string do arquivo de texto
StringSplit(s, ","," , a); // Elementos de corda separados por vírgula em uma matriz
datatime T1=StrToTime(a[4]); // Além disso, a transformação ...
int ord=StrToInteger(a[8]);
double Price=StrToDouble(a[12]);

Obrigado, exatamente o que eu queria.



A seguir, há 5 produtos fabricados

Lançamos uma leitura de alerta (qualquer)

por exemplo, nível "200".

Quando o alerta dispara, algo abre a pose, algo se apaga, algo faz outras coisas. Quero implementar um mecanismo para dar um sinal desta forma


Z.U.

Terminei o que eu queria, posso enviá-lo para revisão. Galpões perfeitamente. Mas é proibido afixar aqui.

 
Ihor Herasko:

Por exemplo, é possível dividir os pedidos por tipo de uma só vez: Compra, Venda, BuyStop, SellStop, BuyLimit, SellLimit. Então, precisaremos de quatro matrizes desse tipo. Mas então não precisaremos passar por toda a lista de pedidos abertos novamente quando tomarmos decisões comerciais. Só precisamos saber o número de pedidos de um determinado tipo e consultar a matriz necessária.

Isso é exatamente o que eu preciso, ou melhor, só paraComprar e Vender. O principal para minha estratégia simples é não deixar que as posições abertas interfiram umas com as outras para ver as condições de fechamento. Talvez, podemos prescindir de arrays? Eu não os entendo: como criá-los, como abordá-los - estou no escuro. Talvez minha situação se torne mais clara para você na captura de tela:

Parece que tudo no código é simples e funciona claramente, mas este é o único caso de incompreensão.

 
novichok2018:

Isto é exatamente o que eu preciso, ou melhor, apenas paraComprar e Vender. Para minha estratégia simples, o mais importante é que as posições abertas não interfiram nas condições de fechamento um do outro. Talvez possamos passar sem matrizes? Eu não os entendo: como criá-los, como abordá-los - estou no escuro. Talvez minha situação se torne mais clara para você na captura de tela:

Parece que tudo no código é simples e funciona claramente, mas este é o único caso de incompreensão.

Claro que, na mais simples (e média complexidade), é mais conveniente sem matrizes. E quando se chega ao ponto de usar centenas de pedidos, é muito mais fácil distinguir entre os pedidos. Por exemplo, de acordo com OrderType() - um para comprar 0, o outro para vender 1. A estratégia de seu comerciante é boa - você pode ganhar 1 dia ou perder metade de um dia. A única coisa que precisamos é de como pegar essas flechas. E eles são muito freqüentes. Faz sentido primeiro aprender a dar sinais: Comprar e Vender
 
LRA:
Naturalmente, na mais simples (e média complexidade) sem arrays é mais conveniente. Mas quando se chega ao ponto de usar centenas de pedidos - então...

Poderia ser a razão da minha situação que o registro escreve: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 e repete solidamente para

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alerta: Total de pedidos = 3 ? Na captura de tela você pode ver que este período captura duas condições de fechamento da VENDA.

E os sinais para abrir uma posição são acionados por uma combinação de vários indicadores e fechados por um indicador. E eles não trabalham com tanta freqüência: pode ficar em silêncio por alguns dias durante cinco minutos. Por exemplo, desde 1º de fevereiro deste ano, apenas 14 posições foram acionadas.


 
novichok2018:

Poderia ser a razão da minha situação que o registro escreve: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 e repete solidamente para

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alerta: Total de pedidos = 3 ? Na captura de tela você pode ver que este período captura duas condições próximas

Qual é a sua situação? Você está dizendo que o terminal está fazendo uma entrada de registro que está causando o erro? e o que significa 138 ? você sabe onde procurar? Como você conseguiu isso é um erro muito raro. O que você vê na imagem da tela é metade da batalha. Como explicar isto ao Consultor Especialista? Você tem que escrever alguma condição matemática - ao invés de ver a captura de tela, o Consultor Especialista opera com números

 
LRA:

Você está dizendo que o terminal faz uma entrada de registro, o que causa o erro? ... O que significa 138? Você sabe onde procurar?

Não, eu estou dizendo que o testador falha neste intervalo da história, o que impede que os sinais funcionem corretamente. Porque as solicitações não podem continuar por 24 horas.

 
novichok2018:

Não, o que eu quero dizer é que há uma falha no testador neste ponto da história, o que impede que os sinais funcionem corretamente. Porque as solicitações não podem continuar por 24 horas.

Exigências no testador? Essa é a primeira vez que ouço. O testador é o ideal - ele nem sequer tem escorregamento

...algo está chutando o indicador - tendência para cima. Vou comprar ... Entendi... Embora não seja suficiente eu queria mudar a TP para cima - já funcionou...

Então defina uma EA que, se ela fizer isso, então sairá e continuará no próximo tick. E experimente na demonstração

Razão: