¿Cómo codificar? - página 293

 
lincoln2012:
Estoy tratando de aprender MQ4. Mi primer programa simple se supone que debe saltar una alerta cuando 2 MAs se cruzan. No puedo entender por qué

este código no funciona.

Cualquier ayuda será muy apreciada. Gracias de antemano.

extern int Periodo_MA1 = 5;

extern int Periodo_MA2 = 1;

double MA1;

double MA2;

int init()

{

return(0);

}

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

int deinit()

{

return(0);

}

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

int inicio()

{

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

MA1=iMA(NULL,0,Period_MA1,0,MODE_SMA,PRICE_CLOSE,0);

MA2=iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0);

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

si (MA2 == MA1 )

Alert("El precio es el mismo(",Period_MA2,").");// Alert

devolver;

}

Hola Lincoln2012,

Podría revisar el código de este Ma Cross

Archivos adjuntos:
macross-1.mq4  7 kb
 
lincoln2012:
Estoy tratando de aprender MQ4. Mi primer programa simple se supone que debe hacer saltar una alerta cuando 2 MAs se cruzan. No puedo entender por qué

este código no funciona.

}

La clave para codificar un cruce de 2 líneas indicadoras cualesquiera es este concepto

1. Si la línea de la barra actual1>línea2, y la línea de la barra anterior1<línea2, entonces hay un cruce ascendente.

2. Si la línea de la barra actual1línea2, entonces hay un cruce hacia abajo.

 
mj10:
hola

El programa de la empresa es un programa de la empresa que se encarga de la gestión de las actividades de la empresa. El objetivo de este proyecto es hacer un indicador simple, pero no sé cómo hacerlo.

su simple indicador simplemente comprueba el valor si el valor de la todos los varible son iguales que dibujar ese punto donde el valor de la todos los partidos de las variables.

mi solución simple

supongamos que tenemos variables

double movingavg1;

double movingavg12;

double movingavg13;

double movingavg14

double movingavg15

doble movingavg16

doble movingavg17

doble movingavg18

doble movingavg19;

doble movingavg10;

double movingavgall;

declaramos la variable solo estoy dando un ejemplo estoy usando iStochastic(1), pero podemos usar para cualquier indicador.

movingavg12=iStochastic(1)

movingavg13=iStochastic(2)

.

.

.

así sucesivamente

ahora

if (movingavg12=movingavg13=movingavg14,....) (poner el valor en la variable "movingavgall") //poner el valor que es igual para vria

dibujar movingavgall en las barras

Aplicación

supongamos que quiero comprobar si la media móvil 3 y la media móvil 5 tienen el mismo valor

incluso este indicador puede ser utilizado con RSI donde el valor de RSI 1 y RSI 2 = 80

y muchos más

incluso si añadimos el MTF que será una ventaja añadida

parece simple por escrito pero no he podido encontrar la solución espero que alguien pueda ayudar

espero que entiendan lo que estoy diciendo

gracias

Una vez que tengas los valores a comparar usarías un código similar al siguiente.

Lacomprobación de valores iguales utiliza ==. Un solo = se utiliza para asignar un valor a una variable.

Comprobando más de 1 conjunto debe usar && para significar Y

movingavgall = 0;

si ((a == b) && (b == c) && (c == d)) movingavgall = a;

A continuación, puede comprobar si movingavgall tiene un valor con

if (movingavgall != 0)

{

// haz algo aquí

}

Haz una búsqueda de programación en metatrader usando Google.

Usted debe encontrar varios buenos tutoriales para la programación en MT4.

Un buen libro de programación en C también te ayudará.

Robert Hill alias MrPip

 

simplificar este código

¡hola a todos!

Estoy tratando de simplificar este código utilizando el comando stringconcatenate de esta manera:

ObjectSetText("uitog1v", StringConcatenate("/\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

a esto:

ObjectSetText("uitog1v", StringConcatenate("/\", uitog1v, "%","/\", uitog2v, "%","/\", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Espero que alguien pueda ayudarme.

Saludos cordiales

doc

trend_alexcud_v_2men.mq4

Archivos adjuntos:
 

...

Doc

Si necesitas todos esos elementos, no hay forma más sencilla de escribirlo

dr.house7:
¡hola a todos!

estoy tratando de semplificar este código usando el comando stringconcatenate de esta manera

ObjectSetText("uitog1v", StringConcatenate("/\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

a esto:

ObjectSetText("uitog1v", StringConcatenate("/\", uitog1v, "%","/\", uitog2v, "%","/\", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Espero que alguien pueda ayudarme.

Saludos cordiales

doc

trend_alexcud_v_2men.mq4
 

Cómo: Alerta cada 60 segundos

¿Cómo puedo hacer un código que, por ejemplo, me dé una alerta cada 60 segundos?

He creado este código de abajo, pero me da una alerta cada minuto desde que lo adjunto al gráfico y quiero que siga el tiempo del broker para que me alerte por ejemplo cada 60 segundos.

#include

#include

// exported variables

// local variables

double PipValue=1; // this variable is here to support 5-digit brokers

bool Terminated = false;

string LF = "\n"; // use this in custom or utility blocks where you need line feeds

int NDigits = 4; // used mostly for NormalizeDouble in Flex type blocks

int ObjCount = 0; // count of all objects created on the chart, allows creation of objects with unique names

int ExpectedTime2 = 0;

int init()

{

NDigits = Digits;

ObjectsDeleteAll(); // clear the chart

Comment(""); // clear the chart

}

// Expert start

int start()

{

if (Bars < 10)

{

Comment("Not enough bars");

return (0);

}

if (Terminated == true)

{

Comment("EA Terminated.");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

if (true == false && true) PipValue = 10;

if (true && (NDigits == 3 || NDigits == 5)) PipValue = 10;

OncePerMinutes2();

}

void OncePerMinutes2()

{

int datetime800 = TimeLocal();

if (ExpectedTime2 == 0 || datetime800 > ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1; // reset paused time

}

if (datetime800 >= ExpectedTime2 && datetime800 < ExpectedTime2 + 60)

{

ExpectedTime2 = datetime800 + 60 * 1;

Alert3();

}

}

void Alert3()

{

Alert("One minute gone");

}

int deinit()

{

if (true) ObjectsDeleteAll();

}

 
mladen:
Doc Si necesitas todos esos elementos, no hay forma más sencilla de escribirlo

Uhm, mala suerte esta vez, gracias de todos modos.

Saludos cordiales

doc

 

Hay un problema con la segunda llamada StringConcatenate.

Estás sumando 3 nombres de fuentes diferentes y no habrá un nombre resultante válido.

Robert

dr.house7:
¡hola a todos!

Estoy tratando de simplificar este código usando el comando stringconcatenate de esta manera

ObjectSetText("uitog1v", StringConcatenate("/\ ", uitog1v, "%"),12, hr1v, DodgerBlue );

a esto:

ObjectSetText("uitog1v", StringConcatenate("/\", uitog1v, "%","/\", uitog2v, "%","/\", uitog3v, "%"),12, StringConcatenate(hr1v,hr2v,hr3v), DodgerBlue );

Espero que alguien pueda ayudarme.

Saludos cordiales

doc

trend_alexcud_v_2men.mq4
 

Necesito ayuda con el EA ... las operaciones no se cierran en el probador

Estoy trabajando en un EA, pero no importa lo que haga, no puedo hacer que cierre las operaciones. El código de mi EA es el mismo que el de los demás, pero no se cierra.

Voy a publicar parte del código de mi EA para que tal vez uno de ustedes codificadores experimentados puede averiguar por qué estoy teniendo este problema. Los vares 'buyTrade' y 'sellTrade' son globales para todo el EA.

NOTA: Sólo quiero UNA operación abierta en cualquier momento, ya sea larga o corta. Las operaciones son "siempre en" por lo que cuando una señal de largo viene, el corto existente debe ser cerrado y viceversa.

No está haciendo esto. Lo que está haciendo es abrir operaciones y luego abre más operaciones... y abre más... y las mantiene abiertas hasta que todas llegan a sus topes.

Gracias de antemano

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);
 

...

Ya que es un código parcial : intente reemplazar symBid con symAsk en el cierre de la venta y symAsk con symBid al cerrar la orden de compra (invierta los precios de cierre, no puede cerrar una venta a precio de oferta y no puede cerrar una compra a precio de demanda)

outofdebt:
Estoy trabajando en un EA, pero no importa lo que haga, no puedo hacer que cierre las operaciones. Las abre muy bien, pero cuando quiero cerrarlas, el EA no las cierra.

Voy a publicar parte del código de mi EA para que quizás alguno de vosotros, codificadores experimentados, pueda averiguar por qué tengo este problema. Las variables 'buyTrade' y 'sellTrade' son globales para todo el EA.

NOTA: Sólo quiero UNA operación abierta en cualquier momento, ya sea larga o corta. Las operaciones son "siempre en" por lo que cuando una señal de largo viene, el corto existente debe ser cerrado y viceversa.

No está haciendo esto. Lo que está haciendo es abrir operaciones y luego abre más operaciones... y abre más... y las mantiene abiertas hasta que todas llegan a sus topes.

Gracias de antemano

//---- Is there a new signal?

// Buy signal ---------------------------------------

//if(buyTrade==false || sellTrade==false) {

if (STC_VIDYAprev = 10.00) {

if (sellTrade==true) {

for (int i = OrdersTotal() - 1; i >= 0; i--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_BUY )

{ int OldTicket=OrderTicket(); double lots=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symAsk = NormalizeDouble( MarketInfo( Sym, MODE_ASK ), SymDigits );

bool closeSellOrder = OrderClose( OldTicket, lots, symAsk, 0, CLR_NONE );

}

sellTrade = false;

}

if(buyTrade==false) {

EnterLong(Sym, Lots, "");

buyTrade = true;

}

}

//else

//return(0);

// Sell signal ---------------------------------------

if (STC_VIDYAprev > 90.00 && STC_VIDYAcur <= 90.00 ) {

if (buyTrade==true) {

for (int j = OrdersTotal() - 1; j >= 0; j--) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if ( OrderType() == OP_SELL )

{ int oldTicket=OrderTicket(); double lotts=OrderLots();}

RefreshRates(); //OrderSelect() needed ?

double symBid = NormalizeDouble( MarketInfo( Sym, MODE_BID ), SymDigits );

bool closeBuyOrder = OrderClose( oldTicket, lotts, symBid, 0, CLR_NONE );

}

buyTrade = false;

}

if(sellTrade==false) {

EnterShrt( Sym, Lots, "");

sellTrade = true;

}

}

//else

//return(0);