¿Cómo codificar? - página 151

 
luxinterior:
Utilice el archivo de inclusión OrderReliable. Lux

parece que falta un poco en esto para la función OrderSendReliable ¿tienes una versión posterior?

 

Cómo utilizar el tiempo en los cálculos

Soy nuevo en MQL4 y estaba tratando de ver si podía hacer un simple EA que utilizara algunas funciones básicas. Conozco bien el C++ pero debo ser muy malo con el MQL4 porque algo está mal con este código y creo que tiene que ver con las funciones de tiempo o posiblemente las funciones de compra/venta, aquí está el código: ...y por cierto esto no fue diseñado para ganar dinero solo para probar las funciones ¡Gracias!

int inicio()

{

//----

double currenttimeN, currentvalue;

double timeM = TimeMinute (TimeCurrent());

double timeH = TimeHour(TimeCurrent());

currenttimeN = (timeH / 24) + (timeM / 1440);//dice la hora del día en porcentaje o en 1 (1 = un día completo) por lo que siempre es menor que 1

currentvalue = Ask;

si (currentvalue > currenttimeN){

OrderSend(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point,Ask+25*Point, "My order #2",16384,0,Green);

}

/* ORDEN DE COMPRA */

else if (currentvalue < currenttimeN){

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point, "Mi orden #2",16384,0,Verde);

}

//----

return(0);

}

 

...................

 

Cadena equivocada:

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

¿Cómo se puede comparar la parte del día y el precio?

 

comprar y vender al mismo tiempo

alguien puede ayudar a programar para que pueda comprar y vender al mismo tiempo...algunos scripts o etc...

se lo agradezco...

ejemplo:

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point,"-", 0, 0, Red);

}

el problema es que solo compra...pero necesito que se ejecuten las dos ordenes...gracias..

 
kk81:
alguien puede ayudar a programar para que pueda comprar y vender al mismo tiempo...algunos scripts o etc...

lo aprecio...

ejemplo:

if (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Red);

}

el problema es que sólo comprará... pero necesito que ejecute ambas órdenes... gracias...

https://www.mql5.com/en/forum/177583/page37

 

¿Cómo obtener el precio de retorno de OrderClose?

Quiero saber, a qué precio se cierra la orden

Archivos adjuntos:
closeorder.jpg  62 kb
 

Barra de libertad de Forex

hola

muchas gracias a todos los amigos , en concreto a Roger09

Quiero experto (comercio automático) ForexFreedomBars .

cuando el cuadrado 5m , 15m ,30m ,1H es Rojo , enviar orden de VENTA por 10-20 TP

cuando el cuadrado 5m , 15m ,30m ,1H es Azul , enviar orden de COMPRA por 10-20 TP

(TP, SL, lote, maxtrade) la capacidad tiene que cambiar

por favor ayudenme .

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

//| #Las Barras de Libertad de Forex

//|

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

#property copyright "Programado por Eli hayun"

#property indicator_separate_window

#property indicador_mínimo -0.5

//#property indicator_maximum 5

#property indicator_buffers 8

#property indicator_color1 Red

#propiedad indicator_color2 DodgerBlue

#propiedad indicador_color3 Rojo

#propiedad indicator_color4 DodgerBlue

#Indicador de propiedad_color5 Rojo

#indicador de propiedad_color6 DodgerAzul

#indicador de propiedad_color7 Rojo

#propiedad indicador_color8 DodgerAzul

//---- buffers

double buf4_up[];

double buf4_down[];

double buf3_up[];

double buf3_down[];

double buf2_up[];

double buf2_down[];

double buf1_up[];

double buf1_down[];

extern double Gap = 1; // Espacio entre las líneas de barras

extern int Period_1 = PERIOD_M5;//M15

extern int Periodo_2 = PERIOD_M15;//M30

extern int Periodo_3 = PERIOD_M30;//H1

extern int Periodo_4 = PERIOD_H1;//H4

extern int cci_1 = 2;//50

extern int cci_2 = 2;//14

extern int cci_3 = 2

extern int cci_4 = 2;

extern int StopLoss=100;

extern int TakeProfit=100;

extern double Lotes=0,1;

extern bool AutoDisplay = false;

string shortname = "";

bool firstTime = true

int UniqueNum = 228;

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

//| Función de inicialización del indicador personalizada ||.

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

int init()

{

EstablecerAutoDisplay();

shortname = "#Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true;

IndicatorShortName(shortname);

//---- indicadores

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,110);

SetIndexBuffer(0,buf4_up);

SetIndexEmptyValue(0,0.0);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,110);

SetIndexBuffer(1,buf4_down);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,110);

SetIndexBuffer(2,buf3_up);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,110);

SetIndexBuffer(3,buf3_down);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,110);

SetIndexBuffer(4,buf2_up);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,110);

SetIndexBuffer(5,buf2_down);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,110);

SetIndexBuffer(6,buf1_up);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,110);

SetIndexBuffer(7,buf1_down);

SetIndexEmptyValue(7,0.0);

//----

return(0);

}

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

//| Función de desinicialización del indicador personalizada ||

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

int deinit()

{

//----

SetAutoDisplay();

shortname = "#Forex Freedom("+Period_1+", "+Period_2+", "+Period_3+", "+Period_4+")";

firstTime = true;

//----

return(0);

}

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

//| Función de iteración del indicador personalizada ||

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

int inicio()

{

int barras_contadas=IndicadorContado();

int i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy;

int limit=Barras_contabilizadas;

datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];

//----

if (firstTime || NewBar())

{

firstTime = false;

int win = UniqueNum; // WindowFind(shortname);

double dif = Tiempo[0] - Tiempo[1];

for (int ii=ObjectsTotal()-1; ii>-1; ii--)

{

if (StringFind(ObjectName(ii), "FF_"+win+"_") >= 0)

ObjectDelete(ObjectName(ii));

si no

ii=-1;

}

double shift = 0.2;

for (ii=0; ii<4; ii++)

{

cadena txt = "??";

doble gp;

switch (ii)

{

caso 0: txt = tf2txt(Periodo_1); gp = 1 + shift; break;

caso 1: txt = tf2txt(Periodo_2); gp = 1 + Gap + shift; break;

caso 2: txt = tf2txt(Periodo_3); gp = 1 + Gap*2 + shift; break

caso 3: txt = tf2txt(Period_4); gp = 1 + Gap*3 + shift; break;

}

string name = "FF_"+win+"_"+ii+"_"+txt;

ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);

ObjectSetText(nombre, txt,8, "Arial", Silver);

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2);

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limit;i++)

{

if (Time<TimeArray_5M[y5m]) y5m++;

if (Time<TimeArray_1H[y1h]) y1h++;

if (Time<TimeArray_30M[y30m]) y30m++;

if (Time<TimeArray_15M[y15m]) y15m++;

int cci_n = cci_1;

for (int tf = 0; tf < 4; tf++)

{

int prd;

switch (tf)

{

caso 0: prd = Período_1; cci_n = cci_1; yy = y5m; break;

caso 1: prd = Período_2; cci_n = cci_2; yy = y15m; break

caso 2: prd = Período_3; cci_n = cci_3; yy = y30m; break

caso 3: prd = Período_4; cci_n = cci_4; yy = y1h; break;

}

double cci = iCCI(NULL, prd, cci_n,PRICE_TYPICAL, yy);

double dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);

double dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", false, 0, yy);

si (cci < 0) dUp = 1; si no, dDn = 1;

switch (tf)

{

caso 0: if (dUp == EMPTY_VALUE) buf1_down = 1; else buf1_up = 1; break;

case 1: if (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1; else buf2_up = 1 + Gap * 1; break

caso 2: if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2; else buf3_up = 1 + Gap * 2; break

caso 3: if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3; else buf4_up = 1 + Gap * 3; break;

}

if (NewBar())

{

string sDir = "";

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "Up";

if (buf1_down[0] + buf2_down[0] + buf3_down[0] + buf4_down[0] == 4)

sDir = "Down";

si (sDir != "")

{

PlaySound("alert1.wav");

Print("Autopista Forex - Dirección ",sDir);

}

}

}

}

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss ,TakeProfit); else

return(0);

}

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

string tf2txt(int tf)

{

if (tf == PERIOD_M1) return("M1");

if (tf == PERIOD_M5) return("M5");

si (tf == PERIOD_M15) return("M15");

si (tf == PERIOD_M30) return("M30");

if (tf == PERIOD_H1) return("H1");

si (tf == PERIOD_H4) return("H4");

si (tf == PERIOD_D1) return("D1");

si (tf == PERIOD_W1) return("W1");

si (tf == PERIOD_MN1) return("MN1");

return("??");

}

void SetValues(int p1, int p2, int p3, int p4)

{

Periodo_1 = p1; Periodo_2 = p2; Periodo_3 = p3; Periodo_4 = p4;

}

void SetAutoDisplay()

{

if (AutoDisplay)

{

switch (Period())

{

case PERIOD_M1 : SetValues(PERIOD_M1, PERIOD_M5, PERIOD_M15,PERIOD_M30); break;

case PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break

case PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); break

case PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30, PERIOD_H1); break

case PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30,PERIOD_H1, PERIOD_H4); break

case PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1); break

case PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); break

case PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

case PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); break;

}

}

}

bool NuevaBarra()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Tiempo[0];

return(true);

}

return(false);

}

 

Problema al migrar un indicador a un EA como función de filtro

Al intentar utilizar parte de un indicador como una función en mi EA, ahora me doy cuenta de que hay tres tipos de funciones. El primer tipo es un Void que realiza un proceso y devuelve 0. El segundo tipo realiza cálculos y devuelve un resultado. El tercer tipo espera que se le dé un conjunto de valores específicos para procesar y luego devuelve un resultado.

¿Qué puedo hacer si mis cálculos producen tres resultados que deben utilizarse al menos de dos maneras diferentes? Esos cálculos pueden necesitar ubicarse en la función Start() por la siguiente razón: la información fluye desde las variables Externas (que pueden ajustarse manualmente) y las variables Globales (que permanecen estáticas a menos que se recompilen) hacia las distintas funciones del EA. La función Start() es el cerebro del EA y llega a las otras funciones para obtener su información. Puede pasar un conjunto de variables a una función como argumentos de esa función si esa función ha declarado esas variables dentro de sus paréntesis (). Luego recibe un resultado de vuelta y puede pasar más variables a otra función para terminar su proceso.

Una vez que bagan a pasar variables como argumentos a otras funciones, esperaba disfrutar de un nivel de éxito con mi codificación de EA. Desgraciadamente, creé un error de división en cero, posiblemente porque intenté pasar un valor como argumento de una función a otra, de manera que el valor no llegó cuando era necesario. Como en realidad faltaba, obtuve el error de división por cero. Mi siguiente revisión eliminó los pasos intermedios y entregó los valores directamente a las funciones donde se utilizaban.

(No creo que me hago ningún favor al registrar este punto en mi primera experiencia de dos meses de aprendizaje de codificación MQL4. Sin embargo, cualquier persona que puede estar buscando en Google "MQL4 cero dividir error", podría estar contento de saber cómo me las arreglé para resolverlo).

Mi siguiente revisión de EA curado mi error de división por cero, pero el comentario de la revista de mi probador stratagy ahora indicó un desbordamiento de la pila. Para aquellos que busquen en Google "MQL4 stack overrun", publicaré la causa que encontré. Fue un fallo en la conversión de los lotes a su equivalente decimal mediante el uso de la constante "Puntos" al cambiar un precio para abrir o modificar una orden.

El último consejo que me gustaría publicar aquí (después de mi experiencia inicial de dos meses de codificación y más de 12 reescrituras de EAs) es una forma en la que pude resolver un corchete "paréntesis izquierdo desigual" difícil de encontrar. El MetaEditor no resalta el texto del corchete en color. Si usted tiene un producto de AutoDesk con Visual LISP Editor, puede abrir su archivo MQ4 en ese editor y ver casi todos los pares de corchetes en color. Esto hace mucho más fácil la lectura de prueba para el corchete que falta.

Gracias a todos los que comparten sus respuestas en este foro,

¡Feliz codificación!

 

¿Alguna ayuda?

También me gustaría saber si las órdenes de Metatrader se pueden ejecutar desde la línea de comandos. O en general si es posible interconectar aplicaciones externas con Metatrader utilizando algún tipo de API.

Gracias

Jeff

Razón de la queja: