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

 
shtr:

¡¡Wow!! Gracias. Esto requiere cierta reflexión.

¿Tal vez haya un "autoestudio" sobre las nuevas normas en algún lugar? El número de página de 4 dígitos es un poco estresante...

Quién es fácil ahora... Hay 5 temas más sobre novatos en el archivo ))))

Para ser honesto, los ejemplos de la ayuda y codobase son suficientes si ya tienes experiencia en programación, preferiblemente en C++. Si no tienes ninguna experiencia, puedes estudiar primero un tutorial de C++, MQL es muy similar en sintaxis.

 
evillive:

Quién lo tiene fácil ahora... Hay 5 temas más sobre novatos en el archivo ))))

Para ser honesto, los ejemplos de la ayuda y codobase son suficientes si ya tienes experiencia en programación, preferiblemente en C++. Si no tienes ninguna experiencia, puedes estudiar primero un tutorial de C++, MQL es muy similar en sintaxis.

Sin experiencia = tutorial de C++; )))

Gracias por su ayuda.

 

Buenas tardes, estimados señores.

Por favor, ayúdenme a añadir una alerta al indicador cuando aparezca una flechaindicando un par de divisas.

Yo también lo intenté, pero como dicen, es difícil no saber y olvidar. Gracias de antemano.



#propiedad ventana_del_gráfica_del_indicador

#property indicator_buffers 4

#property indicator_color1 Blanco

#property indicator_color2 Blanco

#property indicator_color3 LightGreen

#property indicator_color4 Rojo


extern int Cuenta de Barras = 300;

extern string FS = " ** Sensibilidad del filtro: Alta <-[1..3]-> Baja ** ";

extern int Sensibilidad = 2;

double g_ibuf_92[];

double g_ibuf_96[];

double g_ibuf_100[];

double g_ibuf_104[];

int gi_unused_108 = -1;


int init() {

IndicatorBuffers(4);

SetIndexStyle(2, DRAW_ARROW);

SetIndexArrow(2, 233);

SetIndexBuffer(2, g_ibuf_92);

SetIndexStyle(3, DRAW_ARROW);

SetIndexArrow(3, 234);

SetIndexBuffer(3, g_ibuf_96);

SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3, White);

SetIndexBuffer(0, g_ibuf_100);

SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 3, White);

SetIndexBuffer(1, g_ibuf_104);

SetIndexEmptyValue(0, 0);

SetIndexEmptyValue(1, 0);

SetIndexEmptyValue(2, 0);

SetIndexEmptyValue(3, 0);

SetIndexLabel(2, "Señal de compra");

SetIndexLabel(3, "Señal de venta");

SetIndexLabel(0, "High");

SetIndexLabel(1, "Low");

SetIndexEmptyValue(0, EMPTY_VALUE);

SetIndexEmptyValue(1, EMPTY_VALUE);

SetIndexEmptyValue(2, EMPTY_VALUE);

SetIndexEmptyValue(3, EMPTY_VALUE);

string ls_0 = "Señal del escalador";

IndicadorNombreCorto(ls_0);

si (Sensibilidad < 1) Sensibilidad = 1;

si (Sensibilidad > 3) Sensibilidad = 3;

retorno (0);

}


int deinit() {

retorno (0);

}


double sellSignal(int ai_0) {

bool li_4 = TRUE;

si (Sensibilidad > 2)

if (iHigh(Symbol(), Period(), ai_0 + 6) >= iHigh(Symbol(), Period(), ai_0 + 5)) li_4 = FALSE;

si (Sensibilidad > 1)

if (iHigh(Symbol(), Period(), ai_0 + 5) >= iHigh(Symbol(), Period(), ai_0 + 4)) li_4 = FALSE;

si (Sensibilidad > 0)

if (iHigh(Symbol(), Period(), ai_0 + 4) >= iHigh(Symbol(), Period(), ai_0 + 3)) li_4 = FALSE;

si (li_4) {

if (iClose(Symbol(), Period(), ai_0 + 2) < iHigh(Symbol(), Period(), ai_0 + 3))

if (iClose(Symbol(), Period(), ai_0 + 1) < iLow(Symbol(), Period(), ai_0 + 3)) return (iHigh(Symbol(), Period(), ai_0 + 3) + 10.0 * Point)

}

retorno (0);

}


double buySignal(int ai_0) {

bool li_4 = TRUE;

si (Sensibilidad > 2)

if (iLow(Symbol(), Period(), ai_0 + 6) <= iLow(Symbol(), Period(), ai_0 + 5)) li_4 = FALSE;

si (Sensibilidad > 1)

if (iLow(Symbol(), Period(), ai_0 + 5) <= iLow(Symbol(), Period(), ai_0 + 4)) li_4 = FALSE;

si (Sensibilidad > 0)

if (iLow(Symbol(), Period(), ai_0 + 4) <= iLow(Symbol(), Period(), ai_0 + 3)) li_4 = FALSE;

si (li_4) {

if (iClose(Symbol(), Period(), ai_0 + 2) > iLow(Symbol(), Period(), ai_0 + 3))

if (iClose(Symbol(), Period(), ai_0 + 1) > iHigh(Symbol(), Period(), ai_0 + 3)) return (iLow(Symbol(), Period(), ai_0 + 3) - 10.0 * Point)

}

retorno (0);

}


int inicio() {

int li_0 = IndicadorContado();

si (li_0 < 0) devuelve (-1);

si (li_0 > 0) li_0--;

int li_4 = Bares - li_0;

for (int l_count_8 = 0; l_count_8 < li_4; l_count_8++) {

g_ibuf_92[l_count_8 + 3] = buySignal(l_count_8);

g_ibuf_96[l_count_8 + 3] = sellSignal(l_count_8);

if (buySignal(l_count_8) > 0.0 | sellSignal(l_count_8) > 0.0) {

g_ibuf_100[l_count_8 + 3] = iHigh(Symbol(), Period(), l_count_8 + 3);

g_ibuf_104[l_count_8 + 3] = iLow(Symbol(), Period(), l_count_8 + 3);

}

}

retorno (0);

}

Archivos adjuntos:
 

Hola cavadores.

El resultado del historial de pedidos se me ha torcido un poco.

Estrategia:

1-Abrir 2 órdenes en diferente dirección (bloqueo de hecho) con un stop corto y un beneficio largo.

Si el precio se mueve de forma constante fuera del rango, derribará el stop de una de las órdenes, y buscará un beneficio largo en la otra orden.

3 - Cuando se alcanza el stop de una de las órdenes, se coloca una orden pendiente al nivel de su apertura, y si el precio vuelve, la orden se abre de nuevo

y volvemos al estado de posición hasta el siguiente movimiento a la ganancia a través del golpe del stop corto.

Objetivo:

Para trazar 3 paradas de golpe, para en la 4ª orden, Martin se dispara. El problema es que algo va mal. Determino la rentabilidad de la orden por el historial de OrderProfit(),

Pero sigo sin entender cómo funciona OrdersHistoryTotal(). ¿La función comprueba el número de pedido o la cantidad de pedido?

Del mismo modo, no entiendo cómo interpreta el borrado de una posición (ya sea como pérdida o como nada). ¿Cómo puedo rastrear 3 pérdidas consecutivas en tal situación cuando el historial muestra muchas otras cosas además de las pérdidas?

 
Fartarantula:

Hola cavadores.

El resultado del historial de pedidos se me ha torcido un poco.

Estrategia:

1-Abrir 2 órdenes en diferente dirección (bloqueo de hecho) con un stop corto y un beneficio largo.

Si el precio se mueve de forma constante fuera del rango, derribará el stop de una de las órdenes, y buscará un beneficio largo en la otra orden.

3 - Cuando se alcanza el stop de una de las órdenes, se coloca una orden pendiente al nivel de su apertura, y si el precio vuelve, la orden se abre de nuevo

y volver al estado de bloqueo antes del siguiente movimiento a la ganancia a través del golpe de la parada corta.

Objetivo:

Para trazar 3 paradas de golpe, para en la 4ª orden, Martin se dispara. El problema es que algo va mal. Determino la rentabilidad de la orden por el historial de OrderProfit(),

Pero sigo sin entender cómo funciona OrdersHistoryTotal(). ¿La función comprueba el número de pedido o la cantidad de pedido?

Del mismo modo, no entiendo cómo interpreta el borrado de una posición (ya sea como pérdida o como nada). ¿Cómo debería rastrear 3 pérdidas consecuentes en una situación como ésta cuando el historial muestra mucha otra información además de las pérdidas?

Lo primero que hay que recordar es que una orden pendiente no es una orden con pérdidas; o bien se ha activado o se ha eliminado.

La pérdida debe verse en las órdenes de mercado (Compra, Venta).

OrdersHistoryTotal() devuelve la cantidad de órdenes en el historial de operaciones disponible (incluyendo los depósitos y retiros de la cuenta, si se elige el modo "historial completo"). El número 0 suele ser el primer depósito, es decir, el primer pedido; el número OrdersHistoryTotal()-1 es el último pedido del historial.

Esto significa que tenemos que recorrer las órdenes desde la última hasta la primera, contando al mismo tiempo las órdenes pendientes y perdidas.

Pero, ¿para qué colocar órdenes pendientes si siempre podemos esperar a que el precio alcance el nivel de la orden cerrada en el stop y abrir la orden de inmediato según el mercado? Las órdenes de límite son un eslabón innecesario en este caso, ya que confunden la cuenta.

 
Fartarantula: Estrategia:

1-Abrir 2 órdenes en diferentes direcciones (bloqueo real) con un stop corto y un beneficio largo.

2-Si el precio se mueve de forma constante fuera del rango, derribará el stop de una de las órdenes, e irá a por un beneficio largo en la otra orden.

Miré su estrategia a través de los ojos del programador. Cuando el precio sube, alcanza el SL de venta, por lo que hay una orden de compra con su SL y un TP en alguna parte. En este caso has conseguido una pequeña pérdida en la orden cerrada. Ahora consideremos la variante con dos órdenes pendientes. En lugar de abrir dos órdenes, coloquemos dos órdenes pendientes en los mismos lugares en los que tiene SL. Cuando el precio alcanza el tope de compra, se abre una orden de compra y tenemos la misma posición, pero no hay pérdidas. Y ahora lo más interesante. A medida que el precio se mueve hacia arriba ...

 

...Y a medida que el precio subía en su principio, su TP se alejaba. Y tú tienes menos posibilidades de obtener el beneficio que yo, si consideras nuestras acciones en el momento.

Y aunque no opere en paralelo contigo, tu TP está entre los pips, y el mío de hecho. Y será siempre - le das al mercado una parte de movimiento direccional.

Si no lo sabe, debe tener en cuenta que incluso una desafortunada diferencia de 2 puntos convierte un sistema positivo en uno perdedor. A juzgar por la primera cifra, tiene un spread de unos 20 pips en un spread de 5 dígitos,

porque la diferencia entre las órdenes colocadas simultáneamente "a ojo" es de 40 pips según la figura.

Esa no es la cuestión... necesitas un fragmento de código, la detección correcta de una serie de 3 topes eliminados. ¿Por qué todo el mundo intenta corregir el sistema? Y la metodología del citado compañero

tampoco funcionará. Puede que el mercado simplemente no le deje abrir, o que abra donde no debe. Hombre, os entiendo a todos, y a vuestro deseo de compartir vuestras experiencias. Pero sólo necesito trazar tres paradas.

Todo está en su sitio, sólo que he visto que me he equivocado de orden con un doble. Resultó que Histototal daba lo que consideraba oportuno, y el bucle de determinar un orden cerrado por pérdida de la historia fallaba el orden.

 
Fartarantula Todo está en la línea, acabo de ver accidentalmente que he deslizado el orden equivocado con la duplicación. Resultó que Histototal daba lo que consideraba oportuno, y el bucle de determinar un orden cerrado por pérdida de la historia fallaba el orden.

Hay que alejarse de la calificación de Coder y aprender los fundamentos de la programación. Aquí tienes más detalles... Y aquí.

Este es el problema. Lo que vuelve, como dice el autor, Histototal en este guión en la misma cuenta del domingo.

void OnStart()
{
  Alert("Cчет " + DoubleToStr(AccountNumber(), 0),
        "  Дата ", TimeToStr(TimeLocal(),TIME_DATE),
        "  Ордеров ", OrdersHistoryTotal());
}

¿Por qué diferente?

Si hay menos y más pedidos en una cuenta, entonces 0 228 228 216 98... ¡Y si hay menos pedidos, la tramitación es más rápida!

El cliente está sudando - es imposible trabajar, el terminal tiene fallos, Histototal dio lo que quería, ¡el bucle se lo saltó!

 

Buenas tardes a todos. Ayúdame a subir las flechas del indicador, las inferiores están bien, pero las superiores están encima de los candelabros.

Probé con ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20); no funcionó. El punto de anclaje de la flecha (objeto) está en la parte superior, ¿cómo lo muevo hacia arriba?

//display signal arrow 
      RefreshRates(); 
   
      if(   (High[i+1]  >upBuffer[i+1] ) 
         && (Close[i+1] >Open[i+1]     ) 
         && (Close[i]   <Open[i]       ) 
        )            
      {  //draw a dot on top of the bar
         string Arrow_name_jack1 = "AboveTopBand_SellBar_jack1_" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);  //TimeCurrent()
         ObjectCreate(Arrow_name_jack1, OBJ_ARROW, 0, Time[i], High[i]+iATR(NULL,0,20,i)/5);//5*pips);  //OBJ_ARROW=22,window=0,
//???????????? так не получилось         //  ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20);
            ObjectSet(Arrow_name_jack1, OBJPROP_ARROWCODE, 242          );  //159
            ObjectSet(Arrow_name_jack1, OBJPROP_COLOR,     Yellow    );  //Magenta
            ObjectSet(Arrow_name_jack1, OBJPROP_STYLE,     STYLE_SOLID  );
            ObjectSet(Arrow_name_jack1, OBJPROP_WIDTH,     2            ); 
            
      }
      else
      if (   (Low[i+1]   <dnBuffer[i+1] ) 
          && (Close[i+1] <Open[i+1]     ) 
          && (Close[i]   >Open[i]       ) 
         )            
      {  //draw a dot on top of the bar
          Arrow_name_jack1 = "BelowBotBand_BuyBar_jack1_" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);//TimeCurrent()
         ObjectCreate(Arrow_name_jack1, OBJ_ARROW, 0, Time[i], Low[i]-iATR(NULL,0,20,i)/5);//5*pips);  //OBJ_ARROW=22,window=0,
            ObjectSet(Arrow_name_jack1, OBJPROP_ARROWCODE, 241          );//159
            ObjectSet(Arrow_name_jack1, OBJPROP_COLOR,     Yellow   );//Magenta
            ObjectSet(Arrow_name_jack1, OBJPROP_STYLE,     STYLE_SOLID  );
            ObjectSet(Arrow_name_jack1, OBJPROP_WIDTH,     2            ); 
      }
   }//end for(i = limit; i >= 0; i--)
 
mikanit:

Buenas tardes a todos. Ayúdame a subir las flechas del indicador, las inferiores están bien, pero las superiores están encima de los candelabros.

Probé con ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20); no funcionó. El punto de anclaje de la flecha (objeto) está en la parte superior, ¿cómo moverlo hacia arriba?

ObjectSetInteger(0,Arrow_name_jack1,OBJPROP_ANCHOR,ANCHOR_BOTTOM);

Recomiendo utilizar variables separadas para almacenar los nombres de las flechas superiores e inferiores, para evitar confusiones.

Y sí, dibujar flechas en el indicador con objetos es una perversión. Hay topes indicadores:

SetIndexStyle(0,DRAW_ARROW,0,1,clrRed);

    SetIndexArrow(0,242);