<b>Это не грааль!!!</b> Идея была: <ul><li>во-первых, сделать полнофункциональный шаблон-машину по обслуживанию выставленных ордеров по нескольким не зависимым стратегиям;</li><li>во-вторых, несколько стратегий работая параллельно и управляемые одним "мозговым центром" могут компенсировать неправильные входы друг друга.</li></ul> <b><i>Это не поиск мифической атрибутики (я про грааль) - это задача создать надёжную, стабильную, гибкую, подстраивающуюся под любые изменения правил (со стороны ДЦ) зарабатывающую систему НАВСЕГДА (пока существует Forex)!</i></b> ^secret^ Наверно, выразился не совсем понятно... Тогда по-порядку. Десяток (но добавить или заменить любую стратегию не проблема) внутри одного советника выставляют свои ордера каждый на своём периоде (TF) (по "своим правилам") со своими Magic-ами. Можно ордера выставлять согласно приоритету: чем больше стратегия заработала, тем больше приоритет. Процесс выставления можно контролировать различными фильтрами, как краткосрочной тенденции, так и долгосрочной. Внутри присоединён блок расчёта тенденции (тренда) по шести (количество настраиваемо) разным индикаторам по шести TF. Работа по расписанию. Можно контролировать количество выставляемых в рынок ордеров по каждой стратегии. Можно контролировать минимальное расстояние между рыночными ордерами, как одной стратегии, так и всех соседних. Можно установить контроль нового бара. Можно задать размерность (лот) и принцип формирования величины лота следующего выставляемого очередного ордера. Для любителей Мартина есть возможность установить коэффициент. Всё это, как отдельно для каждой стратегии, так и совместно. Стопы можно формировать пятью разными вариантами на выбор. Это что касается процесса <i>входа</i> в рынок. Что касается <i>выхода</i>: <ul><li>на выбор несколько вариантов трейлинга;</li><li>БУ;</li><li>на выбор несколько вариантов частичного закрытия (по частям), как по определённым пропорциям, так и по времени;</li><li>динамические стопы;</li><li>трейлинг профита.</li></ul> Работу выхода можно пропускать через "трендовые" фильтры. Ну, и напоследок, работа выхода может контролироваться без модификации стопов ордеров - виртуально. Если не включены виртуальные стопы, а ДЦ раздвигает стандартный STOPLEVEL, то советник автоматически переходит (настройка отключаемая) на виртуальные стопы. "В бою" не боится реквот и организована совместная работа нескольких советников на одном счету. Ведёт детализированный лог (отключаемо). Выводит сводную индикаторную таблицу (отключаемо). Показывает на чарте статистику работы по каждой стратегии (отключаемо). Это из реализованного. Вот такой "конструктор" по добыванию профита! :tatice_06: <b>НАСТРОЙКИ:</b> <!--c1--><div class='codetop'>Код</div><div class='codemain'><!--ec1-->extern string _________TX0________ = "========Общие настройки советника========="; extern int MAGIC = 555; extern string ExpComment = "PSI-Processor"; extern string Lots = "0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1;0.1"; extern double MaxLots = 2.0; // Максимальный размер лота extern bool ShowCommentInChart = True; // Показывать комментарии на графике. extern int ProfitMin = 50; // Уровень минимальной прибыли на MINLOT extern int Popravka = 15; extern string StopLoss = "0,0,0,0,0,0,0,0,0"; extern string TakeProfit = "0,0,0,0,0,0,0,0,0"; extern string VirtualSL = "0,0,0,0,0,0,0,0,0"; // Если StopLoss = 0, а VirtualSL != 0, VariantSTOPS_SL работает для VirtualSL, а если StopLoss != 0, обыкновенный SL выставляется по этому значению extern string VirtualTP = "0,0,0,0,0,0,0,0,0"; extern string MaxYbutok_MinLot = "0,0,0,0,0,0,0,0,0"; // На MINLOT в пп. extern string _________TX1________ = "================STRATEGY================"; // Разные стратегии выставления ордеров extern string TM_Strategy = "0,0,0,30,0,0,0,0,0"; extern string Use_Strategy = "0,0,0,0,0,0,0,0,0"; extern string DisableStopTrade = "0,0,0,0,0,0,0,0,0"; // Возможность остановить выставление ордеров в отдельно взятой стратегии extern string Use_CheckNewBars = "0,0,0,0,0,0,0,0,0"; // На одном баре выставляется только один ордер extern string Use_CheckArea = "0,0,0,0,0,0,0,0,0"; // Контроль зоны выставления следующего ордера extern int Area = 20; // Расстояние в пп. до следующего ордера extern string MaxOrders = "10,1,1,1,1,1,1,1,1"; // Макс. кол-во ордеров по в одной стратегии extern bool Use_Prioritet = true; // Контроль очерёдности выставления следующего ордера extern int PeriodPrioritet = 30; // Количество дней за которые рассчитывается приоритет extern string _____Fortrader______ = "=========Стратегия(1)========="; extern int Otstup = 10; extern int CountUPBars = 3; // Настройка паттерна, кол-во баров extern int CountDWBars = 3; // Настройка паттерна, кол-во баров extern string _______Farhad_______ = "=========Farhad(2)=========="; // Price : 0=close, 1=open, 2=high, 3=low, 4=median((h+l/2)), 5=typical((h+l+c)/3), 6=weighted((h+l+c+c)/4) // Mode : 0=sma, 1=ema, 2=smma, 3=lwma, 4=LSMA extern bool UseMACD = true; extern int MACD_Price = 1; extern bool UseMA_Cross = false; extern int MA_SlowPeriod = 21; extern int MA_FastPeriod = 2; extern int MA_Shift = 1; extern int MA_Mode = 2; extern int MA_Price = 5; extern bool UseMomentum = true; extern bool UsePSAR = true; extern int MomentumPeriod = 14; extern int MomentumPrice = 1; extern double MomentumHigh = 100; extern double MomentumLow = 100; extern bool UseStochLevel = true; extern int Stoch_Mode = 0; extern int StochPrice = 0; // 0, 1 extern double StochHigh = 60; extern double StochLow = 35; extern bool UseStochCross = false; extern int SignalCandle = 0; extern int SignalTimeFrame = 0; extern bool CloseSwingSygnal_F = true; // Закрывать ордер по обратному сигналу extern string ____ProfitGarant____ = "======Стратегия(3)====="; extern bool CloseSwingSygnal = true; // Закрывать ордер по обратному сигналу extern string _____PatternMTF_____ = "=========Стратегия(4)========"; extern int Cena_PMTF = 1; // Цена: 1 - открытия; 2 - закрытия; 3 - максимум; 4 - минимум; 5 - (H+L)/2; 6 - (H+L+C)/3; 0 - (H+L+C+O)/4; extern int CountBars = 7; extern int MinCandle = 15; // Минимальная величина свечи в пп. extern double Koef = 2.0; extern int Otkat = 10; extern bool ReversSygnal = false; // Открывать ордер по обратному сигналу extern bool SendSwingSygnal = false; // Открывать ордер по обратному сигналу extern string ______Pipsator______ = "=========Стратегия(5)========="; extern int ShiftBars_PiP = 5; // Сдвиг баров extern string ____CandlesStar_____ = "=======Стратегия(6)========"; extern int Porog_CS = 30; // Подтверждение тенденции свечной комбинации extern bool flat = false; extern bool Bear = true; extern bool Bull = true; extern bool TMc = true; extern bool TMhl = false; extern string _______Star3________ = "==========Стратегия(7)==========="; extern int Porog_S3 = 10; // Подтверждение тенденции свечной комбинации extern string _______3_sve4i______ = "=========Стратегия(8)=========="; extern int NCandles = 3; // Количество просчитываемых свечей extern string _____Perceptron_____ = "=======Стратегия(9)========="; extern int x1 = 120; extern int x2 = 172; extern int x3 = 39; extern int x4 = 172; extern double Per_BUY = 20.0; extern double Per_Close_BUY = -5.0; extern double Per_SELL = -20.0; extern double Per_Close_SELL = 5.0; extern string PerceptronBars = "1,3,5,10,15"; extern string _______Better_______ = "=========Стратегия(10)=========="; extern int Warp = 67; // -100 - 100: D=1 extern double Deviation = 1.85; // 0 - 2: D=0.01 extern int Amplitude = 155; // 0 - 200: D=1 extern double Distortion = 0.79; // -1 - 1: D=0.01 extern double Dir_BUY = 20.0; extern double Dir_Close_BUY = -5.0; extern double Dir_SELL = -20.0; extern double Dir_Close_SELL = 5.0; extern string DirectionBars = "1,3,5,10"; extern string _________TX2________ = "***Настройки контроля тренда***"; extern string ControlTrend_Short = "0,0,0,0,0,0,0,0,1"; // 0-без контроля, 1-с контролем VariantCTRL_Short extern string ControlTrend_Long = "0,0,0,0,0,0,0,0,0"; extern string VariantCTRL_Short = "1,1,1,1,1,1,1,1,8"; // 0-без контроля, до 8 // 0: регулируемый контроль отсутствует // 1: по 2 MA // 2: по 3 MA // 3: по тенденции open\close последних ExCountPeriod свечей // 4: по показаниям библиотеки индикаторов b-IndTrend Trend Short // 5: по показаниям библиотеки индикаторов b-IndTrend ACC_short // 6: по показаниям библиотеки индикаторов b-IndTrend Trend Short && ACC_short // 7: по свечным уровням // 8: по CCI extern string ________TX21________ = "Настройки MA для 1/2-го вариантов:"; extern int MA1TF = 1440; extern int MA1Period = 20; extern int MA2TF = 1440; extern int MA2Period = 80; extern string ________TX23________ = "Настройки для 3-го варианта:"; extern string ExCountPeriod = "5,5,5,5,5,5,5,5,5"; // Для варианта 3. Количество просчитываемых баров extern string ________TX27________ = "Настройки для 7-го варианта:"; extern int HighBar = 50; // сколько баров будет просматриваться, для поиска наибольшего значения Хая фильтр extern int LowBar = 50; // сколько баров будет просматриваться, для поиска наименьшего значения Лоу фильтр extern int Zone = 20; // зона расстояние в пунктах от хая и лоу фильтр extern string ________TX28________ = "Настройки для 8-го варианта:"; extern int CCIper = 10; // Period усреднения для вычисления индикатора CCI extern int CCIlev = 50; // extern string ________EXIT________ = "**********ВЫХОД с рынка**********"; // Ступенчатое закрытие ордеров extern string VariantExit = "0,0,0,0,0,0,0,0,0"; // 0: регулируемый выход отсутствует // 1: ActivePosManagerCloser() - 1/2 закрытия на LevelOne, и окончательное закрытие на LevelTwo // 2: ActivePosManagerCloserDP() - ступенчатое закрытие на каждом 1\4 промежутке до TP // 3: ActivePosManagerDP2() - ступенчатое закрытие по MA // 4: fTimeOpenedProtection() - закрытие ордеров по времени жизни и маленькому профиту для пипсовки // 5: PartClose() - ступенчатое закрытие по заданным параметрам extern string ______1вариант______ = "Настройки для 1-го варианта:"; extern int LevelOne = 30; extern int LevelTwo = 100; extern string ______2вариант______ = "Настройки MA для 3-го варианта:"; extern int perema1 = 7; extern int perema2 = 21; extern int persma3 = 98; extern int perema4 = 365; extern string ______4вариант______ = "Настройки для 4-го варианта:"; extern int LimitTime_1 = 60; extern int LimitTime_2 = 140; extern int LimitTime_3 = 170; extern int LimitTime_4 = 200; extern int LimitTime_5 = 240; extern int pips_1 = 50; extern int pips_2 = 40; extern int pips_3 = 30; extern int pips_4 = 20; // Размер убытка до LimitTime_5 extern int pips_5 = 40; // Размер убытка после LimitTime_5 extern string ______5вариант______ = "Настройки для 5-го варианта:"; extern string LevelClose = "10/20/5"; // Уровни закрытия. Например, при параметрах 10/20/5 первое закрытие выполняется при достижении ордером прибыли в 10 пунктов, затем еще через 20 пунктов и еще через 5 пунктов. extern string PercentClose = "50/25/25"; // Процент закрытия (через разделитель "/") для соответствующего уровня. Здесь отсчет идет от лота первого ордера. Если исходный ордер открыт с лотом 1.0 лот, закрывается 50% - 0.5, затем 25% от 1.0 - 0.3 и наконец 0.2 extern string ________JUMP________ = "Настройки для JUMP:"; // Резкое движение цены в противоположную сторону extern string Use_JumpExit = "0,0,0,0,0,0,0,0,0"; extern int Jump = 20; // Резкое изменение цены в пп.\мин. extern string _________TX3________ = "******Управление профитом******"; extern string BULevel = "0,0,0,0,0,0,0,0,0"; // Уровень срабатывания БУ (с перемещением SL) extern string BUSize = "0,0,0,0,0,0,0,0,0"; // Величина перемещения SL extern string VBU_Start = "0,0,0,0,0,0,0,0,0"; // Виртуальный БезУбыток extern string VBU_Value = "5,5,5,5,5,5,5,5,5"; extern string _______TRAILING_____ = "***********TRAILING************"; // Чтобы работал Trailing до OrderProfit() < 0 - SL и TP обязательно != 0 extern string MethodTraillingStop = "0,0,0,0,0,0,0,0,0"; // Метод трейлинга 0-4 // 0: Трейлинг не используется // 1: Простой (Simple) трейлинг // 2: SarTrailingStop по Parabolic // 3: ATRTrailingStop по ATR // 4: DinamicTrailing от ширины экстремумов на TF // 5: по Price Channel (индикатор) extern bool TSOnlySL = True; // Тралить только SL extern bool AllowLossSL = True; // Тралить SL на LOSS-участке extern bool AllowLossTP = False; // Тралить TP на LOSS-участке extern string _______SIMPLE_______ = "Настройки Simple Trailing"; extern string TrailingStop = "0,0,0,0,0,0,0,0,0"; extern string TrailingShag = "5,5,5,5,5,5,5,5,5"; extern string UseVirtualTrailing = "0,0,0,0,0,0,0,0,0"; // Trailing будет работать без модификации стопов у ордеров extern string ______KillLoss______ = "Настройки KillLoss"; extern string Use_KillLoss = "0,0,0,0,0,0,0,0,0"; // Использование антилоссового трала extern string SpeedCoeff = "0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5"; extern string ________SAR_________ = "Настройки SAR"; extern int SAR_TF = 1; // Таймфрейм: 0-текущий на графике; 1-TF стратегии extern double SARstep = 0.005; extern double SARmax = 0.02; extern string ________ATR_________ = "Настройки ATR"; extern int ATR_TF = 1; // Таймфрейм: 0-текущий на графике; 1-TF стратегии extern int ATR_Period = 9; // Период усреднения extern double Fast_ATR_Trailing = 1.0; extern double ATR_Trailing = 2.0; extern string _______Pr_Ch________ = "Настройки Price Channel"; extern int PrCh_ChannelPeriod = 240; extern int PrCh_Shift = 0; extern string ___TrailingProfit___ = "Настройки TrailingProfit"; extern string Use_TrailingProfit = "0,0,0,0,0,0,0,0,0"; extern int TP_Start = 150; // Размер профита при котором начинает работать TrailingProfit extern int TP_Value = 100; // Размер откатного движения при котором закроются все ордера extern string _________TX4________ = "******Управление СТОПАМИ*******"; extern string VariantSTOPS_SL = "0,0,0,0,0,0,0,0,0"; extern string VariantSTOPS_TP = "0,0,0,0,0,0,0,0,0"; extern bool ControlMINStops = False; // Если ДЦ раздвигает (увеличивает) стопы, советник переходит на виртуальные стопы // 0: согласно заданному значению в пипсах, или по минимально разрешённому STOPLEVEL // 1: по max\min предыдущего или текущего дня плюс поправка, или по минимально разрешённому STOPLEVEL // 2: по max\min предыдущего часа плюс поправка, или по минимально разрешённому STOPLEVEL // 3: вычисляется динамически по max\min последних StopLossBars\TakeProfitBars баров плюс поправка, или по минимально разрешённому STOPLEVEL // 4: вычисляется динамически по среднему размеру последних StopLossBars\TakeProfitBars баров плюс поправка // для 3-4 вариантов StopLossBars\TakeProfitBars != 0 !!! // 5: вычисляется динамически по индикатору Waddah_Attar_Hidden_Level // 6: вычисляется динамически по индикатору AvalsLevels extern string StopLossBars = "0,0,0,0,0,0,0,0,0"; extern string TakeProfitBars = "0,0,0,0,0,0,0,0,0"; extern string UseDinamicVirtualSL = "0,0,0,0,0,0,0,0,0"; // Чтобы работал DinamicVirtualSL, нужно чтобы VirtualSL > 0 extern string UseDinamicVirtualTP = "0,0,0,0,0,0,0,0,0"; extern int DinVirtSTOPS_Period = 0; // Period обновления стопов: 0-текущий на графике; 1-TF стратегии extern string SpecialConditions = "0,0,0,0,0,0,0,0,0"; // Специальные условия для срабатывания виртуальных стопов и MaxUbutok // 0: без условий // 1: слежение за состоянием Trend_Long // 2: слежение за состоянием Trend_Short // 3: слежение за состоянием Trend_Long и свечного индикатора extern string SpecCondFOR = "0,0,0,0,0,0,0,0,0"; // Специальные условия срабатывания для: // 0: для виртуальных стопов, MaxUbutok и PartitionExit (ступенчатое закрытие ордеров) // 1: для MaxUbutok и PartitionExit (ступенчатое закрытие ордеров) // 2: для виртуальных стопов и MaxUbutok // 3: PartitionExit (ступенчатое закрытие ордеров) extern string ____SetupVirtLine___ = "*******Setup Virtual Line********"; extern bool CreatVirtualObject = False; // Показывать на графике линии виртуальных стопов extern bool ShowTextForObject = False; // Показывать на графике подписи для линий виртуальных стопов extern int VertSdvigText = 5; // Вертикальный сдвиг текста extern color ColorLineBU = Gold; // Цвет линий БУ extern color ColorLineSL = Magenta; // Цвет линий SL extern color ColorLineTP = RoyalBlue; // Цвет линий TP extern color ColorLineMaxUbutok = Chartreuse; // Цвет линий MaxUbutok extern string ________TX5_________ = "********Money Management*********"; extern int StopMarginPercent = 50; // Процент свободной маржи от Баланса при котором новые ордера не выставляются extern int RiskDepoPercent = 50; // При каком лоссе от Depo закрываются все ордера extern string VariantFormationLot = "0,0,0,0,0,0,0,0,0"; // Вариант формирования размера лота // 0: с приростом прибыли по стратегии на PipsDeltaDepo увеличивается лот на MINLOT // 1: Martingale // 2: с приращением к каждому последующему открываемому ордеру MINLOT // default: MINLOT extern string ________0вар________ = "Настройки для 0-го варианта:"; extern double PipsDeltaDepo = 1000.0; // Прирост прибыли по стратегии для увеличения лота на MINLOT extern string ________1вар________ = "Настройки для 1-го варианта:"; extern double KoefM = 1.67; // Коэффициент Martin'a extern string OnlyWay = "0,0,0,0,0,0,0,0,0"; // 0-выставлять ордера в обоих направлениях; 1-только доливка к первоначальному ордеру<!--c2--></div><!--ec2--> Предлагаю эту игрушку для "любителей" поэкспериментировать в тестере (<b>за "удачную" оптимизацию отблагодарю рабочей версией</b>). Хочу оговориться, что стандартным методом через тестер терминала советник не оптимизируется (только тестовый проход), так как внешние переменные (большинство) имеют тип string. Выслушаю интересные идеи и конструктивную критику. Желающим посплетничать и поспорить ничего не доказываю и разговор не поддерживаю - нет времени на это. Свой интерес Вы можете проявить через личку и, подтверив совсем не значительной суммой в 6$, получите на мыло Демо-версию этой игрушки! P.S. Работа с пятью знаками предусматривалась, но не тестировалась!!!
Взял гуляющий по Интернету Perceptron, немножко его подправил: ввёл уровни выставления и удаления ордеров, максимальное количество ордеров поставил 2, лот увеличивающийся по Мартину, ограничил убыток 10% от депозита, расстояние м\у ордерами поставил 15 пп. Немножко поковырял фильтра (по наитию). Включил TrailingProfit с маленьким диапозоном (40\25) и запустил с начала года на USDJPY. Результат в прикреплённом файле. ^secret^ Теперь в советнике 11 стратегий: пара нейросетевых, пара "пипсовок", несколько по свечным комбинациям, одна по системе Элдера, остальные по оригинальным (из Инета) правилам. P.S. Чтобы десять раз не повторяться: Запускать гулять в свободное плавание по Интернету результаты полугодового труда у меня нет желания. Продавать тоже не планирую - "такая корова" нужна самому. Пока занимаюсь реализацией "идей напоследок" не откажусь от сторонней помощи по оптимизации. Потом оптимизацией займусь потихонечку сам и в помощи со стороны надобность отпадёт... ^edkk^