Hola
Como los ateriores daban problemas de conttrol sobre las órenes los he cambiado.
Este es un pequeño sistema que lleva añadido la automatización de órdenes en AMIB. Es un reverse que siempre está en mercado con un contrato; para utilizar MoneyM habrá que aprender a programar algo más. Por ahora espero que esto os sea de alguna utilidad.
Podeis probarlo en gráficos de un minuto para que cambie de posición rápidamente, en el Paper de IB con Eur Fut.
Solo hay que copiarlo y pegarlo:
(si veis algún fallo por favor comentarlo)
////Para probar IBController ////
Ind=Ref(MACD(12,17),-1);
Ind2=MA(Ind,2);
Buy=Cross(Ind,Ind2);
Short=Cross(Ind2,Ind);
Cover=Buy;
Sell=Short;
SellPrice=O;
BuyPrice = O;
Plot(Ind,"Ind",colorRed);
Plot(Ind2,"Ind2",colorBlue);
PlotShapes(IIf (Buy,shapeUpArrow,shapeNone),colorGreen,0,Graph0,-12);
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorRed,0,Graph0,-12);
//// IBController //////
ibc = GetTradingInterface("IB");
if( LastValue( Buy ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.02, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Short) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >=0 )AND (ibc.IsOrderPending(OrderId) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 0.02, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
Ordenes automáticas con AMI
Ordenes automáticas con AMI
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
tú serás duro pero yo no tengo prisa.
Bueno, pues este es otro sistemilla para probar órdenes automáticas con AMI, pero con este te puede dejar fuera de mercado, es decir controla las órdenes Sell y Cover.
A mí me funciona correctamente escepto el stop, se supone que debería saltar a 2 pipos pero no salta. Habrá que estudiar más.
También es para el EUR.
Saludos y suerte.
////Para probar IBController ////
Ind=Ref(MACD(8,17),-1);
Ind3=Ref(MACD(3,10),-1);
Ind2=Ind+0.0001;
Buy=Cross(Ind3,Ind);
Short=Cross(Ind2,Ind3);
Sell=Cross(Ind3,Ind2) ;
Cover=Cross(Ind,ind3) ;
CoverPrice=O;
ShortPrice=O;
SellPrice=O;
BuyPrice = O;
Buy=ExRem(Buy,Short);
Short=ExRem(Short, Buy);
Cover=ExRem(Cover,Short);
Sell=ExRem(Sell,Buy);
Plot(Ind,"Ind",colorRed);
Plot(Ind2,"Ind2",colorBlue);
Plot(Ind3,"I3",colorYellow);
PlotShapes(IIf (Cover,shapeUpArrow,shapeNone),colorWhite,0,Graph0,-12);
PlotShapes(IIf(Sell,shapeDownArrow,shapeNone),colorYellow,0,Graph0,-12);
PlotShapes(IIf (Buy,shapeUpArrow,shapeNone),colorGreen,0,Graph0,-12);
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorRed,0,Graph0,-12);
//// IBController //////
ibc = GetTradingInterface("IB");
if( LastValue( Buy ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Short) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >=0 )AND (ibc.IsOrderPending(OrderId) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Cover ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) < 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 2, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Sell) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >0 )AND (ibc.IsOrderPending(OrderId) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 2, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
A mí me funciona correctamente escepto el stop, se supone que debería saltar a 2 pipos pero no salta. Habrá que estudiar más.
También es para el EUR.
Saludos y suerte.
////Para probar IBController ////
Ind=Ref(MACD(8,17),-1);
Ind3=Ref(MACD(3,10),-1);
Ind2=Ind+0.0001;
Buy=Cross(Ind3,Ind);
Short=Cross(Ind2,Ind3);
Sell=Cross(Ind3,Ind2) ;
Cover=Cross(Ind,ind3) ;
CoverPrice=O;
ShortPrice=O;
SellPrice=O;
BuyPrice = O;
Buy=ExRem(Buy,Short);
Short=ExRem(Short, Buy);
Cover=ExRem(Cover,Short);
Sell=ExRem(Sell,Buy);
Plot(Ind,"Ind",colorRed);
Plot(Ind2,"Ind2",colorBlue);
Plot(Ind3,"I3",colorYellow);
PlotShapes(IIf (Cover,shapeUpArrow,shapeNone),colorWhite,0,Graph0,-12);
PlotShapes(IIf(Sell,shapeDownArrow,shapeNone),colorYellow,0,Graph0,-12);
PlotShapes(IIf (Buy,shapeUpArrow,shapeNone),colorGreen,0,Graph0,-12);
PlotShapes(IIf(Short,shapeDownArrow,shapeNone),colorRed,0,Graph0,-12);
//// IBController //////
ibc = GetTradingInterface("IB");
if( LastValue( Buy ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Short) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >=0 )AND (ibc.IsOrderPending(OrderId) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Cover ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) < 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 2, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
if( LastValue( Sell) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) >0 )AND (ibc.IsOrderPending(OrderId) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder("6EH6-GLOBEX-FUT", "sell", 1, "MKT", 0, 2, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
tú serás duro pero yo no tengo prisa.
Pues yo Strada por más que lo intento no me sale. Intento hacer un sistema tonto para lanzar las ordenes en modo prueba y se vuelve loco lanzando mil ordenes por segundo. Éste es el último código que usé, a ver si ves algo raro (y, por cierto, a ver si saco un rato para probar el tuyo). Como puedes ver uso una booleana para evitar la locura de las ordenes pero nada, es como si cogiera una orden por segundo cada vez que se mueve el precio:
X-Trader
Un saludoLastPosition=0;
Buy=C > Ref(C, -1);
Sell=C < Ref(C, -1);
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);
if( LastValue( Buy ) )
{
ibc = GetTradingInterface("IB");
if( ibc.IsConnected() )
{
if(LastPosition==0)
{
ibc.PlaceOrder( Name(), "Buy", 1, "MKT", 0, 0, "Day", False);
LastPosition=1;
}
}
else
{
if( LastPosition==-1)
{
ibc.PlaceOrder( Name(), "Buy", 2, "MKT", 0, 0, "Day", False );
LastPosition=1;
}
}
}
if( LastValue( Sell ) )
{
ibc = GetTradingInterface("IB");
if( ibc.IsConnected() )
{
if( LastPosition==0 )
{
ibc.PlaceOrder( Name(), "Sell", 1, "MKT", 0, 0, "Day", False );
LastPosition=-1;
}
}
else
{
if( LastPosition==1 )
{
ibc.PlaceOrder( Name(), "Sell", 2, "MKT", 0, 0, "Day", False );
LastPosition=-1;
}
}
}
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Hola
No puedo decir que sepa programar pero probando aquí y allá van saliendo cosas, es cuestion de dedicarle tiempo. La verdad es que este AFL es bastante sencillo. Lo que no entindo bien es las órdenes IF- ELSE
ó DO - While y tampoco sé dónde aprender algo más sobre esto, no sé de qué lenguaje se trata, si Visual, c++ o qué.
Me parece que el Controller no va muy fino, me imagino que lo irán mejorando. Como lo necesito para mi sistema lo iré perfeccionando para que haga lo que yo quiero, que funcionen los stops y al gún tipo de MM.
X , A mí me pasaba lo mismo, para que no ocurra esto hay que meter las órdenes en una "hipotética" lista:
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
Y antes de abrir una orden hay que chequear esta lista y comprobar que no queden órdenes pendientes:
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
De esta forma cada órden me queda así:
ibc = GetTradingInterface("IB");
if( LastValue( Buy ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
Las claves para que me funcionara están en los comandos: StaticVarGetText y StaticVarSetText. Y utilizar PlaceOrder en lugar de TansmitOrder. O sea que es nuy "delicadito" hay que darle todo bien masacado, incluso el contrato en el que quieres que trabaje...
De todas formas el Stop que dicen que debería funcionar a mí no me funciona y no sé porqué. En fin, todo se andará.
Bueno espero que te funcione.
Saludos y suerte
No puedo decir que sepa programar pero probando aquí y allá van saliendo cosas, es cuestion de dedicarle tiempo. La verdad es que este AFL es bastante sencillo. Lo que no entindo bien es las órdenes IF- ELSE
ó DO - While y tampoco sé dónde aprender algo más sobre esto, no sé de qué lenguaje se trata, si Visual, c++ o qué.
Me parece que el Controller no va muy fino, me imagino que lo irán mejorando. Como lo necesito para mi sistema lo iré perfeccionando para que haga lo que yo quiero, que funcionen los stops y al gún tipo de MM.
X , A mí me pasaba lo mismo, para que no ocurra esto hay que meter las órdenes en una "hipotética" lista:
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
Y antes de abrir una orden hay que chequear esta lista y comprobar que no queden órdenes pendientes:
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
De esta forma cada órden me queda así:
ibc = GetTradingInterface("IB");
if( LastValue( Buy ) )
{
// check if we are connected OK
if( ibc.IsConnected() )
{
// check if we do not have already open position on this stock
OrderID = StaticVarGetText("OrderID"+"6EH6-GLOBEX-FUT");
if(( ibc.GetPositionSize( "6EH6-GLOBEX-FUT" ) <= 0 )AND (ibc.IsOrderPending(OrderId ) == False) )
{
// transmit order
OrderID = ibc.PlaceOrder( "6EH6-GLOBEX-FUT", "Buy", 1, "MKT", 0, 0.0002, "Day", True,1 );
// store orderID for next run so we know which order to modify
StaticVarSetText("OrderID"+"6EH6-GLOBEX-FUT" , OrderID);
}
}
}
Las claves para que me funcionara están en los comandos: StaticVarGetText y StaticVarSetText. Y utilizar PlaceOrder en lugar de TansmitOrder. O sea que es nuy "delicadito" hay que darle todo bien masacado, incluso el contrato en el que quieres que trabaje...
De todas formas el Stop que dicen que debería funcionar a mí no me funciona y no sé porqué. En fin, todo se andará.
Bueno espero que te funcione.
Saludos y suerte
El perro le dijo al hueso:
tú serás duro pero yo no tengo prisa.
tú serás duro pero yo no tengo prisa.
Segun lo que he entendido hasta ahora el Amibroker chekea el codigo entero cada 5 segundos y lo hace desde arriba hasta abajo, si despues de una orden le das valor a la variable 1 y en la entrada del codigo ( arriba del todo ) le das valor 0 identificara que siempre vale 0, por eso da error el codigo.
Para solucionar esto con ordenes a mercado hay que usar la funcion ibc.GetPositionSize( Name() ) == X así chekea la posicion que hay en la TWS antes de lanzar la orden.
Haciendolo asi con ordenes a mercado funciona perfecto, ese era el error que tenia el codigo.
Yo ahora estoy con un error nuevo ( ordenes a stop) que son mucho mas dificiles que las mkt y ademas no hay nada de informacion en la red, al menos yo no he encontrado nada.
Para solucionar esto con ordenes a mercado hay que usar la funcion ibc.GetPositionSize( Name() ) == X así chekea la posicion que hay en la TWS antes de lanzar la orden.
Haciendolo asi con ordenes a mercado funciona perfecto, ese era el error que tenia el codigo.
Yo ahora estoy con un error nuevo ( ordenes a stop) que son mucho mas dificiles que las mkt y ademas no hay nada de informacion en la red, al menos yo no he encontrado nada.
No, si al final me haceis ponerme de nuevo con al AmiBroker!!!MARTING escribió:Segun lo que he entendido hasta ahora el Amibroker chekea el codigo entero cada 5 segundos y lo hace desde arriba hasta abajo, si despues de una orden le das valor a la variable 1 y en la entrada del codigo ( arriba del todo ) le das valor 0 identificara que siempre vale 0, por eso da error el codigo.
Para solucionar esto con ordenes a mercado hay que usar la funcion ibc.GetPositionSize( Name() ) == X así chekea la posicion que hay en la TWS antes de lanzar la orden.
Haciendolo asi con ordenes a mercado funciona perfecto, ese era el error que tenia el codigo.
Yo ahora estoy con un error nuevo ( ordenes a stop) que son mucho mas dificiles que las mkt y ademas no hay nada de informacion en la red, al menos yo no he encontrado nada.
Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Voy a lanzar una inderecta sutil a ver que pasa...
- Adjuntos
-
- SISTEMA CIERRES.afl
- (2.49 KiB) Descargado 257 veces
aprovechando este hilo quisiera, antes de dar mil vueltas, preguntaros algo:
estoy empezando a programar mi operativa en el AMIbroker ,pero cuando lo pongo en el ami me genera mil y un entradas,siempre que se cumple la condicion en cada barra, cuando lo que suiero es que se ejecute en la primera barra que se de la condicion (que tal media sea mayor que tal otra)
no puedo poner la condicion getposition o similar por que es para hacer backtest, no para papertrading o real, que es lo que "cortaria" la reiteracion de la orden de compra o venta.
antes de leerme cada una de las 800 paginas del manual y unos cientos de foros ¿?algun alma caritativa tiene la solucion a esto¿?
saludos.
estoy empezando a programar mi operativa en el AMIbroker ,pero cuando lo pongo en el ami me genera mil y un entradas,siempre que se cumple la condicion en cada barra, cuando lo que suiero es que se ejecute en la primera barra que se de la condicion (que tal media sea mayor que tal otra)
no puedo poner la condicion getposition o similar por que es para hacer backtest, no para papertrading o real, que es lo que "cortaria" la reiteracion de la orden de compra o venta.
antes de leerme cada una de las 800 paginas del manual y unos cientos de foros ¿?algun alma caritativa tiene la solucion a esto¿?
saludos.
las gacelas tambien tenemos derecho a pasto
Es probable que Dios no exista. Ahora, deja de preocuparte y disfruta de la vida
Es probable que Dios no exista. Ahora, deja de preocuparte y disfruta de la vida
Si te ha gustado este hilo del Foro, ¡compártelo en redes!