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

 
-Aleks-:

Você pode me mostrar na minha função como fazer isso? Estou realmente lutando para entendê-lo.


Você tem que decidir quais variáveis da função que você precisa (para o programa principal) e passá-las/devolvê-las. Se você precisar de Todos, então declare estas variáveis no início do programa e elas serão visíveis para todas as funções de uma só vez.
 
-Aleks-:

Não pense "por que", é melhor pensar "como".

Eu disse que não se aplica a esta função...

Tais funções são grandes, como regra, por isso é uma pena chamá-las para execução várias vezes a fim de obter valores diferentes, mas eu quero obter todos os resultados de uma só vez.

Bem, por exemplo, quero obter de uma só vez o número de todos os lotes e o número de todos os pedidos discriminados por tipo de pedido.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
double n_Lot_BUY;
double n_Lot_SELL;
int n_Order_BUY;
int n_Order_SELL;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
   F();
   Print("Лотов BUY:",n_Lot_BUY,"   Лотов SELL:",n_Lot_SELL,"   Позиций BUY:",n_Order_BUY,"   Позиций SELL:",n_Order_SELL);
  }
//+------------------------------------------------------------------+
void F()
  {
   n_Lot_BUY=0;
   n_Lot_SELL=0;
   n_Order_BUY=0;
   n_Order_SELL=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)){break;}
      if(OrderType()==0)
        {
         n_Order_BUY++;
         n_Lot_BUY=n_Lot_BUY+OrderLots();
        }
      if(OrderType()==1)
        {
         n_Order_SELL++;
         n_Lot_SELL=n_Lot_SELL+OrderLots();
        }
     }
  }
//+------------------------------------------------------------------+
 
Nikolay Gaylis:

A idéia é declarar antecipadamente todas as variáveis e depois modificá-las através de uma função - entendi, obrigado pela opção. Mas, nem sempre é conveniente, se uma e o mesmo nome de variável for usado para o mesmo tipo de variáveis... nenhuma outra opção?
 

os mesmos tipos podem ser combinados em uma estrutura e declarados como uma matriz, como sugerido acima)

//структура из переменных
struct OrdStruct
   {
   double tp;
   double sl;
   double open;
   double close;
   double lot;
   datetime time_open; 
   datetime time_close;
   };

//массив структур
OrdStruct ORDERS[];


//обращение к переменным
ORDERS[i].sl=OrderStopLoss();
ORDERS[i].tp=OrderTakeProfit();
ORDERS[i].lot=OrderLots();

//или
ORDERS[i]=ORDERS[i+1];

ZeroMemory(ORDERS[i]);
 
Taras Slobodyanik:

Os mesmos tipos podem ser combinados em uma estrutura e declarados como uma matriz, como sugerido acima)

Isto já é difícil de entender... por exemplo, não consigo entender i - ao que é igual e, não deveria ser dado um tamanho à matriz de ORDENS[i]=?

 
-Aleks-:

Isto já é difícil de entender... por exemplo, não consigo entender i - o que é igual e, não deveria o ORDENS[i]= matriz ser dimensionada?


Este é apenas um exemplo, é claro que eu preciso ser especificado e o tamanho da matriz precisa ser ajustado de acordo com o número de pedidos...

ou seja, as variáveis são mais ou menos as mesmas tp / sl / lote ... mas o índice da matriz i muda

 
-Aleks-:

Dói-me ver sua angústia... Você está em um fórum técnico, use a lógica, por favor.

1 Descreva o problema;

Descreva as variáveis que você está usando;

Descreva o que você quer obter como resultado;

Aprenda a expressar suas idéias em uma linguagem técnica em um fórum técnico. Caso contrário, levará um longo tempo para adivinhar aqui.

 
Taras Slobodyanik:


Isto é, por exemplo, claro que preciso especificar e definir o tamanho da matriz, dependendo do número de pedidos...

ou seja, as variáveis são mais ou menos as mesmas tp / sl / lote ... mas o índice da matriz i muda

Sim, eu consegui, obrigado, eu deveria tentar usá-lo no futuro, em algum lugar.... Eu simplesmente não entendo, e trabalhar com esta estrutura como uma matriz? Classificar e realizar outras operações padrão?

 
Alexey Kozitsyn:

Dói-me ver sua angústia... Você está em um fórum técnico, use a lógica, por favor.

1. descrever o problema;

Descreva as variáveis que você está usando;

Descreva o que você quer obter como resultado;

Aprenda a expressar suas idéias em uma linguagem técnica em um fórum técnico. Caso contrário, levará um longo tempo para adivinhar aqui.

Por favor, escreva onde não há lógica em minhas palavras...

O tormento de saber é o prazer de resolver.

Eu não queria derramar meu problema, então mantive-o simples - acho difícil adivinhar o que causou a dificuldade de perceber... Desculpe se eu o fiz sentir desconfortável com meu "tormento".

 
-Aleks-:

Ou seja, a idéia é declarar antecipadamente todas as variáveis e depois alterá-las através de uma função - entendi, obrigado pela variante. Mas, nem sempre é conveniente se uma e o mesmo nome de variável for usado para o mesmo tipo de variáveis... nenhuma outra opção?

Leia com atenção aqui e você verá o que está acontecendo. Isto descreve a primeira opção, que foi proposta, parâmetro passando por referência.

Simplificando, quando uma função é chamada, a variável pode ser passada por parâmetro.

double FirstMethod(int i,int j)

ou por referência se o nome da variável for precedido por um sinal &.

double SecondMethod(int &i,int &j)

Na segunda variante, as variáveis passadas para a função por referência serão alteradas juntamente com as variáveis que têm até mesmo nomes diferentes. No caso especial, estas são as variáveis i e j

Tudo o mais está suficientemente claro a partir do texto de ajuda.

Передача параметров - Функции - Основы языка - Справочник MQL4
Передача параметров - Функции - Основы языка - Справочник MQL4
  • docs.mql4.com
Передача параметров - Функции - Основы языка - Справочник MQL4