يرجى العلم بأن هذه الطريقة غير موثوق بها ، حيث يتوقف MT عن تحديث عدد القضبان بعد تحقيق الحد الأقصى لأعمدة القضبان. لذا ، فقط! طريقة موثوقة للتحقق من الوقت.Originally Posted by ;
يرجى العلم بأن هذه الطريقة غير موثوق بها ، حيث يتوقف MT عن تحديث عدد القضبان بعد تحقيق الحد الأقصى لأعمدة القضبان. لذا ، فقط! طريقة موثوقة للتحقق من الوقت.Originally Posted by ;
نعم ، وافق ، بالتأكيد لا تستخدم طريقة القضبان. الطريقة الأكثر موثوقية لاستخدام SeriesInfoInteger واستدعائها لـ LASTBAR_DATE ، تحقق من وجود أخطاء ، وإذا كان هناك أخطاء في الأخطاء واطلب مرة أخرى حتى انتهاء مهلة وظيفتك أو تحصل على نتيجة نظيفة. هنا مثال على MTF isNewBar function ... Inserted Code #include lt؛ Arrays \ ArrayObj.mqhgt؛ class NewBars: public CObject {ENUM_TIMEFRAMES m_timeframe؛ التاريخ والوقت m_last_bar_time public: NewBars (ENUM_TIMEFRAMES tf): m_timeframe (tf)، m_last_bar_time (0) {} bool isNewBar () {uint ms = GetTickCount ()؛ تيارات التاريخ والوقت القيام {ResetLastError ()؛ curr = (datetime) SeriesInfoInteger (_Symbol، m_timeframe، SERIES_LASTBAR_DATE)؛ } بينما (_LastError! = ERR_NO_ERROR GetTickCount () - ms lt؛ 500)؛ if (curr gt؛ 0 _LastError == ERR_NO_ERROR curr! = m_last_bar_time) {bool res = true؛ if (m_last_bar_time == 0) res = false؛ m_last_bar_time = curr؛ عودة الدقة } عودة كاذبة؛ } bool isMatching (ENUM_TIMEFRAMES tf) {return m_timeframe == tf؟ خطأ صحيح؛} }؛ bool isNewBar (const ENUM_TIMEFRAMES timeframe) {static CArrayObj tfs؛ for (int i = tfs.Total () - 1؛ igt؛ = 0؛ i--) {NewBars * tf = dynamic_castlt؛ NewBars * gt؛ (tfs.At (i))؛ إذا كان (tf.isMatching (الإطار الزمني)) إرجاع tf.isNewBar ()؛ } tfs.Add (NewBars new (timeframe))؛ عودة كاذبة؛ }Originally Posted by ;
1 مرفق (مرفقات)
لا (لا يتوقف التحديث) تتخطى القضبان () الحد الأقصى لعدد الأشرطة في الحالات التي يتم فيها الوصول إلى الحد الأقصى من القضبان (ويتم تجاوزه)Originally Posted by ;
شكرا لك ، أنت لطيف جدا في تقديم هذه الأمثلة ، هنا وعلى المواضيع الأخرى. أتفهم ما قمت به هنا ، لكن اللغويات لا تدرك أنني ما زلت أتعلم الجانب OO من MQL4. أنا أيضًا لست متأكدًا تمامًا من أن الشفرة ستعمل داخل سياق النص البرمجي ، لكنني لست على دراية كاملة.Originally Posted by ;
شكرا ، قرأت تناقض الردود في مختلف المواضيع حتى لم أكن متأكدا لكنه كان يعمل بالنسبة لي لذلك أنا أحسب ما هيكOriginally Posted by ;
شكرا على الرد ، فهل أنا محق في استخدام طريقة القضبان هذه أم لا؟ يشعر وكأنه أبسط ثم طريقة الوقت وأنا أحب أن تبقي الأمور بسيطةOriginally Posted by ;
لا توجد أي طريقة معقدة: تم إدراج رمز ثابت تاريخوقت _prevTime = 0؛ datetime _currTime = iTime (NULL ، الإطار الزمني المطلوب ، 0)؛ bool _isNewBar = (_prevTime! = _currTime)؛ if (_isNewBar) _prevTime = _currTime؛Originally Posted by ;
شكرا ، كان لدي شيء مماثل في البرنامج النصي الخاص بي لكنه لم يعمل (نشر في أول وظيفة) حتى عندما قمت بإضافة RefreshRates (). سأحاول مرة أخرى مع التعليمات البرمجية الخاصة بك ، مع إضافة ResreshRates () داخل وخارج الحلقة بحيث يحصل البرنامج النصي على معلومات جديدة.Originally Posted by ;
الرمز المدرج/--- المتغير العام ----------------------------------------- ------------------------- datetime ArrayTime # 91؛ # 93 ؛، LastTime؛ void OnTick () {if (NewBar (PERIOD_CURRENT)) {//your code}} bool NewBar (int int) {bool firstRun = false، newBar = false؛ ArraySetAsSeries (ArrayTime، صحيح)؛ CopyTime (رمز ()، فترة، 0،2، ArrayTime)؛ if (LastTime == 0) firstRun = true؛ if (ArrayTime # 91؛ 0 # 93؛ gt؛ LastTime) {if (firstRun == false) newBar = true؛ LastTime = ArrayTime # 91؛ 0 # 93 ؛؛ } عودة newBar ؛ }
أيضًا ، تحقق من هذا الرمز المناسب للإطارات الزمنية التعسفية (تم الكشف عنها مع عرض السعر الأول): Insert Code #property strict void OnStart () {datetime seconds = _Period * 60؛/تحديد أي مقدار بالثواني datetime t_last_recorded = 0؛/من أجل العرض التوضيحي: D بينما (! IsStopped ()) {RefreshRates ()؛ datetime t = TimeCurrent ()؛/time of last known quote datetime t_normalized = tseconds * seconds؛ if (t_normalized gt؛ t_last_recorded) {//new bar printf (new bar!)؛ t_last_recorded = t_normalized؛ } النوم (1) ؛ }}