Ordersend y Oanda
Ordersend y Oanda
A ver si me echan un cable los usuarios de este broker, no consigo meterle ordenes a mercado desde un EA. No se si sera por el quinto decimal o no pero he probado de todo.
Este codigo no funciona y no se por que:
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-(700*Point),Ask+(70*Point),"My EA",12345,0,Green); //En un broker de 4 decimales si que funciona...
En el backtest si funciona, cuando no funciona es en el forward test, y si lo ejecuto sin stop y sin target si que entra, el probrema esta aqui pero no se solucionarlo..
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,0,"My EA",12345,0,Green); //Asi si funciona
Luego no me hace order modifi, una vez ha entrado sin stop ni target, al ser de 5 decimales le añado un 0 mas a los target y stop, con esto ya deberia de estar compensado, a ver si algun usuario de oanda me ilumina.
Saludos
Este codigo no funciona y no se por que:
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-(700*Point),Ask+(70*Point),"My EA",12345,0,Green); //En un broker de 4 decimales si que funciona...
En el backtest si funciona, cuando no funciona es en el forward test, y si lo ejecuto sin stop y sin target si que entra, el probrema esta aqui pero no se solucionarlo..
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,0,"My EA",12345,0,Green); //Asi si funciona
Luego no me hace order modifi, una vez ha entrado sin stop ni target, al ser de 5 decimales le añado un 0 mas a los target y stop, con esto ya deberia de estar compensado, a ver si algun usuario de oanda me ilumina.
Saludos
Re: Ordersend y Oanda
Hola,
Supongo que si, has verificado que tu TP no esté demasiado cercano?
MarketInfo(argSymbol,MODE_STOPLEVEL)
Saludos,
Supongo que si, has verificado que tu TP no esté demasiado cercano?
MarketInfo(argSymbol,MODE_STOPLEVEL)
Saludos,
___________________________
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
Re: Ordersend y Oanda
Me devuelve 0
MarketInfo("EURUSD",MODE_STOPLEVEL)
MarketInfo("EURUSD",MODE_STOPLEVEL)
Re: Ordersend y Oanda
GetLastError( ) me devuelve error 130
http://docs.mql4.com/constants/errors
ERR_INVALID_STOPS 130 Invalid stops.
http://docs.mql4.com/constants/errors
ERR_INVALID_STOPS 130 Invalid stops.
Re: Ordersend y Oanda
Bueno listo, solucionado en dos pasos, primero meto la orden y luego la modifico, de momento me vale:
Código: Seleccionar todo
if(OrdersTotal()==0)
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,0,"My EA",12345,0,Green);
else
{
int TakeProfit = 100; //points
int StopLoss = 100;
double SL, TP;
OrderSelect(0, SELECT_BY_POS, MODE_TRADES);
SL = NormalizeDouble(OrderOpenPrice() - StopLoss * Point,Digits);
TP = NormalizeDouble(OrderOpenPrice() + TakeProfit * Point,Digits);
OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,Yellow);
}
Re: Ordersend y Oanda
EDITO: No había visto tu último post.
------------------------------------
Está claro que el problema está en el SL o TP.
Te paso algunas funciones que uso y que "en teoría" se adaptan a 4 y 5 dígits bróker.
Declara esta variables globales:
double StopLoss = 20;
double TakeProfit=80;
int Slipagge=3;
Declara también estas 2:
double UsePoint;
int UseSlippage;
Pon esto dentro del init()
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(),Slippage);
}
Pon estas 2 funciones personalizadas al final del programa
// Pip Point Function
double PipPoint(string Currency)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return(CalcPoint);
}
// Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return(CalcSlippage);
}
Y para lanzar la orden pon este bloque:
double OpenPrice = Ask;
// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
Espero te funcione.
Ya me dirás
------------------------------------
Está claro que el problema está en el SL o TP.
Te paso algunas funciones que uso y que "en teoría" se adaptan a 4 y 5 dígits bróker.
Declara esta variables globales:
double StopLoss = 20;
double TakeProfit=80;
int Slipagge=3;
Declara también estas 2:
double UsePoint;
int UseSlippage;
Pon esto dentro del init()
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(),Slippage);
}
Pon estas 2 funciones personalizadas al final del programa
// Pip Point Function
double PipPoint(string Currency)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return(CalcPoint);
}
// Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return(CalcSlippage);
}
Y para lanzar la orden pon este bloque:
double OpenPrice = Ask;
// Calculate stop loss and take profit
if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);
if(TakeProfit > 0) double BuyTakeProfit = OpenPrice + (TakeProfit * UsePoint);
// Open buy order
BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,OpenPrice,UseSlippage,
BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
Espero te funcione.
Ya me dirás
___________________________
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
El trading puede aportar beneficios mucho más valiosos que el dinero.
CJS
Re: Ordersend y Oanda
Gracias cjs , ya voy a probar tu codigo, por que el apaño que he echo no es suficiente, funciona cuando quiere.
El tema esta en que hay que mandar un stop de 5 decimales, y a pesar de guardar el numero en un double, luego al mostralo en pantalla solo muestra 4. Debe ser que el mt no esta preparado para 5.
Si no consigo que funcione con tu codigo tendre que tirar de una funcion de control de equidad y cierre respectivos
El tema esta en que hay que mandar un stop de 5 decimales, y a pesar de guardar el numero en un double, luego al mostralo en pantalla solo muestra 4. Debe ser que el mt no esta preparado para 5.
Si no consigo que funcione con tu codigo tendre que tirar de una funcion de control de equidad y cierre respectivos
Re: Ordersend y Oanda
Tienes que poner el OrderSend sin stoploss ni takeprofits, y en caso necesario incluirlos después con OrderModify.
Por ejemplo yo lo hago así para que funcione en Oanda:
Por ejemplo yo lo hago así para que funcione en Oanda:
Código: Seleccionar todo
if(broker5=="OANDA"){tk=OrderSend(Symbol(),tip,NormalizeDouble(lotmult*minlot,2),NormalizeDouble(precio,Digits),slipo,0,0,comment,magicnumber,0,col);
if(sl>0 || tp>0)while(tk>0 && !bm && i<5){i++;bm=OrderModify(tk,NormalizeDouble(precio,Digits),NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),0);}}
else tk=OrderSend(Symbol(),tip,NormalizeDouble(lotmult*minlot,2),NormalizeDouble(precio,Digits),slipo,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),comment,magicnumber,0,col);
Si te ha gustado este hilo del Foro, ¡compártelo en redes!