Добавляете в код следующую функцию:
//Посмотрим не открывались ли позы на текущем баре bool CheckExists(int Type) { bool Result = True; for(int i = 0; i < OrdersTotal(); i++) if(OrderSelect(i, SELECT_BY_POS)) if(OrderType() == Type && OrderMagicNumber() == Magic && OrderSymbol() == Symbol()) if(OrderOpenTime() >= Time[0]) Result = False; for(i = 0; i < OrdersHistoryTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) if(OrderType() == Type && OrderOpenTime() >= Time[0] && OrderMagicNumber() == Magic && OrderSymbol() == Symbol()) Result = False; } return(Result); }Потом в условие открытия ордера на покупку добавляете
if(/*ваше условие*/ &&CheckExists(OP_BUY)) { }В условие на продажу:
if(/*ваше условие*/ && CheckExists(OP_SELL)) { }
Напишите, пожалуйста, код для открытия одного ордера на одной свече
В вашем коде насколько понимаю нужно добавить в строчки
lFlagBuyOpen = (diCustom0<diCustom1 && diCustom2>=diCustom3 && diClose4>diCustom5 && diClose6>diCustom7 && CheckExists(OP_BUY)); lFlagSellOpen = (diCustom8>diCustom9 && diCustom10<=diCustom11 && diClose12<diCustom13 && diClose14<diCustom15 && CheckExists(OP_SELL));
Спасибо, попробую
это работает... Но есть еще одно НО! После закрытия одного ордера, открываются ещё ордера до тех пор, пока выполняются все условия, т.е. на последующих свечах, а надо, чтобы открылся только один ордер
artemmaster:
это работает... Но есть еще одно НО! После закрытия одного ордера, открываются ещё ордера до тех пор, пока выполняются все условия, т.е. на последующих свечах, а надо, чтобы открылся только один ордер
Так если есть условие, значит должны открываться ордера:) Наиболее логичным здесь вижу вариант пересмотреть само условие открытия ордера. Например, если это пересечение вверх, то писать "что-то было ниже на пред.баре, а на текущем выше чего-то";) Как-то так.
это работает... Но есть еще одно НО! После закрытия одного ордера, открываются ещё ордера до тех пор, пока выполняются все условия, т.е. на последующих свечах, а надо, чтобы открылся только один ордер
Номер бара открытия int NumberOfBarOpenLastPos() Необходима для открытия не одном баре не более одного ордера //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Возвращает номер бара открытия последней позиции или -1. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) { datetime oot; int i, k=OrdersTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (oot<OrderOpenTime()) oot=OrderOpenTime(); } } } } } } return(iBarShift(sym, tf, oot, True)); }
Donatom:
int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) { return(iBarShift(sym, tf, oot, True)); }
Тогда уж и вот эту функцию распиши:
iBarShift()
выполнение тика просто можно обрывать на старте и все
int start() { //---- //проверка сигнала в баре if (Time[0] == NowBarsTime) { return(0); } else { NowBarsTime = Time[0]; } // }
artemmaster, отправил Вам личное сообщение по советнику, чтобы не перегружать форум рисунками.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ichimoku:
Author: artem1985