Перейти к содержанию

Доработка советников: общая тема


Рекомендуемые сообщения

Доработка советников: общая тема Опубликовано

Немного смущает сам вопрос - при сетке более 8 ордеров становится неправильным расчёт БУ (в обоих случаях)? или косяк в дальнейшем расчёте ТП, или при модификации ордера? как Вы узнали о неправильном ТП у ордеров?


Например, при дефолтных настройках выложенного советника ТП -50пп (4-х знак). Т.е. при лоте=0.1(усреднение), средняя доходность составляет ордера в сетке 50$. А, например, на сетке в 23 ордера средняя доходность 38$.
На кроссах при 8 ордерах вообще отрицательная :(
При этом в визуальном режиме отображается линия БУ и "линейкой" измеряю- ТП стоит там где надо- на расстоянии 50 пп. Собственно поэтому стал грешить на расчет цены БУ.

bag.png

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 2,5k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Версия с правками. Я немного свернул код, чтобы не перебирались ордера попусту и чтобы проверка красной/синей зоны делалась в одном месте. Прогнал в тесте с настройками по умолчанию. Ожидаемо лье

Перейти

Нате 1_2_3 _Fraktal.mq4

Перейти

Система маятника, или попрыгунчика, или фиг ее знает как ее еще назвать не намного младше сетки мартингейла. Мы в далеком 2017 писали по ней сов с индикатором на вход: https://tlap.com/forum/labo

Перейти
Доработка советников: общая тема Опубликовано

Ок. Давай разберём конкретный пример на 23 ордера. Скинь сюда лотности и цены открытия, а мы пересчитаем и сравним.

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

24 ордер не считаем, он одиночный, далее с 1 по 23 в сумме дали 892$ :23= 38,8$ на ордер

StrategyTesterBag.gif
StrategyTesterBag.htm

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Посмотрите 12 ордер. У него тейк был 515 пипс, а в деньгах около 43$, что явно меньше ожидаемых Вами 50$... Может тут собака порылась?
А сова считает всё правильно...
Можно рассчитывать ТП не в пунктах а в деньгах. 23 * 50$ = 1150$ вот ожидаемый тейк, делите на цену пункта = будет тейк в пипсах.

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Короче, я совсем ничего не понимаю... Сделал, как Oll рекомендовал:
Выкинул всю сетку в Эксель... Выводы:
1. дистанция между ордерами как положено- 100 пп. (4-х знак);
2. Тейк в пунктах- 1149, что в среднем по 50 пп на каждый ордер- как положено.
3. Цена пункта в середине сетки (11,12,13 ордера) отклоняется от правильного (=1$), далее снова приходит в норму..
4. Из-за изменения стоимости пункта "плывет" общая прибыль (-892$) и, соответственно, средняя прибыль на ордер (=39$).
Полтергейст?! ~x(
All, Вы, по-моему, делали из Ва-банка сеточник (хотя без разницы по какой стратегии). Может покажете в качестве образца?

Расчет_рез._сетки.png
Сетка23ордера.xlsx

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Из Ва-банка не делал, из доступных делал zerg, модифицировал Илан. А для себя делал в классах, т.е. работа с ордерами в одном классе, работа с сеткой в другом, ММ в третьем, индикаторы в четвёртом, а сама стратегия в основном файле. Довольно сложно всё выписано - если долго не смотрю в код, то сам путаюсь. Загляни в код сетки QJ - что-то похожее... Классы публиковать не буду - на любые вопросы отвечу.

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Короче, нашел, в чем проблема: все-таки учет свопов (вернее, его отсутствие) вносил искажение в результаты. Т.к. сетка могла висеть много дней, это оказалось существенным моментом. Сразу не "дошел" до этого потому что при включенном ежедневном пересчете ТП результат также был неверен. Просто фактически пересчет не производился...
И вот теперь я "залип" на куске кода, отвечающий за пересчет...


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 started
2010.01.01 02:00:03 test_iTime EURUSDf,H1: Current TF 60
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M1 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M5 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M15 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: M30 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: H1 2010.01.01 02:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: H4 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: D1 1970.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: W1 2009.12.27 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: MN1 2010.01.01 00:00:00
2010.01.01 02:00:03 test_iTime EURUSDf,H1: =======================

Нулевые результаты для некоторых ТФ остаются таковыми на всем протяжении теста. Котировки закачаны все. Пробовал на разных инструментах...
В чем может быть проблема?
п.с. на ДЕМО работает как надо, проблема только в тестере... Изменено пользователем usver73
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
usver73 Про проблемы с iTime я писал последний раз года полтора назад, в итоге когда Ва-Банк делал всё пересчитывал на текущий ТФ.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Вот мне тоже казалось, что читал про проблемы, но ветка большая, поленился искать...
Поставил "костыль" в виде TimeDayOfYear(TimeCurrent()), но глобально проблему он не решает- у меня есть еще разные штуки завязанные не фиксированный ТФ.

Цитата

в итоге когда Ва-Банк делал всё пересчитывал на текущий ТФ.

А можно в двух словах алгоритм или кусок кода?
Снимаю вопрос, нашел Вашу дискуссию с voldemar227. Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Снимаю вопрос, нашел Вашу дискуссию с 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 "Не хватает памяти для исторических данных". Скажите, с этой функцией тоже надо костыли применять?
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

по идее (для твоего примера) MathMod(Time[0], PERIOD_H1*60 ) = 0 только 1 раз в час и дополнительных костылей не нужно.
при использовании iLowest никогда никаких ошибок не видел, правда всегда использовал на текущем ТФ, если надо на старшем, то пересчитай длину фрейма и смотри на текущем и всё.
ПС: я никогда не использую другие ТФ - просто не вижу в этом смысла.

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

по идее (для твоего примера) MathMod(Time[0], PERIOD_H1*60 ) = 0 только 1 раз в час и дополнительных костылей не нужно


Ну не знаю, без костылей у меня не получилось. Допустим, рабочий ТФ М5, тогда Time[0] будет иметь одно и то же значение в течение 5 мин. и заходить в блок if несколько раз.

если надо на старшем, то пересчитай длину фрейма и смотри на текущем и всё.

так и сделал.

я никогда не использую другие ТФ - просто не вижу в этом смысла.

У меня трал по теням свечей на Н1. И Х.З., какой у пользователя в этот момент будет рабочий таймфрейм.
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Допустим, рабочий ТФ М5, тогда Time[0] будет иметь одно и то же значение в течение 5 мин. и заходить в блок if несколько раз.

Ну сделай стандартную проверку новой свечи на текущем ТФ, можно туда и проверку индюков всунуть чтоб терминал не грузить.
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Доработка советников: общая тема Опубликовано

Привет Гуру!

Помогите пожалуйста допилить советника. В тырнете нашел фрагмент кода по дням TIME FILTER, попробовал прикрутить - вроде получилось, но советник все равно открывает по времени, которое контролирует функция IsTradeTimeA(), а она открывает ордера с понедельника по пятницу. Необходим только TIME FILTER.

Код.txt

Изменено пользователем mrJack
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Вот код выключающий торговлю в определённые дни недели и числа месяца.
советнике пишите:
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
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Спасибо! Вставлял и в начало кода после объявления переменных и ниже функции IsTradeTime - всё равно открывает в первых числах месяца 1,2,3,4,5. Не работает. Может не туда вставляю?

З.Ы. А эта фукция где должна быть прописана if ( NoTradeDay() ) return; // если не рабочий день - выход.. И с ней и без нее не работает. Я вставлял ее в тело функции IsTradeTime - тоже никакой реакции.

Код.txt

Изменено пользователем mrJack
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Почему с расширением txt, а не mq4?

   if ( StringFind( s_NoTradeDay_Week, stm, 0 ) >= 0 ) return ( true ); // найден нерабочий день недели      return ( false );   
Тут return(false); попал в комментарии.

В начало функции IsTradeTime вставить
if ( NoTradeDay() ) return(false);
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Перезалил


Добавлено: 02-08-2017 11:18:40

Все исправил. Теперь свойства эксперта не открывается и не запускается на старт.

скачайте пожалуйста еще раз

Добавлено: 02-08-2017 11:29:52

Всех участников от души благодарю! Нашел ошибку и 3 раза перезапустил советника и все пошло!!! <:-p>EURCHF_M15.mq4
Изменено пользователем mrJack
Ссылка на сообщение
Поделиться на другие сайты

  • 3 weeks later...
Доработка советников: общая тема Опубликовано


Здравствуйте. Есть индикатор от советника Август Голем. Ломанный соаетник перестал работать. Помогите написать советник. Входы по сигналу. ПО одному сигналу на бар. При повторе сигнала, если идем не в нашу сторону так же открываем ордера. В общем делаем сетку, которую закрываем по обратному сигналу или по Общему ТП. ТФ 1 минута.
Можно вообще в советнике http://tlap.com/forum/sovetniki-foreks/11/sovetnik-martingeyl-survivor/15463/
заменить параметры входа на входы по прилагаемому индикатору, ну или добавить.
Сами сигналы появляются только пр прогоне в тестере. Нет стрелочек, только рисует какие-то кружочки.




На графике и в тестере рисует только скользящую и требует Вторую часть индюка AugustForexGolem_v2-i2.ex4. Изменено пользователем Pavel888
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано


Помогите кто нить скомпилировать этот код в советник, я полный дуб в этом #:-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 * 3600

int 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 Изменено пользователем Pavel888
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Может кто модифицировать советник AP3.0 индикатором EasyTrend?
Смысл такой:
При торговле на м5 советником АР ордера открываются только по тренду из индикатора EasyTrend на тф h1, при смене тренда должны пред идущие ордера закрываться и открываться по новому тренду.
К сожалению исходного кода индюка нет, возможно ли осуществить эту задумку или нет?

Auto-Profit3.0.mq4
EasyTrend.ex4

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Советник работает на мартингейле от границ канала в сторону тренда по стратегии Безубыток. Первый ордер рыночный, последующие отложенные. Нужно прикрутить закрытие ордеров по общему профиту и нормализовать работу. Такой вопрос-будут ли сделки закрываться по профиту, если сам профит на графике не выставляется?

Изменено пользователем Schkiperok
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Приветствую!!индикатор(SuperTrend)можно ли его использовать в советнике если можно
то как.советник(STrend_2)с 2я Moving Average работает нормально.Что добавить в код
чтоб использовать инди(SuperTrend)условия входа в скрине.Спасибо

Форум.rar

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Такой вопрос-будут ли сделки закрываться по профиту, если сам профит на графике не выставляется?

Вопрос не понятен. Если советник работает с неким набором ордеров, то он может контролировать их общий профит и даже с учётом комиссий и свопов, и закрывать свои ордера при достижении профитом некого уровня.
Ссылка на сообщение
Поделиться на другие сайты

  • idinesh changed the title to Assae Elite Pro tlap version source code need i have plan convert this mt4 to mt5 and it possible mt4 dll file modified mt5 version
  • Pavel888 pinned this тема

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • ×
    ×
    • Создать...