Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes - page 1271

 

When manually restarting the terminal, the changes are not always saved to the default profile. What can this be? Under what circumstances

settings are saved for sure? Maybe advisors/indicators need to hang around for some minimum time for settings to reset to disk?

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

Terminal MT4. I tried several brokers.


 

Hello.

I'm asking for help. I can't figure out the file operations in MQL4. Here is the code :

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()
  {
//---
   
  }
//+------------------------------------------------------------------+

Creates a Test EURUSD.csv file - everything is ok. I have "0.1" in the file.

It won't read though : it returns "Lot = 0.0" in the log.

When compiling it, it gives no errors.

I already "broke my brain" - I do not understand where the error.

I am grateful in advance to everyone who will help.

 
Vladimir Pastushak:

Bring all the code.

almost all

Almost all of it. But I also counted separately: double iK2 = (numPosOr - numStepCount) / numPosOr - it turns out = 0

 
graf1976:

Hello.

I'm asking for help. I can't figure out the file operations in MQL4. Here is the code :

Creates a Test EURUSD.csv file - everything is ok. I have "0.1" in the file.

It won't read though : it returns "Lot = 0.0" in the log.

When compiling it, it gives no errors.

I already "broke my brain" - I do not understand where the error.

I want to thank in advance everyone who will help.

I think the error is here

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

I think there's a mistake here

Thanks, but it didn't help. I still got a null result in the log.
 
graf1976:
Thank you, but it didn't help. It still outputs zero results in the log.
graf1976:
Thanks, but it didn't help. I still got zero results in the log.

Also

replace function

FileReadDouble(filehandle,DOUBLE_VALUE);

to

FileReadNumber(filehandle);
 
Alekseu Fedotov:

Also

replace the function

to

Alexei, a HUGE THANK YOU.

After replacing the function - it worked.

 

I would like to ask the experts whether such a preparation for an expert is correct or is it better to organize the logic in a different way?

 //+------------------------------------------------------------------+
//|                                                    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;

Why does this calculation makeiK = 0?

Is there no one to give me a hint?

 
Sysmart:

Is there no one to tell you?

What is your problem? What do you want from your function?

maybe i can understand and then we can look for a solution together ?

Reason: