Любые вопросы новичков по 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

Терминал МТ4. Пробовал нескольких брокеров.


 

Здравствуйте.

Прошу помощи. Не могу разобраться с файловыми операциями в 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()
  {
//---
   
  }
//+------------------------------------------------------------------+

Создает файл Test EURUSD.csv - все ок. Запись "0.1" в файле присутствует.

А вот читать не хочет : в журнале выдает "Lot = 0.0"

При компиляции ошибок не выдает.

Я уже "мозг сломал" - не пойму, где ошибка.

Заранее благодарен всем кто поможет.

 
Vladimir Pastushak:

Приведите весь код

почти весь

Почти весь. Но я и отдельно считал: double iK2 = (numPosOr - numStepCount) / numPosOr - получалось = 0

 
graf1976:

Здравствуйте.

Прошу помощи. Не могу разобраться с файловыми операциями в MQL4. Вот код :

Создает файл Test 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:

Неужели некому подсказать?

а в чём у Вас загвоздка ? что Вы хотите получить от Вашей функции ? 

в вкратце - может я пойму, тогда и будем вместе искать способ решения