Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 869

 
Top2n:

Lo siento, es una lástima tener que repetir lo mismo cien veces.

Llevo casi un mes mirando como una oveja a la puerta. No entiendo nada.

La tarea consiste en calcular una media móvil menor con una media móvil de 13,

es decir, calcular un período de 12 basado en 13.

Fácil de calcular: Y(N)=1/N*(Y(N+1)*(N+1)-X[N]), donde Y(i) - valor de MA(i) en la barra cero, X[j] - valor del precio en la barra j-ésima; sólo que esto es un sinsentido computacional, mientras que no permite mirar al futuro de todos modos.
 

Hola, ¿podría alguno de los estimados gurús comprobar el inicio de mi primer EA? ¿Es posible seguir adelante? ¿Quizás me he perdido algo? Estaría muy agradecido por cualquier dato concreto. He visto en algún lugar del foro cómo hacer que sólo se abra una posición, pero no lo copié y ahora no lo encuentro. Ayuda, por favor.

Gracias.

// Versión de prueba de Expert Advisor

//--------------------------------------------------------------------

//------Вводные данные:-----------------------------------------------------------

input double Lotes = 0.1; //Lote

input int MovingPeriod =5; // МА período de cálculo

input int MovingShift =0; // MA shift

input int InpBandsPeriod=10; // Periodo de las Bandas Bollinger

input int InpBandsShift=0; // Desplazamiento de las Bandas Bollinger

input double InpBandsDeviations=2.0; // Desviación de las Bandas de Bollinger

input int K_Period=30; // %K periodo del Estocástico

input int D_Period=10; // %D Periodo estocástico

input int Slowdawn =8; // Ralentización estocástica

color de entrada clMainStoch =Amarillo; // color de la línea estocástica principal

color de entrada clSignalStoch =Red; // color de la línea de señal estocástica

// -----Declare las variables globales:------------------------------------------

double MA_0, MA_1, MA_2; // Valor de la MA en las barras 0, 1 y 2

double MB_0, MB_1, MB_2; // Valor del Bollinger medio en las barras 0, 1 y 2

double ExtUpperBuffer[]; // valor de la línea Bollinger superior

double ExtLowerBuffer[]; // Valor de la línea Bollinger inferior

double Delta_0, Delta_1; // diferencia entre los valores de Bollinger superior e inferior ...

// ...Líneas de Bollinger en las barras 0 y 1

double Yellow_0, Yellow_1, Yellow_2; // Valor principal en las barras 0, 1 y 2

double Rojo_0, Rojo_1, Rojo_2; // señal de valor en las barras 0, 1 y 2

//-------Поехали!----------------------------------------------------------------

int start() //Función especial start

{

//Llamada a la función del indicador MA

MA_0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

MA_1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);

MA_2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2);

//retroalimentación a la función de las Bandas de Bollinger

MB_0=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,0);

MB_1=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,1);

MB_2=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,2);

Delta_0=iBands(ExtUpperBuffer[0]-ExtLowerBuffer[0]);

Delta_1=iBands(ExtUpperBuffer[1]-ExtLowerBuffer[1]);

//Llamada a la función estocástica

Yellow_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,0);

Yellow_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,1);

Yellow_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,2);

Red_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,0);

Red_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,1);

Red_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,2);

//-------Ситуации по Стохастику:-----------------------------------------------------

//El mercado está sobrecomprado

double MOB()=(Amarillo_0>=80 && Rojo_0>=80); //Variable local

//El mercado está sobrevendido.

double MOS()=(Amarillo_0<=20 && Rojo_0<=20); //Variable local

//El mercado es normal.

double MN()=(20<Amarillo_0<80 && 20<Rojo_0<80); //Variable local

//situación crítica

double MC1()=(20<Amarillo_0<80 && Rojo_0<=20); //Variable local

double MC2()=(20<Amarillo_0<80 && Rojo_0>=80); //Variable local

double MC3()=(20<Red_0<80 && Yellow_0<=20); //Variable local

double MC4()=(20<Red_0<80 && Yellow_0>=80); //Variable local

//-------Example(my)order to open position-----------------------------------------------------


if (Delta_0 > Delta_1 && MOB()==true) //El mercado está sobrecomprado pero delta se expande

{ si (MB_2 > MB_1 && MB_1 < MB_0) /Ruptura de Bollinger inferior

OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point);//abrir orden de compra

Alert("GetLastError()); //Mensaje de un error

Alert("Posición abierta BAY con lotes("Lots"),precio("Ask")."); //Mensaje de compra

 

Además, las posiciones BAY (al igual que las de venta) pueden abrirse en diferentes condiciones, y dependiendo de las condiciones en las que se haya abierto la posición (por ejemplo, BAY), habrá diferentes condiciones de cierre. (por ejemplo, BAY), habrá diferentes condiciones de cierre.

¿Cómo traduzco esto en MKL?

 
rapid_minus:

Además, las posiciones BAY (al igual que las de venta) pueden abrirse en diferentes condiciones, y dependiendo de las condiciones en las que se haya abierto la posición (por ejemplo, BAY), habrá diferentes condiciones de cierre. (por ejemplo, BAY), habrá diferentes condiciones de cierre.

¿Cómo traduzco esto en MKL?

Seleccionamos el orden en el bucle. Si se trata de una Compra, y otros datos (símbolo, magik, etc.) cumplen el criterio de que debe cerrarse a "condiciones de cierre personalizadas", entonces la cerraremos si existen "condiciones de cierre personalizadas".
 
artmedia70:
Seleccionamos el orden en el bucle. Si es una Compra y todos los demás datos (símbolo, mago, lo que sea) cumplen el criterio de tener que cerrarla en "condiciones adecuadas de cierre", entonces la cerramos si hay "condiciones adecuadas de cierre".

Para mí es un poco vago, pero después de indagar un poco creo que lo entenderé. Muchas gracias por no dar la espalda y sentar cátedra desde las alturas del conocimiento, como algunos compañeros del país soviético.

Descubrí cómo cerrarlo de esta manera:

//-------Ejemplo(mío) de una orden de apertura de posición con cierre vinculante (por ticket)-----------------------------------------------------

/Variable local que abre una orden BAY (en lugar de la línea 63)

int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point))

//-------Entonces el cierre de esta orden particular podría ser el siguiente:-----------------------------------------------------

if (Ticket_1()==true) //si se ha abierto la orden nº 1, entonces...

{ si (Amarillo_0>Rojo_0 && (Amarillo_0-Rojo_0)<(Amarillo_1-Rojo_1)) //El amarillo es mayor que el rojo, contracción(condición)

{ si (MA_2 < MA_1 && MA_1 > MA_0);} //Rojo por encima del medio(condición)

else (Amarillo_0>Rojo_0 && (Amarillo_0-Rojo_0)>(Amarillo_1-Rojo_1)) //Amarillo sobre rojo, expansión(condición)

{ si (MB_2 < MB_1 && MB_1 > MB_0);} //Ruptura de Bollinger superior (condición)

bool Ans=CerrarOrden(Billete,Lote,Oferta,0); //...cerrar la orden (bloqueovariable)

Alert("Intentando cerrar la orden con Bid("Lots"),price("Ask"). Esperando respuesta...");

if (Ans==true) // Ha funcionado :)

{

Alerta ("Orden cerrada de BAY por lote("Lotes"),Precio de cierre("Oferta");

break; // Salir del bucle de cierre de posición

}


}

Por favor, haz un análisis, bien en el post anterior también. Perdona que sea tan terco, pero ya ves que eres el único que contesta... Gracias.

 
//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)----------------------------------------------------- 
                                                      
                                                      //Локальная переменная, открывающая ордер БАЙ(вместо строки 63)
   int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));
   
        //-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------
    
    if (Ticket_1()==true)                              //Если был открыт ордер №1, то...
     { if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)
        { if (MA_2 < MA_1 && MA_1 > MA_0);}                      //Верхний перелом Средней (условие)
       else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)
         { if (MB_2 < MB_1 && MB_1 > MB_0);}                      //Верхний перелом Боллинджера (условие)
       
       bool Ans=OrderClose(Ticket,Lot,Bid,0);          //...закрытие ордера (лок.переменная)                                               
   Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");
   if (Ans==true)                                     // Получилось :)
        {
         Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");
         break;                                       // Выход из цикла закрытия позиции
        }

     }
Es mucho más fácil de leer. Lo siento.
 
rapid_minus:

Para mí es un poco vago, pero después de indagar un poco creo que lo entenderé. Muchas gracias por no apartarse ni dar lecciones desde las cumbres del conocimiento, como algunos compañeros del país soviético.

Pensé en cerrarlo de esta manera:

...

Por favor, haz un análisis, y sobre el puesto anterior también. Perdón por la insistencia, pero ya ves, eres el único que responde... Gracias.

Bueno, es un poco confuso, ¿no?

1. tiene que determinar el hecho de la ocurrencia de la condición para cerrar la orden

2. En el ciclo, se revisan todas las posiciones abiertas y, cuando se encuentra la orden de compra necesaria, se cierra.

Este es un ejemplo de ciclo:

void ClosePositions(string symbol, int type, int magic) {
   for(int i=OrdersTotal()-1; i>=0; i--) {      // цикл по открытым ордерам
      if(OrderSelect(i,SELECT_BY_POS)) {        // выбираем ордер по индексу
         if(OrderMagicNumber()!=magic) continue;// если магик не искомый - ищем дальше
         if(OrderSymbol()!=symbol)     continue;// если символ не тот - ищем дальше
         if(OrderType()!=type)         continue;// если тип ордера не тот - ищем дальше
         // здесь, если ордер выбран, то он соответствует нужным критериям,
         // вызов функции закрытия выбранного ордера по тикету
         }
      }   
   }

Es decir, para cerrar la orden de compra en el símbolo actual (en el gráfico donde se ejecuta el Asesor Experto) y con un número mágico de 100500 (por ejemplo), debe llamar a la función así

ClosePositions(Symbol(),OP_BUY,100500);

No tienes que escribir el número 100500, normalmente el número mágico ya está fijado en el EA a una variable, por ejemplo int Magic = 100500; Entonces tienes que escribir Magic en lugar de 100500

No escribí nada en el bucle donde se debe cerrar la posición seleccionada, ya que debería llamar a la función para cerrar el pedido según la entrada. Normalmente se trata de una llamada a una función completa con los códigos de retorno del servidor comercial que se manejan. Puede escribir allí un simple comando para cerrar la orden seleccionada OrderClose() para comprobarlo;

 
rapid_minus:
Es mucho más fácil de leer de esa manera. Lo siento.

También es posible editar un post antiguo, para no crear duplicados ;)

 
evillive:
Todavía es posible editar un post antiguo para evitar duplicados ;)
Lo intenté, pero el SRC ya no lo pone.
 
artmedia70:

Está un poco nublado.

1) Determinar el hecho de que la condición para cerrar la orden de compra se ha producido

2. En el bucle, revisa todas las posiciones abiertas y, cuando encuentra la orden de compra necesaria, la cierra.

Este es un ejemplo de ciclo:

Es decir, para cerrar la orden de compra en el símbolo actual (en el gráfico donde se ejecuta el Asesor Experto) y con un número mágico de 100500 (por ejemplo), debe llamar a la función así

No tienes que escribir el número 100500, normalmente el número mágico ya está fijado en el EA a una variable, por ejemplo int Magic = 100500; Entonces tienes que escribir Magic en lugar de 100500

No escribí nada en el bucle donde se debe cerrar la posición seleccionada, ya que debería llamar a la función para cerrar el pedido según la entrada. Normalmente se trata de una llamada a una función completa con los códigos de retorno del servidor comercial que se manejan. Puede escribir allí un simple comando para cerrar la orden seleccionada OrderClose() para comprobarlo;


Gracias. Pero por lo que he entendido el magik se asigna automáticamente al abrir un pedido. Por eso no puedo determinar en qué condiciones se abre la orden y por tanto no sé las condiciones para cerrarla.
Razón de la queja: