Ayuda a la codificación - página 352

 
freakout:
Hola,

querido mladen, tengo una pequeña petición para ti - ¿podrías desactivar toda la información que el indicador adjunto muestra en la esquina superior izquierda?

gracias de antemano ;-)

Hizo una opción para activar/desactivar los comentarios.

Archivos adjuntos:
 
paradise77:
Hola,

Soy nuevo aquí. Me gustaría actualizar un objeto rectángulo, pero no sé cómo. El código de abajo se utiliza para crear rectángulos objeto, si EMAs cruzado. Estos rectángulos deben terminar si el precio retrocede y lo toca. ¿Cómo hacerlo?

Gracias de antemano.

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 clrLime

#property indicator_width1 2

#property indicator_color2 clrMagenta

#property indicator_width2 2

extern int EMA1 = 3;

extern int EMA2 = 21;

extern int EMA3 = 63;

extern double arrowDistance = 0.0003;

extern color upRectColor = clrYellow;

extern color dnRectColor = clrDodgerBlue;

extern color touchRectColor = clrDarkGray;

//---

extern double rectHigh = 0.0001;

extern int rectDays = 3;

extern int bars_limit = 2000;

extern bool showRectangle = true;

double upArrow[];

double dnArrow[];

double prev2EMA1, prev2EMA2, prev2EMA3;

double prevEMA1, prevEMA2, prevEMA3;

double curEMA1, curEMA2, curEMA3;

double prevOpenPrc, prevClosePrc, prevLowPrc, prevHighPrc;

string objRectName;

string rectArray[];

string indiName = "Emac";

int rectValidity = 0;

int arrayMaxAmounts = 99999;

int arrayCurAmount = 0;

int arrayLastAmount = 0;

//+------------------------------------------------------------------+

//| INIT() |

//+------------------------------------------------------------------+

int init() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

ArrayResize(rectArray,arrayMaxAmounts,arrayMaxAmounts);

IndicatorBuffers(2);

SetIndexBuffer(0,upArrow);

SetIndexBuffer(1,dnArrow);

SetIndexStyle(0,DRAW_ARROW);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(0,233);

SetIndexArrow(1,234);

SetIndexEmptyValue(0,0.0);

SetIndexEmptyValue(1,0.0);

SetIndexLabel(0,"Up");

SetIndexLabel(1,"Dn");

return(0);

}

//+------------------------------------------------------------------+

//| DEINIT() |

//+------------------------------------------------------------------+

int deinit() {

int k=0;

while (k<ObjectsTotal()) {

string objname = ObjectName(k);

if (StringSubstr(objname,0,StringLen("Emac")) == "Emac")

ObjectDelete(objname);

else

k++;

}

return(0);

}

//+------------------------------------------------------------------+

//| START() |

//+------------------------------------------------------------------+

int start() {

if (Period() != PERIOD_H1) {

Alert("Use only @ TF: H1");

return(0);

}

int limit,i,k;

int counted_bars=IndicatorCounted();

//---- last counted bar will be recounted

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

//---

if (limit>bars_limit-1 && bars_limit!=0) limit=bars_limit-1;

if (Bars<EMA1 || Bars<EMA2 || Bars0 && bars_limit0 && bars_limit0 && bars_limit<EMA3)) {

Alert("Adjust limit settings or put more bars on your chart!");

return(0);

}

//---

for (i=0; i<limit; i++) {

prev2EMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+2);

prev2EMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+2);

prevEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+1);

prevEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+1);

curEMA1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

curEMA2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

curEMA3 = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i);

prevOpenPrc = iOpen(NULL,0,i+1);

prevClosePrc = iClose(NULL,0,i+1);

prevLowPrc = iLow(NULL,0,i+1);

prevHighPrc = iHigh(NULL,0,i+1);

rectValidity = rectDays*86400;

if ( (prev2EMA1=prevEMA2)&&(curEMA1>curEMA2)&&(prevEMA2>=prevEMA3)&&(curEMA2>curEMA3) ) { // up

upArrow = prevLowPrc - arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0,Time,prevLowPrc,Time+rectValidity,prevLowPrc+rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, upRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$up$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

if ( (prev2EMA1>prev2EMA2)&&(prevEMA1<=prevEMA2)&&(curEMA1<curEMA2)&&(prevEMA2<=prevEMA3)&&(curEMA2<curEMA3) ) { // down

dnArrow = prevHighPrc + arrowDistance;

if (showRectangle == true) {

//----------------------- Draw Rectangle ----------------------

objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));

if (ObjectFind(objRectName) == -1) { // not exists

ObjectCreate(objRectName, OBJ_RECTANGLE, 0, Time,prevHighPrc,Time+rectValidity,prevHighPrc-rectHigh);

ObjectSet(objRectName, OBJPROP_COLOR, dnRectColor);

ObjectSet(objRectName, OBJPROP_WIDTH, 0);

ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);

//--- put information to Array ---

arrayCurAmount = ArraySize(rectArray);

rectArray[arrayCurAmount] = StringConcatenate(objRectName,"$dn$",Time,"$",prevClosePrc,"$0"); // 0=new, not yet touched

} // if

} // if

} // if

} // for

//----------------------- Edit Rectangle, change time2 & color, if price touched ----------------------

return(0);

} // start

//+------------------------------------------------------------------+

void DelObjects(string id) {

int ot1=ObjectsTotal();

while(ot1>=0) {

if (StringFind(ObjectName(ot1),id,0)>-1) {

ObjectDelete(ObjectName(ot1));

}

ot1--;

}

return;

}

//+------------------------------------------------------------------+

string FuncPeriodToStr(int thePeriod) {

switch(thePeriod) {

case 1: return("M1");

case 5: return("M5");

case 15: return("M15");

case 30: return("M30");

case 60: return("H1");

case 240: return("H4");

case 1440: return("D1");

case 10080: return("W1");

case 43200: return("MN1");

default: return("MN1");

}

}

//+------------------------------------------------------------------+

@Mladen,

¿Podría ayudarme a dar una pista sobre la edición del rectángulo?

He encontrado esto :

*) Tipos de objetos - Documentación MQL4

*) Propiedades de los objetos - Documentación MQL4

Puedo obtener las propiedades del rectángulo (tiempo1, precio1, tiempo2, precio2, color), y luego comparar el precio1 o el precio2 con el precio Ask/Bid actual. Si el precio Ask/Bid toca el precio1 o el precio2, entonces debo hacer lo siguiente:

a) No necesito un Array, sino sólo mirar cada objeto rectángulo.

Borrar el objeto, crearlo de nuevo usando new time2 y newcolor.

b) ¿Cómo saber la posición de la vela en OBJPROP_PRICE1? Normalmente utilizamos un bucle "for" como

for (i=limit; i>0; i--)

¿Cómo podemos obtener la "i" de la barra que tiene el precio1?

c) Si no borro y vuelvo a crear el rectángulo, ¿puedo usar ObjectSet para cambiar el tiempo2 y el color del rectángulo?

Gracias.

 
paradise77:
@Mladen,

¿Podría ayudarme a dar una pista sobre la edición del rectángulo?

He encontrado esto :

*) Tipos de objetos - Documentación MQL4

*) Propiedades de los objetos - Documentación MQL4

Puedo obtener las propiedades del rectángulo (tiempo1, precio1, tiempo2, precio2, color), y luego comparar el precio1 o el precio2 con el precio Ask/Bid actual. Si el precio Ask/Bid toca el precio1 o el precio2, entonces debo hacer lo siguiente:

a) No necesito un Array, sino sólo mirar cada objeto rectángulo.

Borrar el objeto, crearlo de nuevo usando new time2 y newcolor.

b) ¿Cómo saber la posición de la vela en OBJPROP_PRICE1? Normalmente usamos el bucle "for" como

¿Cómo podemos obtener la "i" de la barra que tiene el precio1?

c) Si no borro y vuelvo a crear el rectángulo, ¿puedo usar ObjectSet para cambiar el tiempo2 y el color del rectángulo?

Gracias.

En tu caso tus precios están bien. Tienes que usar tiempos para limitar las cajas de la izquierda y la derecha

 

Cosmiclifeform,

Gracias por esta pieza, en realidad he utilizado instaforex demo.I descargado los precios 1M fiest como el método normal.I luego hacer la configuración, utilizando EURUSD, ver los screenshorts abajo de la ficha de informe y el registro..

//informes, anotando pero zerp, ¿por qué?

cosmiclifeform:
Hola Mastercash,

Corrí el EA en una cuenta demo FXDD...y no hice nada especial...solo corrí el EA en el Probador de Estrategias con la configuración por defecto.

Me gustaría poder ayudar más...pero sin pistas específicas para rastrear (registros de error, capturas de pantalla, y otras condiciones) será imposible averiguar por qué usted está recibiendo resultados en blanco.

Todo lo que puedo recomendar es...

Primero prueba un buen EA en el probador que sepas que funciona bien.

Esto establecerá que tanto tus cuentas demo como tus procedimientos están bien.

Obtenga su confianza primero de que todo funciona como se supone.

Luego pruebe su Nice TraderEA... y anote exactamente lo que sucede. Incluso una pantalla en blanco debería tener registros para comprobar.

Pruebe a añadir declaraciones PRINT y COMENTARIO en todas partes...luego compruebe sus registros de nuevo...tanto en la pestaña EA como en la pestaña Journal...

También sus COMENTARIOS aparecerán en la pantalla...así que debería ver su EA funcionando o no.

La línea de fondo en la obtención de una buena ayuda de codificación ...

Es proporcionar la mayor cantidad de pistas que puede encontrar a lo que está sucediendo con su EA ...

Sigue intentando todo lo posible...y haznos saber los resultados.

Cuídate,

Robert
Archivos adjuntos:
backtest1.png  14 kb
backtest2.png  3 kb
 
mladen:
En tu caso tus precios están bien. Tienes que utilizar los tiempos para limitar las cajas de la izquierda y la derecha

Gracias mladen. ¿Quiere decir que debo utilizar el Tiempo2 dinámicamente? Tiempo1, precio1 y precio2 son fijos. Pero el Tiempo2 depende de la barra actual (i), y se mueve, hasta que el precio toca el rectángulo, o es más que el tiempo de ajuste del rectángulo por defecto.

En otras palabras, ¿es imposible cambiar el color y el tiempo2 de un rectángulo?

Gracias

 
paradise77:
Gracias mladen. ¿Quieres decir que debo utilizar el tiempo2 de forma dinámica? Tiempo1, precio1 y precio2 son fijos. Pero el Tiempo2 depende de la barra actual (i), y se mueve, hasta que el precio toca el rectángulo, o es más que el tiempo de ajuste del rectángulo por defecto.

En otras palabras, ¿es imposible cambiar el color y el tiempo2 de un rectángulo?

Gracias

paraíso77

Sí, debes hacerlo

De esta forma siempre ajustarás el borde derecho de la caja (si necesita ajuste, claro)

 

Hola Mladen y Mrtools.

La verdad es que no me gustan demasiadas alertas porque me gusta más un sistema visual, así que todo ese ruido y ventanas emergentes sólo me distraen. Solo pongo algunas alertas del CCI cuando hay sobreventa o sobrecompra, eso es todo.

Pero hay una alerta que me gustaría tener, que es cuando "mi" SSA + MA hace un cruce con la MA, ya sea al alza o a la baja.

Otra cosa, siempre añado tres niveles a esta preciosa herramienta; por supuesto la zerolina, 0,0, pero también -0,3 y 0,3.

También me gustaría adquirir una alerta cuando el SSA cruza el nivel -0,3 y el nivel 0,3. El nivel 0,0 no es necesario.

Como alerta un simple sonido y popup, eso es todo.

Gracias.

Archivos adjuntos:
ssa__ma.mq4  5 kb
 
Wulong10:
Hola Mladen y Mrtools.

Realmente no me gustan demasiadas alertas porque me gusta más un sistema visual, así que todo ese ruido y ventanas emergentes sólo me distraen. Solo pongo algunas alertas del CCI cuando hay sobreventa o sobrecompra, eso es todo.

Pero hay una alerta que me gustaría tener, que es cuando "mi" SSA + MA hace un cruce con la MA, ya sea al alza o a la baja.

Otra cosa, siempre añado tres niveles a esta preciosa herramienta; por supuesto la zerolina, 0,0, pero también -0,3 y 0,3.

También me gustaría adquirir una alerta cuando el SSA cruza el nivel -0,3 y el nivel 0,3. El nivel 0,0 no es necesario.

Como alerta un simple sonido y popup, eso es todo.

Gracias.

Wulong10

Lo que pasa con el SSA es que es un algoritmo que recalcula. Añadirle alertas no es, al menos esa es mi opinión, acertado ya que siempre cambiará el lugar de los cruces y a veces los cruces desaparecerán por completo. Es mejor utilizarlo en modo no señalización (sólo estimación)

 

Hola Mladen,

Sé que el SSA recalcula en plazos más altos.

Cuando lo uso en la M5 cambia un poco, en la M15 mucho más, pero en la M1 he probado mucho este indy y estoy muy satisfecho con él. Con mis ajustes realmente no se adapta mucho, de hecho es muy preciso.

Por supuesto, cuando hay una larga subida o una larga bajada del precio, no es muy fiable, pero ¿no es así con muchos indicadores?

Entonces se utiliza una simple media móvil en el gráfico por cuestiones de seguridad ...

Tal vez alguien más no puede utilizar las alertas, pero yo sí.

Las alertas del CCI tampoco son siempre correctas, pero sólo es una indicación de lo que puede pasar después.

Por lo tanto, si la SSA diera una alerta, me corresponde a mí decidir qué hacer al respecto y se me está dando bien.

Además, creo que no soy el único al que le gusta la SSA...

¿Cruces que desaparecen? No es muy frecuente en la M1 y hace días que observo ese gráfico ....

Por lo tanto, me gustaría mucho las alertas, si es posible.

¡Danke schön !

 
Wulong10:
Hola Mladen,

Sé que el SSA recalcula en plazos más altos.

Cuando lo uso en la M5 cambia un poco, en la M15 mucho más, pero en la M1 he probado mucho este indy y estoy muy satisfecho con él. Con mis ajustes realmente no se adapta mucho, de hecho es muy preciso.

Por supuesto, cuando hay una larga subida o una larga bajada del precio, no es muy fiable, pero ¿no es así con muchos indicadores?

Entonces se utiliza una simple media móvil en el gráfico por cuestiones de seguridad ...

Tal vez alguien más no puede utilizar las alertas, pero yo sí.

Las alertas del CCI tampoco son siempre correctas, pero sólo es una indicación de lo que puede pasar después.

Por lo tanto, si la SSA diera una alerta, me corresponde a mí decidir qué hacer al respecto y se me está dando bien.

Además, creo que no soy el único al que le gusta la SSA...

¿Cruces que desaparecen? No es muy frecuente en la M1 y hace días que observo ese gráfico ....

Así que me gustaría mucho las alertas, si es posible.

¡Danke schön !

Wulong10

El SSA siempre recalcula (créeme ya que fui yo quien hizo ese dll para calcularlo). No hay ninguna excepción a esa regla (no importa en qué periodo de tiempo lo uses).

Además, si el número de cálculos se establece en > 1, recalculará todas las barras. Si el número de cálculos se establece en 1, entonces al menos las barras de "retraso" van a ser recalculadas