Значит перед каждой функцией делать запись templ(T1)и она буде принимать переменную или нужный аргумент? А почему объявляется templ(T)а вызывается templ(T1),нужно добавлять цифру перед каждой функцией(templ(T1)templ(T2)templ(T3)) или везде писать templ(T1)? А если несколько параметров забито в template<typename T>то как будет, вот так template<typename T,typename P,typename Q> - templ(T,P,Q).
Да, запись всё равно делается перед каждой функцией, где нужно обычную функцию превратить шаблон функции. Просто эта запись теперь заметно короче. T1 - имя, обозначающее какой-то тип данных, который хранится в переменной обозначенной своим именем (a). Цифру добавлять не обязательно. Можно одно и то же имя везде использовать, даже ту же самую Т без цифры. templ не вызывается, а автоматом заменяется тем, что прописано к нему в #define. Это простая замена одного текста другим, но можно так же как и функций прописывать входные параметры в скобках.
#define templ(T) template<typename T> // один входной параметр именуемый буквой "T" т. е. "T" это просто имя.
templ(T1) T1 Funct(T1 a) { return a;} // функция вернёт тот же тип, что и будет передан при вызове это функции
в момент компиляции выражение templ(T1) будет заменено на template<typename T1> и получится это
template<typename T1>
T1 Funct(T1 a) { return a;}
Для нескольких параметров, да, вы верно догадались, как описать.
Директива #define подставляет expression вместо всех последующих найденных вхождений identifier в исходном тексте. identifier заменяется только в том случае, если он представляет собой отдельный токен. identifier не заменяется, если он является частью комментария, частью строки, или частью другого более длинного идентификатора. expression...
Я так понимаю, что нужно делать выбор через switch, и там вносить названия
Ваш код печатает int значение, а нужно выбирать string
я бы через массив строковых констант выбирал бы имя индикатора, т.е. мой пример выдает Вам номер записи при выборе пользователем, а этот номер может быть номером элемента (индекс) массива строк, где Вы сохраните текстовые имена индикаторов
к сожалению нет терминала, в коде не покажу пример, но думаю я объяснил идею
я бы через массив строковых констант выбирал бы имя индикатора, т.е. мой пример выдает Вам номер записи при выборе пользователем, а этот номер может быть номером элемента (индекс) массива строк, где Вы сохраните текстовые имена индикаторов
к сожалению нет терминала, в коде не покажу пример, но думаю я объяснил идею
PS:
Спасибо, так и сделал, это довольно таки удобно.
А вот итоговый вариант, это просто бомба. Мне этого давно не хватало, так как открыто в терминале не менее 20 графиков
Привет всем. Помогите, пожалуйста. Хочу, чтоб после закрытия сделки советник ждал n часов. Можно также подправить эту функцию. Правильно ли будет исправить Mode_Trades на Mode_History? Спасибо
Carcass77: Привет всем. Помогите, пожалуйста. Хочу, чтоб после закрытия сделки советник ждал n часов. Можно также подправить эту функцию. Правильно ли будет исправить Mode_Trades на Mode_History? Спасибо
MODE_HISTORY - конечно нужно, но есть ещё один момент: в тексте "после закрытия", а в коде OrderOpenTime
И не стоит переходить к барам, возвращайте время t, а потом как-то так используйте:
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
// здесь пофиг какой символ и какая позиция ... последняя позиция и всеint ClosePos = SecondsAfterCloseLastPos();
// здесь по тек. символу и пофиг какая позиция // int ClosePos = SecondsAfterCloseLastPos(Symbol()); // здесь по тек. символу и OP_BUY позиция // int ClosePos = SecondsAfterCloseLastPos(Symbol(),OP_BUY); // здесь по тек. символу , OP_BUY позиция , и магик 5 // int ClosePos = SecondsAfterCloseLastPos(Symbol(),OP_BUY,5);// продажи, вместо OP_BUY прописываем OP_SELL.if(ClosePos > 3600 || ClosePos == 0 ) {/*можно открывать*/}
}
//+------------------------------------------------------------------+//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает количество секунд после закрытия последней позиций. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int SecondsAfterCloseLastPos(string sy="",int op=-1,int mn=-1)
{
datetime t=0;
int i,k=OrdersHistoryTotal();
if(sy=="0") sy=Symbol();
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==sy || sy=="")
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(op<0 || OrderType()==op)
{
if(mn<0 || OrderMagicNumber()==mn)
{
if(t<OrderCloseTime()) t=OrderCloseTime();
}
}
}
}
}
}
int CloseTime;
if(t==0)
CloseTime=0;
else
CloseTime = int(TimeCurrent()-t);
return(CloseTime);
}
//+----------------------------------------------------------------------------+
Значит перед каждой функцией делать запись templ(T1)и она буде принимать переменную или нужный аргумент? А почему объявляется templ(T)а вызывается templ(T1),нужно добавлять цифру перед каждой функцией(templ(T1)templ(T2)templ(T3)) или везде писать templ(T1)? А если несколько параметров забито в template<typename T>то как будет, вот так template<typename T,typename P,typename Q> - templ(T,P,Q).
Да, запись всё равно делается перед каждой функцией, где нужно обычную функцию превратить шаблон функции. Просто эта запись теперь заметно короче.
T1 - имя, обозначающее какой-то тип данных, который хранится в переменной обозначенной своим именем (a). Цифру добавлять не обязательно. Можно одно и то же имя везде использовать, даже ту же самую Т без цифры.
templ не вызывается, а автоматом заменяется тем, что прописано к нему в #define. Это простая замена одного текста другим, но можно так же как и функций прописывать входные параметры в скобках.
в момент компиляции выражение templ(T1) будет заменено на template<typename T1> и получится это
Для нескольких параметров, да, вы верно догадались, как описать.
Понятно, спасибо за информацию, уже поэксперемнтировал- удобно.
Я так понимаю, что нужно делать выбор через switch, и там вносить названия
Ваш код печатает int значение, а нужно выбирать string
я бы через массив строковых констант выбирал бы имя индикатора, т.е. мой пример выдает Вам номер записи при выборе пользователем, а этот номер может быть номером элемента (индекс) массива строк, где Вы сохраните текстовые имена индикаторов
к сожалению нет терминала, в коде не покажу пример, но думаю я объяснил идею
PS:
я бы через массив строковых констант выбирал бы имя индикатора, т.е. мой пример выдает Вам номер записи при выборе пользователем, а этот номер может быть номером элемента (индекс) массива строк, где Вы сохраните текстовые имена индикаторов
к сожалению нет терминала, в коде не покажу пример, но думаю я объяснил идею
PS:
Спасибо, так и сделал, это довольно таки удобно.
А вот итоговый вариант, это просто бомба. Мне этого давно не хватало, так как открыто в терминале не менее 20 графиков
Привет всем. Помогите, пожалуйста. Хочу, чтоб после закрытия сделки советник ждал n часов. Можно также подправить эту функцию. Правильно ли будет исправить Mode_Trades на Mode_History? Спасибо
MODE_HISTORY - конечно нужно, но есть ещё один момент: в тексте "после закрытия", а в коде OrderOpenTime
И не стоит переходить к барам, возвращайте время t, а потом как-то так используйте:
MODE_HISTORY - конечно нужно, но есть ещё один момент: в тексте "после закрытия", а в коде OrderOpenTime
И не стоит переходить к барам, возвращайте время t, а потом как-то так используйте:
Я исправлял на Mode_History, так сова не откравает первый ордер. Можно поподробней решение? Спасибо
Я исправлял на Mode_History, так сова не откравает первый ордер. Можно поподробней решение? Спасибо
Посмотрите это.
Посмотрите это.
А как первый ордер разрешить?
А как первый ордер разрешить?
Обратите внимание, функцию немного изменил.