Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1271

 

Al reiniciar manualmente el terminal, los cambios no siempre se guardan en el perfil por defecto. ¿Qué puede ser esto? En qué circunstancias

¿se guardan los ajustes con seguridad? ¿Tal vez los asesores/indicadores deban permanecer un tiempo mínimo para que los ajustes se restablezcan en el disco?

Windows Server 2012 R2 Standard x64, IE 11, RDP, UAC, 2 x Intel Xeon E3-12xx v2 (Ivy Bridge, IBRS), Memoria: 2970 / 3999 Mb, Disco: 2 / 19 Gb

Terminal MT4. He probado varios corredores.


 

Hola.

Estoy pidiendo ayuda. No puedo entender las operaciones de archivo en MQL4. Aquí está el código :

double Lot; 
string file_name        = "Test "+Symbol()+".csv";
int    filehandle; 
                                                                       
//+------------------------------------------------------------------+
int OnInit()
  {
//----- Создание файла 

   ResetLastError();
   if(!FileIsExist(file_name)) 
      {
      Print("Файл <",file_name,"> отсутствует. Создание файла.");
      filehandle=FileOpen(file_name,FILE_WRITE|FILE_CSV); 
      if(filehandle!=INVALID_HANDLE) 
         {
         FileWrite(filehandle,0.1); 
         //FileWriteDouble(filehandle,0.1,DOUBLE_VALUE);
         FileClose(filehandle);  
         } 
         else Comment("Файл не создан, ошибка ",GetLastError());
      }
      else  Print("Файл <",file_name,"> существует");
   
   
   
//----- Чтение файла 
   
   ResetLastError();
   filehandle=FileOpen(file_name,FILE_READ|FILE_BIN);
   if(filehandle!=INVALID_HANDLE) 
         { 
         Print("Файл <",file_name,"> открыт для чтения");
         Lot=FileReadDouble(filehandle,DOUBLE_VALUE);
         Print("Lot = ",Lot);
         FileClose(filehandle);  
         }
         else Comment("Файл не создан, ошибка ",GetLastError()); 
         
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   FileDelete(file_name);
   
  }
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Crea un archivo de prueba EURUSD.csv - todo está bien. Tengo "0.1" en el archivo.

Sin embargo, no lee: devuelve "Lote = 0,0" en el registro.

Al compilarlo, no da errores.

Ya me "rompí el cerebro" - no entiendo dónde está el error.

Agradezco de antemano a todos los que ayuden.

 
Vladimir Pastushak:

Trae todo el código.

casi todos

Casi todo. Pero también conté por separado: doble iK2 = ( numPosOr - numStepCount) / numPosOr - resulta = 0

 
graf1976:

Hola.

Estoy pidiendo ayuda. No puedo entender las operaciones de archivo en MQL4. Aquí está el código :

Crea un archivo de prueba EURUSD.csv - todo está bien. Tengo "0.1" en el archivo.

Sin embargo, no lee: devuelve "Lote = 0,0" en el registro.

Al compilarlo, no da errores.

Ya me "rompí el cerebro" - no entiendo dónde está el error.

Quiero agradecer de antemano a todos los que ayuden.

Creo que el error está aquí

filehandle=FileOpen(file_name,FILE_READ|
FILE_BIN);  // надо  FILE_CSV 
 
Alekseu Fedotov:

Creo que hay un error aquí

Gracias, pero no ha servido de nada. Todavía tengo un resultado nulo en el registro.
 
graf1976:
Gracias, pero no ha servido de nada. Sigue dando un resultado nulo en el registro.
graf1976:
Gracias, pero no ha servido de nada. Todavía tengo cero resultados en el registro.

También

función de sustitución

FileReadDouble(filehandle,DOUBLE_VALUE);

a

FileReadNumber(filehandle);
 
Alekseu Fedotov:

También

sustituir la función

a

Alexei, un ENORME AGRADECIMIENTO.

Después de reemplazar la función - funcionó.

 

Me gustaría preguntar a los expertos si tal preparación para un experto es correcta o es mejor organizar la lógica de otra manera.

 //+------------------------------------------------------------------+
//|                                                    01 Sample.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#define MACD_MAGIC 1234503
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
CTrade            m_trade;     // trading object
CSymbolInfo       m_symbol;   // symbol info object
CPositionInfo     m_position; // trade position object
CAccountInfo      m_account;   // account info wrapper
//---
input double MaximumRisk      = 0.02 ; // Maximum Risk in percentage
input double DecreaseFactor   = 3 ;     // Descrease factor
input int     InpMACDOpenLevel = 3 ;     // MACD open level (in pips)
input int     InpMACDCloseLevel= 2 ;     // MACD close level (in pips)
input int     InpMATrendPeriod = 26 ;   // MA trend period
//---
double    m_macd_open_level  = 0.0 ; //
double    m_macd_close_level = 0.0 ; //
datetime ExtPrevBars        = 0 ;   // "0" -> D'1970.01.01 00:00';
datetime ExtPrevBars_0      = 0 ;   // "0" -> D'1970.01.01 00:00';
int       m_handle_macd;             // MACD indicator handle
int       m_handle_ema;             // Moving Average indicator handle
double    m_adjusted_point;         // point value adjusted for 3 or 5 points
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized( void )
  {
   double price= 0.0 ;
   double margin= 0.0 ;
//--- select lot size
   if (! SymbolInfoDouble ( _Symbol , SYMBOL_ASK ,price))
       return ( 0.0 );
   if (! OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 1.0 ,price,margin))
       return ( 0.0 );
   if (margin<= 0.0 )
       return ( 0.0 );
   double lot= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_MARGIN_FREE )*MaximumRisk/margin, 2 );
//--- calculate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       //--- select history for access
       HistorySelect ( 0 , TimeCurrent ());
       //---
       int     orders= HistoryDealsTotal ();   // total history deals
       int     losses= 0 ;                     // number of losses orders without a break
       for ( int i=orders- 1 ; i>= 0 ; i--)
        {
         ulong ticket= HistoryDealGetTicket (i);
         if (ticket== 0 )
           {
             Print ( "HistoryDealGetTicket failed, no trade history" );
             break ;
           }
         //--- check symbol
         if ( HistoryDealGetString (ticket, DEAL_SYMBOL )!= _Symbol )
             continue ;
         //--- check Expert Magic number
         if ( HistoryDealGetInteger (ticket, DEAL_MAGIC )!=MACD_MAGIC)
             continue ;
         //--- check profit
         double profit= HistoryDealGetDouble (ticket, DEAL_PROFIT );
         if (profit> 0.0 )
             break ;
         if (profit< 0.0 )
            losses++;
        }
       //---
       if (losses> 1 )
         lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//--- normalize and check limits
   double stepvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );
   lot=stepvol* NormalizeDouble (lot/stepvol, 0 );
   double minvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
   if (lot<minvol)
      lot=minvol;
   double maxvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX );
   if (lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return (lot);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- initialize common information
   m_symbol.Name( Symbol ());                   // symbol
   RefreshRates();
   m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol( Symbol ());
//--- tuning for 3 or 5 digits
   int 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_macd_open_level =InpMACDOpenLevel*m_adjusted_point;
   m_macd_close_level=InpMACDCloseLevel*m_adjusted_point;
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints( 3 *digits_adjust);
//---
//--- create MACD indicator
   m_handle_macd= iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE );
//--- if the handle is not created
   if (m_handle_macd== INVALID_HANDLE )
     {
       //--- tell about the failure and output the error code
       PrintFormat ( "Failed to create handle of the handle_iCustom indicator for the symbol %s/%s, error code %d" ,
                   Symbol (),
                   EnumToString ( Period ()),
                   GetLastError ());
       //--- the indicator is stopped early
       return ( INIT_FAILED );
     }
//--- Moving Average indicator
   m_handle_ema= iMA ( NULL , 0 ,InpMATrendPeriod, 0 , MODE_EMA , PRICE_CLOSE );
//--- if the handle is not created
   if (m_handle_ema== INVALID_HANDLE )
     {
       //--- tell about the failure and output the error code
       PrintFormat ( "Failed to create handle of the handle_iCustom indicator for the symbol %s/%s, error code %d" ,
                   Symbol (),
                   EnumToString ( Period ()),
                   GetLastError ());
       //--- the indicator is stopped early
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- refresh rates
   RefreshRates();
   CheckForOpen();
   CheckForClose();
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool LongClosed( void )
  {
   bool res= false ;
//--- should it be closed?
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of current positions
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()== Symbol ())
           {
             if (m_position.PositionType()== POSITION_TYPE_BUY )
              {
               ClosePosition(m_position. Symbol ()); // close a position by the specified symbo
               printf ( "Long position by %s to be closed : '%s'" , Symbol (),m_trade.ResultComment());
               //--- processed and cannot be modified
               res= true ;
              }
           }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for short position closing                                 |
//+------------------------------------------------------------------+
bool ShortClosed( void )
  {
   bool res= false ;
//--- should it be closed?
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of current positions
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()== Symbol ())
           {
             if (m_position.PositionType()== POSITION_TYPE_SELL )
              {
               ClosePosition(m_position. Symbol ()); // close a position by the specified symbo
               printf ( "Short position by %s to be closed : '%s'" , Symbol (),m_trade.ResultComment());
               //--- processed and cannot be modified
               res= true ;
              }
           }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool LongOpened( void )
  {
   bool res= false ;
//--- check for long position (BUY) possibility
   double price=m_symbol.Ask();
//--- open position
   if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_BUY ,TradeSizeOptimized(),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,TP=%f" ,price, 0.0 );
     }
//--- in any case we must exit from expert
   res= true ;
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for short position opening                                 |
//+------------------------------------------------------------------+
bool ShortOpened( void )
  {
   bool res= false ;
//--- check for short position (SELL) possibility
   double price=m_symbol.Bid();
//--- open position
   if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_SELL ,TradeSizeOptimized(),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,TP=%f" ,price, 0.0 );
     }
//--- in any case we must exit from expert
   res= true ;
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
bool CheckForOpen( void )
  {
   bool res= false ;
//--- we work only at the time of the birth of new bar
   datetime time_0= iTime ( Symbol (), Period (), 0 );
   if (time_0==ExtPrevBars)
       return ( false );
   ExtPrevBars=time_0;
   if (!RefreshRates())
     {
      ExtPrevBars= 0 ;
       return ( false );
     }
//---
   double main[],signal[],ma[];
   ArraySetAsSeries (main, true );
   ArraySetAsSeries (signal, true );
   ArraySetAsSeries (ma, true );
   int start_pos= 0 ,count= 3 ;
   if (!iGetArray(m_handle_macd, MAIN_LINE ,start_pos,count,main) ||
      !iGetArray(m_handle_macd, SIGNAL_LINE ,start_pos,count,signal) ||
      !iGetArray(m_handle_ema, 0 ,start_pos,count,ma))
     {
      ExtPrevBars= 0 ;
       return ( false );
     }
//--- check for long position (BUY) possibility
   if (main[ 0 ]< 0 )
       if (main[ 0 ]>signal[ 0 ] && main[ 1 ]<signal[ 1 ])
         if ( MathAbs (main[ 0 ])>(m_macd_open_level) && ma[ 0 ]>ma[ 1 ])
           {
            LongOpened();
            res= true ;
           }
//--- check for short position (SELL) possibility
   if (main[ 0 ]> 0 )
       if (main[ 0 ]<signal[ 0 ] && main[ 1 ]>signal[ 1 ])
         if (main[ 0 ]>(m_macd_open_level) && ma[ 0 ]<ma[ 1 ])
           {
            ShortOpened();
            res= true ;
           }
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
bool CheckForClose( void )
  {
   bool res= false ;
//--- we work only at the time of the birth of new bar
   datetime time_0= iTime ( Symbol (), Period (), 0 );
   if (time_0==ExtPrevBars_0)
       return ( false );
   ExtPrevBars_0=time_0;
   if (!RefreshRates())
     {
      ExtPrevBars_0= 0 ;
       return ( false );
     }
//---
   double main[],signal[],ma[];
   ArraySetAsSeries (main, true );
   ArraySetAsSeries (signal, true );
   ArraySetAsSeries (ma, true );
   int start_pos= 0 ,count= 3 ;
   if (!iGetArray(m_handle_macd, MAIN_LINE ,start_pos,count,main) ||
      !iGetArray(m_handle_macd, SIGNAL_LINE ,start_pos,count,signal) ||
      !iGetArray(m_handle_ema, 0 ,start_pos,count,ma))
     {
      ExtPrevBars_0= 0 ;
       return ( false );
     }
//--- should it be closed?
   if (main[ 0 ]< 0 )
       if (main[ 0 ]>signal[ 0 ] && main[ 1 ]<signal[ 1 ])
         if ( MathAbs (main[ 0 ])>m_macd_close_level)
           {
            ShortClosed();
            res= true ;
           }
//--- should it be closed?
   if (main[ 0 ]> 0 )
       if (main[ 0 ]<signal[ 0 ] && main[ 1 ]>signal[ 1 ])
         if (main[ 0 ]>m_macd_close_level)
           {
            LongClosed();
            res= true ;
           }
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
double iGetArray( const int handle, const int buffer, const int start_pos, const int count, double &arr_buffer[])
  {
   bool result= true ;
   if (! ArrayIsDynamic (arr_buffer))
     {
       Print ( "This a no dynamic array!" );
       return ( false );
     }
   ArrayFree (arr_buffer);
//--- reset error code
   ResetLastError ();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied= CopyBuffer (handle,buffer,start_pos,count,arr_buffer);
   if (copied!=count)
     {
       //--- if the copying fails, tell the error code
       PrintFormat ( "Failed to copy data from the indicator, error code %d" , GetLastError ());
       //--- quit with zero result - it means that the indicator is considered as not calculated
       return ( false );
     }
   return (result);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "RefreshRates error" );
       return ( false );
     }
//--- protection against the return value of "zero"
   if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
     {
       Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "Ask == 0.0 OR Bid == 0.0" );
       return ( false );
     }
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Close selected position                                          |
//+------------------------------------------------------------------+
void ClosePosition( const string symbol)
  {
   if (InitTrade(symbol))
      m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbo
   PlaySound ( "ok.wav" );
  }
//+------------------------------------------------------------------+
//| Init trade object                                                |
//+------------------------------------------------------------------+
bool InitTrade( const string symbol)
  {
   if (!m_symbol.Name(symbol)) // sets symbol name
       return ( false );
//---
   if (IsFillingTypeAllowed(symbol, SYMBOL_FILLING_FOK ))
      m_trade.SetTypeFilling( ORDER_FILLING_FOK );
   else
       if (IsFillingTypeAllowed(symbol, SYMBOL_FILLING_IOC ))
         m_trade.SetTypeFilling( ORDER_FILLING_IOC );
       else
         m_trade.SetTypeFilling( ORDER_FILLING_RETURN );
//---
   return ( true );
//---
  }
//+------------------------------------------------------------------+
//| Checks if the specified filling mode is allowed                  |
//+------------------------------------------------------------------+
bool IsFillingTypeAllowed( string symbol, int fill_type)
  {
//--- Obtain the value of the property that describes allowed filling modes
   int filling=( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE );
//--- Return true, if mode fill_type is allowed
   return ((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+
 
Sysmart:

numPosOr= 4;

numStepCount= 1;

iK = (numPosOr - numStepCount) / numPosOr;

¿Por qué este cálculo hace queiK = 0?

¿No hay nadie que me dé una pista?

 
Sysmart:

¿No hay nadie que te lo diga?

¿Cuál es su problema? ¿Qué quiere de su función?

tal vez pueda entenderlo y entonces podemos buscar una solución juntos ?