Ayuda a la codificación - página 238

 

¿Existe la posibilidad de añadir opciones para elegir?

Por ejemplo,

por separado, compra y venta por separado

Modificación: ¿BE todo comprar 0, o +1, o +2 pips o vender todo BE 0, 1 o 2 pips?

¿Es posible?

be.mq4

Archivos adjuntos:
be.mq4  1 kb
 

Hola Mladen ,

Alguien puede decirme que estoy haciendo mal, yo escribo mi ea usando FX Gen con fragmentos y códigos usando ejemplos del compilador mq4 y foros en línea.Estoy tratando de codificar mi estrategia para el comercio más fácil, he sido capaz de seleccionar la última orden con éxito utilizando este código.

void OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Ninguna abierta.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY | OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY | OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket);

}

si no

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

¿Puedes echar un vistazo a este código? Estoy tratando de eliminar la orden más antigua primero usando la fecha y el ticket de la orden, por ejemplo, si la orden abierta >2 elimina la orden más antigua.

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

// Etasoft Inc. Forex EA y Script Generator versión 4.1 EA

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

// Palabras clave: MT4, Forex EA builder, crear EA, desarrollador de asesores expertos

#property copyright "Copyright © 2011, Etasoft Inc. Generador de EA de Forex v4.1"

#property link

#include

#include

//variables exportadas

extern int OrderId = 1;

extern int Deslizamiento = 2;

extern double Lotes = 0.01

extern int MaxOrdersAllowed = 2;// op buy y op sell permitidos

extern int Grid = 10; // distancia total en pips para abrir órdenes

extern string EAComment = "564 testing";

// variables locales

double PipValue=1; // esta variable está aquí para soportar brokers de 5 dígitos

bool Terminated = false;

string LF = "\n"; // utilícelo en bloques personalizados o de utilidad donde necesite saltos de línea

int NDigits = 4; // se utiliza principalmente para NormalizeDouble en bloques de tipo Flex

int ObjCount = 0; // cuenta todos los objetos creados en el gráfico, permite la creación de objetos con nombres únicos

int current = 0;

int init()

{

NDigits = Dígitos;

if (false) ObjectsDeleteAll(); // borrar el gráfico

Comment(""); // borrar el gráfico

}

// Inicio del experto

int inicio()

{

if (Bars < 10)

{

Comentario("No hay suficientes barras");

return (0);

}

if (Terminado == true)

{

Comment("EA Terminado");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

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

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

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MaximumOrder();

}

void IfOrderDoesNotExist2()

{

bool existe = false

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true;

}

}

si no

{

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

BuyPendingOrder();

}

}

void IfOrderDoesNotExist4()

{

bool existe = false

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true;

}

}

si no

{

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

SellPendingOrder();

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

double SL = precio - 0*ValorPip*Punto;

si (0 == 0) SL = 0;

double TP = precio + 0*PipValue*Point;

si (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

si (ticket == -1)

{

Print("Error de OrderSend() - ", ErrorDescription(GetLastError());

}

}

void VenderPedidoPendiente()

{

int expire = TimeCurrent() + 60 * 0;

double precio = NormalizeDouble((Oferta+((Demanda-Oferta)/2)), NDigits) - Grid*PipValue*Point;

double SL = precio + 0*ValorPip*Punto;

si (0 == 0) SL = 0;

double TP = precio - 0*PipValue*Point;

si (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red);

si (ticket == -1)

{

Print("Error de OrderSend() - ", ErrorDescription(GetLastError());

}

}

void PedidoMáximo()

{

if (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

void OrderCount()

{

int count = 0;

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

si no

{

Print("Error de OrderSend() - ", ErrorDescription(GetLastError());

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // Ninguno abierto.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() = OP_BUY | OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

return(lastTicket);

}

si no

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

int deinit()

{

si (false) ObjectsDeleteAll();

}

 
sulaimoney:
Hola Mladen ,

Alguien puede decirme que estoy haciendo mal, yo escribo mi ea usando FX Gen con fragmentos y códigos usando ejemplos del compilador mq4 y foros en línea.Estoy tratando de codificar mi estrategia para un comercio más fácil, he sido capaz de seleccionar la última orden con éxito utilizando este código.

void OpenNewTrade()

{ datetime lastTime = 0;

int lastTicket = -1; // Ninguna abierta.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() >= lastTime && OrderTicket() > lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() == OP_BUY | OrderType() == OP_SELL

&& Ask - OrderOpenPrice() >= Grid*PipValue*Point

{

{

BuyOrder();

}

}

if (OrderType() == OP_BUY | OrderType() == OP_SELL

&& OrderOpenPrice() - Bid >= Grid*PipValue*Point

{

{

SellOrder();

}

}

}

return(lastTicket);

}

si no

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

¿Puedes echar un vistazo a este código? Estoy tratando de eliminar la orden más antigua primero usando la fecha y el ticket de la orden, por ejemplo, si la orden abierta >2 elimina la orden más antigua.

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

// Etasoft Inc. Forex EA y Script Generator versión 4.1 EA

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

// Palabras clave: MT4, Forex EA builder, crear EA, desarrollador de asesores expertos

#property copyright "Copyright © 2011, Etasoft Inc. Generador de EA de Forex v4.1"

#property link

#include

#include

//variables exportadas

extern int OrderId = 1;

extern int Deslizamiento = 2;

extern double Lotes = 0.01

extern int MaxOrdersAllowed = 2;// op buy y op sell permitidos

extern int Grid = 10; // distancia total en pips para abrir órdenes

extern string EAComment = "564 testing";

// variables locales

double PipValue=1; // esta variable está aquí para soportar brokers de 5 dígitos

bool Terminated = false;

string LF = "\n"; // utilícelo en bloques personalizados o de utilidad donde necesite saltos de línea

int NDigits = 4; // se utiliza principalmente para NormalizeDouble en bloques de tipo Flex

int ObjCount = 0; // cuenta todos los objetos creados en el gráfico, permite la creación de objetos con nombres únicos

int current = 0;

int init()

{

NDigits = Dígitos;

if (false) ObjectsDeleteAll(); // borrar el gráfico

Comment(""); // borrar el gráfico

}

// Inicio del experto

int inicio()

{

if (Bars < 10)

{

Comentario("No hay suficientes barras");

return (0);

}

if (Terminado == true)

{

Comment("EA Terminado");

return (0);

}

OnEveryTick1();

}

void OnEveryTick1()

{

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

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

IfOrderDoesNotExist2();

IfOrderDoesNotExist4();

MaximumOrder();

}

void IfOrderDoesNotExist2()

{

bool existe = false

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_BUYSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true;

}

}

si no

{

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

BuyPendingOrder();

}

}

void IfOrderDoesNotExist4()

{

bool existe = false

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderType() == OP_SELLSTOP && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)

{

existe = true;

}

}

si no

{

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

if (exists == false)

{

SellPendingOrder();

}

}

void BuyPendingOrder()

{

int expire = TimeCurrent() + 60 * 0;

double price = NormalizeDouble((Ask-((Ask-Bid)/2)), NDigits) + Grid*PipValue*Point;

double SL = precio - 0*ValorPip*Punto;

si (0 == 0) SL = 0;

double TP = precio + 0*PipValue*Point;

si (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Blue);

si (ticket == -1)

{

Print("Error de OrderSend() - ", ErrorDescription(GetLastError());

}

}

void VenderPedidoPendiente()

{

int expire = TimeCurrent() + 60 * 0;

double precio = NormalizeDouble((Oferta+((Demanda-Oferta)/2)), NDigits) - Grid*PipValue*Point;

double SL = precio + 0*ValorPip*Punto;

si (0 == 0) SL = 0;

double TP = precio - 0*PipValue*Point;

si (0 == 0) TP = 0;

if (0 == 0) expire = 0;

int ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, price, Slippage, SL, TP, EAComment, OrderId, expire, Red);

si (ticket == -1)

{

Print("Error de OrderSend() - ", ErrorDescription(GetLastError());

}

}

void PedidoMáximo()

{

if (MaxOrdersAllowed> 0)

{

OrderCount();

}

}

void OrderCount()

{

int count = 0;

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol())

if (OrderMagicNumber() == OrderId)

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

{

count++;

}

}

si no

{

Print("Error de OrderSend() - ", ErrorDescription(GetLastError());

}

if (count > MaxOrdersAllowed )

{

DeleteOldestOrder();

}

}

void DeleteOldestOrder()

{

datetime lastTime = 0;

int lastTicket = -1; // Ninguno abierto.

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

if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() < lastTime && OrderTicket() < lastTicket )

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

if (OrderType() = OP_BUY | OrderType() == OP_SELL )

{

{

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}

}

}

return(lastTicket);

}

si no

Print("Error de OrderSelect() - ", ErrorDescription(GetLastError()));

}

int deinit()

{

si (false) ObjectsDeleteAll();

}

Prueba a utilizar una función como esta :

void DeleteOldestOrder()

{

datetime lastTime = Time[0]+Period()*60;

int lastTicket = -1; // None open.

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

{

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && OrderOpenTime() <= lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

}

if (lastTicket>-1)

if (OrderSelect(lastTicket,SELECT_BY_TICKET,MODE_TRADES))

OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(),Slippage,Red);

}
 

Gracias Mladen

funcionó sin problemas, por cierto me disculpo por publicar un código tan largo en el foro. Todavía me estoy acostumbrando a la interfaz. Gracias.

 

El indicador no se actualiza automáticamente.

Aquí tengo un indicador que es muy adecuado para mi comercio.

Por desgracia, no se actualiza por sí mismo. Siempre tengo que actualizar manualmente que se renueva.

¿Hay una manera de resolver este problema?

¡Sería muy útil!

Gracias de antemano.

P.D.: Adjunto todo lo que tengo.

Archivos adjuntos:
 

Quiere el sms de notificación. ¿Cómo se ve el código?

 
popej30:
Quiere el sms de notificación. ¿Cómo se ve el código?

popej30

Haga lo siguiente :

SendNotification("mensaje de notificación que quiere enviar");

 

¿Y dónde insertas tu número de teléfono? Mi número 0039 555-23-45. ¿Dónde introducirlo?

Ejemplo:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

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

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

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

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}
 
popej30:
¿Y dónde insertas tu número de teléfono? Mi número 0039 555-23-45. ¿Dónde se introduce?

Ejemplo:

#property indicator_separate_window

#property indicator_minimum -1.1

#property indicator_maximum 1.1

#property indicator_buffers 2

#property indicator_color1 Aqua

#property indicator_color2 Lime

extern int period = 25;

extern int limit = 5000;

double g_ibuf_84[];

double g_ibuf_88[];

double g_ibuf_92[];

int init() {

IndicatorBuffers(3);

SetIndexStyle(0, DRAW_ARROW);

SetIndexStyle(1, DRAW_ARROW);

SetIndexStyle(2, DRAW_NONE);

SetIndexEmptyValue(0, 0.0);

SetIndexEmptyValue(1, 0.0);

SetIndexArrow(0, 233);

SetIndexArrow(1, 234);

SetIndexBuffer(0, g_ibuf_88);

SetIndexBuffer(1, g_ibuf_92);

SetIndexBuffer(2, g_ibuf_84);

IndicatorShortName("BR16");

return (0);

}

int start() {

double ld_72;

double ld_24 = 0;

double ld_32 = 0;

double ld_unused_40 = 0;

double ld_unused_48 = 0;

double ld_56 = 0;

double ld_unused_64 = 0;

double l_low_80 = 0;

double l_high_88 = 0;

for (int li_96 = 0; li_96 <= limit; li_96++) {

g_ibuf_88[li_96] = 0;

g_ibuf_92[li_96] = 0;

}

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

l_high_88 = High;

l_low_80 = Low;

ld_72 = (High[li_96] + Low[li_96]) / 2.0;

if (l_high_88 != l_low_80) ld_24 = 0.66 * ((ld_72 - l_low_80) / (l_high_88 - l_low_80) - 0.5) + 0.67 * ld_32;

else ld_24 = 0.0;

ld_24 = MathMin(MathMax(ld_24, -0.999), 0.999);

g_ibuf_84[li_96] = MathLog((ld_24 + 1.0) / (1 - ld_24)) / 2.0 + ld_56 / 2.0;

ld_32 = ld_24;

ld_56 = g_ibuf_84[li_96];

}

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

if (g_ibuf_84[li_96] >= 0.0 && g_ibuf_84[li_96 + 1] < 0.0) g_ibuf_88[li_96] = -1;

if (g_ibuf_84[li_96] 0.0) g_ibuf_92[li_96] = 1;

}

return (0);

}

Aquí hay una buena explicación de cómo se puede hacer eso :

 
Jim Clark:
El indicador no se actualiza automáticamente.

Aquí tengo un indicador que es muy adecuado para mi comercio.

Por desgracia, no se actualiza por sí mismo. Siempre tengo que actualizar manualmente que se renueva.

¿Hay una manera de resolver este problema?

¡Sería muy útil!

Gracias de antemano.

P.D.: Adjunto todo lo que tengo.

Jim

En vez de reescribirlo todo, añade un límite para calcular las barras y entonces todas esas barras se recalculan. Eso debería resolver el problema de la actualización (sólo hay que mantener el BarsTocalculate en un valor razonable, no demasiado grande ni demasiado pequeño. Usé 1000 como valor por defecto y parece estar bien así). Pruébalo

Archivos adjuntos: