usver73 Опубликовано 13 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 13 июля, 2017 Немного смущает сам вопрос - при сетке более 8 ордеров становится неправильным расчёт БУ (в обоих случаях)? или косяк в дальнейшем расчёте ТП, или при модификации ордера? как Вы узнали о неправильном ТП у ордеров? Например, при дефолтных настройках выложенного советника ТП -50пп (4-х знак). Т.е. при лоте=0.1(усреднение), средняя доходность составляет ордера в сетке 50$. А, например, на сетке в 23 ордера средняя доходность 38$. На кроссах при 8 ордерах вообще отрицательная :( При этом в визуальном режиме отображается линия БУ и "линейкой" измеряю- ТП стоит там где надо- на расстоянии 50 пп. Собственно поэтому стал грешить на расчет цены БУ.bag.png Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 13 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 13 июля, 2017 Ок. Давай разберём конкретный пример на 23 ордера. Скинь сюда лотности и цены открытия, а мы пересчитаем и сравним. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 13 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 13 июля, 2017 24 ордер не считаем, он одиночный, далее с 1 по 23 в сумме дали 892$ :23= 38,8$ на ордер StrategyTesterBag.gifStrategyTesterBag.htm Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 14 июля, 2017 Посмотрите 12 ордер. У него тейк был 515 пипс, а в деньгах около 43$, что явно меньше ожидаемых Вами 50$... Может тут собака порылась?А сова считает всё правильно... Можно рассчитывать ТП не в пунктах а в деньгах. 23 * 50$ = 1150$ вот ожидаемый тейк, делите на цену пункта = будет тейк в пипсах. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 14 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 14 июля, 2017 Короче, я совсем ничего не понимаю... Сделал, как Oll рекомендовал:Выкинул всю сетку в Эксель... Выводы:1. дистанция между ордерами как положено- 100 пп. (4-х знак);2. Тейк в пунктах- 1149, что в среднем по 50 пп на каждый ордер- как положено.3. Цена пункта в середине сетки (11,12,13 ордера) отклоняется от правильного (=1$), далее снова приходит в норму..4. Из-за изменения стоимости пункта "плывет" общая прибыль (-892$) и, соответственно, средняя прибыль на ордер (=39$).Полтергейст?! ~x( All, Вы, по-моему, делали из Ва-банка сеточник (хотя без разницы по какой стратегии). Может покажете в качестве образца? Расчет_рез._сетки.pngСетка23ордера.xlsx Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 14 июля, 2017 Из Ва-банка не делал, из доступных делал zerg, модифицировал Илан. А для себя делал в классах, т.е. работа с ордерами в одном классе, работа с сеткой в другом, ММ в третьем, индикаторы в четвёртом, а сама стратегия в основном файле. Довольно сложно всё выписано - если долго не смотрю в код, то сам путаюсь. Загляни в код сетки QJ - что-то похожее... Классы публиковать не буду - на любые вопросы отвечу. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 17 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 17 июля, 2017 Короче, нашел, в чем проблема: все-таки учет свопов (вернее, его отсутствие) вносил искажение в результаты. Т.к. сетка могла висеть много дней, это оказалось существенным моментом. Сразу не "дошел" до этого потому что при включенном ежедневном пересчете ТП результат также был неверен. Просто фактически пересчет не производился...И вот теперь я "залип" на куске кода, отвечающий за пересчет... datetime dtDay=0; if( UseCalcSwap && dtDay!=iTime(NULL, PERIOD_D1, 0) ) { dtDay=iTime(NULL,PERIOD_D1,0); Print("Пересчитываем ТП раз в день"); if (countBUY>0) { SetTakeProfit(OP_BUY, false) ; Print("Пересчитан ТП БАЙ-сетки.Новый день или Стоп-ордер переведен в рыночный"); } if (countSELL>0){ SetTakeProfit(OP_SELL, false) ; Print("Пересчитан ТП СЕЛЛ-сетки.Новый день или Стоп-ордер переведен в рыночный");} } Блин, ну проще быть не может, НО! iTime выдает корректное время только для текущего ТФ, для W1 и для MN1.(в тестре)Весь Гугл перерыл, никто об этой проблеме не упоминал.Специально написал:void OnTick() {//--- Print("Current TF ", Period()); Print("M1 ", iTime(NULL,PERIOD_M1,0)); Print("M5 ", iTime(NULL,PERIOD_M5,0)); Print("M15 ", iTime(NULL,PERIOD_M15,0)); Print("M30 ", iTime(NULL,PERIOD_M30,0)); Print("H1 ", iTime(NULL,PERIOD_H1,0)); Print("H4 ", iTime(NULL,PERIOD_H4,0)); Print("D1 ", iTime(NULL,PERIOD_D1,0)); Print("W1 ", iTime(NULL,PERIOD_W1,0)); Print("MN1 ", iTime(NULL,PERIOD_MN1,0)); Print("=============================="); } Результат, например, для Н1:2010.01.01 00:00:00 test_iTime test started2010.01.01 02:00:03 test_iTime EURUSDf,H1: Current TF 602010.01.01 02:00:03 test_iTime EURUSDf,H1: M1 1970.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: M5 1970.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: M15 1970.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: M30 1970.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: H1 2010.01.01 02:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: H4 1970.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: D1 1970.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: W1 2009.12.27 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: MN1 2010.01.01 00:00:002010.01.01 02:00:03 test_iTime EURUSDf,H1: ======================= Нулевые результаты для некоторых ТФ остаются таковыми на всем протяжении теста. Котировки закачаны все. Пробовал на разных инструментах...В чем может быть проблема?п.с. на ДЕМО работает как надо, проблема только в тестере... Изменено 17 июля, 2017 пользователем usver73 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 17 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 17 июля, 2017 usver73 Про проблемы с iTime я писал последний раз года полтора назад, в итоге когда Ва-Банк делал всё пересчитывал на текущий ТФ. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 17 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 17 июля, 2017 Вот мне тоже казалось, что читал про проблемы, но ветка большая, поленился искать...Поставил "костыль" в виде TimeDayOfYear(TimeCurrent()), но глобально проблему он не решает- у меня есть еще разные штуки завязанные не фиксированный ТФ. Цитата в итоге когда Ва-Банк делал всё пересчитывал на текущий ТФ. А можно в двух словах алгоритм или кусок кода?Снимаю вопрос, нашел Вашу дискуссию с voldemar227. Изменено 17 июля, 2017 пользователем usver73 Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 19 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 19 июля, 2017 Снимаю вопрос, нашел Вашу дискуссию с voldemar227. Oll, уточнить хочу: в упомянутом обсуждении я взял Вашу проверку открытия нового бара на старшем ТФ: if (MathMod(Time[0], NewBar*60 ) == 0 ) Но если в if не включать проверку открытия бара на текущем ТФ, то в результате сигнал появляется несколько раз. Например, на рабочем ТФ М15 проверка бара на Н1 дает результат 4 раза... я сделал так: if (MathMod((double)Time[0], TFEQ*60 ) == 0 && prevtimeEQ!=Time[0]) { prevtimeEQ=Time[0]; .... } Я не перемудрил?И основной вопрос: применяю iLowest для поиска экстремумов на старшем ТФ. Выдает ошибку 4074 "Не хватает памяти для исторических данных". Скажите, с этой функцией тоже надо костыли применять? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 20 июля, 2017 по идее (для твоего примера) MathMod(Time[0], PERIOD_H1*60 ) = 0 только 1 раз в час и дополнительных костылей не нужно.при использовании iLowest никогда никаких ошибок не видел, правда всегда использовал на текущем ТФ, если надо на старшем, то пересчитай длину фрейма и смотри на текущем и всё.ПС: я никогда не использую другие ТФ - просто не вижу в этом смысла. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 21 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 21 июля, 2017 по идее (для твоего примера) MathMod(Time[0], PERIOD_H1*60 ) = 0 только 1 раз в час и дополнительных костылей не нужно Ну не знаю, без костылей у меня не получилось. Допустим, рабочий ТФ М5, тогда Time[0] будет иметь одно и то же значение в течение 5 мин. и заходить в блок if несколько раз. если надо на старшем, то пересчитай длину фрейма и смотри на текущем и всё. так и сделал. я никогда не использую другие ТФ - просто не вижу в этом смысла.У меня трал по теням свечей на Н1. И Х.З., какой у пользователя в этот момент будет рабочий таймфрейм. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 21 июля, 2017 Поделиться Доработка советников: общая тема Опубликовано 21 июля, 2017 Допустим, рабочий ТФ М5, тогда Time[0] будет иметь одно и то же значение в течение 5 мин. и заходить в блок if несколько раз.Ну сделай стандартную проверку новой свечи на текущем ТФ, можно туда и проверку индюков всунуть чтоб терминал не грузить. Ссылка на сообщение Поделиться на другие сайты More sharing options...
mrJack Опубликовано 1 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 1 августа, 2017 Привет Гуру! Помогите пожалуйста допилить советника. В тырнете нашел фрагмент кода по дням TIME FILTER, попробовал прикрутить - вроде получилось, но советник все равно открывает по времени, которое контролирует функция IsTradeTimeA(), а она открывает ордера с понедельника по пятницу. Необходим только TIME FILTER. Код.txt Изменено 1 августа, 2017 пользователем mrJack Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 2 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 2 августа, 2017 Вот код выключающий торговлю в определённые дни недели и числа месяца. советнике пишите:if ( NoTradeDay() ) return; // если не рабочий день - выход.---------------input string s_NoTradeDay_Month = "2,5,8,24";input string s_NoTradeDay_Week = "3,5";bool NoTradeDay(){ string stm = IntegerToString( TimeDay( TimeCurrent() ) ); int pos = StringFind( s_NoTradeDay_Month, stm, 0 ); if ( pos >= 0 ) // найдено нерабочее число месяца { if ( StringLen( stm ) > 1 ) return ( true ); // если 2 значное число - выход // если 1 значное число и т.к. будут 2 значные числа - проверка на "," или конец строки if ( pos >= StringLen( s_NoTradeDay_Month ) - 1 ) return ( true ); // 1-зн.число и конец строки - выход stm = StringSubstr( s_NoTradeDay_Month, pos+1, 1 ); if ( StringCompare( stm, "," ) == 0 ) return ( true ); // 1-зн.число и символ разделитель "," - выход } stm = IntegerToString( TimeDayOfWeek( TimeCurrent() ) ); if ( StringFind( s_NoTradeDay_Week, stm, 0 ) >= 0 ) return ( true ); // найден нерабочий день недели return ( false );}----------------------ПС: код не использую - тестируй тщательнее. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mrJack Опубликовано 2 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 2 августа, 2017 Спасибо! Вставлял и в начало кода после объявления переменных и ниже функции IsTradeTime - всё равно открывает в первых числах месяца 1,2,3,4,5. Не работает. Может не туда вставляю?З.Ы. А эта фукция где должна быть прописана if ( NoTradeDay() ) return; // если не рабочий день - выход.. И с ней и без нее не работает. Я вставлял ее в тело функции IsTradeTime - тоже никакой реакции. Код.txt Изменено 2 августа, 2017 пользователем mrJack Ссылка на сообщение Поделиться на другие сайты More sharing options...
machine Опубликовано 2 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 2 августа, 2017 Почему с расширением txt, а не mq4? if ( StringFind( s_NoTradeDay_Week, stm, 0 ) >= 0 ) return ( true ); // найден нерабочий день недели return ( false ); Тут return(false); попал в комментарии.В начало функции IsTradeTime вставить if ( NoTradeDay() ) return(false); 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mrJack Опубликовано 2 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 2 августа, 2017 Перезалил Добавлено: 02-08-2017 11:18:40Все исправил. Теперь свойства эксперта не открывается и не запускается на старт.скачайте пожалуйста еще разДобавлено: 02-08-2017 11:29:52Всех участников от души благодарю! Нашел ошибку и 3 раза перезапустил советника и все пошло!!! <:-p>EURCHF_M15.mq4 Изменено 2 августа, 2017 пользователем mrJack Ссылка на сообщение Поделиться на другие сайты More sharing options...
machine Опубликовано 2 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 2 августа, 2017 Можно ещё так: EURCHF_M15.mq4 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 19 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 19 августа, 2017 Здравствуйте. Есть индикатор от советника Август Голем. Ломанный соаетник перестал работать. Помогите написать советник. Входы по сигналу. ПО одному сигналу на бар. При повторе сигнала, если идем не в нашу сторону так же открываем ордера. В общем делаем сетку, которую закрываем по обратному сигналу или по Общему ТП. ТФ 1 минута.Можно вообще в советнике http://tlap.com/forum/sovetniki-foreks/11/sovetnik-martingeyl-survivor/15463/ заменить параметры входа на входы по прилагаемому индикатору, ну или добавить.Сами сигналы появляются только пр прогоне в тестере. Нет стрелочек, только рисует какие-то кружочки. На графике и в тестере рисует только скользящую и требует Вторую часть индюка AugustForexGolem_v2-i2.ex4. Изменено 5 декабря, 2017 пользователем Pavel888 Ссылка на сообщение Поделиться на другие сайты More sharing options...
MikR0ReR Опубликовано 21 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 21 августа, 2017 Помогите кто нить скомпилировать этот код в советник, я полный дуб в этом #:-s . Сова имеет функцию нужную для моей стратегии обрезать часть прибыли (объема) . Нашел похожий код. А так мне надо чтобы после определенного количества пунктов обрезалась позиция. И чтобы сова могла обрезать сделки по всем открытым парам.Функция в сове вроде такая " close_lot=NormalizeDouble(OrderLots()/2,2);"2" это закрыть половину, округление согласно NormalizeDouble "+ Спойлер extern string General_settings ="-------------------------------------------------------";extern double Lots = 0.01;extern int Delta = 1;extern string Order_settings ="-------Настройки СЛ и ТП-------------------------------";extern int TakeProfit = 500;extern int StopLoss = 400;extern string Order_management ="-------Настройки Риск Менеджмента----------------------";extern bool fixed_sl=true;extern int NoLoss = 100;extern int NoLossFiboLevels = 60;extern int NoLossProfit = 0;extern string st5 ="-Настройки Дистанции и Процента для закрытия-----------"; extern bool Lot_Mode_Percent = true;extern int Lot_Percent_23_6 = 5; extern int Lot_Percent_38_2 = 20; extern int Lot_Percent_50 = 30;extern int Lot_Percent_61_8 = 40; extern string st6 ="-Веремя работы советника------------------------------"; extern int TimeStart = 01; // Время начала работы советникаextern int TimeEnd = 23; // Время окончания работы советникаextern int TimeStartMonday = 3; // Время начало торговли в понидельник extern int TimeEndFriday = 17; // Время после которого не торгуем в пятницу// Глобальные переменныеint LastTradeTimeBuy = 0; // Время последней открытой сделкиint LastTradeTimeSell = 0;int LastTradeBuy = 0; // Время последней открытой сделкиint LastTradeSell = 0; // Время последней открытой сделкиint MagicNumber= 0;double StopLossValue = 0;#define HR2400 86400 // 24 * 3600int TimeOfDay(datetime when){ return( when % HR2400 ); }datetime DateOfDay(datetime when){ return( when - TimeOfDay(when) ); }datetime Today(){ return(DateOfDay( TimeCurrent() )); }datetime Tomorrow(){ return(Today() + HR2400); }datetime Yesterday(){ return( iTime(NULL, PERIOD_D1, 1) ); }int tomorrow_day =0;int current_day = 0;int count_buy = 0;int count_sell = 0;//------- Внешние параметры модуля -----------------------------------extern string _Parameters_b_Lot = "- Параметры модуля расчёта лота----------------------";extern int LotsWayChoice = 1; // Способ выбора рабочего лота: // 0-фиксированный, // 1-процент от депозита, // 2-фиксированно-пропорциональный, // 3-фракционно-фиксированный,extern int LotsPercent = 10; // Процент от депозитаextern int LotsDeltaDepo = 500; // Коэффициент приращения депозитаextern int LotsDepoForOne = 500; // Размер депозита для одного минилотаextern int LotsMax = 1000; // Максимальное количество минилотов//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+double fPreviousBid = 0; // значение bid на предыдущем тикеstring symb;int OnInit(){ fPreviousBid = 0; return(INIT_SUCCEEDED);}void OnTick() { symb = _Symbol; Bkl(); }void Bkl() { static datetime bodCurr; datetime bodPrev = bodCurr; bodCurr = DateOfDay( TimeCurrent() ); bool isNewDay = bodPrev != bodCurr; if(isNewDay){ int part_order_close_sell_23_6 = 0; };if (TradeStatuse() > 0) return (0);double SL=0,TP=0,NoLossTP=0,Current_Value,Bid_Value_23_6=0,Ask_Value_23_6=0,Bid_Value_38_2=0,Ask_Value_38_2=0,Bid_Value_50=0,Ask_Value_50=0,Bid_Value_61_8=0,Ask_Value_61_8=0,Lot_23_6=0,Lot_38_2=0,Lot_50=0,Lot_61_8=0,Spread=Ask-Bid,StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL),HighD1=iHigh(Symbol(),PERIOD_D1,1),LowD1=iLow(Symbol(),PERIOD_D1,1),HighD1Today=iHigh(Symbol(),PERIOD_D1,0),LowD1Today=iLow(Symbol(),PERIOD_D1,0),HighH4=iHigh(Symbol(),PERIOD_H4,1),LowH4=iLow(Symbol(),PERIOD_H4,1),HighH6=iHigh(Symbol(),PERIOD_H6,0),LowH6=iLow(Symbol(),PERIOD_H6,0),HighW1=iHigh(Symbol(),PERIOD_W1,1),LowW1=iLow(Symbol(),PERIOD_W1,1),CheckHiLivels = 0, CheckLowLivels = 0; static double max_23_6 = 0; static double max_38_2 = 0; static double max_50_0 = 0; static double max_61_8 = 0; static double min_23_6 = 0; static double min_38_2 = 0; static double min_50_0 = 0; static double min_61_8 = 0; static double high_day = 0; static double low_day = 0; high_day = iHigh(Symbol(), PERIOD_D1, 1); low_day = iLow(Symbol(), PERIOD_D1, 1);int total = OrdersTotal(); // сколько всего ордеров открыто double fUpperLevel = iHigh(Symbol(), PERIOD_D1, 1) + Delta * Point(); double fLowerLevel = iLow(Symbol(), PERIOD_D1, 1) - Delta * Point(); double TodayHi = iHigh(Symbol(),PERIOD_D1,0); // Цена закрытия предпоследнего дня double TodayLow = iLow(Symbol(),PERIOD_D1,0); // Цена закрытия последнего дня if (TodayHi>fUpperLevel && Open[0] if (TodayLow fLowerLevel) CheckLowLivels = 1; bool Open_Bay = fPreviousBid > 0 && Bid > fUpperLevel && fPreviousBid bool Open_Sell = fPreviousBid > 0 && Bid = fLowerLevel && CheckLowLivels == 1; // запоминаем текущий бид fPreviousBid = Bid;int Ticket,cnt,Total=0; double spread=ask-bid; int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT)); comm=comm+"Вычисленный спред = "+(string)spread_points+" пунктов"; for(cnt=0;cnt { OrderSelect(cnt,SELECT_BY_POS); if(OrderSymbol()==Symbol()) { Total++; Lot_23_6 = OrderLots()*Lot_Percent_23_6/100;if(Lot_23_6>OrderLots()||Lot_23_6100)Lot_23_6=100;} Lot_23_6 = (NormalizeLot(Lot_23_6, False)); Lot_38_2 = OrderLots()*Lot_Percent_38_2/100;if(Lot_38_2>OrderLots()||Lot_38_2100)Lot_38_2=100;} Lot_38_2 = (NormalizeLot(Lot_38_2, False)); Lot_50 = OrderLots()*Lot_Percent_50/100;if(Lot_50>OrderLots()||Lot_50100)Lot_50=100;} Lot_50 = (NormalizeLot(Lot_50, False)); Lot_61_8 = OrderLots()*Lot_Percent_61_8/100;if(Lot_61_8>OrderLots()||Lot_61_8100)Lot_61_8=100;} Lot_61_8 = (NormalizeLot(Lot_61_8, False)); if(OrderType()==OP_BUY)// long position is opened { max_23_6 = high_day + (MathAbs(high_day - low_day) / 4.236); max_38_2 = high_day + (MathAbs(high_day - low_day) / 2.582); max_50_0 = high_day + (MathAbs(high_day - low_day) / 1.960); max_61_8 = high_day + (MathAbs(high_day - low_day) / 1.618); if(Lot_38_2>0&& Bid> max_38_2) { if(Lot_38_2>0){ Print ("Частичное закрытие ордера Buy на уровне 32.2"); OrderClose(OrderTicket(), Lot_38_2, Bid, 20, Blue);return(0);} return(0); } if(Lot_50>0&&Bid > max_50_0) { if(Lot_50>0){ Print ("Частичное закрытие ордера Buy на уровне 50"); OrderClose(OrderTicket(), Lot_50, Bid, 20, Blue);return(0);} return(0); } if(Lot_61_8>0&&Bid > max_61_8) { if(Lot_61_8 > 0){ Print ("Частичное закрытие ордера Buy на уровне 61.8", Lot_61_8); OrderClose(OrderTicket(), Lot_61_8, Bid, 20, Blue);return(0);} return(0); } if( Bid > OrderOpenPrice()+(NoLoss*Point) && NoLoss>0 ) { SL = NormalizeDouble(OrderOpenPrice()+(NoLoss*Point),Digits); if(!CompareDoubles(OrderStopLoss(),SL)){ OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0); } return(0); } if( Bid > max_23_6 && OrderStopLoss() { SL = NormalizeDouble(OrderOpenPrice() + (NoLossFiboLevels*Point),Digits); if (!CompareDoubles(OrderStopLoss(),SL)){ OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue); Print ("Частичное закрытие ордера Buy на уровне 23.6"); OrderClose(OrderTicket(), Lot_23_6, Bid, 20, Blue);return(0); } } } if(OrderType()==OP_SELL) {//--sell--------------------------------------------------------------------------------------------------------------------- min_23_6 = low_day - (MathAbs(high_day - low_day) / 4.236);// Alert("min_23_6 ", min_23_6); min_38_2 = low_day - (MathAbs(high_day - low_day) / 2.582); min_50_0 = low_day - (MathAbs(high_day - low_day) / 1.960); min_61_8 = low_day - (MathAbs(high_day - low_day) / 1.618);// Alert("min_61_8 ", min_61_8); if(Lot_38_2>0&&Ask { if(Lot_38_2>0){ Print ("Частичное закрытие ордера Sell на уровне -38.2 ",Ask," Размер лота ",Lot_38_2); OrderClose(OrderTicket(), Lot_38_2, Ask, 20, Blue);return(0);} } if(Lot_50>0&&Ask { if(Lot_50>0){ Print ("Частичное закрытие ордера Sell на уровне -50 ",Ask," Размер лота ",Lot_50); OrderClose(OrderTicket(), Lot_50, Ask, 20, Blue);return(0);} } if(Lot_61_8>0&& Ask { if(Lot_61_8>0){ Print ("Частичное закрытие ордера Sell на уровне -61.8 ",Ask," Размер лота ",Lot_61_8); OrderClose(OrderTicket(), Lot_61_8, Ask, 20, Blue);return(0);} } if( Ask 0 ) { SL = NormalizeDouble(OrderOpenPrice() - (NoLoss*Point),Digits); if (!CompareDoubles(OrderStopLoss(),SL)){ OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue); } return(0); } if( Ask min_23_6 ) { SL = NormalizeDouble(OrderOpenPrice() - (NoLossFiboLevels*Point),Digits); if (!CompareDoubles(OrderStopLoss(),SL)){ OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue); Print ("Частичное закрытие ордера Sell на уровне -23.6 ",Ask," Размер лота ", Lot_23_6); OrderClose(OrderTicket(), Lot_23_6, MarketInfo(Symbol(), MODE_ASK), 20, Blue); } } } } }//+----Открытие позицийint TradeTime=TimeDay(TimeCurrent());int TradeTimeBuy=TimeDay(TimeCurrent());int TradeTimeSell=TimeDay(TimeCurrent());if(Total { if(Open_Bay && LastTradeTimeBuy!=TradeTimeBuy ) { SL = iLow(symb,PERIOD_D1,0); // Alert("(Bid-SL)*10000 ", (Bid-SL)*100000); if((Bid-SL)*100000>StopLoss){SL = Bid - (StopLoss*Point);} if(TakeProfit>0) TP = Ask + TakeProfit*Point; if(Bid-SL Ticket=OrderSend(Symbol(),OP_BUY,GetSizeLot(),Ask + Spread ,20,SL,TP); if (Ticket > 0) { LastTradeTimeBuy=TradeTimeBuy; // задаем время сделки, чтобы сегодня больше не торговать } return(0); }//+---- if(Open_Sell && LastTradeTimeSell!=TradeTimeSell) { SL = iHigh(symb,PERIOD_D1,0); if((Ask+SL)*100000>StopLoss){SL = Ask + (StopLoss*Point);} if(TakeProfit>0) TP = Bid - TakeProfit*Point; if (SL-Ask Ticket = OrderSend(Symbol(),OP_SELL,GetSizeLot(),Bid - Spread,20,SL,TP); if (Ticket > 0) { LastTradeTimeSell=TradeTimeSell; // задаем время сделки, чтобы сегодня больше не торговать } return(0); } } // return(0); }int TradeStatuse(){ if ((!IsTesting()) && IsStopped()) return (1); //--- Если не тестовый режим и советник приостановлен (IsStopped). if ((!IsTesting()) && !IsTradeAllowed()) return (2); //--- Если не тестовый режим и торговля заблокирована (IsTradeAllowed). if ((!IsTesting()) && IsTradeContextBusy()) return (3); //--- Если не тестовый режим и поток для выполнения торговых операции занят (IsTradeContextBusy). if (Hour() if (Hour() >= TimeEndFriday + DayOfWeek() == 5) return (5); //--- Проверка на торговое время в пятницу. if (TimeEnd { if(Hour() >= TimeEnd && Hour() } else { if ((Hour() = TimeEnd)) return (6); //--- Проверка на торговое время. } if ((DayOfWeek() == 0) || (DayOfWeek() == 6)) return (7); //--- Выходные, некоторые брокеры как RVD торговля начинаеться в воскресение вечером //--- return(0);}double GetSizeLot(){ double dLot; if (LotsWayChoice==0) dLot=Lots; // фиксированный процент от депозита if (LotsWayChoice==1) { // dLot=MathCeil(AccountFreeMargin()/10000*LotsPercent)/10; dLot=MathFloor(AccountFreeMargin()/MarketInfo(Symbol(),MODE_LOTSIZE)/MarketInfo(Symbol(),MODE_MINLOT)*AccountLeverage()/100.0*LotsPercent) * MarketInfo(Symbol(),MODE_MINLOT); } // фиксированно-пропорциональный if (LotsWayChoice==2) { int k=LotsDepoForOne; for (double i=2; i { k=k+i*LotsDeltaDepo; if (k>AccountFreeMargin()) { dLot=(i-1)/10000; break; } } } // фракционно-фиксированный if (LotsWayChoice==3) { dLot=MathCeil((AccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/10; } if (dLot if (dLot>100) dLot=100; return(dLot);}double NormalizeLot(double lo, bool ro=False, string sy="") { double l, k; if (sy=="" || sy=="0") sy=Symbol(); double ls=MarketInfo(sy, MODE_LOTSTEP); double ml=MarketInfo(sy, MODE_MINLOT); double mx=MarketInfo(sy, MODE_MAXLOT); if (ml==0) ml=0.01; if (mx==0) mx=100; if (ls>0) k=1/ls; else k=1/ml; if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k; if (l if (l>mx) l=mx; return(l);}bool CompareDoubles(double number1,double number2) { if(NormalizeDouble(number1-number2,8)==0) return(true); else return(false); } void NoLoss() { int tip,Ticket; double StLo,OSL,OOP; for (int i=0; i if (OrderSelect(i, SELECT_BY_POS)) { tip = OrderType(); if (tip OSL = NormalizeDouble(OrderStopLoss(),Digits); OOP = NormalizeDouble(OrderOpenPrice(),Digits); Ticket = OrderTicket(); if (tip==OP_BUY) { if (OSL>OOP) continue; StLo = NormalizeDouble(OOP+Point,Digits); if (NormalizeDouble((Bid-OOP)/Point,0)>=NoLoss) { if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White)) Print("NoLoss Error ",GetLastError()," buy SL ",OSL,"->",StLo); } } if (tip==OP_SELL) { if (OSL StLo = NormalizeDouble(OOP-Point,Digits); if (NormalizeDouble((OOP-Ask)/Point,0)>=NoLoss) { if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White)) Print("NoLoss Error ",GetLastError()," sell SL ",OSL,"->",StLo); } } } } } } :(( Привет! Чаво от куда, куды вставлять? :-b Изменено 5 декабря, 2017 пользователем Pavel888 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Kuddesnik Опубликовано 23 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 23 августа, 2017 Может кто модифицировать советник AP3.0 индикатором EasyTrend? Смысл такой:При торговле на м5 советником АР ордера открываются только по тренду из индикатора EasyTrend на тф h1, при смене тренда должны пред идущие ордера закрываться и открываться по новому тренду.К сожалению исходного кода индюка нет, возможно ли осуществить эту задумку или нет? Auto-Profit3.0.mq4EasyTrend.ex4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Schkiperok Опубликовано 31 августа, 2017 Поделиться Доработка советников: общая тема Опубликовано 31 августа, 2017 Советник работает на мартингейле от границ канала в сторону тренда по стратегии Безубыток. Первый ордер рыночный, последующие отложенные. Нужно прикрутить закрытие ордеров по общему профиту и нормализовать работу. Такой вопрос-будут ли сделки закрываться по профиту, если сам профит на графике не выставляется? Изменено 1 сентября, 2017 пользователем Schkiperok Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр 1939 Опубликовано 1 сентября, 2017 Поделиться Доработка советников: общая тема Опубликовано 1 сентября, 2017 Приветствую!!индикатор(SuperTrend)можно ли его использовать в советнике если можно то как.советник(STrend_2)с 2я Moving Average работает нормально.Что добавить в кодчтоб использовать инди(SuperTrend)условия входа в скрине.Спасибо Форум.rar Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 2 сентября, 2017 Поделиться Доработка советников: общая тема Опубликовано 2 сентября, 2017 Такой вопрос-будут ли сделки закрываться по профиту, если сам профит на графике не выставляется?Вопрос не понятен. Если советник работает с неким набором ордеров, то он может контролировать их общий профит и даже с учётом комиссий и свопов, и закрывать свои ордера при достижении профитом некого уровня. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти