Здравствуйте. Есть индикатор . Хотел прикрутить его к советнику. Всегда все получалось. С этим индюком не получается. Разработчики чтоль какую гадость вставили в код ? В тестере на М5 с помощью Print выводил значения индикатора. Он показывает за несколько минут , а потом провал на час , два. А индюк за это время успевал несколько раз направление поменять. Мне вот эту смену направлений и нужно в советник.
В чем тут подвох с этим индюком ? Помогите, кто знает.
Заранее Спасибо !
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
С помощью арифметики и округления в меньшую сторону можно посчитать
Первая цифра после запятой от цены Bid
a=floor((Bid-floor(Bid))*10);
Вторая цифра после запятой
b=floor((Bid*10-floor(Bid*10))*10);
Третья цифра после запятой
c=floor((Bid*100-floor(Bid*100))*10);
Другой вариант можно преобразовать цену в строку и вытащить любой символ строки. Но строчные операции медленнее.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
Чужие программы не переделываю!
Последний раз редактировалось Ugar; 04.12.2018 в 18:30.
Подскажите пожалуйста как сделать, чтобы советник различал каждую цифру в цене. Например отдельно видел первую или вторую цифру после запятой.
Вот ещё вариант математических преобразований для достижения поставленной цели:
Код:
int f(double value, int i)
{
int ii = int(pow(10, i));
int ee = int(value*ii);
int valMod = ee%10;
return(valMod);
}
Но в этой функции отсутствует "защита от дурака". Если ввести 5 знаков после запятой, а запросить значение 7го знака, то получишь *** сами знаете что...
Какой вопрос, такой и ответ. Какое отношение имеют строки второго кода к первому???
Что такое SM() откуда взято и куда засунуто???
Цитата:
Это вывод информации на график:
SM вообще не имеет отношения к вопросу.
Если вам будет проще, то вообще эти две строки не смотрите.
Есть profitToday и profitYesterday и в этом коде показано как это получено.
Мне нужно получить profitWeek и profitMonth.
А Вы обращаете внимание на то, о чем речь вообще не шла.
Спасибо, но это совсем не то. Нужно на основе моего кода.
А там вообще всё по-другому.
Как можно сделать на основе Вашего кода, если в нем нет необходимых данных???
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:
Скрытый текст
PHP код:
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 12.05.2008 | //| Описание : Возвращает дату понедельника | //+----------------------------------------------------------------------------+ //| Параметры: | //| (-2 - позатой недели) | //| (-1 - прошлой недели) | //| no - номер понедельника ( 0 - текущей недели) | //| ( 1 - следующий, ближайший будущий) | //| ( 2 - последующий) | //+----------------------------------------------------------------------------+ datetime DateOfMonday(int no=0) { datetime dt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
while (TimeDayOfWeek(dt)!=1) dt -= 24*60*60; dt += no*7*24*60*60;
return(dt); }
[свернуть]
Вам, всего-то нужно, взять готовые функции и вставить в свой код и связать все воедино.
Как можно сделать на основе Вашего кода, если в нем нет необходимых данных???
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:
Скрытый текст
PHP код:
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 12.05.2008 |
//| Описание : Возвращает дату понедельника |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| (-2 - позатой недели) |
//| (-1 - прошлой недели) |
//| no - номер понедельника ( 0 - текущей недели) |
//| ( 1 - следующий, ближайший будущий) |
//| ( 2 - последующий) |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int no=0)
{
datetime dt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
while (TimeDayOfWeek(dt)!=1) dt -= 24*60*60;
dt += no*7*24*60*60;
return(dt);
}
[свернуть]
Вам, всего-то нужно, взять готовые функции и вставить в свой код и связать все воедино.
но мне надо не отдельными функциями, а встроить в уже имеющуюся функцию.
вот есть:
datetime today = TimeCurrent() ;
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
и надо продолжение там же сделать:
datetime week = ...
datetime month = ....
В итоге получаем суммарный профит за нужный период profitWeek=ProfitT(1); для недели, где 1 в параметрах - это которую по счету неделю назад нужно посчитать. Для месяца аналогично. В коде есть проверка на магик - там переменную Magic нужно заменить на свою.
Привет) выше я описал примерно тот же вариант) но мне надо решить этот момент отталкиваясь от основного кода, т.е там всё вместе сделать.
не отдельными функциями, а всё в одном месте.
Привет) выше я описал примерно тот же вариант) но мне надо решить этот момент отталкиваясь от основного кода, т.е там всё вместе сделать.
не отдельными функциями, а всё в одном месте.
В таком варианте будет считать за последние 7 и 30 календарных дней. Если заморачиваться по количеству дней в месяце - надо подумать как лучше. Хотя, вряд ли что-то получится в этом плане, т.к. будет перескок с одного месяца на другой.
В таком варианте будет считать за последние 7 и 30 календарных дней. Если заморачиваться по количеству дней в месяце - надо подумать как лучше. Хотя, вряд ли что-то получится в этом плане, т.к. будет перескок с одного месяца на другой.
Что-то мне кажется что вопрос в том, как из функции вернуть больше чем одно значение. Не так?
Просто в одном цикле переборки всех закрытых ордеров посчитать профиты за разные периоды времени по дням от сейчас и в прошлое. Или для вчерась от начала вчера по начало сегодня. Все в одном цикле считается легко, но вот зачем там в оригинале заморочки с проверкой на текущий месяц и текущий год - по-моему лишнее. Если отталкиваться от времени открытия баров, каждый подсчет за нужный период занимает одну строчку кода в цикле.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
Она более корректно должна работать. А в предыдущей нужно добавить в проверку +86400, как в этой версии, иначе текущие на этот день профиты не будут учитываться для недельного и месячного расчетов.
Можно вечно смотреть на то, как горит огонь, как течет вода... и как работает трал...
Последний раз редактировалось vladradon; 05.12.2018 в 21:57.
Она более корректно должна работать. А в предыдущей нужно добавить в проверку +86400, как в этой версии, иначе текущие на этот день профиты не будут учитываться для недельного и месячного расчетов.
Что-то не то... Не обнуляется профит за месяц через месяц, и профит за неделю через неделю... Т.е. профит за месяц через календарный месяц должен обнулиться. Тоже самое и профит за неделю каждую новую неделю должен начинать с нуля. Но этого происходит. Суммы периодически становятся меньше, но незначительно.. Что-то в общем не то происходит
Вот эти функции считают всё четко, но они используются отдельно, вне основной функции. А я бы хотел как-то это использовать в основной функции расчета...
В чем тут подвох с этим индюком ? Помогите, кто знает.
Заранее Спасибо !
Первая цифра после запятой от цены Bid
a=floor((Bid-floor(Bid))*10);
Вторая цифра после запятой
b=floor((Bid*10-floor(Bid*10))*10);
Третья цифра после запятой
c=floor((Bid*100-floor(Bid*100))*10);
Другой вариант можно преобразовать цену в строку и вытащить любой символ строки. Но строчные операции медленнее.
Чужие программы не переделываю!
Последний раз редактировалось Ugar; 04.12.2018 в 18:30.
профит за неделю
профит за месяц?
А там вообще всё по-другому.
Какое отношение имеют строки второго кода к первому???
Что такое SM() откуда взято и куда засунуто???
Если вам будет проще, то вообще эти две строки не смотрите.
Есть profitToday и profitYesterday и в этом коде показано как это получено.
Мне нужно получить profitWeek и profitMonth.
А Вы обращаете внимание на то, о чем речь вообще не шла.
P.S. Вот SM
Последний раз редактировалось FEEX; 05.12.2018 в 16:42.
Например, как Вы писали, нужно узнать профит за неделю - как по мне, сперва находим понедельник и от него считаем по "сегодня". Вопрос: и где в Вашем коде определение понедельника? Код, что Вам привел в качестве примера содержит:
Скрытый текст
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 12.05.2008 |
//| Описание : Возвращает дату понедельника |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| (-2 - позатой недели) |
//| (-1 - прошлой недели) |
//| no - номер понедельника ( 0 - текущей недели) |
//| ( 1 - следующий, ближайший будущий) |
//| ( 2 - последующий) |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int no=0)
{
datetime dt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
while (TimeDayOfWeek(dt)!=1) dt -= 24*60*60;
dt += no*7*24*60*60;
return(dt);
}
Вам, всего-то нужно, взять готовые функции и вставить в свой код и связать все воедино.
вот есть:
datetime today = TimeCurrent() ;
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
и надо продолжение там же сделать:
datetime week = ...
datetime month = ....
не отдельными функциями, а всё в одном месте.
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
datetime today = TimeCurrent();
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
for(int l=OrdersHistoryTotal();l>=0;l--)
{
if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
{
totalLotsTraded += OrderLots();
maxLotsizeUsed = MathMax(maxLotsizeUsed, OrderLots());
if(OrderProfit()>0) wonTrades++;
else lostTrades++;
double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
if(orderProfit<0) totalAmountLost+=orderProfit;
else totalAmountWon+=orderProfit;
profitTotal+=orderProfit;
if( TimeDay (OrderCloseTime()) == TimeDay(today) &&
TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
TimeYear (OrderCloseTime()) == TimeYear(today) )
{
profitToday+=orderProfit;
}
if( TimeDay (OrderCloseTime()) == TimeDay(yesterday) &&
TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
{
profitYesterday+=orderProfit;
}
if(OrderCloseTime()>=iTime(_Symbol,PERIOD_W1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_W1,0)) profitWeek+=orderProfit;
if(OrderCloseTime()>=iTime(_Symbol,PERIOD_MN1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_MN1,0)) profitMonth+=orderProfit;
}
}
}
}
Последний раз редактировалось vladradon; 05.12.2018 в 19:32.
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
datetime today = TimeCurrent();
datetime yesterday = TimeCurrent() - (60 * 60 * 24);
for(int l=OrdersHistoryTotal();l>=0;l--)
{
if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
{
totalLotsTraded += OrderLots();
maxLotsizeUsed = MathMax(maxLotsizeUsed, OrderLots());
if(OrderProfit()>0) wonTrades++;
else lostTrades++;
double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
if(orderProfit<0) totalAmountLost+=orderProfit;
else totalAmountWon+=orderProfit;
profitTotal+=orderProfit;
if( TimeDay (OrderCloseTime()) == TimeDay(today) &&
TimeMonth (OrderCloseTime()) == TimeMonth(today) &&
TimeYear (OrderCloseTime()) == TimeYear(today) )
{
profitToday+=orderProfit;
}
if( TimeDay (OrderCloseTime()) == TimeDay(yesterday) &&
TimeMonth(OrderCloseTime()) == TimeMonth(yesterday) &&
TimeYear (OrderCloseTime()) == TimeYear(yesterday) )
{
profitYesterday+=orderProfit;
}
if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,7) && OrderCloseTime()<=iTime(_Symbol,PERIOD_D1,0)) profitWeek+=orderProfit;
if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<=iTime(_Symbol,PERIOD_D1,0)) profitMonth+=orderProfit;
}
}
}
}
Последний раз редактировалось vladradon; 05.12.2018 в 20:05.
Спасибо)
Если что-то всплывает не то, я напишу)
int wonTrades=0;
int lostTrades=0;
double profitToday=0;
double profitYesterday=0;
double profitWeek=0.0;
double profitMonth=0.0;
double profitTotal=0;
double totalLotsTraded=0;
double maxLotsizeUsed=0;
double profitFactor=-1;
double totalAmountWon=0;
double totalAmountLost=0;
for(int l=OrdersHistoryTotal();l>=0;l--)
{
if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==magicbuy || OrderMagicNumber()==magicsell)
{
totalLotsTraded += OrderLots();
maxLotsizeUsed = MathMax(maxLotsizeUsed, OrderLots());
if(OrderProfit()>0) wonTrades++;
else lostTrades++;
double orderProfit=(OrderProfit()+OrderSwap()+OrderCommission());
if(orderProfit<0) totalAmountLost+=orderProfit;
else totalAmountWon+=orderProfit;
profitTotal+=orderProfit;
if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,0) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitToday+=orderProfit;
if(OrderCloseTime()>=iTime(_Symbol,PERIOD_D1,1) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)) profitYesterday+=orderProfit;
if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,7) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitWeek+=orderProfit;
if(OrderCloseTime()>iTime(_Symbol,PERIOD_D1,30) && OrderCloseTime()<iTime(_Symbol,PERIOD_D1,0)+86400) profitMonth+=orderProfit;
}
}
}
}
Последний раз редактировалось vladradon; 05.12.2018 в 21:57.
Вот эти функции считают всё четко, но они используются отдельно, вне основной функции. А я бы хотел как-то это использовать в основной функции расчета...
Последний раз редактировалось FEEX; 06.12.2018 в 18:48.