新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1271 1...126412651266126712681269127012711272127312741275127612771278...1953 新评论 Dmitri Custurov 2020.10.10 17:33 #12701 当手动重启终端时,所做的改变并不总是被保存到默认配置文件中。这可能是什么呢?在什么情况下 设置肯定会被保存?也许顾问/指示器需要在一些最短的时间内挂起,以便将 设置重置到磁盘? 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。我试过几个经纪公司。 Any questions from newcomers MQL5 bug when working 使用iClose/iOpen时间序列访问等工作时的MQL5错误。 graf1976 2020.10.10 19:01 #12702 你好。 我在请求帮助。我搞不清楚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"。 编译时,它没有出现任何错误。 我已经 "打破了我的大脑"--我不明白哪里出了错。 我预先感谢所有愿意提供帮助的人。 Sysmart 2020.10.10 19:30 #12703 Vladimir Pastushak:带上所有的代码。几乎所有的。但我也单独计算过:双倍iK2 = (numPosOr - numStepCount) / numPosOr- 结果是 = 0 Alekseu Fedotov 2020.10.11 03:18 #12704 graf1976:你好。我在请求帮助。我搞不清楚MQL4中的文件操作。以下是代码。创建一个测试EURUSD.csv文件 - 一切正常。我的文件里有 "0.1"。但它不会读取:它在日志中返回 "Lot = 0.0"。编译时,它没有出现任何错误。我已经 "打破了我的大脑"--我不明白哪里出了错。我想提前感谢每一个愿意提供帮助的人。 我认为错误在这里 filehandle=FileOpen(file_name,FILE_READ| FILE_BIN); // надо FILE_CSV graf1976 2020.10.11 05:40 #12705 Alekseu Fedotov:我认为这里有一个错误 谢谢,但这并没有帮助。我在日志中仍然得到一个空的结果。 Alekseu Fedotov 2020.10.11 06:21 #12706 graf1976: 谢谢你,但这并没有帮助。它在日志中输出的结果仍然为零。 graf1976: 谢谢,但这没有帮助。我在日志中得到的结果仍然是零。 另外 替换功能 FileReadDouble(filehandle,DOUBLE_VALUE); 至 FileReadNumber(filehandle); graf1976 2020.10.11 06:34 #12707 Alekseu Fedotov:另外替换功能至 阿列克谢,非常感谢你。 在更换了功能后--它起作用了。 SanAlex 2020.10.11 09:40 #12708 请问各位高手,这样的高手准备是正确的,还是换一种方式组织逻辑比较好? //+------------------------------------------------------------------+ //| 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 2020.10.11 10:17 #12709 Sysmart:numPosOr= 4;numStepCount= 1。iK = (numPosOr - numStepCount) / numPosOr;为什么这种计算方式使iK=0? 难道没有人给我一个提示吗? SanAlex 2020.10.11 10:57 #12710 Sysmart:没有人可以告诉你吗? 你的问题是什么? 你想从你的职能中得到什么? 也许我可以理解,然后我们可以一起寻找一个解决方案? 1...126412651266126712681269127012711272127312741275127612771278...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
当手动重启终端时,所做的改变并不总是被保存到默认配置文件中。这可能是什么呢?在什么情况下
设置肯定会被保存?也许顾问/指示器需要在一些最短的时间内挂起,以便将 设置重置到磁盘?
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中的文件操作。以下是代码。
创建一个测试EURUSD.csv文件 - 一切正常。我的文件里有 "0.1"。
但它不会读取:它在日志中返回 "Lot = 0.0"。
编译时,它没有出现任何错误。
我已经 "打破了我的大脑"--我不明白哪里出了错。
我预先感谢所有愿意提供帮助的人。
带上所有的代码。
几乎所有的。但我也单独计算过:双倍iK2 = (numPosOr - numStepCount) / numPosOr- 结果是 = 0
你好。
我在请求帮助。我搞不清楚MQL4中的文件操作。以下是代码。
创建一个测试EURUSD.csv文件 - 一切正常。我的文件里有 "0.1"。
但它不会读取:它在日志中返回 "Lot = 0.0"。
编译时,它没有出现任何错误。
我已经 "打破了我的大脑"--我不明白哪里出了错。
我想提前感谢每一个愿意提供帮助的人。
我认为错误在这里
我认为这里有一个错误
谢谢你,但这并没有帮助。它在日志中输出的结果仍然为零。
谢谢,但这没有帮助。我在日志中得到的结果仍然是零。
另外
替换功能
FileReadDouble(filehandle,DOUBLE_VALUE);
至
FileReadNumber(filehandle);
另外
替换功能
至
阿列克谢,非常感谢你。
在更换了功能后--它起作用了。
请问各位高手,这样的高手准备是正确的,还是换一种方式组织逻辑比较好?
numPosOr= 4;
numStepCount= 1。
iK = (numPosOr - numStepCount) / numPosOr;
为什么这种计算方式使iK=0?
难道没有人给我一个提示吗?
没有人可以告诉你吗?
你的问题是什么? 你想从你的职能中得到什么?
也许我可以理解,然后我们可以一起寻找一个解决方案?