[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 511

 
hoz:

¿Cómo podría ser si no? ¿Hay que calcular lo mismo una y otra vez 100 veces?

Haz que la señal forme parte del experto, como en el libro de texto, ¡y serás feliz!

Te he dado todos los enlaces en el hilo anterior...


 
hoz:

¿Cómo podría ser si no? ¿Hay que calcular lo mismo 100 veces?
La idea es CORRECTA, la ejecución es CRUZADA. :)))
 

Bueno, aquí no hay ejemplos concretos:

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

Se escribe en la parte superior donde están los parámetros de la función como la mía, es decir, & después del tipo de datos.

 
hoz:

Bueno, aquí no hay ejemplos concretos:

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

Se escribe en la parte superior donde están los parámetros de la función como la mía, es decir, & después del tipo de datos.

Tal vez se compile así:

//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
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);
}

aunque la estructura del código es un poco "zurda"...

 
TarasBY:

Tal vez se compile así:

aunque la estructura del código es un poco "zurda"...


Bueno... fui yo quien lo escribió. Canta la primera cucharada. :)
 

Reescribí un poco al experto. Esto es lo que salió:

//+------------------------------------------------------------------+
//|                                                       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);
}

 

Por cierto, el error:

'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)

ocurre exactamente en la función deinicio estas variables no están definidas, no en otro lugar. Entonces, ¿hay que añadir algo para empezar?

 
hoz:

Por cierto, el error:

ocurre exactamente en la función deinicio estas variables no están definidas, no en otro lugar. Entonces, ¿hay que añadir algo para empezar?

Deben definirse en start() y pasarse a la función llamada por referencia.
 
Reshetov:
Deben ser definidos en start() y pasados por referencia a la función que llamamos.


Esta es la forma más sencilla. Pero estoy viendo artículos escritos por un programador y no hay nada definido en la función start() en absoluto.

Aquí hay un enlace a su asesor:

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

En particular, me interesa mucho cómo escribe el código de forma inteligente. Por lo tanto, quiero aprender a escribir todo en funciones separadas, y añadir sólo lo esencial paraempezar sin declarar variables allí.

Si pasamos una variable por referencia a una función, estamos trabajando con un buffer de la variable original, no con su doble por separado. Esto significa que no importa en qué función lo hayamos declarado previamente. ¿No es así?

 
hoz:


Esta es la variante más sencilla. Pero estoy observando artículos escritos por un programador y no se declara nada en su función de inicio en absoluto.

Puedes declarar una variable estática fuera de las funciones y entonces no tendrás que pasar nada por referencias en absoluto.

hoz:

Si pasamos una variable por referencia a una función, estamos trabajando con un buffer de la propia variable inicial que pasamos en lugar de su duplicado por separado. Esto significa que no importa en qué función lo hayamos declarado previamente. ¿No es así?

No estás pensando correctamente. Si pasas una variable como argumento a una función, no tienes que declararla al cuerpo de la función - ya está declarada en el argumento. Debe declarar la función desde la que se pasa.
 
hoz:


Esta es la forma más fácil. Pero estoy viendo artículos de un programador y en su función de inicio no se declara nada en absoluto.

Aquí hay un enlace a su asesor:

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

En particular, me interesa mucho cómo escribe el código de forma inteligente. Así que quiero aprender a escribir todo en funciones separadas, y añadir sólo lo esencial paraempezar sin declarar variables allí.

Si pasamos una variable por referencia a una función, estamos trabajando con un buffer de la variable original, no con su doble por separado. Esto significa que no importa en qué función lo hayamos declarado previamente. ¿No es así?


También escribió inteligentemente

leer

Sí, cambia la línea

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

a

if(!GetPriceToInput (signal))