¿Cómo codificar? - página 206

 

Uso de archivos externos *.set

He tratado y tratado pero no puedo entender esto así que espero que alguien pueda ver el árbol a través del bosque aquí.

Quiero programar un EA para que utilice su configuración programada o bien para que utilice un archivo *.set externo.

Así que si:

extern bool UseExternSet = true;

utilizará la configuración del archivo set externo en lugar de la configuración programada.

Se sabe que se puede hacer pero simplemente se pierde aquí.

Cualquier ejemplo de ea servirá

Bernard

 

¿Problema del compilador o del código?

extern int ma1period=5;

extern int ma1method=1;

extern int ma1tf=0;

extern int ma2period=5;

extern int ma2method=1;

extern int ma2tf=10080;

extern double lots=1;

int init(){}

int deinit(){}

double CMA (int tf,int period, int shift, int method)

{

double MA=iMA(NULL,tf,period,0,method,0,shift)

return(MA)

}

int start()

{

int BarsCount=0;

if (Bars> BarsCount)

{

BarsCount=Bars;

double ma1.1=CMA(ma1tf,ma1period,1,ma1method);

double ma1.2=CMA(ma1tf,ma1period,2,ma1method);

double ma2.1=CMA(ma2tf,ma2period,1,ma2method);

double ma2.2=CMA(ma2tf,ma2period,2,ma2method);

bool ma1upsignal =ma1.2<ma1.1;

bool ma1downsignal =ma1.2>ma1.1;

bool ma2upsignal =ma2.2<ma2.1;

bool ma2downsignal =ma2.2>ma2.1;

if (ma1upsignal&&ma2upsignal)

{

OrderSend(Symbol(),OP_BUY,lots,Ask,3,NULL,NULL,NULL,NULL,0,Green);

}

if (ma1downsignal&&ma2downsignal)

{

OrderSend(Symbol(),OP_SELL,lots,Bid,3,NULL,NULL,NULL,NULL,0,Green);

}

if ((ma1upsignal&&ma2downsignal)||(ma1downsignal&&ma2upsignal))

{

int total=OrdersTotal(); //Script to close all open orders.

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

{

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

switch(type)

{

//Close opened long positions

case OP_BUY : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

break;

//Close opened short positions

case OP_SELL : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

}

}

}

}

Este es el trozo de código en el que estoy trabajando. El compilador dice "la variable BarsCount no está definida". ¿Qué debo hacer? Por lo que veo, la variable ha sido inicializada y se le ha dado un valor.

¿Es un problema del compilador o del código?

Archivos adjuntos:
capture2_1.png  12 kb
 

[CÓDIGO]

double CMA (int tf,int period, int shift, int method)

{

double MA=iMA(NULL,tf,period,0,method,0,shift);

return(MA);

}

 
username1:
[CÓDIGO]

double CMA (int tf,int period, int shift, int method)

{

double MA=iMA(NULL,tf,period,0,method,0,shift);

return(MA);

}

Michel,

Gracias. Así se ha solucionado el problema :-)

 

Contar barras consecutivas

¿Alguien tiene algún código sobre cómo contar barras de compra/venta consecutivas en una fila? Quiero contar cuántas veces en un gráfico (introduzca el número de barras para comprobar) hay 1 barra de venta en una fila, 32 barras de venta en una fila, 3 barras de venta en una fila, 4 barras de venta en una fila (igual con la compra), etc.

Sé que tengo que hacer un bucle, pero no sé cómo.

Los resultados pueden ir en un Comment().

Gracias.

 

¿Por qué no funciona mi programa?

Escribí un programa simple.

Se supone que entrar en una sola orden a la vez, y la salida w / una toma de beneficios o una pérdida de la parada.

Está configurado para M30 en GBPUSD.

Es decir: algunas de las constantes sed en el prog se encuentran por "globo ocular" estimaciones. Esto no debería afectar mucho al programa... tampoco funciona con diferentes constantes. (Al menos, cuando se prueba con el Probador de Estrategias, se pone en rápido o medio: no "tick por tick". (demasiado lento...)

En cualquier caso, el programa, cuando se prueba, no introduce una orden y no comprueba nunca la dirección "hacia arriba". (Esto, a través de la "impresión"/traza)

(se supone que comprueba: entrar con una compra o entrar con una venta)

Lógica incidental: comprueba 2 barras consecutivas. Si la barra 1 tiene ambos: un alto más alto y un bajo más alto, el programa piensa que la siguiente barra será alcista.

(Simétricamente para abajo).

El take profit y el stop loss se fijan en consecuencia.

El programa tampoco funciona cuando las declaraciones "if" están anidadas ....

Gracias por mirar esto.

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

//| función de inicialización de expertos ||

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

int init()

{

//----

//----

return(0);

}

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

//| función de desinicialización experta ||

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

int deinit()

{

//----

//----

return(0);

}

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

//| función de inicio experto ||

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

int inicio()

{

//----

bool TrendUp1; double TakeProfitUp; double EE = .00500;

bool OrdTot_OK;double lote;double deslizamiento

double SL_Trailing_Up;bool High2Up;bool Low2Up;

int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;

bool TrendDown; double SL_Trailing_Down;double TakeProfitDown;

bool High2down; bool Low2down;

int ABC = OrdersTotal();

double Size1 = .00630;bool BigUp; double A = High[1];double B= Low[2];//41

double C= High[2]; double D= Low[1];bool BigDown;

//------------------------------------down inicio de la orden

if (ABC == 0)//no hay órdenes fuera es cierto

OrdTot_OK = true

si (ABC == 0)// no hay órdenes fuera es verdadero

Imprime ("en la secuencia de órdenes down, no hubo órdenes out")

si ((C-D) > Tamaño1)/máximo de 2 menos mínimo de 1 > .0063

BigDown = true;

si ((C-D) > Tamaño1)/alto de 2 menos bajo de 1 > .0063

Imprime ("en la secuencia de órdenes bajistas, encontró una gran ruptura a la baja");

si (Alto[1]< Alto[2])

High2down=true;

si (Alto[1]< Alto[2])

Print ("en la secuencia de órdenes a la baja, las barras consecutivas tienen máximos decrecientes")

if(Bajo[1]< Bajo[2])

Low2down=true;

if(Mínimo[1]< Mínimo[2])

Print ("en la secuencia de órdenes descendentes, las barras consecutivas tienen mínimos decrecientes");

if (High2down && Low2down)

TrendDown=true;

si (Alto2abajo && Bajo2abajo)

Imprimir ("en la secuencia de órdenes descendentes, la bandera TrendDown está activada");

si (TrendDown)

SL_Trailing_Down = High[1];

si (TrendDown)

Print ("en la secuencia de órdenes bajistas, se ha establecido el stop_loss")

si (TrendDown)

TakeProfitDown = Oferta - (.005);

si (TrendDown)

Imprime ("en la secuencia de órdenes bajistas, obtuvo un takeprofit", TakeProfitDown);

si (TrendDown && BigDown)

DownAndBig = true;

if (DownAndBig && OrdTot_OK)

ticketdown= OrderSend(Symbol(),OP_SELL,lot, Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);

if (DownAndBig && OrdTot_OK)

Imprime ("en la secuencia de órdenes a la baja, ha intentado introducir un ticket", ticketdown);

if (ticketdown < 0)

Print("OrderSend_Down falló con el error #",GetLastError());

return(0);

//----------------------------------------------down order done

//---------------------------------------------------up order start

si (ABC == 0)

OrdTot_OK = true;

si (ABC == 0)

Imprime ("en la secuencia de subida, no ha salido ninguna orden");

si ((A - B) > Tamaño1)

BigUp = true

si ((A - B) > Tamaño1)

Imprime ("en la secuencia que sube, la prueba de tamaño de las dos barras fue correcta");

if (High[1] > High[2])

High2Up = true;//44

si (High[1] > High[2])

Print ("en la secuencia ascendente, la prueba de máximos crecientes fue correcta")

if(Bajo[1] > Bajo[2])

Low2Up=true;

if(Mínimo[1] > Mínimo[2])

Print ("en la secuencia ascendente, la prueba de mínimos crecientes fue correcta");

if (High2Up && Low2Up)

TrendUp1=true;

if (Alta2Subida && Baja2Subida)

Print ("en la secuencia de subidas, se activó la bandera de subidas");

si (TrendUp1)

SL_Trailing_Up = Low[1] ;

si (TrendUp1)

Print ("en la secuencia de subida, estableció el stoploss")

si (TrendUp1)

TakeProfitUp = Ask + (.005);

si (TrendUp1)

Print ("en la secuencia alcista, se establece el takeprofit", TakeProfitUp);

si (TrendUp1 && BigUp)

UpAndBig = true;

if ( UpAndBig && OrdTot_OK)

ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);

if (UpAndBig && OrdTot_OK)

Imprime ("en la secuencia de subida, intentó enviar una orden", ticketup);

if (ticketup < 0)

Print("OrderSend_Up falló con el error #",GetLastError());

return(0);

//-------------------------------------------------up order done

//----

return(0);// no estoy seguro de esta línea

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

//----

return(0);

}

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

 

Barras mínimas antes/después de la operación

Hola,

Hola, soy nuevo en MT4.. ¿Podría alguien decirme cómo puedo poner una restricción en un EA que requiera un mínimo de "x" barras para abrir una nueva posición o cerrar una anterior?

(sin usar el comando sleep)

Saludos.

 

ayuda de codificación mql

if (iMA(NULL, 0, 24, 0, MODE_LWMA, PRICE_WEIGHTED, 1) > iMA(NULL, 0, 120, 1, MODE_LWMA, PRICE_WEIGHTED, 1)) gi_268 = 2;

---------------------------------------------------------------

¿qué significa?

¿2 LWMA utilizados?

LWMA periodo =24 desplazamiento =0 en el precio ponderado (hcll4) cruzar LWMA periodo 120 desplazamiento =1 en el precio ponderado (hcll4) entonces comprar o vender?

 

Problema con la posición de cierre

Hola,

Acabo de empezar con mi nuevo EA y la apertura de posiciones está bien, configuro tp y sl. El EA abre y cierra 1 por 1 posición y nunca hay más de 1 orden. Pero me gustaría cerrar la posición si alguno de los indicadores me avisa antes del límite de sl o tp.

Si intento algo como esto:

for (int i=1; i<=OrdersTotal(); i++) {

if (OrderSelect(i, SELECT_BY_POS, 2)) {

if (OrderSymbol()==Symbol()) {

Ans=OrderClose(OrderTicket(),alLots,Bid,2);// Order closing

}

}

}[/CODE]

Nothing happened. Doesn't find any opened positions and I know there is 1.

If I try something like this:

for (int i=1; i<=OrdersTotal(); i++) {

CloseOrder(OrderValue(i,VAL_TICKET),OrderValue(i,VAL_LOTS),Bid,3);

}

Compiler report error message that VAL_TICKER and VAL_LOTS are not defined and in examples I found they are nowhere declared.

If I try direcly by number to close:

[CODE]

Ans=OrderClose(0,alLots,Bid,2);// Order closing

Me sale el mensaje de error 4107 o 4105 que el ticker no es valido

¿Puede alguien comprobar esto y mi ea en el archivo adjunto y ayudar por favor?

Muchas gracias

Archivos adjuntos:
rsiproba.mq4  6 kb
 

iMayor iMenor Aclaración

Supongamos 3 barras: Barra [2], Barra [1] y Barra [0] (Actual).

¿Es correcta la siguiente función "stop_low()" para encontrar el mínimo de la barra [2] y [3]?

double stop_low = iLowest(Symbol(),0,1,2,1);

------------------------------------------------------------

Referencia:

int iLowest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

Devuelve el desplazamiento del menor valor a lo largo de un número específico de períodos en función del tipo.

Parámetros:

symbol - Símbolo cuyos datos deben ser utilizados para calcular el indicador. NULL significa el símbolo actual.

timeframe - Timeframe. Puede ser cualquiera de los valores de la enumeración Timeframe. 0 significa el marco de tiempo del gráfico actual.

type - Identificador de la serie. Puede ser cualquiera de los valores de la enumeración de identificadores de series.

count - Número de periodos (en dirección desde la barra inicial hasta la posterior) sobre los que se realiza el cálculo.

start - Desplazamiento que muestra la barra, relativa a la barra actual, de la que se deben tomar los datos.

Ejemplo:

// calcular el valor más bajo en las 10 barras consecutivas en el rango

// del 10º al 19º índice inclusive en el gráfico actual

double val=Low;