¿Cómo codificar? - página 135

 

Error al comilar

Hola a todos

Tengo el siguiente error:

'<'-tipos diferentes en la comparación

Intento modificar la siguiente línea:

(NonLagMA_2D_S2&&D_S2Switch==1)

a

(Price_NowD_S2&&D_S2Switch==1)

¿Dónde está el problema?

Lo siento, no puedo subir el archivo mql. No es mi script

 
:: se compara algo con diferentes tipos, por lo que tiene que ser enteros con enteros, dobles con dobles, cadenas con cadenas... así...

IN10TION

Badguy:
Hola a todos

Tengo el siguiente error:

'<'-tipos diferentes en la comparación

Intento modificar la siguiente línea:

(NonLagMA_2D_S2&&D_S2Switch==1)

a

(Price_NowD_S2&&D_S2Switch==1)

¿Dónde está el problema?

Lo siento, no puedo subir el archivo mql. No es mi script
 

Cierre de posición múltiple por número mágico - Ayuda

Hola a todos.

Soy nuevo en la programación de mt4 y a continuación son mi primera EA. El propósito de este EA es cerrar todas las posiciones independientemente de cualquier par de divisas basado en el mismo número mágico.

Digamos que bajo la magia # 8675310, tengo 2 posición EURUSD y USDCFh. Deberá ser capaz de cerrar todos estos pares cuando se alcanza cierto objetivo de beneficio.

El problema con este EA es,

Transacción abierta # 1 EURUSD (capaz de cerrar)

Abrir Transacción # 2 USDCFh (no podrá cerrar)

NO SERÁ CAPAZ DE CERRAR LA TRANSACCIÓN # 2.

¿Alguna idea?

Gracias

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

//| Cerrando_Trade_By_Magic_No_v1 .mq4 |||

//| Mío |

//| Software de comercio de Forex: Plataforma de Comercio Forex MetaTrader 4

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

#property copyright "Mine"

#property link "http://www.metaquotes.net"

//---- parámetros de entrada

extern int NúmeroMágico1=8675310;

extern int Beneficio1=10;

extern int NúmeroMágico2=8675311;

extern int Beneficio2=15;

extern int MagicNumber3=8675312;

extern int Beneficio3=15

extern int NúmeroMágico4=8675313

extern int Beneficio4=15

extern int NúmeroMágico5=8675314

extern int Beneficio5=15

extern int MagicNumber6=0;

extern int Beneficio6=10;

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

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

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

int init()

{

onScreenComment(98, "Tengak Initialize..");

//----

//----

return(0);

}

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

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

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

int deinit()

{

//----

//----

return(0);

}

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

//| función de inicio experto ||

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

int inicio()

{

string myMessage="";

myMessage = myMessage + ProfitLossMonitor(1,MagicNumber1,Pr ofit1,myMessage);

miMensaje = miMensaje + ProfitLossMonitor(2,MagicNumber2,Pr ofit2,miMensaje);

miMensaje = miMensaje + ProfitLossMonitor(3,MagicNumber3,Pr ofit3,miMensaje);

miMensaje = miMensaje + ProfitLossMonitor(4,MagicNumber4,Pr ofit4,miMensaje);

miMensaje = miMensaje + ProfitLossMonitor(5,MagicNumber5,Pr ofit5,miMensaje);

miMensaje = miMensaje + ProfitLossMonitor(6,MagicNumber6,Pr ofit6,miMensaje);

onScreenComment(98,miMensaje);

//----

//----

return(0);

}

string ProfitLossMonitor(int miNúmeroGrupo,int miNúmeroMágico, int miBeneficio,string miMensaje )

{

int total = OrdersTotal();

double MiBeneficioActual=0;

string MiNúmeroDePedido="";

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES);

if (OrderMagicNumber() == myMagicNumber)

{

MiBeneficioActual += BeneficioOrden();

MyOrderNo= MyOrderNo + "," + OrderTicket();

}

}

if(MyCurrentProfit>=myProfit)

CloseAll(myMagicNumber);

myMessage="Posición del grupo #" + myGroupNumber + " + myMagicNumber + "=" + myProfit + "(" + DoubleToStr(MyCurrentProfit,2) + " " + MyOrderNo + ")" + "\n" ;

return (miMensaje);

}

void CerrarTodo(int miNúmeroMágico)

{

int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES);

if (OrderMagicNumber() == myMagicNumber)

if(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots( ),Bid,5,Violet);

if(OrderType()==OP_SELL)

OrderClose(OrderTicket(),OrderLots( ),Ask,5,Violet);

}

}

void onScreenComment(int myEvent, string myComment)

{

switch (myEvent)

{

caso 98: Comment(myComment); break;

}

}

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

Editar/borrar mensaje

 
El problema con este EA es,

Open Transaction # 1 EURUSD (able to close)

Abrir la transacción # 2 USDCFh (no se podrá cerrar)

NO PODRÁ CERRAR LA TRANSACCIÓN # 2.

¿Alguna idea?

Asumo que está ejecutando el ea en el gráfico EURUSD en el momento en que intenta cerrar las órdenes. ya que esas posiciones se están cerrando bien. Cuando su código intenta cerrar las posiciones del USDCHF(¿un poco de dislexia?) está usando la oferta y la demanda equivocadas, el precio de cierre que usa es del par de divisas al que está unido el EA, no el precio del símbolo de las posiciones. Si intenta cerrar otro par de divisas desde un gráfico que no coincide con esa divisa, debe recuperar primero el precio correcto antes de intentar cerrarlo.

keit

edit: También la divisa, USDCHF en este caso, debe aparecer en su ventana de observación del mercado en el momento en que intenta recuperar las cotizaciones correctas para cerrar las órdenes. Si el USDCHF no aparece en la ventana de vigilancia del mercado, no podrá obtener ninguna cotización para ese par.

 

Gracias cockeyedcowboy !.

"primero debe recuperar el precio correcto antes de intentar cerrarlo".

¿Podría su compartir la sintaxis o función que puede hacer las necesidades anteriores;

 

como no operar hasta la siguiente barra

He intentado programar por primera vez, pero tengo un problema.

- si cierro una operación en una barra, sólo puedo abrir una nueva operación cuando se abre la nueva barra.

He probado lo siguiente;

datetime time0=0;

int inicio()

if (time0 = Time[0]) return;

{

"código del programa"

}

time0 = Tiempo[0];

return(0);

Si quito este bit obtengo múltiples entradas en varias barras. Con él dentro, obtengo muchas menos entradas (de 70 en un backtest. a 4), pero con entradas perdidas.

Alguien sabe qué estoy haciendo mal.

Gracias de antemano.

 

Puede utilizar la función NewBar() a continuación..

Como if(NewBar(){ ........programación aquí

bool NewBar() {

static datetime LastTime = 0;

if (Time[0] != LastTime) {

LastTime = Time[0];

return (true);

} else

return (false);

}

También podría querer probar las órdenes abiertas si sólo quiere una orden a la vez.

Espero que eso ayude.

Lux

 

Lux

Gracias por tu ayuda con esto.

Creo que he descubierto lo que estaba pasando en el programa.

Anteriormente estaba comprobando si había una nueva barra al inicio, por lo que el programa sólo comprobaba el primer tick de la nueva barra para ver si coincidía con mis señales, sin comprobar los demás ticks. Por eso, en el backtest se han producido pocas señales comerciales.

Ahora he colocado el código correctamente, (es decir, donde mi instuction ordersend es) parece estar funcionando bien.

¿Estoy en lo correcto?

 

Por favor, ayude a actualizar el código de experto.

Hay un experto simple. El código es claro y simple también, pero tengo un gran problema - el experto tiene sólo un intento de abrir/cerrar la orden.

¿Puede alguien ayudar a arreglarlo?

El experto debe intentar 5-10 veces abrir/cerrar la orden.

Tal vez n=número de intentos, y por favor sin "while".

Muchas gracias.

Archivos adjuntos:
test.mq4  9 kb
 

Mi código para 'ajustar los lotes después de la pérdida', necesita ayuda..gracias

Mi código de abajo para 'ajustar los lotes después de la pérdida', pero hizo un masaje de error"posición de inicio incorrecta 0 para la función ArraySort" durante la prueba. ¿Alguien puede ayudarme a solucionarlo?

double AdjtLotsByWinRate( int magicnumber,double NormLots)

{

int i,counter;

int ProfitAndTime[][2];

double Profits[];

//----

ArrayResize(ProfitAndTime,OrdersHistoryTotal());

for (i=0;i<OrdersHistoryTotal();i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

{

if (OrderType()<=OP_SELL && OrderMagicNumber()==magicnumber ) // 0 OP_BUY 1 OP_SELL 2 OP_BUYLIMIT 3 OP_SELLLIMIT 4 OP_BUYSTOP 5 OP_SELLSTOP

{

ProfitAndTime[counter][0]=OrderCloseTime();

ProfitAndTime[counter][1]=OrderProfit();

counter++;

}

}

}

ArrayResize(ProfitAndTime,counter);

ArrayResize(Profits,counter);

ArraySort(ProfitAndTime);

for (i=0;i<counter;i++)

{

Profits=ProfitAndTime[1];

}

//Print(Profits);

int err=GetLastError();

int WinRate_N=0,WinRate_A=5;

double WinRate;

for (i=counter;i<counter-WinRate_A+1;i--)

{

if (Profits>0){

WinRate_N=WinRate_N+1;

}

else if (Profits<0)

{

WinRate_N=WinRate_N-1;

}

else

{

WinRate_N=WinRate_N+0;

}

}

WinRate=WinRate_N/WinRate_A;

double NewLots;

if (WinRate>=0.7)

{

NewLots=NormLots*1.5;

}

else if (WinRate>=0.5 && WinRate<0.7)

{

NewLots=NormLots*1;

}

else if (WinRate>=0.3 && WinRate<0.5)

{

NewLots=NormLots*0.5;

}

else //if (WinRate<0.3)

{

NewLots=NormLots*0.1;

}

return(NewLots);

}

Razón de la queja: