Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré
Pseudo Código N&P Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas. ---EURUSD--- Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces: Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.
Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces: Lotes cortos de EURUSD (de nuevo, variable externa). Si no (es decir, si no se cumplen las condiciones, no se pone en corto).
Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD. Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD. Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición
manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).
----GBPUSD--- exactamente el mismo código que el anterior.
----USDJPY--- IGUAL QUE EL ANTERIOR
---USDCHF--- IGUAL QUE EL ANTERIOR
---AUDUSD--- IGUAL QUE EL ANTERIOR
**Específicos del código tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente ***no se necesita un stoploss para este código
Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré
N&P Pseudo Código Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas. ---EURUSD--- Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces: Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.
Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces: Lotes cortos de EURUSD (de nuevo, variable externa). Si no es así (es decir, si no se cumplen las condiciones, no se vende).
Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD. Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD. Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición
manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).
----GBPUSD--- exactamente el mismo código que el anterior.
----USDJPY--- IGUAL QUE EL ANTERIOR
---USDCHF--- IGUAL QUE EL ANTERIOR
---AUDUSD--- IGUAL QUE EL ANTERIOR
**Específicos del código tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente ***no se necesita un stoploss para este código
**No hay código de gestión de dinero para este
Entonces, ¿cómo se ve esto?
Hola chicos, el tutorial básico de codificación realmente ayudó a conseguir mi cabeza alrededor de esto (aunque la parte de codificación detallada es falta). Para mostraros que he estado ocupado, os adjunto el código de abajo. La idea creo que está ahí, pero todavía devuelve muchos errores. Verás que todo está bajo un gran paréntesis en Start() la razón por la que lo hice es porque mql seguía dando el error de que la variable no puede ser declarada globalmente, y cuando lo hice todo en un paréntesis pareció haber detenido ese error (aunque muchos otros errores persistieron). Utilicé el notepad++ para comprobar la alineación de los paréntesis. ¿Así que al menos voy por el camino correcto con esto?
//+------------------------------------------------------------------+//| N&P 1DailyUpTrendExec.mq4 |//| Copyright Nick Lou & Pete Arh 2009 |//| 20090523 |//| |//+------------------------------------------------------------------+externdouble Lots=0.01;externdouble TakeProfit=20;//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+//-------------------Declaring All Variables and Conditions//--------------------declaration endint init(){return(0);}//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit(){return(0);}// Order counting code// Return: 0 = no orders// >0 = # long orders// <0 = # short ordersint CalcOpenOrders(){intlong=0,short=0;for(int i=0; i<OrdersTotal(); i++)//i set to 0 to stop bugs from//crawling in, i<Orderstotal means if i is behind the number of orders//in market then start counting orders and make i that number{if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;//this function selects an order for further processingif(OrderType()==OP_BUY)long++;if(OrderType()==OP_SELL)short++;}if(long>0)return(long);if(short>0)return(-short);}//------------ (fingers crossed this is right). I still don't get it why we need to count orders.//--------------DECLARATION OF VARIABLES-------------------------double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start (){
ema1=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2=iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3=iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2= ema1< ema2;
e2under3= ema2< ema3;
e1over2= ema1> ema2;
e2over3= ema2> ema3;if(Bars<75){Print("Bars less than 100");return(0);}//------------------EURUSD Block-------------------------//check order type, if it doesn't equal to buy already then buy//here i am setting a condition which will be//checked before a trade is opened, it shoudl state 'It's okay to enter//into long trade so long as there is either 1 order in place already or//none)// Call function. the returnvalue (output) of the function is stored into ReturnValint ReturnVal = CalcOpenOrders();// Check output of functionif( ReturnVal >0)// >0 = long orders. See CalcOpenOrders()
eurusdbuyok=1;else{
eurusdbuyok=0;return(0);}if( ReturnVal<0)// <0 = short orders. See CalcOpenOrders()
eurusdshortok=1;else{
eurusdshortok=0;return(0);}//--------------condition endsif( eurusdshortok==1){staticint ticket;// deleted if(OrdersTotal()==0)if( e1under2 && e2under3)// short function{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);if( ticket>0){if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))Print("SHORT order opened : ",OrderOpenPrice());}}return(0);}// -------------------------------------------------------------------------------------------if( eurusdbuyok==1){staticint ticket1;// deleted if(OrdersTotal()==0)if( e1over2 && e2over3 && eurusdbuyok==1)//buy function{
ticket1=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green);//What's 12345 for? I ADDED ASk-30*Point for stop lossif( ticket1>0){if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());}}return(0);}return(0);}
esta es la última versión del código. sintéticamente todo parece estar bien, pero cuando lo ejecuto a través de probador de la estrategia que devuelve ningún comercio. algo está mal con la lógica. necesito ayuda. Me estoy familiarizando con el código ahora, así la estructura del lado del programa de la misma.
Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré
Pseudo Código N&P Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas. ---EURUSD--- Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces: Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.
Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces: Lotes cortos de EURUSD (de nuevo, variable externa). Si no es así (es decir, si no se cumplen las condiciones, no se vende).
Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD. Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD. Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición
manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).
----GBPUSD--- exactamente el mismo código que el anterior.
----USDJPY--- IGUAL QUE EL ANTERIOR
---USDCHF--- IGUAL QUE EL ANTERIOR
---AUDUSD--- IGUAL QUE EL ANTERIOR
**Específicos del código tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente ***no se necesita un stoploss para este código
**No hay código de gestión de dinero para este
¿Cómo se ve esto?
Hola Niko
Tu pseudo código se ve muy bien para un primer intento.
Sin embargo, me gustaría verlo un poco más estructurado y hay un par de preguntas que me plantea.
He podido ponerlo fácil y rápidamente en el tipo de formato que yo mismo utilizaría normalmente. Se adjunta aquí como archivo de texto para que le eches un vistazo. Tendrá que guardar este archivo y abrirlo en el bloc de notas o en un editor similar para ver el formato.
Tenga en cuenta que en esta etapa no estamos escribiendo en ningún lenguaje informático específico. Sólo estamos tratando de especificar claramente y sin ambigüedades lo que estamos tratando de hacer.
Puedes notar que el pseudocódigo es bastante específico y "legalista". Así es como tenemos que hablar con los ordenadores. Tenemos que especificar muy claramente qué es lo que queremos que hagan. De lo contrario, tienden a generar basura.
También notarás el uso de "Bloques" para organizar las cosas en grupos lógicos. Estos pueden ser útiles más adelante para ayudarnos a estructurar el código adecuadamente. Como alguien señaló anteriormente en esta discusión, no hacemos esto sólo por diversión. Lo hacemos para que el código sea más legible, más comprensible, más fácil de mantener y, en última instancia, más fiable y libre de errores. Esto último es extremadamente importante en un software que va a ser utilizado para el comercio en vivo, a menos que, por supuesto, usted tiene cubos de dinero que está dispuesto a tirar :) . En serio, el comercio es lo suficientemente difícil como para tener que lidiar con el software con errores.
Por favor, eche un vistazo a lo que le he enviado y siéntase libre de hacer los cambios que considere necesarios. Hay un par de puntos importantes que faltan en mi pseudocódigo. ¿Puedes identificarlos?
También puede ocuparse de las dos cuestiones que he planteado en el pseudocódigo. Se me ocurren otras preguntas, pero es mejor dejarlas para la fase de codificación.
Si aún no lo ha hecho, puede probar el editor Notepad++ que FXtrader2008 mencionó anteriormente en esta discusión. Utilice cualquier herramienta que pueda encontrar que haga la vida un poco más fácil. Por favor, envíe su pseudocódigo revisado de nuevo a mí como un archivo de texto adjunto. Me parece que tratar de escribir el código estructurado, pseudo o de otra manera, en este editor de HTML un poco tedioso y desordenado.
Tu pseudocódigo tiene muy buena pinta para ser un primer intento.
Sin embargo, me gustaría verlo un poco más estructurado y hay un par de preguntas que me plantea.
He podido ponerlo fácil y rápidamente en el tipo de formato que yo mismo utilizaría normalmente. Se adjunta aquí como archivo de texto para que le eches un vistazo. Tendrá que guardar este archivo y abrirlo en el bloc de notas o en un editor similar para ver el formato.
Tenga en cuenta que en esta etapa no estamos escribiendo en ningún lenguaje informático específico. Sólo estamos tratando de especificar claramente y sin ambigüedades lo que estamos tratando de hacer.
Puedes notar que el pseudocódigo es bastante específico y "legalista". Así es como tenemos que hablar con los ordenadores. Tenemos que especificar muy claramente qué es lo que queremos que hagan. De lo contrario, tienden a generar basura.
También notarás el uso de "Bloques" para organizar las cosas en grupos lógicos. Estos pueden ser útiles más adelante para ayudarnos a estructurar el código adecuadamente. Como alguien señaló anteriormente en esta discusión, no hacemos esto sólo por diversión. Lo hacemos para que el código sea más legible, más comprensible, más fácil de mantener y, en última instancia, más fiable y libre de errores. Esto último es extremadamente importante en un software que va a ser utilizado para el comercio en vivo, a menos que, por supuesto, usted tiene cubos de dinero que está dispuesto a tirar :) . En serio, el comercio es lo suficientemente difícil como para tener que lidiar con el software con errores.
Por favor, eche un vistazo a lo que le he enviado y siéntase libre de hacer los cambios que considere necesarios. Hay un par de puntos importantes que faltan en mi pseudocódigo. ¿Puedes identificarlos?
También puede ocuparse de las dos cuestiones que he planteado en el pseudocódigo. Se me ocurren otras preguntas, pero es mejor dejarlas para la fase de codificación.
Si aún no lo ha hecho, podría probar el editor Notepad++ que FXtrader2008 mencionó anteriormente en esta discusión. Utilice cualquier herramienta que pueda encontrar que haga la vida un poco más fácil. Por favor, envíe su pseudocódigo revisado de nuevo a mí como un archivo de texto adjunto. Me parece que tratar de escribir el código estructurado, pseudo o de otra manera, en este editor de HTML un poco tedioso y desordenado.
Saludos
Tim
Hola TSW. Gracias por esto. Veo que le dedicaste bastante tiempo a esto, así que te lo agradezco mucho. Adjunté el pseudocódigo actualizado, pero en caso de que no se adjunte, aquí está abajo. Intenté ver lo que te faltaba, pero no pude entenderlo del todo, algunas cosas las añadí pero eran solo aclaraciones de cosas.
¿A dónde vamos a partir de aquí? Mientras creamos este código "adecuado", sigo intentando resolver el rompecabezas del código anterior. No sigue nuestro pseudocódigo ya que es un código antiguo parcheado, pero todavía estoy bastante desconcertado con él ya que debería funcionar, al menos para 1 moneda. La clave es que construirlo de esta manera desordenada me está enseñando los elementos de codificación reales (como la forma en que los corchetes afectan a la secuencia de comandos, donde declarar las variables, etc). ¿Alguna idea de por qué ese código no funciona como está ahora?
Program Title - N&P Pseudo Code
START BLOCK - List of Currency Pairs
EURUSD
GBPUSD
USDJPY
USDCHF
AUDUSD
END BLOCK - List Of Currency Pairs
START BLOCK - Configuration Parameters
Set the value of TopFilterLevel manually on a daily basis for EURUSD
Set the value of BottomFilterLevel manually on a daily basis EURUSD
Set the value of TopFilterLevel manually on a daily basis for GBPUSD
Set the value of BottomFilterLevel manually on a daily basis GBPUSD
Set the value of TopFilterLevel manually on a daily basis for USDJPY
Set the value of BottomFilterLevel manually on a daily basis USDJPY
Set the value of TopFilterLevel manually on a daily basis for USDCHF
Set the value of BottomFilterLevel manually on a daily basis USDCHF
Set the value of TopFilterLevel manually on a daily basis for AUDUSD
Set the value of BottomFilterLevel manually on a daily basis AUDUSD
Set Lot size manually for All positions at once (same lot size)
END BLOCK - Configuration Parameters
START BLOCK - Entry Rules
If the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average AND
the 14 Period Exponential Moving Average is greater than the 50 period Simple Moving Average AND
Current Price is less than TopFilterLevel THEN
Signal a BUY (Long) entry condition
If the 7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average AND
the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average AND
Current Price is less than BottomFilterLevel THEN
Signal a SELL (Short) entry condition
*** Question ***
What time periods do you want to use for your moving averages? Are the periods Minutes, Hours, Days, Weeks, Months or do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.
END BLOCK - Entry Rules
START BLOCK - Manual Close
**** Question ***
You say
"Keep being in the market until the position is closed manually.
(ideall we put this into OrderSend function to keep code shorter)."
What exactly do you want the program to do in this block?
***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think
END BLOCK - Manual Close
START BLOCK - Exit Rules
If any Open Position is greater than or equal to 20 pips from the entry level THEN
Close the Position
END BLOCK - Exit Rules
START BLOCK - Main - This block controls the whole flow of the program
With each Currency Pair in the List of Currency Pairs block do all of the following
Process the Exit Rules Block -
(Note that in practice this would normally just be the automatic execution of a Take Profit Stop
but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
such as using the program to close an open position—nope not for this code.)
Check the Entry Rules block to see if a BUY or SELL condition exists for this Currency Pair
Check to see if there is already an open BUY position for this Currency Pair
Check to see if there is already an open SELL position for this Currency Pair
If there is no open BUY position for this currency pair AND
a Buy condition exixts for this currency pair THEN
Open a BUY Position for this currency pair
Size: Pre-determined Lots
ELSE If there is already 1 open BUY position for this currency pair DO NOT OPEN BUY Position for this currency pair.
If there is no open SELL position for this currency pair AND
a SELL condition exixts for this currency pair THEN
Open a SELL Position for this currency pair
Size predetermined lots.
ELSE If there is already 1 sell position open for this currency pair Do not open SELL Positions for this currency pair
END BLOCK - Main
PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way?
**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
Hola chicos, el tutorial básico de codificación me ha ayudado mucho a entender esto (aunque falta la parte de codificación detallada). Para mostraros que he estado ocupado, os adjunto el código de abajo. La idea creo que está ahí pero sigue dando muchos errores. Verás que todo está bajo un gran paréntesis en Start() la razón por la que lo hice es porque mql seguía dando el error de que la variable no puede ser declarada globalmente, y cuando lo hice todo en un paréntesis pareció haber detenido ese error (aunque muchos otros errores persistieron). Utilicé el notepad++ para comprobar la alineación de los paréntesis. ¿Así que al menos voy por el camino correcto con esto?
esta es la ultima version del codigo. sinteticamente todo parece estar bien, pero cuando lo paso por el probador de estrategias no devuelve ninguna operacion. algo esta mal en la logica. necesito ayuda. Me estoy familiarizando con el código, así como con la estructura del programa.
Hola chicos/chicas, cualquier ayuda con el trozo de código anterior (no el pseudocódigo sino el código) mientras aprendo a hacerlo de la manera correcta.
Hoy tuve una lluvia de ideas, creo que tal vez el error es que hay una función que cuenta las órdenes, y en cambio tal vez necesito 2 funciones por separado, una cuenta las compras y otra las ventas. Programé el código de abajo (cambié algunas cosas para tener en cuenta esto), se puede ver a continuación. Pero aun así se me hizo un lío ya que todavía soy un completo principiante. ¿Alguna idea sobre esto?
//+------------------------------------------------------------------+
//| N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009 |
//| 20090523 |
//| |
//+------------------------------------------------------------------+
extern double Lots=0.01;
extern double TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
//-------------------Declaring All Variables and Conditions
//--------------------declaration end
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
// Order counting code
// Return: 0 = no orders
// >0 = # long orders
// <0 = # short orders
int CalcOpenOrders()
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
//i set to 0 to stop bugs from
//crawling in, i<Orderstotal means if i is behind the number of orders
//in market then start counting orders and make i that number
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
//this function selects an order for further processing
if(OrderType()==OP_BUY)long++;
if(OrderType()==OP_SELL)short++;
}
if(long>0)return(long);
if(short>0)return(-short);
}
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.
//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start ()
{
ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
if(Bars<75)
{
Print("Bars less than 100");
return(0);
}
//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
//here i am setting a condition which will be
//checked before a trade is opened, it shoudl state 'It's okay to enter
//into long trade so long as there is either 1 order in place already or
//none)
// Call function. the returnvalue (output) of the function is
stored into ReturnVal
int ReturnVal = CalcOpenOrders();
// Check output of function
if (ReturnVal >0) // >0 = long orders. See CalcOpenOrders()
eurusdbuyok=1;
else
{
eurusdbuyok=0;
return(0);
}
if (ReturnVal<0) // <0 = short orders. See CalcOpenOrders()
eurusdshortok=1;
else
{
eurusdshortok=0;
return(0);
}
//--------------condition ends
if(eurusdshortok==1)
{
static int ticket;
// deleted if(OrdersTotal()==0)
if(e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
}
}
return(0);
}
// -------------------------------------------------------------------------------------------
if (eurusdbuyok==1)
{
static int ticket1;
// deleted if(OrdersTotal()==0)
if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
{
ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
if(ticket1>0)
{
if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
}
return(0);
}
return(0);
}
Hola chicos/chicas, alguna ayuda con el trozo de código de arriba (no el pseudocódigo sino el código) mientras aprendo a hacerlo de la forma correcta.
Hoy tuve una lluvia de ideas, creo que tal vez el error es que hay una función que cuenta las órdenes, y en cambio tal vez necesito 2 funciones por separado, una cuenta las compras y otra las ventas. Programé el código de abajo (cambié algunas cosas para tener en cuenta esto), se puede ver a continuación. Pero aun así se me hizo un lío ya que todavía soy un completo principiante. ¿Alguna idea sobre esto?
Hola Niko
Con referencia al pseudo código
Del código: *** Pregunta *** ¿Qué periodos de tiempo quiere utilizar para sus medias móviles? ¿Son los periodos Minutos, Horas, Días, Semanas, Meses o tienen que ser variables? ***Respuesta: Excelente pregunta. Serán periodos de 5 minutos para todas las medias móviles, no necesitan ser variables.
Entonces sugeriría añadir al pseudocódigo en el área de parámetros de configuración una declaración algo así como
"Utilizar el marco de tiempo de 5 minutos para los indicadores"
Usted dijo: ***No fui claro en esto antes, mis disculpas. No debería haber ningún bloque como este en el código.
Saldré de las posiciones manualmente cuando sea necesario a través de la ventana de comercio/terminal
(asumo que es posible y que no estropeará la ejecución del EA, verdad).
Así que en realidad no sé si es necesario codificar esta flexibilidad o no? ¿Qué opinas?
Entonces le sugiero que elimine este bloque del pseudocódigo.
No debería haber ningún problema en codificar el EA para que puedas usar el terminal para cerrar una posición manualmente sin estropear nada.
Has añadido estas líneas:
ELSE Si ya hay 1 posición de COMPRA abierta para este par de divisas NO ABRIR posición de COMPRA para este par de divisas.
ELSE Si ya hay 1 posición de venta abierta para este par de divisas NO ABRIR POSICIÓN DE VENTA para este par de divisas
*** Pregunta *** ¿Por qué necesitas indicar específicamente lo que NO quieres que haga el programa después de que las líneas anteriores acaban de
indique lo que SÍ quiere que haga el programa. En mi opinión el pseudo código es el lugar para pensar cuidadosamente a través de su lógica. De lo contrario, es probable que
se han metido en un lío cuando empiezas a codificar de verdad.
Usted dijo: PS: A menudo voy a utilizar sólo 1 dirección en un par de divisas (por ejemplo: sólo a corto, para eurusd durante 2 días, por ejemplo). ¿Cómo podríamos construir esto en el código. Mi suposición es que podría poner '//' delante de las partes del código que no quiero usar (por ejemplo, delante de las órdenes de compra o venta dentro de cada par de divisas) y luego eliminarlas cuando necesite usar esa parte del código la próxima vez. ¿Funcionará esto con un código estructurado de esta manera?
Comentar el código como sugieres no es una forma muy elegante de hacerlo. Además, si comentas, por ejemplo, la sección "LONG" del código, comentarías la función para abrir posiciones largas para todos los pares de divisas, a menos que produzcas código con mucha duplicación. Esto tampoco es una forma muy elegante de hacerlo y fácilmente conduce a errores.
Durante un período determinado puede querer estar largo EURUSD, corto GBPUSD y no negociar USDCHF en absoluto. Esto es bastante fácil de lograr, pero me gustaría ver que usted tiene un ir a tratar de trabajar a la forma de describir por sí mismo en el pseudo código.
Aquí hay un par de pistas sobre una posible manera de hacerlo.
1. echar un vistazo a la forma en que sus niveles se establecen y se emplean
2. Los niveles se representan como números decimales. Para las situaciones go/no go es una práctica común utilizar otro tipo de representación conocida como booleana o bandera. ¿Sería posible utilizar banderas para lograr lo que quieres hacer?
Usted dijo:
**No puedo pensar en nada que hayas omitido a propósito, para ser honesto. A menos que sea para comprobar si hay fondos suficientes para el comercio, pero eso no es necesario todavía.
Tal vez en futuras versiones de la estrategia.
No, no se trata de comprobar si hay fondos suficientes. Ha dicho específicamente que no se trata de gestionar el dinero, excepto, por supuesto, de especificar el tamaño del lote. Es algo mucho más fundamental.
¿Qué elementos de información necesita para colocar una orden? ¿Dónde y cómo se describe y maneja cada uno de estos elementos en el código psuedo?
Usted dijo:
¿A dónde vamos a partir de aquí? Mientras creamos este código "apropiado", todavía estoy tratando de resolver el rompecabezas del código anterior. No sigue nuestro pseudocódigo ya que es un código antiguo parcheado, pero todavía estoy bastante desconcertado con él ya que debería funcionar, al menos para 1 moneda. La clave es que construirlo de esta manera desordenada me está enseñando los elementos de codificación reales (como la forma en que los corchetes afectan a la secuencia de comandos, donde declarar las variables, etc). ¿Alguna idea de por qué ese código no funciona como está ahora?
Aprecio su frustración. He echado un vistazo rápido al código antiguo, pero francamente lo que estás tratando de hacer no tiene mucho sentido lógico. Podría reescribir este trozo de código en unos 15 minutos y haría lo que tú quieres, pero ese no es el objetivo, ¿verdad? Dijiste que querías aprender a escribir código. Estoy tratando de instruirte en cómo hacerlo por ti mismo.
Nico, no creo que estés muy lejos de empezar a escribir algo de código propio (nuevo), pero es importante que primero consigas clavar en el pseudocódigo la mayor parte de "lo que quieres hacer" con precisión.
Esto hará que la codificación sea "taaan fácil" como pronto verás.
Como siempre aprecio mucho tu tiempo conmigo. Seguiré adelante y modificaré el pseudocódigo para que refleje tus comentarios. Sobre el código real, no te preocupes, vamos a hacerlo bien (es que soy un poco impaciente a veces :), ya que el aprendizaje es más poderoso que todo.
Volví a repasar el pseudocódigo e hice todo lo que mi cerebro de novato pudo descifrar en este momento. ¡Por favor, encontrarlo adjunto, espero sus comentarios!
Volví a repasar el pseudocódigo e hice todo lo que mi cerebro de novato pudo descifrar en este momento. Lo encuentro adjunto, ¡espero tus comentarios!
Hola Nick
Todo esto se ve bien.
He revisado tu último código psuedo y he respondido a algunas preguntas, etc.
Creo que estamos casi listos para empezar a codificar.
Como regla general, se dice que un tercio del tiempo de programación debe dedicarse a la especificación, un tercio a la codificación y un tercio a la depuración y las pruebas.
Así que podemos decir que ahora estamos aproximadamente a 1/3 del camino de este pequeño proyecto.
Ahora vamos a hablar sobre el lenguaje MT4.
Todos los lenguajes informáticos tienen formas específicas (un formato) en las que el lenguaje debe ser escrito para que el ordenador pueda entender lo que se le quiere indicar. Esta y otra información específica del lenguaje se encuentra en la documentación. La documentación para MT4 está disponible en línea en este foro. Si aún no lo has hecho, te sugiero que pases algún tiempo echando un vistazo al tipo de información que está disponible en la documentación. Así, cuando necesite información sobre algún tema o función específica, sabrá dónde buscarla.
Para hacer la vida más fácil, muchos lenguajes de computación modernos, incluyendo MT4, utilizan plantillas que establecen un diseño de programa básico para usted. Estas plantillas de programas se denominan a menudo "asistentes". Encontrará el asistente de EA en la opción de menú "Nuevo" en el MetatEditor con la cruz verde en él.
Si lo abre, encontrará una plantilla para "Asesor Experto". Selecciónela y se le pedirá un nombre para el EA, los detalles del autor, etc. y los parámetros. Los parámetros pueden ser añadidos o modificados más tarde, pero en esta etapa es posible que desee introducir los parámetros desde el bloque de configuración.
Usted tendrá que dar a cada parámetro un nombre, un tipo y un valor inicial
Los nombres de los parámetros deben ser siempre descriptivos de lo que son
por ejemplo, EURUSD_TopFilterLevel es un nombre significativo ex1 IS NOT. El uso de nombres de datos significativos hace que el programa sea mucho más fácil de entender, depurar o modificar posteriormente. Tenga en cuenta que en MT4, los nombres de datos son sensibles a las mayúsculas y minúsculas. LOTSize no es lo mismo que LotSize. Debe ser cuidadoso y consistente con los nombres de los datos.
También se le pedirá que especifique un tipo de datos (type) para cada parámetro. MT4 utiliza sólo 4 tipos de datos Número entero (int), Número decimal (doble), Texto (cadena) y Verdadero / Falso o Bandera (bool) .
Nuevamente debemos tener cuidado con los tipos de datos y no mezclarlos sin saberlo o podemos introducir sutiles errores.
Una vez que haya creado su plantilla con el asistente le sugiero que empiece a "estructurar" su programa. La unidad básica de estructura en MT4 es la FUNCIÓN.
La función básica más sencilla, que tal y como está escrita aquí, en realidad no hace nada, es
void MiFunciónBásica()
{
}
La plantilla generada por el asistente de metatrader ya tiene tres funciones vacías.
int init()
{
return(0)
}
init deinit()
{
return(0)
}
int inicio()
{
return(0)
}
La función init es llamada cada vez que el EA se inicia cuando se arrastra a un gráfico y se hace clic en el botón de Asesor Experto ON
La función deinit es llamada cada vez que el EA se detiene al arrastrarlo fuera de un gráfico o al hacer clic en el botón del Asesor Experto OFF
La función iniciar es llamada cada vez que el gráfico al que se adjunta recibe un nuevo TICK. Esto significa que puede ser llamada varias veces o más por minuto dependiendo de lo ocupado que esté el mercado. Aquí es donde haremos la mayor parte de nuestro trabajo.
Por el momento sugiero que ponga todo el pseudo código del bloque principal en la función de inicio y luego comente el pseudo código con // en cada línea.
A continuación, cree una nueva función propia para el bloque de reglas de entrada y comente el pseudocódigo en ella de la misma manera.
Deja las funciones init y deint vacías y como están por el momento.
Deberías ser capaz de compilar este código sin errores, pero por supuesto en esta etapa no hará nada.
Sigue trabajando así de bien.
Saludos
Tim
(PS podemos hablar por skype si es necesario, pero vamos a ver cómo vamos con el foro por el momento)
Como siempre, tu ayuda y tu tiempo son muy valiosos. Como gesto de agradecimiento me gustaría enviarte una muy buena botella de champaigne una vez que hayamos terminado con el proceso de codificación.
Sí, he revisado el libro de mql bastantes veces, la dificultad era poner la teoría en práctica. También imprimí una decena de EAs publicados en este sitio web, para ver cómo se codifican y arman las cosas, para tratar de entenderlas. Y paso mucho tiempo en el simulador de trading en MT4 (es decir, haciendo backtesting y aprendiendo los EAs ya existentes).
Empezaré el proceso de codificación, y haré bloques muy claros y separados para que ambos veamos lo que pasa. Y te los enviaré por el foro.
1 Pregunta: Has dicho que los brokers ponen cosas para evitar el pipping agresivo. 1. Qué defines como pipping agresivo? 2. ¿Qué cosas ponen en su lugar?
Yo solía hacer scalping manualmente en eurusd en marcos de tiempo de 1min (con un método de spreadbetting), esto iba muy bien hasta que el brockerage hizo clic y comenzó a poner retrasos para la ejecución (entrada y salida). Así que ahora no tiene sentido hacer esto con este corredor, a pesar de que es ilegal, los retrasos seguirán ocurriendo y arruinar todo el día (como si normalmente cuero cabelludo sólo durante 1 hora, 2 retrasos y perdió el valioso tiempo). Me devolvieron todo el dinero de las operaciones retrasadas después de una agresiva amenaza de acción judicial.
2 Pregunta: ¿Utilizas diferentes brokers? ¿Qué corredores recomendaría? (si se le permite mencionar nombres aquí)
Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré
Pseudo Código N&P
Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas.
---EURUSD---
Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces:
Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.
Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces:
Lotes cortos de EURUSD (de nuevo, variable externa). Si no (es decir, si no se cumplen las condiciones, no se pone en corto).
Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición
manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).
----GBPUSD---
exactamente el mismo código que el anterior.
----USDJPY---
IGUAL QUE EL ANTERIOR
---USDCHF---
IGUAL QUE EL ANTERIOR
---AUDUSD---
IGUAL QUE EL ANTERIOR
**Específicos del código
tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente
***no se necesita un stoploss para este código
**No hay código de gestión de dinero para este
¿Cómo se ve esto?
Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré
N&P Pseudo Código
Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas.
---EURUSD---
Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces:
Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.
Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces:
Lotes cortos de EURUSD (de nuevo, variable externa). Si no es así (es decir, si no se cumplen las condiciones, no se vende).
Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición
manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).
----GBPUSD---
exactamente el mismo código que el anterior.
----USDJPY---
IGUAL QUE EL ANTERIOR
---USDCHF---
IGUAL QUE EL ANTERIOR
---AUDUSD---
IGUAL QUE EL ANTERIOR
**Específicos del código
tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente
***no se necesita un stoploss para este código
**No hay código de gestión de dinero para este
Entonces, ¿cómo se ve esto?
Hola chicos, el tutorial básico de codificación realmente ayudó a conseguir mi cabeza alrededor de esto (aunque la parte de codificación detallada es falta). Para mostraros que he estado ocupado, os adjunto el código de abajo. La idea creo que está ahí, pero todavía devuelve muchos errores. Verás que todo está bajo un gran paréntesis en Start() la razón por la que lo hice es porque mql seguía dando el error de que la variable no puede ser declarada globalmente, y cuando lo hice todo en un paréntesis pareció haber detenido ese error (aunque muchos otros errores persistieron). Utilicé el notepad++ para comprobar la alineación de los paréntesis. ¿Así que al menos voy por el camino correcto con esto?
esta es la última versión del código. sintéticamente todo parece estar bien, pero cuando lo ejecuto a través de probador de la estrategia que devuelve ningún comercio. algo está mal con la lógica. necesito ayuda. Me estoy familiarizando con el código ahora, así la estructura del lado del programa de la misma.Hola leyendas de mql. He cocinado el pseudocódigo para ustedes durante mi hora de almuerzo en el trabajo. Aquí está. Hazme saber lo que falta y lo añadiré
Pseudo Código N&P
Con esta estrategia queremos tener 1 código, poder adjuntarlo a cualquier gráfico, y que se ejecute en 5 divisas, entrando en posiciones cortas y largas en cada una si se cumplen las reglas.
---EURUSD---
Si ema7>ema14>sma50 y PriceNow es < TopFilterLevel (eg:1.3080 para eurusd. Esto lo ajustaré diariamente) entonces:
Compre lotes de EURUSD (los lotes serán una variable externa, por ejemplo 0.01). Si no: (es decir, las condiciones no se cumplen) no comprar.
Si ema7<ema14<sma50 y PriceNow es > BottomFilterLevel (ej: 1.1508 para eurusd) entonces:
Lotes cortos de EURUSD (de nuevo, variable externa). Si no es así (es decir, si no se cumplen las condiciones, no se vende).
Si la posición de COMPRA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si la posición CORTA alcanza 20 pips desde el punto de entrada entonces: TAKEPROFIT en EURUSD.
Si no se alcanzan los 20 pips (ya sea de compra o de venta) entonces sigue estando en el mercado hasta que se cierre la posición
manualmente. (idealmente ponemos esto en la función OrderSend para mantener el código más corto).
----GBPUSD---
exactamente el mismo código que el anterior.
----USDJPY---
IGUAL QUE EL ANTERIOR
---USDCHF---
IGUAL QUE EL ANTERIOR
---AUDUSD---
IGUAL QUE EL ANTERIOR
**Específicos del código
tanto las operaciones de compra como las de venta pueden ejecutarse simultáneamente para cualquier divisa si se cumplen los criterios indicados anteriormente
***no se necesita un stoploss para este código
**No hay código de gestión de dinero para este
¿Cómo se ve esto?
Hola Niko
Tu pseudo código se ve muy bien para un primer intento.
Sin embargo, me gustaría verlo un poco más estructurado y hay un par de preguntas que me plantea.
He podido ponerlo fácil y rápidamente en el tipo de formato que yo mismo utilizaría normalmente. Se adjunta aquí como archivo de texto para que le eches un vistazo. Tendrá que guardar este archivo y abrirlo en el bloc de notas o en un editor similar para ver el formato.
Tenga en cuenta que en esta etapa no estamos escribiendo en ningún lenguaje informático específico. Sólo estamos tratando de especificar claramente y sin ambigüedades lo que estamos tratando de hacer.
Puedes notar que el pseudocódigo es bastante específico y "legalista". Así es como tenemos que hablar con los ordenadores. Tenemos que especificar muy claramente qué es lo que queremos que hagan. De lo contrario, tienden a generar basura.
También notarás el uso de "Bloques" para organizar las cosas en grupos lógicos. Estos pueden ser útiles más adelante para ayudarnos a estructurar el código adecuadamente. Como alguien señaló anteriormente en esta discusión, no hacemos esto sólo por diversión. Lo hacemos para que el código sea más legible, más comprensible, más fácil de mantener y, en última instancia, más fiable y libre de errores. Esto último es extremadamente importante en un software que va a ser utilizado para el comercio en vivo, a menos que, por supuesto, usted tiene cubos de dinero que está dispuesto a tirar :) . En serio, el comercio es lo suficientemente difícil como para tener que lidiar con el software con errores.
Por favor, eche un vistazo a lo que le he enviado y siéntase libre de hacer los cambios que considere necesarios. Hay un par de puntos importantes que faltan en mi pseudocódigo. ¿Puedes identificarlos?
También puede ocuparse de las dos cuestiones que he planteado en el pseudocódigo. Se me ocurren otras preguntas, pero es mejor dejarlas para la fase de codificación.
Si aún no lo ha hecho, puede probar el editor Notepad++ que FXtrader2008 mencionó anteriormente en esta discusión. Utilice cualquier herramienta que pueda encontrar que haga la vida un poco más fácil. Por favor, envíe su pseudocódigo revisado de nuevo a mí como un archivo de texto adjunto. Me parece que tratar de escribir el código estructurado, pseudo o de otra manera, en este editor de HTML un poco tedioso y desordenado.
Saludos
Tim
Hola Niko
Tu pseudocódigo tiene muy buena pinta para ser un primer intento.
Sin embargo, me gustaría verlo un poco más estructurado y hay un par de preguntas que me plantea.
He podido ponerlo fácil y rápidamente en el tipo de formato que yo mismo utilizaría normalmente. Se adjunta aquí como archivo de texto para que le eches un vistazo. Tendrá que guardar este archivo y abrirlo en el bloc de notas o en un editor similar para ver el formato.
Tenga en cuenta que en esta etapa no estamos escribiendo en ningún lenguaje informático específico. Sólo estamos tratando de especificar claramente y sin ambigüedades lo que estamos tratando de hacer.
Puedes notar que el pseudocódigo es bastante específico y "legalista". Así es como tenemos que hablar con los ordenadores. Tenemos que especificar muy claramente qué es lo que queremos que hagan. De lo contrario, tienden a generar basura.
También notarás el uso de "Bloques" para organizar las cosas en grupos lógicos. Estos pueden ser útiles más adelante para ayudarnos a estructurar el código adecuadamente. Como alguien señaló anteriormente en esta discusión, no hacemos esto sólo por diversión. Lo hacemos para que el código sea más legible, más comprensible, más fácil de mantener y, en última instancia, más fiable y libre de errores. Esto último es extremadamente importante en un software que va a ser utilizado para el comercio en vivo, a menos que, por supuesto, usted tiene cubos de dinero que está dispuesto a tirar :) . En serio, el comercio es lo suficientemente difícil como para tener que lidiar con el software con errores.
Por favor, eche un vistazo a lo que le he enviado y siéntase libre de hacer los cambios que considere necesarios. Hay un par de puntos importantes que faltan en mi pseudocódigo. ¿Puedes identificarlos?
También puede ocuparse de las dos cuestiones que he planteado en el pseudocódigo. Se me ocurren otras preguntas, pero es mejor dejarlas para la fase de codificación.
Si aún no lo ha hecho, podría probar el editor Notepad++ que FXtrader2008 mencionó anteriormente en esta discusión. Utilice cualquier herramienta que pueda encontrar que haga la vida un poco más fácil. Por favor, envíe su pseudocódigo revisado de nuevo a mí como un archivo de texto adjunto. Me parece que tratar de escribir el código estructurado, pseudo o de otra manera, en este editor de HTML un poco tedioso y desordenado.
Saludos
Tim
Hola TSW. Gracias por esto. Veo que le dedicaste bastante tiempo a esto, así que te lo agradezco mucho. Adjunté el pseudocódigo actualizado, pero en caso de que no se adjunte, aquí está abajo. Intenté ver lo que te faltaba, pero no pude entenderlo del todo, algunas cosas las añadí pero eran solo aclaraciones de cosas.
¿A dónde vamos a partir de aquí? Mientras creamos este código "adecuado", sigo intentando resolver el rompecabezas del código anterior. No sigue nuestro pseudocódigo ya que es un código antiguo parcheado, pero todavía estoy bastante desconcertado con él ya que debería funcionar, al menos para 1 moneda. La clave es que construirlo de esta manera desordenada me está enseñando los elementos de codificación reales (como la forma en que los corchetes afectan a la secuencia de comandos, donde declarar las variables, etc). ¿Alguna idea de por qué ese código no funciona como está ahora?
Hola chicos, el tutorial básico de codificación me ha ayudado mucho a entender esto (aunque falta la parte de codificación detallada). Para mostraros que he estado ocupado, os adjunto el código de abajo. La idea creo que está ahí pero sigue dando muchos errores. Verás que todo está bajo un gran paréntesis en Start() la razón por la que lo hice es porque mql seguía dando el error de que la variable no puede ser declarada globalmente, y cuando lo hice todo en un paréntesis pareció haber detenido ese error (aunque muchos otros errores persistieron). Utilicé el notepad++ para comprobar la alineación de los paréntesis. ¿Así que al menos voy por el camino correcto con esto?
esta es la ultima version del codigo. sinteticamente todo parece estar bien, pero cuando lo paso por el probador de estrategias no devuelve ninguna operacion. algo esta mal en la logica. necesito ayuda. Me estoy familiarizando con el código, así como con la estructura del programa.Hola chicos/chicas, cualquier ayuda con el trozo de código anterior (no el pseudocódigo sino el código) mientras aprendo a hacerlo de la manera correcta.
Hoy tuve una lluvia de ideas, creo que tal vez el error es que hay una función que cuenta las órdenes, y en cambio tal vez necesito 2 funciones por separado, una cuenta las compras y otra las ventas. Programé el código de abajo (cambié algunas cosas para tener en cuenta esto), se puede ver a continuación. Pero aun así se me hizo un lío ya que todavía soy un completo principiante. ¿Alguna idea sobre esto?
//+------------------------------------------------------------------+ //| N&P 1DailyUpTrendExec.mq4 | //| Copyright Nick Lou & Pete Arh 2009 | //| 20090523 | //| | //+------------------------------------------------------------------+ extern double Lots=0.01; extern double TakeProfit=20; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ //-------------------Declaring All Variables and Conditions //--------------------declaration end int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } // Order counting code // Return: 0 = no orders // >0 = # long orders // <0 = # short orders int CalcOpenOrders() { int long=0,short=0; for(int i=0;i<OrdersTotal();i++) //i set to 0 to stop bugs from //crawling in, i<Orderstotal means if i is behind the number of orders //in market then start counting orders and make i that number { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break; //this function selects an order for further processing if(OrderType()==OP_BUY)long++; if(OrderType()==OP_SELL)short++; } if(long>0)return(long); if(short>0)return(-short); } //------------ (fingers crossed this is right). I still don't get it why we need to count orders. //--------------DECLARATION OF VARIABLES------------------------- double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3, eurusdbuyok, eurusdshortok; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start () { ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0); ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0); ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0); e1under2=ema1<ema2; e2under3=ema2<ema3; e1over2=ema1>ema2; e2over3=ema2>ema3; if(Bars<75) { Print("Bars less than 100"); return(0); } //------------------EURUSD Block------------------------- //check order type, if it doesn't equal to buy already then buy //here i am setting a condition which will be //checked before a trade is opened, it shoudl state 'It's okay to enter //into long trade so long as there is either 1 order in place already or //none) // Call function. the returnvalue (output) of the function is stored into ReturnVal int ReturnVal = CalcOpenOrders(); // Check output of function if (ReturnVal >0) // >0 = long orders. See CalcOpenOrders() eurusdbuyok=1; else { eurusdbuyok=0; return(0); } if (ReturnVal<0) // <0 = short orders. See CalcOpenOrders() eurusdshortok=1; else { eurusdshortok=0; return(0); } //--------------condition ends if(eurusdshortok==1) { static int ticket; // deleted if(OrdersTotal()==0) if(e1under2 && e2under3) // short function { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder ",0,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice()); } } return(0); } // ------------------------------------------------------------------------------------------- if (eurusdbuyok==1) { static int ticket1; // deleted if(OrdersTotal()==0) if(e1over2 && e2over3 && eurusdbuyok==1) //buy function { ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss if(ticket1>0) { if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } } return(0); } return(0); }Hola chicos/chicas, alguna ayuda con el trozo de código de arriba (no el pseudocódigo sino el código) mientras aprendo a hacerlo de la forma correcta.
Hoy tuve una lluvia de ideas, creo que tal vez el error es que hay una función que cuenta las órdenes, y en cambio tal vez necesito 2 funciones por separado, una cuenta las compras y otra las ventas. Programé el código de abajo (cambié algunas cosas para tener en cuenta esto), se puede ver a continuación. Pero aun así se me hizo un lío ya que todavía soy un completo principiante. ¿Alguna idea sobre esto?
Hola Niko
Con referencia al pseudo código
Del código:
*** Pregunta ***
¿Qué periodos de tiempo quiere utilizar para sus medias móviles? ¿Son los periodos Minutos, Horas, Días, Semanas, Meses o tienen que ser variables?
***Respuesta: Excelente pregunta. Serán periodos de 5 minutos para todas las medias móviles, no necesitan ser variables.
Entonces sugeriría añadir al pseudocódigo en el área de parámetros de configuración una declaración algo así como
"Utilizar el marco de tiempo de 5 minutos para los indicadores"
Usted dijo:
***No fui claro en esto antes, mis disculpas. No debería haber ningún bloque como este en el código.
Saldré de las posiciones manualmente cuando sea necesario a través de la ventana de comercio/terminal
(asumo que es posible y que no estropeará la ejecución del EA, verdad).
Así que en realidad no sé si es necesario codificar esta flexibilidad o no? ¿Qué opinas?
Entonces le sugiero que elimine este bloque del pseudocódigo.
No debería haber ningún problema en codificar el EA para que puedas usar el terminal para cerrar una posición manualmente sin estropear nada.
Has añadido estas líneas:
ELSE Si ya hay 1 posición de COMPRA abierta para este par de divisas NO ABRIR posición de COMPRA para este par de divisas.
ELSE Si ya hay 1 posición de venta abierta para este par de divisas NO ABRIR POSICIÓN DE VENTA para este par de divisas
*** Pregunta *** ¿Por qué necesitas indicar específicamente lo que NO quieres que haga el programa después de que las líneas anteriores acaban de
indique lo que SÍ quiere que haga el programa. En mi opinión el pseudo código es el lugar para pensar cuidadosamente a través de su lógica. De lo contrario, es probable que
se han metido en un lío cuando empiezas a codificar de verdad.
Usted dijo:
PS: A menudo voy a utilizar sólo 1 dirección en un par de divisas (por ejemplo: sólo a corto, para eurusd durante 2 días, por ejemplo). ¿Cómo podríamos construir esto en el código. Mi suposición es que podría poner '//' delante de las partes del código que no quiero usar (por ejemplo, delante de las órdenes de compra o venta dentro de cada par de divisas) y luego eliminarlas cuando necesite usar esa parte del código la próxima vez. ¿Funcionará esto con un código estructurado de esta manera?
Comentar el código como sugieres no es una forma muy elegante de hacerlo. Además, si comentas, por ejemplo, la sección "LONG" del código, comentarías la función para abrir posiciones largas para todos los pares de divisas, a menos que produzcas código con mucha duplicación. Esto tampoco es una forma muy elegante de hacerlo y fácilmente conduce a errores.
Durante un período determinado puede querer estar largo EURUSD, corto GBPUSD y no negociar USDCHF en absoluto. Esto es bastante fácil de lograr, pero me gustaría ver que usted tiene un ir a tratar de trabajar a la forma de describir por sí mismo en el pseudo código.
Aquí hay un par de pistas sobre una posible manera de hacerlo.
1. echar un vistazo a la forma en que sus niveles se establecen y se emplean
2. Los niveles se representan como números decimales. Para las situaciones go/no go es una práctica común utilizar otro tipo de representación conocida como booleana o bandera. ¿Sería posible utilizar banderas para lograr lo que quieres hacer?
Usted dijo:
**No puedo pensar en nada que hayas omitido a propósito, para ser honesto. A menos que sea para comprobar si hay fondos suficientes para el comercio, pero eso no es necesario todavía.
Tal vez en futuras versiones de la estrategia.
No, no se trata de comprobar si hay fondos suficientes. Ha dicho específicamente que no se trata de gestionar el dinero, excepto, por supuesto, de especificar el tamaño del lote. Es algo mucho más fundamental.
¿Qué elementos de información necesita para colocar una orden? ¿Dónde y cómo se describe y maneja cada uno de estos elementos en el código psuedo?
Usted dijo:
¿A dónde vamos a partir de aquí? Mientras creamos este código "apropiado", todavía estoy tratando de resolver el rompecabezas del código anterior. No sigue nuestro pseudocódigo ya que es un código antiguo parcheado, pero todavía estoy bastante desconcertado con él ya que debería funcionar, al menos para 1 moneda. La clave es que construirlo de esta manera desordenada me está enseñando los elementos de codificación reales (como la forma en que los corchetes afectan a la secuencia de comandos, donde declarar las variables, etc). ¿Alguna idea de por qué ese código no funciona como está ahora?
Aprecio su frustración. He echado un vistazo rápido al código antiguo, pero francamente lo que estás tratando de hacer no tiene mucho sentido lógico. Podría reescribir este trozo de código en unos 15 minutos y haría lo que tú quieres, pero ese no es el objetivo, ¿verdad? Dijiste que querías aprender a escribir código. Estoy tratando de instruirte en cómo hacerlo por ti mismo.
Nico, no creo que estés muy lejos de empezar a escribir algo de código propio (nuevo), pero es importante que primero consigas clavar en el pseudocódigo la mayor parte de "lo que quieres hacer" con precisión.
Esto hará que la codificación sea "taaan fácil" como pronto verás.
Sigue con el buen trabajo
Saludos
Tim
Hola Tim,
Como siempre aprecio mucho tu tiempo conmigo. Seguiré adelante y modificaré el pseudocódigo para que refleje tus comentarios. Sobre el código real, no te preocupes, vamos a hacerlo bien (es que soy un poco impaciente a veces :), ya que el aprendizaje es más poderoso que todo.
Hola Tim,
Volví a repasar el pseudocódigo e hice todo lo que mi cerebro de novato pudo descifrar en este momento. ¡Por favor, encontrarlo adjunto, espero sus comentarios!
Hola Tim,
Volví a repasar el pseudocódigo e hice todo lo que mi cerebro de novato pudo descifrar en este momento. Lo encuentro adjunto, ¡espero tus comentarios!
Hola Nick
Todo esto se ve bien.
He revisado tu último código psuedo y he respondido a algunas preguntas, etc.
Creo que estamos casi listos para empezar a codificar.
Como regla general, se dice que un tercio del tiempo de programación debe dedicarse a la especificación, un tercio a la codificación y un tercio a la depuración y las pruebas.
Así que podemos decir que ahora estamos aproximadamente a 1/3 del camino de este pequeño proyecto.
Ahora vamos a hablar sobre el lenguaje MT4.
Todos los lenguajes informáticos tienen formas específicas (un formato) en las que el lenguaje debe ser escrito para que el ordenador pueda entender lo que se le quiere indicar. Esta y otra información específica del lenguaje se encuentra en la documentación. La documentación para MT4 está disponible en línea en este foro. Si aún no lo has hecho, te sugiero que pases algún tiempo echando un vistazo al tipo de información que está disponible en la documentación. Así, cuando necesite información sobre algún tema o función específica, sabrá dónde buscarla.
Para hacer la vida más fácil, muchos lenguajes de computación modernos, incluyendo MT4, utilizan plantillas que establecen un diseño de programa básico para usted. Estas plantillas de programas se denominan a menudo "asistentes". Encontrará el asistente de EA en la opción de menú "Nuevo" en el MetatEditor con la cruz verde en él.
Si lo abre, encontrará una plantilla para "Asesor Experto". Selecciónela y se le pedirá un nombre para el EA, los detalles del autor, etc. y los parámetros. Los parámetros pueden ser añadidos o modificados más tarde, pero en esta etapa es posible que desee introducir los parámetros desde el bloque de configuración.
Usted tendrá que dar a cada parámetro un nombre, un tipo y un valor inicial
Los nombres de los parámetros deben ser siempre descriptivos de lo que son
por ejemplo, EURUSD_TopFilterLevel es un nombre significativo ex1 IS NOT. El uso de nombres de datos significativos hace que el programa sea mucho más fácil de entender, depurar o modificar posteriormente. Tenga en cuenta que en MT4, los nombres de datos son sensibles a las mayúsculas y minúsculas. LOTSize no es lo mismo que LotSize. Debe ser cuidadoso y consistente con los nombres de los datos.
También se le pedirá que especifique un tipo de datos (type) para cada parámetro. MT4 utiliza sólo 4 tipos de datos Número entero (int), Número decimal (doble), Texto (cadena) y Verdadero / Falso o Bandera (bool) .
Nuevamente debemos tener cuidado con los tipos de datos y no mezclarlos sin saberlo o podemos introducir sutiles errores.
Una vez que haya creado su plantilla con el asistente le sugiero que empiece a "estructurar" su programa. La unidad básica de estructura en MT4 es la FUNCIÓN.
La función básica más sencilla, que tal y como está escrita aquí, en realidad no hace nada, es
La plantilla generada por el asistente de metatrader ya tiene tres funciones vacías.
La función init es llamada cada vez que el EA se inicia cuando se arrastra a un gráfico y se hace clic en el botón de Asesor Experto ON
La función deinit es llamada cada vez que el EA se detiene al arrastrarlo fuera de un gráfico o al hacer clic en el botón del Asesor Experto OFF
La función iniciar es llamada cada vez que el gráfico al que se adjunta recibe un nuevo TICK. Esto significa que puede ser llamada varias veces o más por minuto dependiendo de lo ocupado que esté el mercado. Aquí es donde haremos la mayor parte de nuestro trabajo.
Por el momento sugiero que ponga todo el pseudo código del bloque principal en la función de inicio y luego comente el pseudo código con // en cada línea.
A continuación, cree una nueva función propia para el bloque de reglas de entrada y comente el pseudocódigo en ella de la misma manera.
Deja las funciones init y deint vacías y como están por el momento.
Deberías ser capaz de compilar este código sin errores, pero por supuesto en esta etapa no hará nada.
Sigue trabajando así de bien.
Saludos
Tim
(PS podemos hablar por skype si es necesario, pero vamos a ver cómo vamos con el foro por el momento)
Hola Tim,
Como siempre, tu ayuda y tu tiempo son muy valiosos. Como gesto de agradecimiento me gustaría enviarte una muy buena botella de champaigne una vez que hayamos terminado con el proceso de codificación.
Sí, he revisado el libro de mql bastantes veces, la dificultad era poner la teoría en práctica. También imprimí una decena de EAs publicados en este sitio web, para ver cómo se codifican y arman las cosas, para tratar de entenderlas. Y paso mucho tiempo en el simulador de trading en MT4 (es decir, haciendo backtesting y aprendiendo los EAs ya existentes).
Empezaré el proceso de codificación, y haré bloques muy claros y separados para que ambos veamos lo que pasa. Y te los enviaré por el foro.
1 Pregunta: Has dicho que los brokers ponen cosas para evitar el pipping agresivo. 1. Qué defines como pipping agresivo? 2. ¿Qué cosas ponen en su lugar?
Yo solía hacer scalping manualmente en eurusd en marcos de tiempo de 1min (con un método de spreadbetting), esto iba muy bien hasta que el brockerage hizo clic y comenzó a poner retrasos para la ejecución (entrada y salida). Así que ahora no tiene sentido hacer esto con este corredor, a pesar de que es ilegal, los retrasos seguirán ocurriendo y arruinar todo el día (como si normalmente cuero cabelludo sólo durante 1 hora, 2 retrasos y perdió el valioso tiempo). Me devolvieron todo el dinero de las operaciones retrasadas después de una agresiva amenaza de acción judicial.
2 Pregunta: ¿Utilizas diferentes brokers? ¿Qué corredores recomendaría? (si se le permite mencionar nombres aquí)
Gracias,
nick