Название советника: Stop_and_Go Обоснование: Каждый трейдер ставит для себя точку "невозврата" или начала пути, концентрация данных точек в узком диапазоне приводит к формированию уровней поддержки и сопротивления. Данный советник предназначен для работы с уровнями поддержки и сопротивления. В связи с тем, что уровнем является не конкретная точка - линия, а узкий диапазон цен, то необходимо определить условия прохождения этих уровней для принятия окончательного решения. При скоплении узких диапазонов цен образуется широкий уровень - что является причиной ложного пробоя - установить ширину этого канала затруднительно, поэтому советник будет продолжать открытие и закрытие ордеров по повторяющимся сигналам. Советник сможет работать по отдельному диапазону цен для ордеров на покупку и для ордеров на продажу. Уровни будут определяется советником по названию Horizontal Line. Советник должен показывать, сколько попыток осталось для преодоления уровни поддержки/сопротивления и с какой размер лота будет открыт следующим Настройки советника: extern string text1 = "1.0 Для ордеров на покупку"; extern int Border_Buy_Center="Border_Buy"; // Название уровеня на графике Horizontal Line для расчета ширины диапазона цен - ширины бордбра, за которой открывается ордер на покупку. extern int Border_Buy_Up=100;// Верхняя граница ширины бордюра для открытия ордеров на покупку в пунктах extern int Border_Buy_Down=100;// Нижняя граница ширины бордюра для открытия ордеров на покупку в пунктах extern int Uslovie_Open_Buy=1;// 0 - не открывать ордера; 1 - открывать ордера, если цена открылась за бордюром "Border_Buy_Up_Point"; 2 - открывать ордера, если цена открылась на прошлом баре за бордюром "Border_Buy_Up" и Low[1]>Border_Buy_Up_Point extern int Uslovie_Close_Buy=1;// 0 - не закрывать ордера; 1 - закрывать ордера, если цена открылась за бордюром "Border_Buy_Down_Point"; 2 - закрывать ордера, если цена открылась на прошлом баре за бордюром "Border_Buy_Down" и High[1]Border_Sell_Up_Point extern int N_Life_Sell=3;// количество попыткок для открытия ордера на попкупку при проходлении бордюра - необходимо ограничить для предотвращения потерь в случае не верного уровня и флета extern int Use_Shot_Sell=100;//0 - не использовать, если значение больше 0, то опрделяем точку Shot_Sell_Point равную Border_Sell_Center и тейк профит Border_Sell_Center_Point-Use_Shot_Sell*Point, а закрытие происходит по правилам для всех остальных ордеров extern int Potencial_Sell=300;// Проверка на ближайшее сопротивление по индикатору iMA или пользовательскому индикатору, если 0, то не используем extern int Target_Sell=500;// Количество пунктов от цены открытия для расчета тейк профита extern string text4 = "2.1 Настройка средней скользящей и отступа для нижнего конверта"; //maL – среднее скользящее: extern int pipsL=1800; //Отступ от maL extern int TFL=0;//тайм фрейм L extern int pMAL=128;//период L средней extern int priceMAL=0;//цена L средней extern int typeMAL=0;//метод L средней extern int shiftMAL=0;//сдвиг L средней extern string text5 = "3.0 Настройки лота и тактики"; extern int MagicAll=0;// 1 - закрывать все ордера по данной валютной паре; 0 - закрывать и закрыввать ордера только с указанным маджиком - Magic extern int Magic=1215;// маджик ордеров советника extern double Lot_Size=0.01;//размер первоначального лота extern int Lot_M=0;// 0 - всегда использовать размер лота из Lot_Size, 1 - каждый новый лот увеличивается на размер первичного лота, 2 - каждый лот увеличивается на сумму предыдущих лотов + начальный лот, 3 - см. описание ниже, 4 - см. описание ниже UseTime=1;// 0 - всегда работает советник, 1 - советник работает только в указанный промежуток времени по данным сервера ДЦ TimeStart=ГГГГ.ММ.ДД.ЧЧ.ММ; //время начала работы советника TimeStop=ГГГГ.ММ.ДД.ЧЧ.ММ; //время окончания работы советника Алгоритм: Для ордеров на покупку: Border_Buy_Center_Point - запрашиваем точку с линии Horizontal Line, название которой указано в переменной Border_Buy_Center Border_Buy_Up_Point=Border_Buy_Center_Point+Border_Buy_Up*Point Border_Buy_Down_Point=Border_Buy_Center_Point-Border_Buy_Down*Point N_Life_Buy_N - сколько ордеров ещё можно открыть за сутки Если Potencial_Buy>0, то maH=iMA(_Symbol, TFH, pMAH, shiftMAH, typeMAH, priceMAH, index) + pipsH*Point && Potencial_Buy_Ok=1, иначе Potencial_Buy_Ok=0 Если Potencial_Buy=<0 Potencial_Buy_Ok=1 Target_Buy_Point=Open[0]+Target_Buy*Point - тейк профит для ордеров, открываемых при приодалении Border_Buy_Up_Point Если Uslovie_Open_Buy==1 && Open[0]>Border_Buy_UP_Point && N_Life_BuyBorder_Buy_UP_Point && Low[1]>Border_Buy_Up_Point && N_Life_Buy0, то Use_Shot_Sell_Point=Border_Buy_Center_Point-Use_Shot_Buy*Point результат используем как тейк профит и открываем отложку на продажу по Border_Buy_Center_Point, размер лота по Lot_Size Для ордеров на продажу: Border_Sell_Center_Point - запрашиваем точку с линии Horizontal Line, название которой указано в переменной Border_Buy_Center Border_Sell_Up_Point=Border_Sell_Center_Point+Border_Sell_Up*Point Border_Sell_Down_Point=Border_Sell_Center_Point-Border_Sell_Down*Point N_Life_Sell сколько ордеров ещё можно открыть за сутки Если Potencial_Sell>0, то maL=iMA(_Symbol, TFL, pMAL, shiftMAL, typeMAL, priceMAL, index) - pipsL*Point && Potencial_Sell_Ok=1, иначе Potencial_Sell_Ok=0 Если Potencial_Sell=<0 Potencial_Sell_Ok=1 Target_Sell_Point=Open[0]-Target_Sell*Point - тейк профит для ордеров, открываемых при приодалении Border_Sell_Down_Point Если Uslovie_Open_Sell==1 && Open[0]Border_Sell_Up_Point, то закрываем ордер на продажу Если Uslovie_Close_Sell==2 && Open[0]0, то Use_Shot_Sell_Point=Border_Sell_Center_Point+Use_Shot_Sell*Point результат используем как тейк профит и открываем отложку на покупку по Border_Sell_Center_Point, размер лота по Lot_Size Для ордеров на покупку и ордеров на продажу: Если MagicAll=1 && Uslovie_Close_Buy!=0, то закрываем все ордера на покупку, иначе закрываем ордера только с маджиком советника - Magic Если MagicAll=1 && Uslovie_Close_Sell!=0, то закрываем все ордера на продажу, иначе закрываем ордера только с маджиком советника - Magic Если ордер открыт на покупку, то N_Life_Buy++ (информацию, конечно лучше запрашивать из истории...) Если ордер открыт на продажу, то N_Life_Sell-- (информацию, конечно лучше запрашивать из истории...) Расчет размера лота: lotM=0;//вариант изменения размера лота при повторном открытии ордера одного вида (на покупку или продажу) до достижения maT (до начала нового цикла) Советник позволяет использовать следующие варианты увеличения лота в отложенных ордерах: 0 - Постоянный лот "lot" 1 - 1+1+1+1+… 2 - 1+2+3+4+... 3 - 1 + 1 = 2 1 + 2 = 3 2 + 3 = 5 3 + 5 = 8 5 + 8 = 13 8 + 13 = 21 13 + 21 = 34 21 + 34 = 55 34 + 55 = 89 … Пример: lotM = 0 - постоянный лот: 1лот=1 2лот=1 3лот=1 4лот=1 5лот=1 lotM = 1 - каждый новый лот увеличивается на размер первичного лота 1лот=1 2лот=1+1 3лот=1+1+1 4лот=1+1+1+1 5лот=1+1+1+1+1 lotM =2 - каждый лот увеличивается на сумму предыдущих лотов + начальный лот 1лот=1 2лот=1+2 3лот=1+2+3 4лот=1+2+3+4 5лот=1+2+3+4+5 lotM =3 - ваше описание верное 1лот=1 2лот=1+1 3лот=1+2 4лот=3+2 5лот=5+3 lotM =4 - гарантированный тейк профит Формируем таблицу из ордеров открытых за прошедшие N_Life_Buy (N_Life_Sell) - берем информацию из истории сделок CloseOrder_[n]_Magic // магическое число ордера с Magic CloseOrder_[n]_Sim // символ (валютная пара) на котором открыт ордер CloseOrder_[n]_Type // тип ордера - Buy/Sell CloseOrder_[n]_PriceOpen // цена открытия ордера CloseOrder_[n]_PriceClose // цена закрытия ордера CloseOrder_[n]_Lot // объем лота Для каждого ордера вычисляем, сколько пунктов он потерял Если CloseOrder_[n]_Type=Buy, то CloseOrder_[n]_Lost_Buy=(CloseOrder_[n]_PriceClose-CloseOrder_[n]_PriceOpen)*CloseOrder_[n]_Lot Если CloseOrder_[n]_Type=Sell, то CloseOrder_[n]_Lost_Sell=(CloseOrder_[n]_PriceOpen-CloseOrder_[n]_PriceClose)*CloseOrder_[n]_Lot Суммируем полученный рузультат ALL_Lost=CloseOrder_[n++]_Lost_Buy+CloseOrder_[n++]_Lost_Sell Вычисляем, какого объема должен быть лот для покрытия убытков, при открытии ордера на покупку Lot_Size+ALL_Lost/(Target_Sell/Point) Вычисляем, какого объема должен быть лот для покрытия убытков, при открытии ордера на продажу Lot_Size+ALL_Lost/(Target_Buy/Point)