Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Посмотрел тут варианты ответа на твой вопрос,но мне кажется доходнее и наджнее примерно так:
//+------------------------------------------------------------------+
bool ProverkaTimeBuy(){
for(int bz=OrdersTotal()-1;bz>=0;bz--){
if(OrderSelect(bz,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()){
if(OrderType()==OP_BUY &&
OrderMagicNumber()==1 &&
OrderOpenTime()>=Time[0]){return(false);}
else{return(true);}
}
}
}
return(true);
}
bool ProverkaTimeSell(){
for(int sz=OrdersTotal()-1;sz>=0;sz--){
if(OrderSelect(sz,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()){
if(OrderType()==OP_SELL &&
OrderMagicNumber()==2 &&
OrderOpenTime()>=Time[0]){return(false);}
else{return(true);}
}
}
}
return(true);
}
//+------------------------------------------------------------------+
кстати, из продвинутых кто что посоветует мне. обмен опытом приветствуется. ))))))))
В этом коде выражение else{return(true); дважды лишнее.
bool ProverkaTimeBuy()
{
for(int b=OrdersTotal()-1;b>=0;b--)
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY && OrderMagicNumber()==1 && OrderOpenTime()>=Time[0])
return(false);
return(true);
}
//************************************************************************************************/
bool ProverkaTimeSell()
{
for(int s=OrdersTotal()-1;s>=0;s--)
if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
if(OrderType()==OP_SELL && OrderMagicNumber()==2 && OrderOpenTime()>=Time[0])
return(false);
return(true);
}
И вообще не рационально, в том числе и у Кима использовать циклы.
Рациональнее запоминать время бара при открытии ордера. Время бара будет всегда последнее пока не появится следующий. Время следующего больше. Вот и проверяйте.
Пример использования:
Почему oot не проиндексировали нулем? Кок вы неизвестное значение сравниваете с временем открытия ордера?
Использование
открытие бай
Открытие селл
А чему равен timealdopen, что вы его с чем-то сравниваете? Перед каждым циклом его надо индексировать нулем.
Если речь идет о контроле баров в целом:
Для тестера подойдет такой вариант:
Я пользуюсь таким:
Если же условия для открытия и закрытия позиций появляются внутри бара, то лучшего варианта, чем функция Кима, Вам не найти.
Аесли стопы не успели выставиться или трал какой-то? А вы будете ждать нового ордера. Он откроется, а вы снова курите.
Довольно интересную тему поднял топикстартер. Я тоже пробовал разные варианты. За годы программирования уже сложился такой подход: Предположим у нас есть некий сигнал и по нему должен открыться один и только один ордер в нужную сторону. Я для осуществления этого сделал себе функцию "Счётчик ордеров". Скажем так, по лонговому сигналу должен открыться лонговый ордер. Делаем проверку: если счётчик лонговых ордеров = нулю, то открыть ордер. Пусть на данном тике ордер открылся. На следующем тике советник обнаружит снова лонговый сигнал, но счётчик скажет, что у нас уже есть рыночный лонг. Поэтому до тех пор, пока рыночный жив, ни по какому лонговому сигналу Бай-ордер больше не откроется.
Бывает, что время жизни ордера меньше времени жизни свечи (свечка ещё не закрылась, а ордер уже отработал). Ордер открылся, отработал, цена уехала. Ордера уже нет, а свечка ещё не закрылась и советник видит, что сигнал есть. В случае, если нам уже не выгодно открываться по такой цене (нужно было открываться на первых тиках), то встраиваю дополнительную проверку. Для этого я сделал себе функцию, возвращающую время закрытия последнего рыночного ордера. Итак, что имеем, если есть сигнал и нет ордера и при этом время закрытия последнего рыночного меньше времени открытия свечи (менее, чем Time[0]), то открываем позу.
Довольно интересную тему поднял топикстартер. Я тоже пробовал разные варианты. За годы программирования уже сложился такой подход: Предположим у нас есть некий сигнал и по нему должен открыться один и только один ордер в нужную сторону. Я для осуществления этого сделал себе функцию "Счётчик ордеров". Скажем так, по лонговому сигналу должен открыться лонговый ордер. Делаем проверку: если счётчик лонговых ордеров = нулю, то открыть ордер. Пусть на данном тике ордер открылся. На следующем тике советник обнаружит снова лонговый сигнал, но счётчик скажет, что у нас уже есть рыночный лонг. Поэтому до тех пор, пока рыночный жив, ни по какому лонговому сигналу Бай-ордер больше не откроется.
Бывает, что время жизни ордера меньше времени жизни свечи (свечка ещё не закрылась, а ордер уже отработал). Ордер открылся, отработал, цена уехала. Ордера уже нет, а свечка ещё не закрылась и советник видит, что сигнал есть. В случае, если нам уже не выгодно открываться по такой цене (нужно было открываться на первых тиках), то встраиваю дополнительную проверку. Для этого я сделал себе функцию, возвращающую время закрытия последнего рыночного ордера. Итак, что имеем, если есть сигнал и нет ордера и при этом время закрытия последнего рыночного меньше времени открытия свечи (менее, чем Time[0]), то открываем позу.
То есть, по сути можно перебирать ордера и рыночные и в истории сразу тоже. И сравнивать их с временем нужной свечи. Если на баре с нужным временем есть или были уже ордера (в рамках данного времени) - то на этом баре больше ордера не открывать. Так что ли???
То есть, по сути можно перебирать ордера и рыночные и в истории сразу тоже. И сравнивать их с временем нужной свечи. Если на баре с нужным временем есть или были уже ордера (в рамках данного времени) - то на этом баре больше ордера не открывать. Так что ли???
Смотрите, пишем функцию:
В теле советника пишем:
после блока
вставляем такой же для Sell-ордеров
По поводу времени. Можно точно так же получить время закрытия последнего ордера. Для этого нужно сперва получить его тикет из истории ордеров. Далее, зная тикет, мы можем выбрать этот ордер по тикету и запросить о нём любую информацию. Например, если мы разделяем открытие лонгов и шортов, мы можем запросить через тикет какого типа этот ордер, в покупку он был, или в продажу. Если например, он был в покупку и у нас сигнал в покупку, то опять выбираем его через тикет и запрашиваем время его закрытия. Смотрите:
Теперь, когда мы знаем тип ордера, решаем, будем ли мы запрашивать его тикет. Если мы отслеживаем лонги, а функция вернула нам значение = 1 (продажа), то ни чего не делаем, если же вернула нужное нам значение = 0 (покупка), то нам нужно запросить его тикет:
Тикет последнего лонга истории получили, можно теперь запросить и время его закрытия, обратившись к нему через тикет.
Тут вот в чём фокус. Кто-то скажет, что я сделал слишком много телодвижений. Можно было проще, одним единственным циклом найти последний ордер истории и вернуть время его закрытия. Это верно, НО! это верно только для одного единственного советника. Функции же, которые я дал можно сунуть в библиотеку. Дальнейшая работа становится в разы проще. Одной строкой кода подключаем к будущему советнику нашу библиотеку, а двумя-тремя другими проводим вызов функций (читай, уже написанных ранее нами кодов), делаем нужные сравнения. В результате код советника получается маленький и хорошо читаемый, ибо основные функции лежат в нашей многоразовой библиотеке. Ну и раз логика советника отслеживается легче, то и допустить случайную ошибку становится труднее. Вобще, логические ошибки отследить труднее всего. Если ошибку синтаксическую компилятор покажет в лёгкую, то он ни как не сможет сказать Вам что вот тут нужно было сравнивать показания не индикаторов 1 и 2, а 1 и 3. Он не сможет отследить ошибки в Вашей логике кода. А когда код маленький, логику проверить проще, чем когда приходится копаться в тысячах строк кода.
Довольно интересную тему поднял топикстартер. Я тоже пробовал разные варианты. За годы программирования уже сложился такой подход: Предположим у нас есть некий сигнал и по нему должен открыться один и только один ордер в нужную сторону. Я для осуществления этого сделал себе функцию "Счётчик ордеров". Скажем так, по лонговому сигналу должен открыться лонговый ордер. Делаем проверку: если счётчик лонговых ордеров = нулю, то открыть ордер. Пусть на данном тике ордер открылся. На следующем тике советник обнаружит снова лонговый сигнал, но счётчик скажет, что у нас уже есть рыночный лонг. Поэтому до тех пор, пока рыночный жив, ни по какому лонговому сигналу Бай-ордер больше не откроется.
Бывает, что время жизни ордера меньше времени жизни свечи (свечка ещё не закрылась, а ордер уже отработал). Ордер открылся, отработал, цена уехала. Ордера уже нет, а свечка ещё не закрылась и советник видит, что сигнал есть. В случае, если нам уже не выгодно открываться по такой цене (нужно было открываться на первых тиках), то встраиваю дополнительную проверку. Для этого я сделал себе функцию, возвращающую время закрытия последнего рыночного ордера. Итак, что имеем, если есть сигнал и нет ордера и при этом время закрытия последнего рыночного меньше времени открытия свечи (менее, чем Time[0]), то открываем позу.
Я писал такой же код по аналогичной логике. Все работает, это верно. Но. Время выполнения теста и оптимизации советника увеличивается в 5 раз с такой фукнцией. Это очень критично, когда оптимизируешь много параметров.
Я все еще в поисках эффективного способа...
Под МТ5 если нужно переделайте, под МТ4 работает отлично