[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 132

 
Roman.:

En mi opinión, no es complicado, pero es muy fácil de "dirigir" o enviar,

Bueno, ciertamente es más fácil "enviar" es decir, "mandar" que sugerir. Y de hecho, no he preguntado nada para meterme en un libro de texto. Escribió un duplicado en un lugar, es cierto, pero la esencia no cambia.

artmedia70:

Por último, dime exactamente lo que quieres hacer... Por ejemplo: MAK tal y tal está subiendo y está por encima de MAK tal y tal y el precio está en algún punto por debajo/por encima de MAK tal y tal y si es cierto, entonces coloca una orden pendiente a cierta distancia. Le daré un algoritmo aproximado. Porque es difícil dirigirte en la dirección correcta, cuando tus fragmentos de código están arrancados del contexto. Después de todo la tarea es para el quinto grado (exageradamente)



Aquí adjunto una versión de prueba del código y la publico también en mi post.

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

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
// Машечки
double fastMa,
       slowMa;
double pt;
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD);
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE);
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa + i_thresholdFromMa * pt) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником

       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
   
   if (ticket > 0)
 
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double fastMa, double slowMa)
{
   int ticket = -1;
   
   if ((fastMa - i_thresholdFromMa * pt) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
   
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(fastMa - i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0)
    
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy(fastMa, slowMa))             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell(fastMa, slowMa))           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)       // Если машки указывают вверх..
       if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
           return(SIGNAL_BUY);                       // ..функция возвращает сигнал покупки

   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)      // Если машки указывают вниз..
       if ( MathAbs(Bid - fastMa) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);                          // ..функция возвращает сигнал продажи
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,1);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,1);

// Отслеживание открытия нового бара
   static datetime lastBarTime = 0;    // Время проведения последних рассчётов
   
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

Las condiciones dicen claramente que el precio de la orden está por encima (debajo) de la MA+(-) compensada de la MA.

Aquí está:

if ( MathAbs(Ask - fastMa) <= i_thresholdFromMa * pt )

La señal sólo debe calcularse cuando el precio está enla zona de "gap" de la sangría de la MA +(-).

En una función de compra, por ejemplo:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

La compra debe ser superior afastMa eni_thresholdFromMa * pt.

De hecho, no está ahí. O bien es un fallo del idioma o bien es un fallo de la ondulación. ¿De qué otra manera puedo explicar lo que necesito? He dado el código completo sin condiciones y funciones adicionales (sólo una señal desnuda y la apertura).

Ya está escrito claramente(para un probador, ¡no lo he comprobado de verdad!)

Así es como se abre:

Lugar equivocado para abrir...

artmedia70:


En cuanto alo resaltado: trabajar en los precios abiertos, entonces no habrá MAs redibujando en la barra cero

Hice deliberadamente una condición en la primera barra, para que no haya confusión. Lo principal es cómo dirigirlo...
Archivos adjuntos:
test_ma.mq4  8 kb
 
El indicador de inicio de, por ejemplo, los cuartos cinco minutos de cada hora debe definirse en el indicador.
if( Minute()==15)
No falta nada. Empuja en la dirección correcta.
 

Tengo una pregunta: si utilizo una media móvil con un desplazamiento hacia la derecha cuando formulo mis criterios de negociación, es decir, el valor del desplazamiento es positivo.

Entonces al formar la señal no debo utilizar el valor de la media móvil en el cero o en la primera barra, sino en la barra con el índice correspondiente al valor del desplazamiento.

 
Operr:
El indicador de inicio de, por ejemplo, los cuartos cinco minutos de cada hora debe definirse en el indicador.


if( Minute()==15)// так будет работать в течении 1 минуты (от 15 до 16)
if( Minute()>=15)// так от 15 минут и до конца текущего часа
 
Tincup:

Tengo una pregunta: si utilizo una media móvil con un desplazamiento hacia la derecha cuando formulo mis criterios de negociación, es decir, el valor del desplazamiento es positivo.

Entonces al formar la señal no debo utilizar el valor de la media móvil en el cero o en la primera barra, sino en la barra con el índice correspondiente al valor del desplazamiento.


Ponga la media móvil en el gráfico y vea qué índice necesita. Puedes verlo visualmente.
 
hoz:

Sin duda, es más fácil "enviar" que sugerir. De hecho, no pedí nada que me pinchara en un libro de texto. He escrito un duplicado en un lugar, pero la esencia no cambia.

Aquí adjunto la variante de código de prueba y la publico también en mi post.

Las condiciones dicen claramente que el precio de la orden está por encima (debajo) de la MA+(-) compensada de la MA.

Aquí está:

La señal sólo debe calcularse cuando el precio está enla zona de "gap" de la sangría de la MA +(-).

En una función de compra, por ejemplo:

La compra debe ser superior afastMa eni_thresholdFromMa * pt.

En realidad no está ahí. O es un error de mi idioma o es un error de mi ratón. ¿De qué otra manera puedo explicar lo que necesito? He dado un código completo sin condiciones y funciones adicionales (sólo una señal desnuda y la apertura).

Ya está escrito claramente(para un probador, ¡no lo he comprobado de verdad!)

Así es como se abre:

Hice especialmente una condición en la primera barra, para que no haya confusión. Lo más importante es cómo dirigirlo...
Una vez más, pregunto: ¿cuándo quiere hacer el pedido exactamente? No es su respuesta de código (no quieren entenderlo - hay suficiente de sus propios códigos para el análisis), y sólo palabras,

Por ejemplo: quiero colocar una orden pendiente por encima/por debajo de una MA a una distancia de ... bah, bah, bah, bah, bah, bah ...

Por segunda vez, explíquese, ¿es tan difícil? Habríamos resuelto su problema hace tiempo.

 
Además: si tienes fastMA y slowMA definidos como globales, ¿por qué pasarlos a una función? Todas las funciones pueden verlas de todos modos, sin pasar sus parámetros a la función llamada.
 

Buenas tardes.

¿Pueden aconsejar cómo tratar los GAPs en los EAs?

A menudo recibo BPAs durante el fin de semana, y después de que ocurren el trabajo con las órdenes se cuelga, cómo solucionarlo, ¡muchas gracias!

 

Artyom, ¿qué crees que funcionará más rápido, la expresión con MathMax o con if?

double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//это?
// или это?
double dist = NormalizeDouble(Dist*Point,Digits);
if(dist < spread) dist = spread;
if(dist < StopLevel) dist = StopLevel;
if(dist < FreezeLevel) dist = FreezeLevel;


No lo he explicado con palabras, porque está claro que esta expresión me sirve para evitar errores 130, ¡y me sirve perfectamente!

Gracias de antemano.

 
hoz:

Ponga la media en el gráfico y vea qué índice necesita. Puedes verlo visualmente.

Lo hice. No entiendo bien tu respuesta, así que te lo preguntaré de nuevo. ¿He entendido bien que al formular las condiciones comerciales

Debe utilizar el valor de la MA para el correspondiente número de barras hacia atrás, pero no el valor marcado con una flecha amarilla en la imagen.

He dibujado la figura según he entendido tu respuesta.