mql5语言的特点、微妙之处以及技巧 - 页 209 1...202203204205206207208209210211212213214215216...247 新评论 fxsaber 2021.09.19 04:11 #2081 另一个是以前公布的(一、二) 确定交易服务器的GMT偏移量的方法。 #define HOUR 3600 #define DAY (24 * HOUR) #define WEEK 7 bool GetWeekSession( const string Symb, datetime &From, datetime &To ) { datetime Tmp; From = 0; To = 0; for (int i = 0; i < 7; i++) if (::SymbolInfoSessionQuote(Symb, (ENUM_DAY_OF_WEEK)i, 0, From, Tmp) && (From != Tmp)) { From += (i + WEEK - 1) * DAY; break; } for (int i = 6; i >= 0; i--) if (::SymbolInfoSessionQuote(Symb, (ENUM_DAY_OF_WEEK)i, 0, Tmp, To) && (To != Tmp)) { To += ((i + WEEK - 1) % WEEK) * DAY; break; } return(From != To); } // Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset // Работает для FOREX-символов. int TimeServerGMTOffset( void ) { const datetime Sunday = (WEEK - 1) * DAY; datetime From; datetime To; return(GetWeekSession(_Symbol, From, To) ? ((int)::MathRound((double)::MathMin(Sunday - DAY - To, Sunday + DAY - From) / HOUR) - 3) * HOUR : 0); } 所有这三种方法的共生,给人以获得正确结果的极高概率。 fxsaber 2021.09.20 10:59 #2082 延续翻转的主题。试图确定M1-历史上的翻车时间。 #define HOUR 3600 #define HOURS 24 #define DAY (HOURS * HOUR) #define WEEK 7 #define MINUTE 60 ENUM_DAY_OF_WEEK TimeDayOfWeek( const datetime time ) { return((ENUM_DAY_OF_WEEK)((time / DAY + THURSDAY) % WEEK)); } datetime GetTimeDayOfWeek( const datetime time, const ENUM_DAY_OF_WEEK Day = SUNDAY ) { const datetime Res = time / DAY * DAY; return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK)) * DAY); } #define GETHOUR(A) (int)((A.time / HOUR) % HOURS) #define GETMINUTE(A) (int)((A.time / MINUTE) % MINUTE) int GetTimePos( const MqlRates &Rates[], const datetime time ) { int Left = 0; int Right = ArraySize(Rates) - 1; while (Right > Left) { const int Middle = (Left + Right) >> 1; if (Rates[Middle].time < time) Left = Middle + 1; else Right = Middle - 1; } return(Left); } int GetRolloverInterval( const MqlRates &Rates[], const datetime From, const datetime To, const bool MQL4Method = false ) { double Hours[HOURS]; ArrayInitialize(Hours, 0); const int FromPos = GetTimePos(Rates, From); const int ToPos = GetTimePos(Rates, To); for (int i = FromPos; i < ToPos; i++) { const int HourNow = GETHOUR(Rates[i]); #ifdef __MQL5__ if (!MQL4Method) // Битые баровые спреды - проблема. Hours[HourNow] += (((HourNow != GETHOUR(Rates[i - 1])) ? GETMINUTE(Rates[i]) : 0) + ((HourNow != GETHOUR(Rates[i + 1])) ? MINUTE : GETMINUTE(Rates[i + 1])) - GETMINUTE(Rates[i])) * Rates[i].spread; else #endif // #ifdef __MQL5__ Hours[HourNow] += (Rates[i].high - Rates[i].low) / Rates[i].tick_volume; } return(ArrayMaximum(Hours)); } // Возвращает время ролловера FOREX-символа на указанной неделе (кроме текущей). datetime RolloverTime( const datetime time, const string Symb = NULL, const bool MQL4Method = false ) { int Hours[HOURS]; ArrayInitialize(Hours, 0); MqlRates Rates[]; datetime From = GetTimeDayOfWeek(time); datetime To = GetTimeDayOfWeek(time) + WEEK * DAY - 1; if (CopyRates(Symb, PERIOD_M1, From, To, Rates) > 0) { #define OFFSET 3 From = (Rates[0].time / HOUR - OFFSET) * HOUR; To = From + ((OFFSET << 1) - 1) * HOUR; #undef OFFSET for (int Count = 0; Count < 4; Count++) Hours[GetRolloverInterval(Rates, From += DAY, To += DAY, MQL4Method)]++; } return(ArrayMaximum(Hours) * HOUR); } #undef GETMINUTE #undef GETHOUR 申请。 // Через Тестер выводит по неделям данные по времени ролловера. const bool Init = EventSetTimer(WEEK * DAY); void OnTimer() { const datetime time = TimeTradeServer() - WEEK * DAY; const datetime From = GetTimeDayOfWeek(time, MONDAY); Print((string)TimeToString(From, TIME_DATE) + " - " + (string)TimeToString(From + WEEK * DAY - 1, TIME_DATE) + ": RolloverTime = " + TimeToString(RolloverTime(time), TIME_MINUTES)); } 结果。 2021.03.01 - 2021.03.07: RolloverTime = 00:00 2021.03.08 - 2021.03.14: RolloverTime = 00:00 2021.03.15 - 2021.03.21: RolloverTime = 23:00 2021.03.22 - 2021.03.28: RolloverTime = 23:00 2021.03.29 - 2021.04.04: RolloverTime = 00:00 2021.04.05 - 2021.04.11: RolloverTime = 00:00 fxsaber 2021.10.23 10:43 #2083 最小地段计算的特殊性。 double NormalizeDouble( const double Value, const double Step ) { return(NormalizeDouble(Step ? (int)(Value / Step + 0.1) * Step : Value, 8)); } // Минимальный лот с учетом требования мин. объема. double GetMinLot( const string Symb, const double MinValue = 0 ) { const double MinLot = SymbolInfoDouble(Symb, SYMBOL_VOLUME_MIN) ; double Res = MinLot; if (MinValue) { const double Diff = SymbolInfoDouble(Symb, SYMBOL_ASK) * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE); Res = Diff ? MinValue * SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_SIZE) / Diff : 0; if (Res <= MinLot) Res = MinLot; else { double StepLot = SymbolInfoDouble(Symb, SYMBOL_VOLUME_STEP); if (!StepLot) StepLot = MinLot; const double NormRes = NormalizeDouble(Res, StepLot); Res = (NormRes < Res) ? NormalizeDouble(NormRes + StepLot, 8) : NormRes; } } return(Res); } 例如(RannForex-Binance_futures)。 void OnStart() { for ( int i = SymbolsTotal(true) - 1; i >= 0; i--) { const string Symb = SymbolName(i, true); Print(Symb + ", MinLot = " + (string)GetMinLot(Symb, 5)); } } XMRUSDT.fut, MinLot = 0.019 XRPUSDT.fut, MinLot = 4.7 TRXUSDT.fut, MinLot = 51.0 LTCUSDT.fut, MinLot = 0.027 FTMUSDT.fut, MinLot = 2.0 ETHUSDT.fut, MinLot = 0.002 EOSUSDT.fut, MinLot = 1.1 BNBUSDT.fut, MinLot = 0.02 BCHUSDT.fut, MinLot = 0.008 BTCUSDT.fut, MinLot = 0.001 Спецификации фьючерсных контрактов USDⓈ-Margined | Binance www.binance.com Фьючерсные контракты USDT-margined не являются инверсными. Это линейные фьючерсные продукты, которые котируются и рассчитываются в BUSD или USDT – стейблкоинах, привязанных к доллару США. Одним из ... fxsaber 2021.10.31 17:12 #2084 这是MQL5的一个特点还是一个错误? void OnStart() { uchar ArrayDst1[]; uchar ArraySrc1[]; ArrayCopy(ArrayDst1, ArraySrc1, 10); Print(ArraySize(ArrayDst1)); // MQL4 - 10, MQL5 - 0 uchar ArrayDst2[]; uchar ArraySrc2[1]; ArrayCopy(ArrayDst2, ArraySrc2, 10); Print(ArraySize(ArrayDst2)); // 11 return; } fxsaber 2021.11.15 09:37 #2085 关于交易、自动交易系统和交易策略测试的论坛 mql5的特殊性,技巧和窍门 A100, 2021.05.20 13:43 你可以看到内联(不确定的顺序)和标准(从右到左)函数之间的区别。 内联函数根本就不是函数,即它们不能有地址。从这个角度看,常规函数和自定义函数之间没有区别,所以,例如,不清楚为什么最简单的自定义函数(本质上是内联的)的参数总是从右向左计算。我不排除将来内联函数的顺序可能会改变,所以 我曾一度建议引入关键词inline以安全使用计算顺序。 在目前的MQL5中,是否可以禁止某些函数的内联? Marat Tuysin 2021.11.15 12:16 #2086 嗨,为什么这样 fxsaber 2021.11.15 12:36 #2087 TUYSIN #: 嘿,为什么这么 从这里阅读。 关于交易、自动交易系统和测试交易策略的论坛 新版MetaTrader 5 build 3091:性能的改进 Carl Schreiber, 2021.11.02 23:34 fxsaber 2021.11.16 11:42 #2088 MqlTick Ticks[4] = {}; // Обнуление статического массива. A100 2021.11.16 12:43 #2089 fxsaber #: 没有任何意义,因为。 struct X { int i; }; void OnStart() { X x[200000] = {}; } F5挂断电话。同时,这也是对构造函数的一种 自相矛盾的变通方法 fxsaber 2021.11.16 14:22 #2090 A100 #:没有任何意义,因为。F5挂断电话。 我不明白。归零是一件有用的事情,所以有意义。 1...202203204205206207208209210211212213214215216...247 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
另一个是以前公布的(一、二) 确定交易服务器的GMT偏移量的方法。
所有这三种方法的共生,给人以获得正确结果的极高概率。
延续翻转的主题。试图确定M1-历史上的翻车时间。
申请。
结果。
最小地段计算的特殊性。
例如(RannForex-Binance_futures)。
这是MQL5的一个特点还是一个错误?
关于交易、自动交易系统和交易策略测试的论坛
mql5的特殊性,技巧和窍门
A100, 2021.05.20 13:43
你可以看到内联(不确定的顺序)和标准(从右到左)函数之间的区别。
内联函数根本就不是函数,即它们不能有地址。从这个角度看,常规函数和自定义函数之间没有区别,所以,例如,不清楚为什么最简单的自定义函数(本质上是内联的)的参数总是从右向左计算。我不排除将来内联函数的顺序可能会改变,所以
我曾一度建议引入关键词inline以安全使用计算顺序。
在目前的MQL5中,是否可以禁止某些函数的内联?
嘿,为什么这么
从这里阅读。
关于交易、自动交易系统和测试交易策略的论坛
新版MetaTrader 5 build 3091:性能的改进
Carl Schreiber, 2021.11.02 23:34
没有任何意义,因为。
F5挂断电话。同时,这也是对构造函数的一种 自相矛盾的变通方法
没有任何意义,因为。
F5挂断电话。
我不明白。归零是一件有用的事情,所以有意义。