mql5言語の特徴、微妙なニュアンスとテクニック - ページ 209 1...202203204205206207208209210211212213214215216...247 新しいコメント fxsaber 2021.09.19 04:11 #2081 もう一つは、以前に公開された(1つ、2つ) 取引サーバーの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); } この3つの手法を共生させることで、非常に高い確率で正しい結果を得ることができるのです。 fxsaber 2021.09.20 10:59 #2082 ロールオーバーのテーマの 続きです。M1-historyで横転した時刻を特定しようとする。 #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 #: hey why so ここからお読みください。 トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム MetaTrader 5ビルド3091の新バージョン:パフォーマンスの改善 カール・シュライバー, 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千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
もう一つは、以前に公開された(1つ、2つ) 取引サーバーのGMTオフセットを決定する方法です。
この3つの手法を共生させることで、非常に高い確率で正しい結果を得ることができるのです。
ロールオーバーのテーマの 続きです。M1-historyで横転した時刻を特定しようとする。
アプリケーションです。
結果
最小ロット算出の特殊性。
例(RannForex-Binance_futures)。
これはMQL5の機能なのかバグなのか?
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
mql5の特性、ヒントとコツ
A100, 2021.05.20 13:43
インライン(不定形)関数と標準(右から左へ)関数の違いがわかると思います。
インライン関数は関数ではなく、アドレスを持つことができません。この観点からすると、通常の関数とカスタム関数の違いはなく、例えば、最も単純なカスタム関数(要するにインライン)の引数が常に右から左に計算される理由は不明である。将来、インライン関数で順番が変わる可能性は否定できないので
私は一時期、計算の順番を安全に使うために、inlineというキーワードを導入することを提案しました。
現在のMQL5では、特定の関数のインライン化を禁止することは可能でしょうか?
hey why so
ここからお読みください。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MetaTrader 5ビルド3091の新バージョン:パフォーマンスの改善
カール・シュライバー, 2021.11.02 23:34
なぜなら意味がない。
F5がハングアップする。また、矛盾する 回避策として、コンストラクタの
なぜなら意味がない。
F5がハングアップする。
理解できない。ゼロックスは便利なものなので、一理ありますね。