Я нашел простой способ торговать без графика и индикаторов вообще. Как доказательство простоты торговли я отдаю вам открытый код одного из своих индикаторов что делал ранее! #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 // ============================================================================ Конечно я использую нейро, но только я один в мире придумал как правильно использовать нейро даже если её запрещено прогнозировать!!