¿Debe Martin activarse sólo cuando la señal del indicador es contraria o independientemente?
Ejemplo: Se abrió una posición de compra según el indicador. El precio ha caído por la distancia establecida y el indicador ya muestra Venta. ¿Se abrirá una posición de compra?
Para abreviar, .....Martin trabaja sólo contra la tendencia, con órdenes a la baja, mientras que el indicador trabaja sólo con la tendencia.
Mañana intentaré dibujarlo en Photoshop y colgaré el archivo
En resumen - Al mismo tiempo ..... Martin trabaja solo contra la tendencia, con órdenes en rojo, y según el indicador, trabajamos solo con la tendencia.
Mañana intentaré dibujar en photoshop y publicar el archivo.
He hecho algo aquí, que yo mismo no entiendo con 100,000 rublos. hasta dos millones
//+------------------------------------------------------------------+//| 6 Sprut 185.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link" https://www.mql5.com "#property version"1.00"//---#define MACD_MAGIC 1234502//---#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---double m_adjusted_point; // point value adjusted for 3 or 5 points
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
CPositionInfo m_position; // trade position object
CAccountInfo m_account; // account info wrapperinput group "---- : Parameters: ----"inputint InpTProfit = 100000 ; // : Take Profit --> (In currency the amount)inputdouble InpLotsRisk = 0.1 ; // : Maximum Risk in percentageinput group "---- : Parameters: ----"inputbool InpClOp = false ; // : Close opposite//---int m_price_uno;
int m_handle_macd; // MACD indicator handleint ExtTimeOut= 10 ; // time out in seconds between trade operations//+------------------------------------------------------------------+//| Calculate optimal lot size |//+------------------------------------------------------------------+double OptimizedBuy( void )
{
double PROFIT_BUY= 0.00 ;
int total= PositionsTotal ();
for ( int i=total- 1 ; i>= 0 ; i--) // returns the number of open positions
{
string position_GetSymbol= PositionGetSymbol (i); // GetSymbol позицииif (position_GetSymbol==m_symbol.Name())
{
if (m_position.PositionType()== POSITION_TYPE_BUY )
{
PROFIT_BUY=PROFIT_BUY+m_position.Select( Symbol ());
}
}
}
double Lots=InpLotsRisk;
double ab=PROFIT_BUY;
if (ab> 0 && ab<= 1 )
Lots=InpLotsRisk* 2 ;
if (ab> 1 && ab<= 2 )
Lots=InpLotsRisk* 4 ;
if (ab> 2 && ab<= 3 )
Lots=InpLotsRisk* 8 ;
if (ab> 3 )
Lots=InpLotsRisk* 16 ;
return (Lots);
}
//+------------------------------------------------------------------+//| Calculate optimal lot size |//+------------------------------------------------------------------+double OptimizedSell( void )
{
double PROFIT_SELL= 0.00 ;
int total= PositionsTotal ();
for ( int i=total- 1 ; i>= 0 ; i--) // returns the number of open positions
{
string position_GetSymbol= PositionGetSymbol (i); // GetSymbol позицииif (position_GetSymbol==m_symbol.Name())
{
if (m_position.PositionType()== POSITION_TYPE_SELL )
{
PROFIT_SELL=PROFIT_SELL+m_position.Select( Symbol ());
}
}
}
double Lots=InpLotsRisk;
double ab=PROFIT_SELL;
if (ab> 0 && ab<= 1 )
Lots=InpLotsRisk* 2 ;
if (ab> 1 && ab<= 2 )
Lots=InpLotsRisk* 4 ;
if (ab> 2 && ab<= 3 )
Lots=InpLotsRisk* 8 ;
if (ab> 3 )
Lots=InpLotsRisk* 16 ;
return (Lots);
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- initialize common information
m_symbol.Name( Symbol ()); // symbol
m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol( Symbol ());
//--- tuning for 3 or 5 digitsint digits_adjust= 1 ;
if (m_symbol. Digits ()== 3 || m_symbol. Digits ()== 5 )
digits_adjust= 10 ;
m_adjusted_point=m_symbol. Point ()*digits_adjust;
//--- set default deviation for trading in adjusted points
m_trade.SetDeviationInPoints( 3 *digits_adjust);
//--- create MACD indicator
m_handle_macd= iCustom ( NULL , 0 , "StepMA_NRTR" );
if (m_handle_macd== INVALID_HANDLE )
{
printf ( "Error creating MACD indicator" );
return ( false );
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ( void )
{
//---if (ProfitBuy() || ProfitSell())
{
return ;
}
staticdatetime limit_time= 0 ; // last trade processing time + timeout//--- don't process if timeoutif ( TimeCurrent ()>=limit_time)
{
//--- check for dataif ( Bars ( Symbol (), Period ())> 2 )
{
//--- change limit time by timeout in seconds if processedif (Processing())
limit_time= TimeCurrent ()+ExtTimeOut;
}
}
}
//+------------------------------------------------------------------+//| main function returns true if any position processed |//+------------------------------------------------------------------+bool Processing( void )
{
//--- refresh ratesif (!m_symbol.RefreshRates())
return ( false );
double m_buff_MACD_main[],m_buff_MACD_signal[];
bool StNRUp,StNRDn;
ArraySetAsSeries (m_buff_MACD_main, true );
ArraySetAsSeries (m_buff_MACD_signal, true );
int start_pos= 1 ,count= 3 ;
if (!iGetArray(m_handle_macd, 0 ,start_pos,count,m_buff_MACD_main)||
!iGetArray(m_handle_macd, 1 ,start_pos,count,m_buff_MACD_signal))
{
return ( false );
}
//---
StNRUp=m_buff_MACD_main[ 0 ]<m_buff_MACD_signal[ 0 ];
StNRDn=m_buff_MACD_main[ 0 ]>m_buff_MACD_signal[ 0 ];
//--- BUY Signalif (StNRUp)
{
if (InpClOp)
if (ShortClosed())
Sleep ( 1000 );
if (m_price_uno< 0 )
LongOpened();
m_price_uno=+ 1 ;
return ( true );
}
//--- SELL Signalif (StNRDn)
{
if (InpClOp)
if (LongClosed())
Sleep ( 1000 );
if (m_price_uno> 0 )
ShortOpened();
m_price_uno=- 1 ;
return ( true );
}
//--- exit without position processingreturn ( false );
}
//+------------------------------------------------------------------+//| Check for long position closing |//+------------------------------------------------------------------+bool LongClosed( void )
{
bool res= false ;
//--- should it be closed?
ClosePositions( POSITION_TYPE_BUY );
//--- processed and cannot be modified
res= true ;
//--- resultreturn (res);
}
//+------------------------------------------------------------------+//| Check for short position closing |//+------------------------------------------------------------------+bool ShortClosed( void )
{
bool res= false ;
//--- should it be closed?
ClosePositions( POSITION_TYPE_SELL );
//--- processed and cannot be modified
res= true ;
//--- resultreturn (res);
}
//+------------------------------------------------------------------+//| Check for long position opening |//+------------------------------------------------------------------+bool LongOpened( void )
{
bool res= false ;
//--- check for long position (BUY) possibilitydouble price=m_symbol.Ask();
//--- check for free moneyif (m_account.FreeMarginCheck( Symbol (), ORDER_TYPE_BUY ,OptimizedBuy(),price)< 0.0 )
printf ( "We have no money. Free Margin = %f" ,m_account.FreeMargin());
else
{
//--- open positionif (m_trade.PositionOpen( Symbol (), ORDER_TYPE_BUY ,OptimizedBuy(),price, 0.0 , 0.0 ))
printf ( "Position by %s to be opened" , Symbol ());
else
{
printf ( "Error opening BUY position by %s : '%s'" , Symbol (),m_trade.ResultComment());
printf ( "Open parameters : price=%f" ,price);
}
PlaySound ( "ok.wav" );
}
//--- in any case we must exit from expert
res= true ;
//--- resultreturn (res);
}
//+------------------------------------------------------------------+//| Check for short position opening |//+------------------------------------------------------------------+bool ShortOpened( void )
{
bool res= false ;
//--- check for short position (SELL) possibilitydouble price=m_symbol.Bid();
//--- check for free moneyif (m_account.FreeMarginCheck( Symbol (), ORDER_TYPE_SELL ,OptimizedSell(),price)< 0.0 )
printf ( "We have no money. Free Margin = %f" ,m_account.FreeMargin());
else
{
//--- open positionif (m_trade.PositionOpen( Symbol (), ORDER_TYPE_SELL ,OptimizedSell(),price, 0.0 , 0.0 ))
printf ( "Position by %s to be opened" , Symbol ());
else
{
printf ( "Error opening SELL position by %s : '%s'" , Symbol (),m_trade.ResultComment());
printf ( "Open parameters : price=%f" ,price);
}
PlaySound ( "ok.wav" );
}
//--- in any case we must exit from expert
res= true ;
//--- resultreturn (res);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif (!m_symbol.RefreshRates())
{
return ( false );
}
//--- protection against the return value of "zero"if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
{
return ( false );
}
//---return ( true );
}
//+------------------------------------------------------------------+//| Check Freeze and Stops levels |//+------------------------------------------------------------------+void FreezeStopsLevels( double &freeze, double &stops)
{
//--- check Freeze and Stops levelsdouble coeff=( double ) 1 ;
if (!RefreshRates() || !m_symbol.Refresh())
return ;
//--- FreezeLevel -> for pending order and modificationdouble freeze_level=m_symbol.FreezeLevel()*m_symbol. Point ();
if (freeze_level== 0.0 )
if ( 1 > 0 )
freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLossdouble stop_level=m_symbol.StopsLevel()*m_symbol. Point ();
if (stop_level== 0.0 )
if ( 1 > 0 )
stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
freeze=freeze_level;
stops=stop_level;
//---return ;
}
//+------------------------------------------------------------------+//| Close positions |//+------------------------------------------------------------------+void ClosePositions( constENUM_POSITION_TYPE pos_type)
{
double freeze= 0.0 ,stops= 0.0 ;
FreezeStopsLevels(freeze,stops);
for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of current positionsif (m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
if (m_position.PositionType()==pos_type)
{
if (m_position.PositionType()== POSITION_TYPE_BUY )
{
bool take_profit_level=((m_position.TakeProfit()!= 0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()== 0.0 );
bool stop_loss_level=((m_position.StopLoss()!= 0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()== 0.0 );
if (take_profit_level && stop_loss_level)
if (!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbolPrint ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "BUY PositionClose " ,m_position.Ticket(), ", " ,m_trade.ResultRetcodeDescription());
}
if (m_position.PositionType()== POSITION_TYPE_SELL )
{
bool take_profit_level=((m_position.TakeProfit()!= 0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()== 0.0 );
bool stop_loss_level=((m_position.StopLoss()!= 0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()== 0.0 );
if (take_profit_level && stop_loss_level)
if (!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbolPrint ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "SELL PositionClose " ,m_position.Ticket(), ", " ,m_trade.ResultRetcodeDescription());
}
PlaySound ( "ok.wav" );
}
}
//+------------------------------------------------------------------+//| Filling the indicator buffers from the indicator |//+------------------------------------------------------------------+bool iGetArray( constint handle, constint buffer, constint start_pos,
constint count, double &arr_buffer[])
{
bool result= true ;
if (! ArrayIsDynamic (arr_buffer))
{
return ( false );
}
ArrayFree (arr_buffer);
//--- reset error codeResetLastError ();
//--- fill a part of the iBands array with values from the indicator bufferint copied= CopyBuffer (handle,buffer,start_pos,count,arr_buffer);
if (copied!=count)
{
return ( false );
}
return (result);
}
//+------------------------------------------------------------------+//| ProfitOnTick closing |//+------------------------------------------------------------------+bool ProfitBuy( void )
{
bool res= false ;
double PROFIT_BUY= 0.00 ;
int total= PositionsTotal ();
for ( int i=total- 1 ; i>= 0 ; i--)
{
string position_GetSymbol= PositionGetSymbol (i);
if (position_GetSymbol==m_symbol.Name())
{
if (m_position.PositionType()== POSITION_TYPE_BUY )
{
PROFIT_BUY=PROFIT_BUY+ PositionGetDouble ( POSITION_PROFIT );
}
}
if (PROFIT_BUY>=InpTProfit)
{
if (LongClosed())
res= true ;
if (ShortOpened())
res= true ;
}
}
return (res);
}
//+------------------------------------------------------------------+//| ProfitOnTick closing |//+------------------------------------------------------------------+bool ProfitSell( void )
{
bool res= false ;
double PROFIT_SELL= 0.00 ;
int total= PositionsTotal ();
for ( int i=total- 1 ; i>= 0 ; i--)
{
string position_GetSymbol= PositionGetSymbol (i);
if (position_GetSymbol==m_symbol.Name())
{
if (m_position.PositionType()== POSITION_TYPE_SELL )
{
PROFIT_SELL=PROFIT_SELL+ PositionGetDouble ( POSITION_PROFIT );
}
}
if (PROFIT_SELL>=InpTProfit)
{
if (ShortClosed())
res= true ;
if (LongOpened())
res= true ;
}
}
return (res);
}
//+------------------------------------------------------------------+
Yo hice lo mismo, pero los buffers se quedan a 0, puedes probarlo tú mismo. Lo único que no entiendo es la funciónIndicatorBuffers() en mi mt5, he utilizado #propertyindicatorbuffers
No deberías, están a punto de lanzarlo al mercado.
No me importa, al menos sacaré algo de provecho de mis estudios. Tengo más ideas en el fondo de mi mente.
\\\\\\\\\\\\\\\\\\\\
Sólo hay dos funciones que necesitas. Y necesitan ser reescritos adecuadamente por un experto en programación porque soy un aprendiz.
estas son las funciones
1. - 1. son multiplicadores de lotes. se abre la primera posición, luego se multiplica la segunda, y así sucesivamente. se abre la primera posición, luego se multiplica la segunda, y así sucesivamente.
//+------------------------------------------------------------------+//| Calculate optimal lot size |//+------------------------------------------------------------------+double OptimizedBuy(void)
{
double PROFIT_BUY=0.00;
int total=PositionsTotal();
for(int i=total-1; i>=0; i--) // returns the number of open positions
{
string position_GetSymbol=PositionGetSymbol(i); // GetSymbol позицииif(position_GetSymbol==m_symbol.Name())
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
PROFIT_BUY=PROFIT_BUY+m_position.Select(Symbol());
}
}
}
double Lots=InpLotsRisk;
double ab=PROFIT_BUY;
if(ab>0 && ab<=1)
Lots=InpLotsRisk*2;
if(ab>1 && ab<=2)
Lots=InpLotsRisk*4;
if(ab>2 && ab<=3)
Lots=InpLotsRisk*8;
if(ab>3)
Lots=InpLotsRisk*16;
return(Lots);
}
//+------------------------------------------------------------------+
Este es el primer EA que he ejecutado en el probador en más de 2 años.
Estoy tratando de entender el probador, todo ha cambiado mucho, han aparecido muchos botones diferentes.
De momento he llegado a la conclusión de que debería ponerlo en demo y ejecutarlo durante un par de semanas.
En resumen, lo he robado ;)
También lo probé con Expert Advisor - de alguna manera depende de la cantidad de cierre. Si pones una cantidad menor, perdería si pones más, también perdería.
Estuve probando 100 000 Rbls y 100 000 Rbls de ganancia y subió a dos millones (el año pasado en EUR/USD durante 1 hora).
¿Debe Martin activarse sólo cuando la señal del indicador es contraria o independientemente?
Ejemplo: Se abrió una posición de compra según el indicador. El precio ha caído por la distancia establecida y el indicador ya muestra Venta. ¿Se abrirá una posición de compra?
Para abreviar, .....Martin trabaja sólo contra la tendencia, con órdenes a la baja, mientras que el indicador trabaja sólo con la tendencia.
Mañana intentaré dibujarlo en Photoshop y colgaré el archivo
En resumen - Al mismo tiempo ..... Martin trabaja solo contra la tendencia, con órdenes en rojo, y según el indicador, trabajamos solo con la tendencia.
Mañana intentaré dibujar en photoshop y publicar el archivo.
He hecho algo aquí, que yo mismo no entiendo con 100,000 rublos. hasta dos millones
Hay que cambiarle el nombre ahora, con una prueba así seguro que es espadín, o robado, no sé qué es lo correcto.
Hay que cambiarle el nombre ya, con una prueba como esa seguro que la saltan, o la roban, no sé cuál es la palabra correcta.
Tal vez alguien se haga rico - no lo entiendo, me gusta vivir modestamente.
Tal vez alguien se haga rico - no lo entiendo, simplemente me gusta vivir modestamente.
Este es el primer EA que he ejecutado en el probador en más de 2 años.
Ahora estoy tratando con el probador, todo ha cambiado mucho, han aparecido muchos botones diferentes.
De momento he llegado a la conclusión de que debería ponerlo en demo y ejecutarlo durante un par de semanas.
De todos modos, ya lo he robado ;)
¿No es así como funciona?
Algo he hecho mal aquí: no sé qué ha pasado de 100.000 rublos a dos millones.
No deberías, están a punto de lanzarlo en el mercado.
No deberías, están a punto de lanzarlo al mercado.
No me importa, al menos sacaré algo de provecho de mis estudios. Tengo más ideas en el fondo de mi mente.
\\\\\\\\\\\\\\\\\\\\
Sólo hay dos funciones que necesitas. Y necesitan ser reescritos adecuadamente por un experto en programación porque soy un aprendiz.
estas son las funciones
1. - 1. son multiplicadores de lotes. se abre la primera posición, luego se multiplica la segunda, y así sucesivamente. se abre la primera posición, luego se multiplica la segunda, y así sucesivamente.
y 2 - cierra la cantidad total en moneda, posiciones abiertas en Buy
y por supuesto las segundas mitades
Tengo más ideas en el fondo de mi mente. Tengo más ideas en el fondo de mi mente.
Entonces deberías ponerlo en la base de código, si vale la pena.
Este es el primer EA que he ejecutado en el probador en más de 2 años.
Estoy tratando de entender el probador, todo ha cambiado mucho, han aparecido muchos botones diferentes.
De momento he llegado a la conclusión de que debería ponerlo en demo y ejecutarlo durante un par de semanas.
En resumen, lo he robado ;)
También lo probé con Expert Advisor - de alguna manera depende de la cantidad de cierre. Si pones una cantidad menor, perdería si pones más, también perdería.
Estuve probando 100 000 Rbls y 100 000 Rbls de ganancia y subió a dos millones (el año pasado en EUR/USD durante 1 hora).