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

 
Игорь:
Olá !
Você pode me dizer como repintar as barras sem usar modelos em mt4 !??
Ou como aplicar um esquema de cores !?
Tabela domenu de contexto, propriedades, cores - você já tentou isso?
 
Ihor Herasko:

Vou simplificar um pouco a resposta para evitar confusão. O sinal (&) indica que o argumento da função pode mudar seu valor no momento da execução e voltará para de onde a função foi chamada com um valor diferente. No caso em questão, a função SaveOrder pode alterar o conteúdo das variáveis g_arrstBuyOrderInfo e g_arrstSellOrderInfo, assim como as variáveis g_nBuyOrdersCnt e g_nSellOrdersCnt.

Obrigado. Torna-se um pouco mais claro. Só não está claro como tudo isso pode ser descoberto sem se referir ao fórum. Eu não encontrei tais explicações nos tutoriais.

Por favor, me dê mais alguns conselhos:

1) O compilador escreve - 'g_nBuyOrdersCnt' - declaração sem tipo ; 'g_nSellOrdersCnt' - declaração sem tipo. Estou correto ao assumir que o g_nBuyOrdersCnt e o g_nSellOrdersCnt devem ser declarados globalmente para evitar um erro do compilador?

2) Compilador:'para' - não são permitidas expressões em um escopo global. Não está claro aqui.

3) Na funçãoSaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) vazia, o compilador escreve: a declaração de 'arrstOrderInfo' esconde a declaração global. ver declaração anterior de 'arrstOrderInfo'. Também não está muito claro.

4) 'nOrderCnt' é um identificador não declarado. Por que não é declarado em nenhum lugar?

E uma última coisa: eu ainda não entendo de onde vêm.n e.f e o que são.




 
Игорь:

Olá !

Você pode me dizer como repintar as barras sem usar modelos em mt4 !??

Ou como aplicar um esquema de cores !???

Se programática, veja as funções ChartSetInteger() e ChartGetInteger().

 
novichok2018:

Obrigado. Está começando a fazer um pouco mais de sentido. Só não está claro como você pode descobrir tudo isso sem se referir a um fórum. Eu não consegui encontrar tais explicações nos livros didáticos.

Por favor, me dê mais alguns conselhos:

1) O compilador escreve - 'g_nBuyOrdersCnt' - declaração sem tipo ; 'g_nSellOrdersCnt' - declaração sem tipo. Estou correto ao assumir que o g_nBuyOrdersCnt e o g_nSellOrdersCnt devem ser declarados globalmente para evitar um erro do compilador?

2) Compilador:'para' - não são permitidas expressões em um escopo global. Não está claro aqui.

3) Na funçãoSaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt) vazia, o compilador escreve: a declaração de 'arrstOrderInfo' esconde a declaração global. ver declaração anterior de 'arrstOrderInfo'. Também não está muito claro.

4) 'nOrderCnt' é um identificador não declarado. Por que não é declarado em nenhum lugar?

Veja como tudo deve estar no código se você olhar para o código como um todo:

#property strict

input       int i_nMagicNumber = 12876;

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

int         g_nBuyOrdersCnt, 
            g_nSellOrdersCnt;

OrderInfo   g_arrstBuyOrderInfo[MAX_ORDERS_CNT], 
            g_arrstSellOrderInfo[MAX_ORDERS_CNT];

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                                                                                                    |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   return INIT_SUCCEEDED;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert deinitialization function                                                                                                                                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                                                                                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick()
{
    FindOrders();
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Fills the orders arrays                                                                                                                                                                           |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void FindOrders()
{
   g_nBuyOrdersCnt = 0;
   g_nSellOrdersCnt = 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 (OrderType() == OP_BUY)
         SaveOrderInfo(g_arrstBuyOrderInfo, g_nBuyOrdersCnt);
      if (OrderType() == OP_SELL)
         SaveOrderInfo(g_arrstSellOrderInfo, g_nSellOrdersCnt);
   }
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Saves one selected order in the specified array                                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt)
{
   if (nOrdersCnt >= MAX_ORDERS_CNT)
      return;

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

   ++nOrdersCnt;
}
 
novichok2018:

Uma última coisa: eu ainda não entendo de onde vêm.n e.f e o que são.

O operador "ponto" indica o acesso a um membro de uma estrutura ou classe. Neste caso, trata-se de uma estrutura.

As letras n e f são uma forma de especificar o tipo de dados armazenados em uma variável. Afinal, com um grande número de variáveis, é impossível lembrar o tipo de cada uma delas. E se em um nome de uma variável houver uma indicação de seu tipo, a necessidade de lembrar desaparece por si só. n é um sinal de um número inteiro (de Numérico), f é um número real (de float - número de ponto flutuante). Esta forma de escrever nomes de variáveis é chamada de notação húngara.

 
Ihor Herasko:

O operador de ponto indica o acesso a um membro de uma estrutura ou classe. Neste caso, uma estrutura.

As letras n e f são uma forma de especificar o tipo de dados que são armazenados em uma variável. Afinal, com um grande número de variáveis, é impossível lembrar o tipo de cada uma delas. E se em um nome de uma variável houver uma indicação de seu tipo, a necessidade de lembrar desaparece por si só. n é um sinal de um número inteiro (de Numérico), f é um número real (de float - número de ponto flutuante). Esta forma de notação de nomes variáveis é chamada de notação húngara.

Aí está!!! Afinal,g_ eg_n não são apenas uma abreviação, mas prefixos que dizem que são variáveis inteiras globais e globais!!! Ugh... E não consegui perceber porque estes traços em designações variáveis. Como é possível para um iniciante, que não está familiarizado com tais sutilezas, escrever código usando arrays, estruturas, etc.? Pensei que minha estratégia simples poderia ser escrita em linguagem simples, sem mergulhar na selva.

Você poderia me dar um link para um tutorial detalhado (estendido) sobre o mcl4 para estudar junto com seus conselhos?

E você poderia escrever o código acima sem usar a notação húngara para comparação? Você tem certeza de que a plataforma MT4 o entende claramente?


E uma pergunta sobre o código: para que é acontinuação; para que?

for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
Se uma ordem não for selecionada na primeira iteração, então ela não será selecionada nas iterações subseqüentes e o ciclo continuará indefinidamente? Porque o número de pedidos não muda. Não seria mais corretoromper com uma mensagem de erro?
 
STARIJ:
Contextos gráficos do menu, propriedades, cores - você já tentou isso?

Obrigado, eu já encontrei!!!

 
Ihor Herasko:

Se programática, veja as funções ChartSetInteger() e ChartGetInteger().

Obrigado por encontrá-lo já com sua ajuda!!!

 
novichok2018:

Aí está!!! Afinal,g_ eg_n não são apenas uma abreviação, mas prefixos que dizem que são variáveis globais e inteiras globais!!! Ugh... E não consegui perceber porque estes traços em designações variáveis. Como é possível para um iniciante, que não está familiarizado com tais sutilezas, escrever código usando arrays, estruturas, etc.? Pensei que minha estratégia simples poderia ser escrita em linguagem simples, sem mergulhar na selva.

Para fazer algo, temos que mergulhar nas sutilezas. Não há outra maneira.

Você poderia me dar um link para um tutorial detalhado (estendido) sobre o mcl4 para estudar junto com seus conselhos?

Conheço apenas um livro sobre MQL4 - o de Sergey Kovalev.

E você poderia escrever o código acima sem usar a notação húngara para comparação? Você tem certeza de que a plataforma MT4 o entende claramente?

Acostume-se a uma formatação de código apropriada de uma só vez )) A notação húngara foi inventada por programadores bastante experientes.

E uma pergunta sobre o código: para que é acontinuação; para que?

Então, se uma ordem não for selecionada na primeira iteração, ela não será selecionada nas próximas e o laço irá para o infinito? Porque o número de pedidos não muda. Não seria mais corretoromper com uma mensagem de erro?

Se não selecionamos uma ordem, isso não significa que não poderemos selecionar a próxima ordem. Portanto, é razoável continuar o ciclo.

Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
В настоящее время персональный компьютер стал незаменимым помощником в жизни каждого человека. Благодаря развитию Интернета и увеличению мощности современных компьютеров открылись новые возможности во многих областях деятельности. Ещё десять лет назад торговля на финансовых рынках была доступна только банкам и узкому кругу специалистов. Сегодня...
 
Ihor Herasko:

A não seleção de uma ordem não significa que a próxima ordem não possa ser selecionada. Portanto, é razoável continuar o ciclo.

E não há necessidade de exibir uma mensagem de erro? Seria provavelmente útil saber por que uma ordem não é encontrada e como evitá-la?