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

 
deathmond1990:
Olá. A questão é: podemos carregar os valores dos carrapatos (os preços correspondentes) para um determinado período comercial (ou seja, para uma única vela) em uma matriz unidimensional? E fazê-lo de tal forma que a matriz seja formada durante a formação de uma vela. É realista na MQL4? Gostaria de receber seu feedback.


É real. Uma matriz dinâmica e ir.

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


Realisticamente. Uma matriz dinâmica e pronta para uso.

Muito obrigado =)
 
Saudações, senhores! Não quero que isto seja uma inundação, mas não posso passar sem esta função. Então pessoal, alguém pode me ajudar com esta função que passa por todos os pedidos e elimina dois pedidos ao mesmo tempo, aquele com o menor lote e lucro negativo, e aquele com o maior lote e lucro positivo.
 
Arseniy Barudkin:
Saudações, senhores! Não quero que isto seja uma inundação, mas não posso passar sem esta função. Então pessoal, alguém pode me ajudar com esta função que passa por todos os pedidos e elimina dois pedidos ao mesmo tempo, aquele com o menor lote e lucro negativo, e aquele com o maior lote e lucro positivo, também dos pedidos existentes.

Tente pesquisarOrderCloseBy
 

Como fazer para que os dados de todas as variáveis globais sejam salvos mesmo após o fechamento do terminal em modo normal e anormal?

A questão diz respeito a variáveis declaradas no início do código como esta:

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

Não preciso perder valores de VAR1 e VAR2 (a matriz é preenchida com dados durante a operação do Expert Advisor). Até agora, a única idéia é escrever os dados em um arquivo (global.txt) a cada tick e depois, quando o terminal é lançado, ler do arquivo (global.txt) e recriar as variáveis e depois escrevê-las novamente a cada tick. Que outras opções existem?

 
smart_man:

Como assegurar que os dados de todas as variáveis globais sejam preservados mesmo após o terminal do cliente ser fechado nos modos normal e anormal?

A questão diz respeito a variáveis declaradas desta forma:

extern double  VAR1 = 1;

double VAR2[1000];

Não preciso perder valores de VAR1 e VAR2 (a matriz é preenchida com dados durante a operação do Expert Advisor). Até agora, a única idéia é escrever os dados em um arquivo (global.txt) a cada tick e depois, quando o terminal é lançado, ler do arquivo (global.txt) e recriar as variáveis e depois escrevê-las novamente a cada tick. Que outras opções existem?

Opção

Variáveis globais do terminal do cliente

//--------

Não confundir com variáveis declaradas globalmente

 
fxtz:

Pergunta Posso escrever um programa no Metatrader 4 para abrir de 2 a 250 posições de minha escolha com um conjunto de perdas e lucro definido em um clique? Eu não preciso abrir um manualmente


Você já encontrou uma corretora onde pode abrir tantos pedidos para um único instrumento? Normalmente 100 pedidos é um limite para todos os instrumentos...

E sim, eu poderia abrir 100.

 
Alekseu Fedotov:

Tente pesquisarOrderCloseBy

Obrigado! Mas eu tenho que selecionar os bilhetes destes pedidos de pelo menos 3 pedidos, muitas vezes há mais de 5 a 10 pedidos, tenho que calcular e comparar lotes e lucros destes pedidos separadamente?

 
Arseniy Barudkin: Temos que selecionar os cartuchos dos pedidos, então por que devemos calcular e comparar os lotes e os lucros desses pedidos separadamente?

A situação é muito pior do que você imagina. Apenas um pedido, selecionado por OrderSelect(), está disponível a qualquer momento. E quando a primeira encomenda é selecionada, com o que devemos compará-la? Os caras espertos realmente fazem algo assim

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
Então veja o valor dos ingressos encontrados - de repente eles são zero!!!
 
STARIJ:

A situação é muito pior do que você imagina. Apenas um pedido, selecionado por OrderSelect(), está disponível a qualquer momento. E quando a primeira encomenda é selecionada, com o que devemos compará-la? Os caras espertos realmente fazem algo assim

Então veja o valor dos ingressos encontrados - de repente eles são zero!!!

Obrigado pela ajuda! Até agora deixei as coisas assim, agora decidi mudar um pouco as condições sob as quais a função é chamada. E em geral, você tem me ajudado muito))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}
Razão: