| НЕВАЛЯШКА. Что за зверь такой? |
Всем доброго.
Руслан по фамилии ruslan71 предложил обсосать, доставшийся ему советник. Говорят, писанный на какой-то конкурс.Мабудь врут.
Самому обсасывать грустно, поэтому Вы и увидели эту страницу.
Идея советника проста для понимания и формализации.
Суть:
открыли стартовым лотом покупки или продажи (орёл-решка) со своими SL и ТР.
Достигнув чего ни будь, ордер закрывается.
Закрылся в профит — открываем тем же лотом и в ту же степь.
Закрылся с убытком -встречный ордер удвоенным лотом.
Это по классике. Вернее по классике ордера не закрываются по SL. Вместо этого открывается встречный ордер удвоенным лотом. Как вариант — можно рассмотреть.
В предъявленном советнике сделан первый шаг по сокращению залоговых средств, практически, с сохранением прибыльности.
Но и такой алгоритм, по идее, сливной. Сольёт на первом же продолжительном «флэте». А так — зверюга ещё тот. Потискать охота.
Как обычно, приветствуется участие в обсуждении и доработке советника.
На начальном этапе информация будет открыта для всех, а на этапе создания защиты от слива — уйдёт в приват. Есть мыслишки.
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!
Комментарии (25)
С разрешения Руслана выкладываю его для обсуждения.
8 kvashnin007 Автор Сообщений: 757 - Андрей
<code>#property strict //--- input parameters enum MODE { Buy = 0, // Покупка Sell = 1, // Продажа Candle = 2 // По свече }; //--- input MODE ModeFirstTrade = Buy; // Тип первой сделки input double StartLot = 0.02; // Лот базовый input int StopLoss = 372; // Потери в пунктах input int TakeProfit = 354; // Прибыль в пунктах input double LotK = 2.2; // Коэф. увеличения лота input int Slippage = 30; // Slippage input int MagicNumber = 1961; // Magic Number //--- int LastCloseType; double LastCloseLot; double LastCloseProfit; double tp,sl,Lot; bool Trade = false; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { tp = NormalizeDouble(TakeProfit*Point,Digits); sl = NormalizeDouble(StopLoss*Point,Digits); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int b=0,s=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) b++; if(OrderType()==OP_SELL) s++; } //--- LastCloseType=-1; datetime CloseTime=0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); LastCloseType = OrderType(); LastCloseLot = OrderLots(); LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap(); } //--------------- Открытие самого первого ордера -------------------------------- if(Trade==false) // Торговля советником не начата if(s+b==0 && LastCloseType==-1) // Нет и не открывались ордера { if(ModeFirstTrade == Buy) { int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Sell) { int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Candle) { } } //--------------- Открытие последующих ордеров ---------------------------- if(LastCloseProfit>0 && s+b==0) { Lot = StartLot; if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //---------------------------- if(LastCloseProfit<0 && s+b==0) { Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2); if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //--------------- Установка ТР и SL ---------------------------- for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { double oop = OrderOpenPrice(); if(OrderType()==OP_BUY) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); if(OrderType()==OP_SELL) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); } } //------------------------------------------------------------------------------- </code>8 kvashnin007 Автор Сообщений: 757 - Андрей
8 kvashnin007 Автор Сообщений: 757 - Андрей
SL и ТР как бы дают шаг сетки. С фиксированными шагами туда сюда.
1. Надо подбирать такой вариант, где бы SL был бы меньше ТР. Если научимся бороться с флетами, Это снизит просадку и даст прирост дэпо.
2. Видится вариант — SL и ТР брать коэффициентом от ATR какого-то периода.
При этом пункт №1 не теряет актуальность.
3. Ещё интересен на пробу вариант открывать сделки по какому ни будь индюку. Редактирован: 4 июля 2022, 20:33
8 kvashnin007 Автор Сообщений: 757 - Андрей
С привязкой выглядит хуже.
Этот факт говорит о плохой повторяемости результатов.
Тобишь, сдвинув период времени тестирования хоть на неделю, с огромной вероятностью сова сольёт.
Попробую применить правило сейфа. А вдруг? Редактирован: 5 июля 2022, 20:09
8 kvashnin007 Автор Сообщений: 757 - Андрей
<code>#property strict //--- input parameters enum MODE { Buy = 0, // Покупка Sell = 1, // Продажа Candle = 2 // По свече }; //--- input bool BU_ON = true; input MODE ModeFirstTrade = Buy; // Тип первой сделки input double StartLot = 0.02; // Лот базовый input int StopLoss = 372; // Потери в пунктах input int TakeProfit = 354; // Прибыль в пунктах input double LotK = 2.2; // Коэф. увеличения лота input int Slippage = 30; // Slippage input int MagicNumber = 1961; // Magic Number //--- int LastCloseType; double LastCloseLot; double LastCloseProfit; double tp,sl,Lot; bool Trade = false; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { tp = NormalizeDouble(TakeProfit*Point,Digits); sl = NormalizeDouble(StopLoss*Point,Digits); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int b=0,s=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) b++; if(OrderType()==OP_SELL) s++; } //--- LastCloseType=-1; datetime CloseTime=0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); LastCloseType = OrderType(); LastCloseLot = OrderLots(); LastCloseProfit = OrderProfit() + OrderCommission() + OrderSwap(); } //--------------- Открытие самого первого ордера -------------------------------- if(Trade==false) // Торговля советником не начата if(s+b==0 && LastCloseType==-1) // Нет и не открывались ордера { if(ModeFirstTrade == Buy) { int ticket=OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Sell) { int ticket=OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } else Trade = true; } //--- if(ModeFirstTrade == Candle) { } } //--------------- Открытие последующих ордеров ---------------------------- if(LastCloseProfit>0 && s+b==0) { Lot = StartLot; if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //---------------------------- if(LastCloseProfit<0 && s+b==0) { Lot = NormalizeDouble(MathCeil(LastCloseLot*100*LotK/100),2); if(LastCloseType==OP_BUY) { int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } if(LastCloseType==OP_SELL) { int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0," ",MagicNumber,0,clrRed); if(ticket<0) { Print("Order Send завершилась с ошибкой #",GetLastError()); return; } } } //--------------- Расчет ТР и SL ------------------------------- double StopLvl = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point,Digits); sl = NormalizeDouble(StopLoss*Point,Digits); if(sl<StopLvl) sl=StopLvl; tp = NormalizeDouble(TakeProfit*Point,Digits); if(tp<StopLvl) tp=StopLvl; //--------------- Установка ТР и SL ---------------------------- for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { double oop = OrderOpenPrice(); if(OrderType()==OP_BUY) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop-sl,Digits),NormalizeDouble(oop+tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); if(OrderType()==OP_SELL) if(OrderStopLoss()==0 || OrderTakeProfit()==0) if(!OrderModify(OrderTicket(),oop,NormalizeDouble(oop+sl,Digits),NormalizeDouble(oop-tp,Digits),0,clrBlue)) Print("Order Modify error #",GetLastError()); } if(BU_ON) BU(); } //------------------------------------------------------------------------------- bool BU() { for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { double sl_min = MarketInfo(Symbol(), MODE_STOPLEVEL)*Point, TP = OrderTakeProfit(), op = OrderOpenPrice(), lt = OrderLots(); double _lt = NormalizeDouble(lt/2,2); // if (_lt==0) break; double LevelBU = MathAbs(op-TP); if(OrderType()==OP_BUY && Ask >= op+LevelBU/2*Point) if(OrderModify(OrderTicket(),op,NormalizeDouble(Ask-sl_min,Digits),OrderTakeProfit(),0,clrNONE)) if(!OrderClose(OrderTicket(),_lt,Bid,Slippage)) Sleep(500); //--- if(OrderType()==OP_SELL && Bid <= op-LevelBU/2*Point) if(OrderModify(OrderTicket(),op,NormalizeDouble(Bid+sl_min,Digits),OrderTakeProfit(),0,clrNONE)) if(!OrderClose(OrderTicket(),_lt,Ask,Slippage)) Sleep(500); } return true; } //------------------------------------------------------------------------------- </code>8 kvashnin007 Автор Сообщений: 757 - Андрей
8 kvashnin007 Автор Сообщений: 757 - Андрей
Видимо Значения SL и ТР часто меньше стоплевела и поэтому не отрабатывают, как задумывалось. Вижу только один вариант(последний) уйти в виртуальные SL-ТР.
Потом попробую. Пока спать. Редактирован: 5 июля 2022, 22:53
8 kvashnin007 Автор Сообщений: 757 - Андрей
А пока кардинально повлиять на алгоритм не удалось.
Думаю надо
1. пробовать поработать по свечам.
2. привязаться к какому-то индюку.
Теперь точно спать. Редактирован: 6 июля 2022, 08:07
8 kvashnin007 Автор Сообщений: 757 - Андрей
11 preasto Сообщений: 445
Например, коэффициенты для SL и ТР от ATR в моих тестах показали плохие результаты. Но я ещё ТОТ тестер. Может надо было дойти до М1?
Советник этот выложен тут последним. Никто не написал ничего по этому поводу. Даже не пробовали тестировать. Все ждут когда я сломаюсь.
Да ради бога. Я это сделал. Теперь работаю исключительно для себя.
Буду по мере продвижения выкладывать здесь закрытые ограниченные файлы продвижения. Может ничего и не выйдет толкового.
8 kvashnin007 Автор Сообщений: 757 - Андрей
5 cesar781 Сообщений: 43
8 kvashnin007 Автор Сообщений: 757 - Андрей
20 Boris54 Сообщений: 827 - ПенSионер
С усреднителями-мартышками не работает. А с любым другим советником при SL торгуем по направлению алгоритма советника, но удваиваем лот от нормы.
Поле не паханное. К половине советников можно приложить. Редактирован: 8 июля 2022, 21:49
8 kvashnin007 Автор Сообщений: 757 - Андрей
Хотя далёк от мысли, что это даст результат.
Если бы тестирующие давали обратную связь, что такое хорошо, что такое плохо!!!
А лично моих мощностей не хватает, чтобы протестировать всё и сразу.
Не… пенсию просчитал быстро и без ошибок. Так что Надежда Ивановна есть.
Это последний открытый код. Далее ухожу в подполье. Там бочонок с вином.
8 kvashnin007 Автор Сообщений: 757 - Андрей
8 kvashnin007 Автор Сообщений: 757 - Андрей
8 kvashnin007 Автор Сообщений: 757 - Андрей
Нифига себе солянка. Тестирование мне на годы.
8 kvashnin007 Автор Сообщений: 757 - Андрей
Ссылка для скачивания кому интересно disk.yandex.ru/d/XzsD7COzDjC5Ug
Это за месяц. Сильно не настраивал, но видно, что советник проседает во флете.
Дальше займусь переходом к сигналам индюка и защитой от просадки. Редактирован: 9 июля 2022, 22:41
8 kvashnin007 Автор Сообщений: 757 - Андрей
8 kvashnin007 Автор Сообщений: 757 - Андрей
<code>// -------------------------------------------------------- bool ValidLot(double volume)// Проверка лота на валидность { //--- минимально допустимый объем для торговых операций double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(volume<min_volume) return(false); //--- максимально допустимый объем для торговых операций double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); if(volume>max_volume) return(false); //--- получим минимальную градацию объема double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); int ratio=(int)MathRound(volume/volume_step); if(MathAbs(ratio*volume_step-volume)>0.0000001) return(false); return(true); } //--------------------------------------------------------------- double NTP(int dir, double _op) // Нормализация цены тейкпрофита { if (TakeProfit==0) return 0; double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point; double pr=NP((dir==OP_BUY)?Bid:Ask); if (dir==OP_BUY) { tp=_op+TakeProfit*Point; return NP(MathMax(tp, pr+StopLvl)); } if (dir==OP_SELL) { tp=_op-TakeProfit*Point; return NP(MathMin(tp, pr-StopLvl)); } return 0; } //--------------------------------------------------------------- double NSL(int dir, double _op) // Нормализация цены стоплоса { if (StopLoss==0) return 0; double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point; double pr=NP((dir==OP_BUY)?Bid:Ask); if (dir==OP_BUY) { sl=_op-StopLoss*Point; return NP(MathMin(sl, pr-StopLvl)); } if (dir==OP_SELL) { sl=_op+StopLoss*Point; return NP(MathMax(sl, pr+StopLvl)); } return 0; } //--------------------------------------------------------------- double ND(double d, int n=-1) { if (n<0) return NormalizeDouble(d, Digits); return NormalizeDouble(d, n); } //--------------------------------------------------------------- double NP(double d) { double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); if (TickSize==0) TickSize=1; return ND(MathRound(d/TickSize)*TickSize); } //--------------------------------------------------------------- </code>За месяц, как обычно. При PointOrderStep=0 работает как обычная неваляшка, но с учетом закрытия бара. Не лучший вариант. Редактирован: 2 августа 2022, 16:28
8 kvashnin007 Автор Сообщений: 757 - Андрей
20 Boris54 Сообщений: 827 - ПенSионер
АТR брал за последние свечи, довольно свежие данные, но это не критично.
Подгонка под приемлемые величины у меня ограничена диапазоном и шагом как на картинке.
8 kvashnin007 Автор Сообщений: 757 - Андрей
А вообще то я ожидал большего эффекта от своих потуг. Помощи мало, а сам быстро нахожу признаки бесперспективности. Хотя часто ошибаюсь с выводами. Редактирован: 5 августа 2022, 15:45
8 kvashnin007 Автор Сообщений: 757 - Андрей
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий