Пишу индикаторы на заказ
Быстро Недорого ( option )
Индикатор закономерностей
Автоматический поиск с тестером

Придумал торговать без терминала

Тема в разделе "Свободное общение", создана пользователем Surem, 9 июн 2026.

  1. Surem . Пользователь

    Сообщения:
    662
    Симпатии:
    100
    Я нашел простой способ торговать без графика и индикаторов вообще. Как доказательство простоты торговли я отдаю вам открытый код одного из своих индикаторов что делал ранее!

    #property strict
    #property indicator_chart_window

    // ============================================================================
    // CoreLayer_Final.mq4
    // VEPSEF Architecture 2.0 — Core Layer
    // Author: VEPSEF Inside
    // Version: 2.0
    // Date: 01.05.2026
    // ----------------------------------------------------------------------------
    // Назначение:
    // Базовый слой архитектуры VEPSEF. Содержит фундаментальные проверки,
    // защиту границ массивов, защиту ENUM, EMPTY_VALUE, стабильность на любых ТФ,
    // и обеспечивает бинарную валидацию для RLF и верхних слоёв.
    // ============================================================================

    //---------------------------------------------
    // Общие константы и типы
    //---------------------------------------------
    #define CORE_OK 0
    #define CORE_FAIL -1
    #define CORE_BOOL_FAIL false
    #define CORE_BOOL_OK true

    // Специальное значение для "нет индекса"
    #define CORE_NO_INDEX -1

    // Контроль допустимых ENUM через int
    enum ENUM_CORE_BOOL
    {
    CORE_FALSE = 0,
    CORE_TRUE = 1
    };

    //---------------------------------------------
    // Вспомогательные функции логирования
    //---------------------------------------------
    void CoreLog(const string src,const string msg)
    {
    Print("[CORE] ",src,": ",msg);
    }

    void CoreLogError(const string src,const string msg)
    {
    Print("[CORE][ERROR] ",src,": ",msg);
    }

    void CoreLogWarn(const string src,const string msg)
    {
    Print("[CORE][WARN] ",src,": ",msg);
    }

    //---------------------------------------------
    // Проверка границ массивов
    //---------------------------------------------
    bool CoreIsValidIndex(const int index,const int total)
    {
    if(total<=0) return(false);
    if(index<0) return(false);
    if(index>=total) return(false);
    return(true);
    }

    // Универсальная безопасная выборка double из массива
    bool CoreSafeGetDouble(const double &arr[],const int index,double &out_value)
    {
    int total=ArraySize(arr);
    if(!CoreIsValidIndex(index,total))
    {
    CoreLogError("CoreSafeGetDouble",
    "index out of range: index="+IntegerToString(index)+
    " size="+IntegerToString(total));
    return(false);
    }
    out_value=arr[index];
    return(true);
    }

    // Универсальная безопасная запись double в массив
    bool CoreSafeSetDouble(double &arr[],const int index,const double value)
    {
    int total=ArraySize(arr);
    if(!CoreIsValidIndex(index,total))
    {
    CoreLogError("CoreSafeSetDouble",
    "index out of range: index="+IntegerToString(index)+
    " size="+IntegerToString(total));
    return(false);
    }
    arr[index]=value;
    return(true);
    }

    // Аналогичные функции для int
    bool CoreSafeGetInt(const int &arr[],const int index,int &out_value)
    {
    int total=ArraySize(arr);
    if(!CoreIsValidIndex(index,total))
    {
    CoreLogError("CoreSafeGetInt",
    "index out of range: index="+IntegerToString(index)+
    " size="+IntegerToString(total));
    return(false);
    }
    out_value=arr[index];
    return(true);
    }

    bool CoreSafeSetInt(int &arr[],const int index,const int value)
    {
    int total=ArraySize(arr);
    if(!CoreIsValidIndex(index,total))
    {
    CoreLogError("CoreSafeSetInt",
    "index out of range: index="+IntegerToString(index)+
    " size="+IntegerToString(total));
    return(false);
    }
    arr[index]=value;
    return(true);
    }

    //---------------------------------------------
    // EMPTY_VALUE и числовая стабильность
    //---------------------------------------------
    bool CoreIsEmptyValue(const double value)
    {
    return(value==EMPTY_VALUE);
    }

    double CoreToEmptyIfNaN(const double value)
    {
    if(MathIsValidNumber(value)) return(value);
    return(EMPTY_VALUE);
    }

    double CoreSafeDiv(const double num,const double den)
    {
    if(den==0.0)
    {
    CoreLogWarn("CoreSafeDiv","division by zero, return EMPTY_VALUE");
    return(EMPTY_VALUE);
    }
    double r=num/den;
    return(CoreToEmptyIfNaN(r));
    }

    // Нормализация цены под текущий символ
    double CoreNormalizePrice(const double price)
    {
    return(NormalizeDouble(price,_Digits));
    }

    //---------------------------------------------
    // Валидация ENUM через диапазон int
    //---------------------------------------------
    bool CoreIsEnumInRange(const int value,const int min_value,const int max_value)
    {
    if(value<min_value) return(false);
    if(value>max_value) return(false);
    return(true);
    }

    // Валидация таймфрейма через int (без прямой работы с ENUM)
    // Исправление: работаем с int, чтобы не было ошибки конверсии enum.
    bool CoreIsValidTimeframe(const int tf_value)
    {
    int v=tf_value;
    if(!CoreIsEnumInRange(v,(int)PERIOD_M1,(int)PERIOD_MN1))
    return(false);
    return(true);
    }

    //---------------------------------------------
    // Контроль параметров и среды
    //---------------------------------------------
    bool CoreCheckSymbolAndTimeframe()
    {
    if(Symbol()=="" || _Symbol=="")
    {
    CoreLogError("CoreCheckSymbolAndTimeframe","empty symbol");
    return(false);
    }

    // _Period — это int, передаём как int, без enum-конверсий
    if(!CoreIsValidTimeframe(_Period))
    {
    CoreLogError("CoreCheckSymbolAndTimeframe",
    "invalid timeframe: "+IntegerToString(_Period));
    return(false);
    }

    return(true);
    }

    //---------------------------------------------
    // Базовая инициализация ядра
    //---------------------------------------------
    int CoreInit()
    {
    if(!CoreCheckSymbolAndTimeframe())
    {
    CoreLogError("CoreInit","environment check failed");
    return(CORE_FAIL);
    }

    CoreLog("CoreInit","environment OK, core ready");
    return(CORE_OK);
    }

    void CoreDeinit()
    {
    CoreLog("CoreDeinit","core shutdown");
    }

    //---------------------------------------------
    // Публичные точки входа индикатора
    //---------------------------------------------
    int OnInit()
    {
    int r=CoreInit();
    if(r!=CORE_OK)
    {
    CoreLogError("OnInit","CoreInit failed");
    return(INIT_FAILED);
    }
    return(INIT_SUCCEEDED);
    }

    void OnDeinit(const int reason)
    {
    CoreDeinit();
    }

    // Ядро не использует данные, но реализует сигнатуру для совместимости
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    {
    // CoreLayer не производит визуализацию и не модифицирует буферы.
    // Здесь может быть размещена базовая валидация входных массивов,
    // если верхние слои потребуют строгой проверки.
    if(rates_total<=0)
    {
    CoreLogWarn("OnCalculate","rates_total<=0");
    return(0);
    }

    int last_index=rates_total-1;
    if(last_index<0)
    return(0);

    // Никакой логики расчёта — только каркас.
    return(rates_total);
    }

    // ============================================================================
    // End of CoreLayer_Final.mq4
    // ============================================================================

    Конечно я использую нейро, но только я один в мире придумал как правильно использовать нейро даже если её запрещено прогнозировать!!