Аналог ObjectGetValueByTime может кто то реализовывал ? - страница 8

 
Lilita Bogachkova #:

Краткое объяснение моего (ChatGPT) кода

Чуть позже изучу, но практика показала что ИИ не справляется с такой задачей...

 
Vladimir Pastushak #:

Чуть позже изучу, но практика показала что ИИ не справляется с такой задачей...

Да, LLM -ки пока не тянут такие задачи на MQL5 без чуткого руководства профессионала. 
Заглянул в код. Скрипт на 1150 строк кода. Там полная дичь.  Горе от ума.
 
Vladimir Pastushak #:

Чуть позже изучу, но практика показала что ИИ не справляется с такой задачей...

Если нет времени на понимание, то всё плохо, адресовано нетерпеливым.

Или, проще говоря, я просто вынесла сам алгоритм из всего предыдущего кода и добавила тестовый скрипт.

FastObjectGetValueByTime_Exact_NativeLike_RU.mqh

Что это такое:
Это лёгкая библиотека с двумя быстрыми заменами
ObjectGetValueByTime() для прямых объектов с двумя точками:
1) FastObjectGetValueByTimeExact()
2) FastObjectGetValueByTimeNativeLike()

Как подключать:
#include <FastObjectGetValueByTime_Exact_NativeLike_RU.mqh>
 
Lilita Bogachkova #:
Если нет времени на понимание, то всё плохо, адресовано нетерпеливым.

Или, проще говоря, я просто вынесла сам алгоритм из всего предыдущего кода и добавила тестовый скрипт.

FastObjectGetValueByTime_Exact_NativeLike_RU.mqh

Что это такое:
Это лёгкая библиотека с двумя быстрыми заменами
ObjectGetValueByTime() для прямых объектов с двумя точками:
1) FastObjectGetValueByTimeExact()
2) FastObjectGetValueByTimeNativeLike()

Как подключать:
#include <FastObjectGetValueByTime_Exact_NativeLike_RU.mqh>
Вы это делаете сами с пониманием или используете ии ?
 
Lilita Bogachkova #:
Если нет времени на понимание, то всё плохо, адресовано нетерпеливым.
Или, проще говоря, я просто вынесла сам алгоритм из всего предыдущего кода и добавила тестовый скрипт.

Если уж вы не поленились написать промт, скопипастить ответ, то почему бы вам не проверить то, что вы сваяли, и сказать, работает то, что вы нам навайбкодили, или нет.

А главное, работает ли ваш код в точности как ObjectGetValueByTime ?

 
Aleksandr Slavskii #:

Если уж вы не поленились написать промт, скопипастить ответ, то почему бы вам не проверить то, что вы сваяли, и сказать, работает то, что вы нам навайбкодили, или нет.

А главное, работает ли ваш код в точности как ObjectGetValueByTime ?


В первом случае это был тестовый файл. Ошибка отображается в распечатке.

2026.04.20 19:47:18.438 FastObjectGetValueByTime_BestFastRobust (GBPUSD,D1)     PrepareHistoryObject=true | PrepareFutureObject=true
2026.04.20 19:47:18.458 FastObjectGetValueByTime_BestFastRobust (GBPUSD,D1)     AutoRecentWeighted | Object=FAST_OGVBT_ARW_HISTORY | Symbol=GBPUSD | TF=D1 | Samples=9 | ValidExact=9 | ValidNativeLike=9 | QueryErrExact=0.00030 | QueryErrNativeLike=0.00000 | WeightedExact=0.037537600 | WeightedNativeLike=0.005397600 | Chosen=NativeLike | Reason=query_priority_native_like
2026.04.20 19:47:18.459 FastObjectGetValueByTime_BestFastRobust (GBPUSD,D1)     Object=FAST_OGVBT_ARW_HISTORY | Time=2026.04.20 19:47:18 | Native=1.35533 | Exact=1.35563 | NativeLike=1.35533 | AutoRecentWeighted=1.35533 | |N-Exact|=0.00030 | |N-NativeLike|=0.00000 | |N-AutoRecentWeighted|=0.00000
2026.04.20 19:47:18.460 FastObjectGetValueByTime_BestFastRobust (GBPUSD,D1)     AutoRecentWeighted | Object=FAST_OGVBT_ARW_FUTURE | Symbol=GBPUSD | TF=D1 | Samples=9 | ValidExact=9 | ValidNativeLike=9 | QueryErrExact=0.00010 | QueryErrNativeLike=0.00000 | WeightedExact=0.012094375 | WeightedNativeLike=0.002030625 | Chosen=NativeLike | Reason=query_priority_native_like
2026.04.20 19:47:18.461 FastObjectGetValueByTime_BestFastRobust (GBPUSD,D1)     Object=FAST_OGVBT_ARW_FUTURE | Time=2026.04.20 19:47:18 | Native=1.35693 | Exact=1.35683 | NativeLike=1.35693 | AutoRecentWeighted=1.35693 | |N-Exact|=0.00010 | |N-NativeLike|=0.00000 | |N-AutoRecentWeighted|=0.00000
 
Vladimir Pastushak #:
Вы это делаете сами с пониманием или используете ии ?
Код не быстрее, чем решение на основе MQL.
PO      0       20:27:18.279    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
MH      0       20:27:18.279    test_Get_Value_By_Time (GBPUSD,D1)      Validated multi-query ObjectGetValueByTime benchmark
DD      0       20:27:18.279    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
KH      0       20:27:18.279    test_Get_Value_By_Time (GBPUSD,D1)      Symbol=GBPUSD | TF=PERIOD_D1 | Digits=5 | Warmup=500 | Measure=20000 | SuccessSamples=6 | FailureSamples=5
HG      0       20:27:18.279    test_Get_Value_By_Time (GBPUSD,D1)      Policy: invalid comparisons are skipped automatically.
DK      0       20:27:18.279    test_Get_Value_By_Time (GBPUSD,D1)      Policy: average speed is measured over multiple query times in one run.
LK      0       20:27:18.283    test_Get_Value_By_Time (GBPUSD,D1)      PrepareSuccessObject=true | PrepareFailureObject=true
GI      0       20:27:18.294    test_Get_Value_By_Time (GBPUSD,D1)      SuccessQueryCount=6 | FailureQueryCount=5
KR      0       20:27:18.294    test_Get_Value_By_Time (GBPUSD,D1)      ------------------------------------------------------------
PS      0       20:27:18.294    test_Get_Value_By_Time (GBPUSD,D1)      Success references
CK      0       20:27:18.294    test_Get_Value_By_Time (GBPUSD,D1)      ------------------------------------------------------------
FG      0       20:27:18.301    test_Get_Value_By_Time (GBPUSD,D1)      SuccessRef[0] | Time=2026.04.20 20:27:18 | Native=1.35160 | Exact=1.35169 | NativeLike=1.35160 | |N-Exact|=0.00009 | |N-NativeLike|=0.00000
KO      0       20:27:18.301    test_Get_Value_By_Time (GBPUSD,D1)      SuccessRef[1] | Time=2026.04.20 00:00:00 | Native=1.35160 | Exact=1.35160 | NativeLike=1.35160 | |N-Exact|=0.00000 | |N-NativeLike|=0.00000
GG      0       20:27:18.301    test_Get_Value_By_Time (GBPUSD,D1)      SuccessRef[2] | Time=2026.04.20 12:00:00 | Native=1.35160 | Exact=1.35165 | NativeLike=1.35160 | |N-Exact|=0.00005 | |N-NativeLike|=0.00000
HO      0       20:27:18.301    test_Get_Value_By_Time (GBPUSD,D1)      SuccessRef[3] | Time=2026.04.17 00:00:00 | Native=1.35150 | Exact=1.35150 | NativeLike=1.35150 | |N-Exact|=0.00000 | |N-NativeLike|=0.00000
CH      0       20:27:18.301    test_Get_Value_By_Time (GBPUSD,D1)      SuccessRef[4] | Time=2026.04.16 00:00:00 | Native=1.35139 | Exact=1.35139 | NativeLike=1.35139 | |N-Exact|=0.00000 | |N-NativeLike|=0.00000
HP      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      SuccessRef[5] | Time=2026.04.15 00:00:00 | Native=1.35128 | Exact=1.35128 | NativeLike=1.35128 | |N-Exact|=0.00000 | |N-NativeLike|=0.00000
KK      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      ------------------------------------------------------------
MK      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      Failure references
CS      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      ------------------------------------------------------------
GO      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      FailureRef[0] | Time=2026.03.10 00:00:00 | Native=FAILED err=4205 | Exact=FAILED | NativeLike=FAILED
EP      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      FailureRef[1] | Time=2026.03.11 00:00:00 | Native=FAILED err=4205 | Exact=FAILED | NativeLike=FAILED
KD      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      FailureRef[2] | Time=2026.03.12 00:00:00 | Native=FAILED err=4205 | Exact=FAILED | NativeLike=FAILED
II      0       20:27:18.302    test_Get_Value_By_Time (GBPUSD,D1)      FailureRef[3] | Time=2026.03.13 00:00:00 | Native=FAILED err=4205 | Exact=FAILED | NativeLike=FAILED
PM      0       20:27:18.303    test_Get_Value_By_Time (GBPUSD,D1)      FailureRef[4] | Time=2026.03.14 00:00:00 | Native=FAILED err=4205 | Exact=FAILED | NativeLike=FAILED
HL      0       20:27:18.303    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
NM      0       20:27:18.303    test_Get_Value_By_Time (GBPUSD,D1)      Success-path benchmark
HD      0       20:27:18.303    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
CG      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      Success | Native | samples=6 | total_calls=20000 | elapsed_us=207613 | avg_us_per_call=10.3806 | calls_per_sec=96333.08 | ok=20000 | fail=0 | last_price=1.35160
NO      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      Success | Exact | samples=6 | total_calls=20000 | elapsed_us=1345864 | avg_us_per_call=67.2932 | calls_per_sec=14860.34 | ok=20000 | fail=0 | last_price=1.35160
DH      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      Success | NativeLike | samples=6 | total_calls=20000 | elapsed_us=1429191 | avg_us_per_call=71.4595 | calls_per_sec=13993.93 | ok=20000 | fail=0 | last_price=1.35160
GJ      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      Success avg speedup Native/Exact = 0.1543x
JR      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      Success avg speedup Native/NativeLike = 0.1453x
IL      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
NN      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      Failure-path benchmark
ID      0       20:27:21.357    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
KD      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      Failure | Native | samples=5 | total_calls=20000 | elapsed_us=175246 | avg_us_per_call=8.7623 | calls_per_sec=114125.29 | ok=0 | fail=20000 | last_price=0.00000
KN      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      Failure | Exact | samples=5 | total_calls=20000 | elapsed_us=1397255 | avg_us_per_call=69.8628 | calls_per_sec=14313.78 | ok=0 | fail=20000 | last_price=0.00000
MO      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      Failure | NativeLike | samples=5 | total_calls=20000 | elapsed_us=1343471 | avg_us_per_call=67.1736 | calls_per_sec=14886.81 | ok=0 | fail=20000 | last_price=0.00000
HJ      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      Failure avg speedup Native/Exact = 0.1254x
ER      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      Failure avg speedup Native/NativeLike = 0.1304x
HS      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
PN      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      Finished
LE      0       20:27:24.348    test_Get_Value_By_Time (GBPUSD,D1)      ============================================================
Файлы:
 
Vladimir Pastushak #:

Правильно ли я перебрал функцию ?

На мой взгляд, нет. Слишком много упрощений, из-за которых получается такой непонятный результат.
Вот мой вариант, максимально близкий к Вашему варианту:

void OnStart()
{
   string sName = "TRNDLN";
   if (ObjectFind(0, sName) < 0)
      return;

   // Исходные данные
   datetime dtTime1 = datetime(ObjectGetInteger(0, sName, OBJPROP_TIME, 0));
   datetime dtTime2 = datetime(ObjectGetInteger(0, sName, OBJPROP_TIME, 1));
   double fPrice1 = ObjectGetDouble(0, sName, OBJPROP_PRICE, 0);
   double fPrice2 = ObjectGetDouble(0, sName, OBJPROP_PRICE, 1);
   
   // Расчет цены на заданном баре
   datetime dtTime3 = dtTime2 + PeriodSeconds() *10;
   double fPrice3 = PredictPriceFromTwoPoints(dtTime1, fPrice1, dtTime2, fPrice2, dtTime3);

   ShowTrendLine("TRNDLNNXT2", dtTime2, fPrice2, dtTime3, fPrice3, "/n", clrGreen, 2);
}

void ShowTrendLine(string sName, datetime time1, double price1, datetime time2, double price2, string toolTip, color clr, const int nWidth)
{
   if (ObjectFind(0, sName) < 0)
   {
      ObjectCreate(0, sName, OBJ_TREND, 0, time1, price1, time2, price2);
      ObjectSetInteger(0, sName, OBJPROP_BACK, false);
      ObjectSetInteger(0, sName, OBJPROP_WIDTH, (int)nWidth);
      ObjectSetInteger(0, sName, OBJPROP_RAY, false);
      ObjectSetInteger(0, sName, OBJPROP_HIDDEN, true);
      ObjectSetInteger(0, sName, OBJPROP_SELECTABLE, false);
   }
   else
   {
      ObjectMove(0, sName, 0, time1, price1);
      ObjectMove(0, sName, 1, time2, price2);
   }
   
   ObjectSetInteger(0, sName, OBJPROP_COLOR, clr);
   ObjectSetString(0, sName, OBJPROP_TOOLTIP, toolTip);
}

double PredictPriceFromTwoPoints(const datetime dtTime1, const double fPrice1, const datetime dtTime2, const double fPrice2, const datetime dtTargetTime)
{
   int nX1 = GetBarIndexByTime(dtTime1);
   int nX2 = GetBarIndexByTime(dtTime2);
   int nTargetBar = GetBarIndexByTime(dtTargetTime);

   if (nX1 == nX2)
      return (fPrice1);
 
   double k = (fPrice2 - fPrice1) / (nX2 - nX1);
   return (k * nTargetBar + (fPrice1 - k * nX1));
}

int GetBarIndexByTime(const datetime dtTime)
{
   if (dtTime <= iTime(NULL, PERIOD_CURRENT, 0))
      return iBarShift(NULL, PERIOD_CURRENT, dtTime);
      
   int nSeconds = PeriodSeconds();
   if (nSeconds <= 0)
      return 0;
   
   return -int(dtTime - iTime(NULL, PERIOD_CURRENT, 0)) / nSeconds;
}

Проведите на графике линию с именем TRNDLN (или измените в коде название искомой линии). Потом запустите этот скрипт. Скрипт дорисует продолжение линии на 10 баров вперед.