[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 511

 
hoz:

De que outra forma poderia ser? Você tem que calcular a mesma coisa mais e mais de 100 vezes?

Faça do sinal parte do especialista, como no livro didático, e você ficará feliz!

Dei-lhe todos os elos do fio antes...


 
hoz:

De que outra forma poderia ser? Você tem que calcular a mesma coisa 100 vezes?
A idéia é DIREITA, a implementação é CROSS! :)))
 

Bem, não há exemplos concretos aqui:

https://docs.mql4.com/ru/basis/variables/formal

Está escrito na parte superior onde os parâmetros da função são como os meus, ou seja, & após o tipo de dados.

 
hoz:

Bem, não há exemplos concretos aqui:

https://docs.mql4.com/ru/basis/variables/formal

Está escrito no topo onde os parâmetros da função são como os meus, ou seja, & após o tipo de dados.

Talvez ela compila dessa forma:

//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
bool GetPriceToInput (int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);

    double deltaForSell = (firstBarClosed - secondBarClosed)/2;
    double priceForSell = secondBarClosed - deltaForSell;


    double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
    double priceForBuy = secondBarClosed + deltaForBuy;  
    return (Trade (signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!GetPriceToInput (signal))
      return(0);

  return(0);
}

embora a estrutura do código seja meio "canhoto".

 
TarasBY:

Talvez ela compila dessa forma:

embora a estrutura do código seja meio "canhoto".


Bem... Fui eu quem escreveu. Cante o primeiro furo. :)
 

Eu reescrevi um pouco o especialista. Isto é o que saiu:

//+------------------------------------------------------------------+
//|                                                       2 Days.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string    A1 = "Объем сделки. Если i_lots = 0, то считается в процентах";
extern double    i_lots = 0.1;
extern string    A2 = "Управление рисками";
extern double    i_sl = 15,
                 i_tp = 10;
extern int  slippage,
            price_b,
            price_a;

extern string    Z1 = "=== Прочие настройки ===";
extern string    i_openOrderSound = "ok.wav";
extern int       i_magicNumber = 400021;

double firstBarClosed,
       secondBarClosed;
 
// Идентификаторы типов сигналов
#define SIGNAL_BUY              1                     // Сигнал на покупку
#define SIGNAL_SELL            -1                     // Сигнал на продажу
#define SIGNAL_NO               0                     // Нет сигнала

#include <stderror.mqh>

//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int init()
{
   
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal, double& priceForBuy, double& priceForSell)
{
 // FindOrders();
  priceForBuy = NormalizeDouble(priceForBuy,Digits);
  priceForSell = NormalizeDouble(priceForSell,Digits);
  
  if (signal == SIGNAL_BUY)
     if (!OrderSend(Symbol(),OP_BUYLIMIT, i_lots,priceForBuy,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  if (signal == SIGNAL_SELL)
     if (!OrderSend(Symbol(),OP_SELLLIMIT,i_lots,priceForSell,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
double GetPriceToInput(int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);
    
  double deltaForSell = (firstBarClosed - secondBarClosed)/2;
  double priceForSell = secondBarClosed - deltaForSell;
    
//  return(priceForSell);

  
  double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
  double priceForBuy = secondBarClosed + deltaForBuy;  
  return(Trade(signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Генерация сигнала закрытия, покупки или продажи                                     |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
  if(firstBarClosed > secondBarClosed)
  return(SIGNAL_BUY);

  if(firstBarClosed < secondBarClosed)
  return(SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!Trade(signal, priceForBuy, priceForSell))
      return(0);

  return(0);
}

 

A propósito, o erro:

'priceForBuy' - variable not defined    E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 25)
'priceForSell' - variable not defined   E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 38)

ocorre exatamente na funçãoinicial, estas variáveis não estão definidas, não em outro lugar. Então algo precisa ser acrescentado para começar?

 
hoz:

A propósito, o erro:

ocorre exatamente na funçãoinicial, estas variáveis não estão definidas, não em outro lugar. Então algo precisa ser acrescentado para começar?

Eles devem ser definidos no início() e passados para a função chamada por referência.
 
Reshetov:
Eles devem ser definidos no início() e passados por referência à função que chamamos.


Esta é a maneira mais simples. Mas estou assistindo a artigos escritos por um programador e não há nada definido na função start().

Aqui está um link para seu conselheiro:

http://www.forextrade.ru/media/Image/MQLabs/181_ag/ChannelByMACross_Expert.mq4

Em particular, estou muito interessado em como ele escreve código de forma inteligente. Portanto, quero aprender a escrever tudo em funções separadas, e acrescentar apenas o essencial paracomeçar sem declarar variáveis lá.

Se passamos uma variável por referência para uma função, estamos trabalhando com um buffer da variável original, e não com seu duplo separado. Isto significa que não importa em que função o declaramos anteriormente. Não é?

 
hoz:


Esta é a variante mais simples. Mas estou observando artigos escritos por um programador e nada é declarado em sua função inicial.

Você pode declarar uma variável estática fora das funções e então você não terá que passar nada por referências.

hoz:

Se passamos uma variável por referência para uma função, estamos trabalhando com um buffer da própria variável inicial que passamos em vez de sua duplicata separada. Isto significa que não importa em que função o declaramos anteriormente. Não é?

Você não está pensando corretamente. Se você passar uma variável como argumento para uma função, você não precisa declará-la ao corpo da função - ela já está declarada no argumento. Você deve declarar a função de onde ela é passada.
 
hoz:


Esta é a maneira mais fácil. Mas estou observando artigos de um programador e nada é declarado em sua função inicial.

Aqui está um link para seu conselheiro:

http://www.forextrade.ru/media/Image/MQLabs/181_ag/ChannelByMACross_Expert.mq4

Em particular, estou muito interessado em como ele escreve código de forma inteligente. Portanto, quero aprender a escrever tudo em funções separadas, e acrescentar apenas o essencial paracomeçar sem declarar variáveis lá.

Se passamos uma variável por referência para uma função, estamos trabalhando com um buffer da variável original, e não com seu duplo separado. Isto significa que não importa em que função o declaramos anteriormente. Não é?


Ele também escreveu inteligentemente

leia

Sim, mudar a linha

if(!Trade(signal, priceForBuy, priceForSell))

para

if(!GetPriceToInput (signal))