新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1271

 

当手动重启终端时,所做的改变并不总是被保存到默认配置文件中。这可能是什么呢?在什么情况下

设置肯定会被保存?也许顾问/指示器需要在一些最短的时间内挂起,以便 设置重置到磁盘

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

终端MT4。我试过几个经纪公司。


 

你好。

我在请求帮助。我搞不清楚MQL4中的文件操作。以下是代码。

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

创建一个测试EURUSD.csv文件 - 一切正常。我的文件里有 "0.1"。

但它不会读取:它在日志中返回 "Lot = 0.0"。

编译时,它没有出现任何错误。

我已经 "打破了我的大脑"--我不明白哪里出了错。

我预先感谢所有愿意提供帮助的人。

 
Vladimir Pastushak:

带上所有的代码。

几乎所有

几乎所有的。但我也单独计算过:双倍iK2 = (numPosOr - numStepCount) / numPosOr- 结果是 = 0

 
graf1976:

你好。

我在请求帮助。我搞不清楚MQL4中的文件操作。以下是代码。

创建一个测试EURUSD.csv文件 - 一切正常。我的文件里有 "0.1"。

但它不会读取:它在日志中返回 "Lot = 0.0"。

编译时,它没有出现任何错误。

我已经 "打破了我的大脑"--我不明白哪里出了错。

我想提前感谢每一个愿意提供帮助的人。

我认为错误在这里

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

我认为这里有一个错误

谢谢,但这并没有帮助。我在日志中仍然得到一个空的结果。
 
graf1976:
谢谢你,但这并没有帮助。它在日志中输出的结果仍然为零。
graf1976:
谢谢,但这没有帮助。我在日志中得到的结果仍然是零。

另外

替换功能

FileReadDouble(filehandle,DOUBLE_VALUE);

FileReadNumber(filehandle);
 
Alekseu Fedotov:

另外

替换功能

阿列克谢,非常感谢你。

在更换了功能后--它起作用了。

 

请问各位高手,这样的高手准备是正确的,还是换一种方式组织逻辑比较好?

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

为什么这种计算方式使iK=0?

难道没有人给我一个提示吗?

 
Sysmart:

没有人可以告诉你吗?

你的问题是什么? 你想从你的职能中得到什么?

也许我可以理解,然后我们可以一起寻找一个解决方案?

原因: