Página 1 de 1

Ordersend y Oanda

Publicado: 22 Sep 2011 11:43
por Gamelu
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

Re: Ordersend y Oanda

Publicado: 22 Sep 2011 11:58
por CJS
Hola,

Supongo que si, has verificado que tu TP no esté demasiado cercano?

MarketInfo(argSymbol,MODE_STOPLEVEL)



Saludos,

Re: Ordersend y Oanda

Publicado: 22 Sep 2011 12:24
por Gamelu
Me devuelve 0
MarketInfo("EURUSD",MODE_STOPLEVEL)

Re: Ordersend y Oanda

Publicado: 22 Sep 2011 12:37
por Gamelu
GetLastError( ) me devuelve error 130

http://docs.mql4.com/constants/errors


ERR_INVALID_STOPS 130 Invalid stops.

Re: Ordersend y Oanda

Publicado: 22 Sep 2011 12:51
por Gamelu
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

Publicado: 22 Sep 2011 12:58
por CJS
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

Re: Ordersend y Oanda

Publicado: 22 Sep 2011 17:01
por Gamelu
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

Re: Ordersend y Oanda

Publicado: 22 Sep 2011 17:33
por Fer137
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:

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);